Advertisement
sergezhu

Untitled

Dec 13th, 2020
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 18.94 KB | None | 0 0
  1. public class LevelCreator : MonoBehaviour
  2. {
  3.     [SerializeField] private PathCreator _pathCreator;
  4.     [SerializeField] private Tower _towerTemplate;
  5.     [SerializeField] private int _humanTowerCount;
  6.    
  7.     [Space]
  8.     [Header("Boosters Settings")]
  9.     [SerializeField] private JumpBooster[] _jumpBoosterTemplates;
  10.     [Range(0,1)]
  11.     [SerializeField] private float _boostersFrequency;
  12.     [Range(0, 10)]
  13.     [SerializeField] private float _distanceBefore;
  14.  
  15.     [Space]
  16.     [Header("Obstacles Settings")]
  17.     [SerializeField] private Obstacle _obstacleTemplate;
  18.     [Range(0, 1)]
  19.     [SerializeField] private float _obstacleFrequency;
  20.  
  21.     private float roadStartMargin = 5f;
  22.     private float roadEndMargin = 10f;
  23.  
  24.     private void Start()
  25.     {
  26.         GenerateLevel();
  27.     }
  28.  
  29.     private void GenerateLevel()
  30.     {
  31.         float roadLength = _pathCreator.path.length - roadStartMargin - roadEndMargin;
  32.         float distanceBetweenTower = roadLength / _humanTowerCount;
  33.  
  34.         float distanceTravelled = roadStartMargin;
  35.         float delta = 0.1f;
  36.  
  37.         Vector3 spawnPoint, nextPoint, direction;
  38.  
  39.         for(int i = 0; i < _humanTowerCount; i++)
  40.         {
  41.             distanceTravelled += distanceBetweenTower;
  42.             spawnPoint = _pathCreator.path.GetPointAtDistance(distanceTravelled, EndOfPathInstruction.Stop);
  43.             nextPoint = _pathCreator.path.GetPointAtDistance(distanceTravelled + delta, EndOfPathInstruction.Stop);
  44.             direction = nextPoint - spawnPoint;
  45.  
  46.             Tower tower = Instantiate(_towerTemplate, spawnPoint, Quaternion.identity);
  47.             tower.transform.LookAt(nextPoint);
  48.  
  49.             TryToCreateBooster(tower, distanceTravelled);
  50.            
  51.             if(i < _humanTowerCount - 1)
  52.             {
  53.                 TryToCreateObstacle(tower, distanceTravelled + distanceBetweenTower / 2f);
  54.             }
  55.         }
  56.     }
  57.  
  58.     private void TryToCreateBooster(Tower tower, float towerPathPoint)
  59.     {
  60.         float dice = Random.value;
  61.         if ((dice > _boostersFrequency) || (tower.Size == 1)) return;
  62.  
  63.         JumpBooster booster;
  64.  
  65.         if (tower.Size == 2)
  66.         {
  67.             booster = _jumpBoosterTemplates[0];
  68.         }
  69.         else
  70.         {
  71.             booster = _jumpBoosterTemplates[Random.Range(0, _jumpBoosterTemplates.Length)];
  72.         }
  73.  
  74.         CreateBooster(booster, tower, towerPathPoint, tower.transform);        
  75.     }
  76.  
  77.     private void CreateBooster(JumpBooster booster, Tower tower, float pathPoint, Transform parent)
  78.     {
  79.         float distance = pathPoint - _distanceBefore;
  80.         Vector3 spawnPoint = _pathCreator.path.GetPointAtDistance(distance, EndOfPathInstruction.Stop);
  81.         Vector3 nextPoint = _pathCreator.path.GetPointAtDistance(distance + 0.1f, EndOfPathInstruction.Stop);
  82.  
  83.         Instantiate(booster, spawnPoint, Quaternion.LookRotation(nextPoint - spawnPoint), parent);
  84.     }
  85.  
  86.     private void TryToCreateObstacle(Tower tower, float obstaclePoint)
  87.     {
  88.         float dice = Random.value;
  89.         if (dice > _obstacleFrequency) return;
  90.  
  91.         int size = Random.Range(1, 3);
  92.         Vector3 spawnPoint = _pathCreator.path.GetPointAtDistance(obstaclePoint, EndOfPathInstruction.Stop);
  93.         Vector3 nextPoint = _pathCreator.path.GetPointAtDistance(obstaclePoint + 0.1f, EndOfPathInstruction.Stop);
  94.  
  95.         Obstacle obstacle = Instantiate(_obstacleTemplate, spawnPoint, Quaternion.LookRotation(nextPoint - spawnPoint));
  96.         obstacle.Size = size;
  97.  
  98.         if (size == 2) CreateBooster(_jumpBoosterTemplates[0], tower, obstaclePoint, obstacle.transform);
  99.     }
  100. }
  101. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  102.  
  103. public class PlayerTower : MonoBehaviour
  104. {
  105.     [SerializeField] private Human _startHuman;
  106.     [SerializeField] private Transform _distanceChecker;
  107.     [SerializeField] private float _fixationMaxDistance;
  108.     [SerializeField] private BoxCollider _checkCollider;
  109.  
  110.     private List<Human> _humans;
  111.  
  112.     private Rigidbody _rigidbody;
  113.     //private float _rigidbodyPositionY;
  114.  
  115.  
  116.     private float displaceScale = 1.5f;
  117.     private float _displaceValue = 0;
  118.  
  119.     public event UnityAction<int> HumanAdded;
  120.     public event UnityAction<int> HumanRemoved;
  121.  
  122.     private void Start()
  123.     {
  124.         _humans = new List<Human>();
  125.         Vector3 spawnpoint = transform.position;
  126.         _humans.Add(Instantiate(_startHuman, spawnpoint, Quaternion.identity, transform));
  127.         _displaceValue = (_humans[0].FixationPoint.position - spawnpoint).magnitude;
  128.         _checkCollider.center = _distanceChecker.localPosition + new Vector3(0, _checkCollider.bounds.size.y / 2f, 0);
  129.         _rigidbody = GetComponent<Rigidbody>();
  130.         _rigidbody.position += Vector3.up * 1.5f;
  131.  
  132.         UpdateAnimations();
  133.         HumanAdded?.Invoke(_humans.Count);
  134.  
  135.  
  136.         Debug.Log("_displaceValue " + _displaceValue);
  137.     }
  138.  
  139.     private void OnCollisionEnter(Collision collision)
  140.     {
  141.         if (collision.gameObject.TryGetComponent(out Human human))
  142.         {
  143.             //Debug.Log("Human Collision");
  144.             Tower collisionTower = human.GetComponentInParent<Tower>();
  145.            
  146.             if(collisionTower != null)
  147.             {
  148.                 List<Human> collectedHumans = collisionTower.CollectHuman(_distanceChecker, _fixationMaxDistance);
  149.                
  150.                 if (collectedHumans != null)
  151.                 {
  152.                     _humans[0].StopRun();
  153.                    
  154.                     InsertHumansFromCollisionTower(collectedHumans);
  155.                     RebuildTower(_humans, collectedHumans.Count);
  156.  
  157.                     DisplaceCheckers(_humans[0]);
  158.                     //GetComponent<Jumper>().SetToGround();
  159.                     UpdateAnimations();
  160.  
  161.                     HumanAdded?.Invoke(_humans.Count);
  162.                 }
  163.  
  164.                 collisionTower.Break();
  165.             }            
  166.         }
  167.         else if(collision.gameObject.TryGetComponent(out Obstacle obstacle))
  168.         {
  169.             Debug.Log("Collision with obstacle, size " + obstacle.Size);
  170.  
  171.             if (_distanceChecker.position.y >= (obstacle.transform.position.y + obstacle.transform.localScale.y)) return;
  172.  
  173.             int removingHumansCount = Mathf.Min(_humans.Count, obstacle.Size);
  174.             List<Human> collisionHumans = _humans.GetRange(0, removingHumansCount);  
  175.            
  176.             _humans.RemoveRange(0, removingHumansCount);
  177.  
  178.             for (int i = 0; i < collisionHumans.Count; i++)
  179.             {
  180.                 collisionHumans[i].gameObject.layer = LayerMask.NameToLayer("Destroying");
  181.  
  182.                 collisionHumans[i].Push(i, 10);
  183.                 Destroy(collisionHumans[i].gameObject, 5f);
  184.             }
  185.  
  186.             if (_humans.Count == 0)
  187.             {
  188.                 Destroy(gameObject);
  189.                 ResetGame();
  190.                 return;
  191.             }
  192.            
  193.             NormalizeHumanPositions(_humans);
  194.             DisplaceCheckers(_humans[0]);
  195.             UpdateAnimations();
  196.  
  197.             HumanRemoved?.Invoke(_humans.Count);
  198.         }
  199.     }
  200.  
  201.    
  202.     private void InsertHumansFromCollisionTower(List<Human> humansFromCollidionTower)
  203.     {
  204.         for (int i = humansFromCollidionTower.Count - 1; i >= 0; i--)
  205.         {
  206.             _humans.Insert(0, humansFromCollidionTower[i]);
  207.         }
  208.     }
  209.     private void RebuildTower(List<Human> humans, int humansFromCollisionTowerCount)
  210.     {
  211.         Debug.Log("RebuildTower, adding " + humansFromCollisionTowerCount);
  212.  
  213.         for (int i = 0; i < humans.Count; i++)
  214.         {
  215.             Human insertHuman = humans[i];
  216.             bool needCorrection = i >= humansFromCollisionTowerCount;
  217.  
  218.             SetHumanPosition(insertHuman);
  219.         }
  220.  
  221.         NormalizeHumanPositions(humans);
  222.     }
  223.  
  224.     private void NormalizeHumanPositions(List<Human> humans)
  225.     {
  226.         for (int i = 1; i < humans.Count; i++)
  227.         {
  228.             float offsetY = _displaceValue * i;
  229.             _humans[i].transform.localPosition = _humans[0].transform.localPosition + new Vector3(0, offsetY, 0);
  230.         }
  231.     }
  232.    
  233.    
  234.     private void SetHumanPosition(Human human)
  235.     {
  236.         human.transform.parent = transform;
  237.         human.transform.localPosition = new Vector3(0, human.transform.localPosition.y, 0);        
  238.         human.transform.localRotation = Quaternion.identity;
  239.     }
  240.  
  241.     private void DisplaceCheckers(Human human)
  242.     {
  243.         Vector3 distanceCheckerNewPosition = _distanceChecker.position;
  244.         distanceCheckerNewPosition.y = human.transform.position.y;
  245.  
  246.         _distanceChecker.position = distanceCheckerNewPosition;
  247.         //_checkCollider.center = _distanceChecker.localPosition;
  248.         _checkCollider.center = _distanceChecker.localPosition + new Vector3(0, _checkCollider.bounds.size.y / 2f, 0);
  249.     }
  250.  
  251.     private void UpdateAnimations()
  252.     {
  253.         _humans[0].StopTexting();
  254.         _humans[0].Run();
  255.  
  256.         for(int i = 1; i < _humans.Count; i++)
  257.         {
  258.             float rnd = Random.value;
  259.  
  260.             if(rnd < 0.5f)
  261.             {
  262.                 _humans[i].Texting();
  263.             }
  264.             else
  265.             {
  266.                 _humans[i].StopTexting();
  267.             }
  268.         }
  269.     }
  270.  
  271.     private void ResetGame()
  272.     {
  273.         SceneManager.LoadScene(SceneManager.GetActiveScene().name);
  274.     }
  275. }
  276. ////////////////////////////////////////////////////////////////////////////////////////////
  277.  
  278. public class Tower : MonoBehaviour
  279. {
  280.     [SerializeField] private Vector2Int _humanInTowerRange;    
  281.     [SerializeField] private Human[] _humansTemplates;
  282.  
  283.     [Space]
  284.     [Range(10, 1000)]
  285.     [SerializeField] private float _breakForceStrength;
  286.  
  287.     public int Size => _humanInTower.Count;
  288.  
  289.     private List<Human> _humanInTower;
  290.  
  291.     private void Awake()
  292.     {
  293.         _humanInTower = new List<Human>();
  294.         int humanInTowerCount = Random.Range(_humanInTowerRange.x, _humanInTowerRange.y);
  295.         SpawnHumans(humanInTowerCount);
  296.     }
  297.  
  298.     private void SpawnHumans(int humanCount)
  299.     {
  300.         Vector3 spawnPoint = transform.position;
  301.  
  302.         for(int i = 0; i < humanCount; i++)
  303.         {
  304.             Human spawnedHuman = _humansTemplates[Random.Range(0, _humansTemplates.Length)];
  305.  
  306.             _humanInTower.Add(Instantiate(spawnedHuman, spawnPoint, Quaternion.identity, transform));
  307.             _humanInTower[i].transform.localPosition = new Vector3(0, _humanInTower[i].transform.localPosition.y, 0);
  308.  
  309.             spawnPoint = _humanInTower[i].FixationPoint.position;
  310.         }
  311.     }
  312.  
  313.     public List<Human> CollectHuman(Transform distanceChecker, float fixationMaxDistance)
  314.     {
  315.         for(int i = 0; i < _humanInTower.Count; i++)
  316.         {
  317.             float distanceBetweenPoints = CheckDistanceY(distanceChecker, _humanInTower[i].FixationPoint.transform);
  318.  
  319.             Debug.Log("distanceBetweenPoints: " + distanceBetweenPoints + "   fixationMaxDistance: " + fixationMaxDistance);
  320.  
  321.             if (distanceBetweenPoints < fixationMaxDistance)
  322.             {
  323.                 List<Human> collectedHumans = _humanInTower.GetRange(0, i + 1);
  324.                 _humanInTower.RemoveRange(0, i + 1);
  325.                
  326.                 return collectedHumans;
  327.             }
  328.         }
  329.  
  330.         return null;
  331.     }
  332.  
  333.     private float CheckDistanceY(Transform distanceChecker, Transform humanFixationPoint)
  334.     {
  335.         Vector3 distanceCheckerY = new Vector3(0, distanceChecker.position.y, 0);
  336.         Vector3 humanFixationPointY = new Vector3(0, humanFixationPoint.position.y, 0);
  337.  
  338.         return Vector3.Distance(distanceCheckerY, humanFixationPointY);
  339.     }
  340.  
  341.     public void Break()
  342.     {
  343.         for(int i = 0; i < _humanInTower.Count; i++)
  344.         {
  345.             _humanInTower[i].gameObject.layer = LayerMask.NameToLayer("Destroying");
  346.             _humanInTower[i].Push(i, 10);
  347.         }
  348.        
  349.         Destroy(gameObject, 3f);
  350.         //Destroy(gameObject);
  351.     }
  352. }
  353. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  354.  
  355. public class Jumper : MonoBehaviour
  356. {
  357.     [SerializeField] private float _jumpForce;
  358.     [SerializeField] private Transform _ground;
  359.  
  360.     private Rigidbody _rigidbody;
  361.     private bool _isGrounded;
  362.     private float _boostMiltiplier;
  363.     //private Vector3 _groundPosition;
  364.  
  365.     private void Awake()
  366.     {
  367.         _rigidbody = GetComponent<Rigidbody>();
  368.         _boostMiltiplier = 1f;
  369.     }
  370.  
  371.     private void Update()
  372.     {
  373.         if(Input.GetMouseButtonDown(0) && _isGrounded == true)
  374.         {
  375.             //_groundPosition = _rigidbody.position;
  376.             _rigidbody.AddForce(Vector3.up * _jumpForce * _boostMiltiplier);
  377.             _isGrounded = false;
  378.         }
  379.     }
  380.  
  381.     private void OnCollisionEnter(Collision collision)
  382.     {
  383.         if(collision.gameObject.TryGetComponent(out Road road))
  384.         {
  385.             _isGrounded = true;
  386.         }
  387.     }
  388.  
  389.     public void SetBoostMultiplier(float multiplier)
  390.     {
  391.         _boostMiltiplier = multiplier;
  392.     }
  393. }
  394. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  395.  
  396. public class JumpBooster : MonoBehaviour
  397. {
  398.     [SerializeField] private float _boostMultiplier;
  399.    
  400.     private Jumper _jumper;
  401.  
  402.     public float Value => _boostMultiplier;
  403.  
  404.     private void Awake()
  405.     {
  406.         _jumper = FindObjectOfType<Jumper>();
  407.     }
  408.  
  409.     private void OnTriggerEnter(Collider other)
  410.     {
  411.         _jumper.SetBoostMultiplier(_boostMultiplier);
  412.     }
  413.  
  414.     private void OnTriggerExit(Collider other)
  415.     {
  416.         _jumper.SetBoostMultiplier(1f);
  417.     }
  418.  
  419. }
  420. /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  421.  
  422. public class PlayerTracker : MonoBehaviour
  423. {
  424.     [SerializeField] private PlayerTower _playerTower;
  425.     [SerializeField] private float _moveSpeed;
  426.     [SerializeField] private Vector3 _offsetPosition;
  427.     [SerializeField] private Vector3 _offsetRotation;
  428.  
  429.     private Vector3 _targetOffsetPosition;
  430.  
  431.     private void OnEnable()
  432.     {
  433.         _playerTower.HumanAdded += OnHumanAdded;
  434.         _playerTower.HumanRemoved += OnHumanRemoved;
  435.     }
  436.     private void OnDisable()
  437.     {
  438.         _playerTower.HumanAdded -= OnHumanAdded;
  439.         _playerTower.HumanRemoved -= OnHumanRemoved;
  440.     }
  441.     private void LateUpdate()
  442.     {
  443.         UpdatePosition();
  444.         _offsetPosition = Vector3.MoveTowards(_offsetPosition, _targetOffsetPosition, _moveSpeed * Time.deltaTime);
  445.     }
  446.     private void UpdatePosition()
  447.     {
  448.         transform.position = _playerTower.transform.position;
  449.         transform.localPosition += _offsetPosition;
  450.        
  451.         Vector3 lookAtPoint = _playerTower.transform.position + _offsetRotation;
  452.  
  453.         transform.localPosition = Vector3.MoveTowards(transform.localPosition, _targetOffsetPosition, _moveSpeed * Time.deltaTime);
  454.  
  455.         transform.LookAt(lookAtPoint);
  456.     }
  457.  
  458.     private void OnHumanAdded(int count)
  459.     {
  460.         float factor = (count > 1) ? (float)count / (float)(count - 1) : 1f;
  461.         factor = Mathf.Sqrt(factor);
  462.        
  463.         _targetOffsetPosition = _offsetPosition + (Vector3.up + Vector3.back) * factor;
  464.         UpdatePosition();
  465.     }
  466.     private void OnHumanRemoved(int count)
  467.     {
  468.         float factor = (count > 1) ? (float)(count - 1) / (float)count : 1f;
  469.         factor = Mathf.Sqrt(factor);
  470.  
  471.         _targetOffsetPosition = _offsetPosition - (Vector3.up + Vector3.back) * factor;
  472.         UpdatePosition();
  473.     }
  474. }
  475. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  476.  
  477. public class Obstacle : MonoBehaviour
  478. {
  479.     private int _size = 1;
  480.  
  481.     public int Size {
  482.         get { return _size; }
  483.         set { _size = value;  UpdateSize(_size); }
  484.     }
  485.  
  486.     private float freeAreaHeight = 0.45f;
  487.     private float oneBlockHeight = 1.5f;
  488.  
  489.     private void Start()
  490.     {
  491.         UpdateSize(_size);
  492.     }
  493.  
  494.     private void UpdateSize(int size)
  495.     {
  496.         Vector3 localScale = transform.localScale;
  497.         localScale.y = (float)_size * oneBlockHeight - freeAreaHeight;
  498.         transform.localScale = localScale;
  499.     }
  500. }
  501. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  502.  
  503. [RequireComponent(typeof(Animator))]
  504. public class Human : MonoBehaviour
  505. {
  506.     [SerializeField] private Transform _fixationPoint;
  507.  
  508.     private Animator _animator;
  509.  
  510.     public Transform FixationPoint => _fixationPoint;
  511.  
  512.     private void Awake()
  513.     {
  514.         _animator = GetComponent<Animator>();
  515.     }
  516.  
  517.     public void Push(int index, float strength)
  518.     {
  519.         //strength = 500;
  520.         Transform t = transform;
  521.  
  522.         int sign = (index % 2 == 0) ? -1 : 1;
  523.         Vector3 forceDir = (t.right * Random.Range(5, 10) * sign + t.forward * (-1) + t.up * 0.1f).normalized;
  524.  
  525.         t.parent = null;
  526.        
  527.         StopRun();
  528.         StopTexting();
  529.         _animator.SetBool("isDead", true);
  530.  
  531.         Rigidbody rb = t.gameObject.AddComponent<Rigidbody>();
  532.         rb.isKinematic = false;
  533.         rb.drag = 2.5f;
  534.         rb.AddForce(forceDir * strength, ForceMode.Impulse);
  535.     }
  536.    
  537.     public void Run()
  538.     {
  539.         _animator.SetBool("isRunning", true);
  540.     }
  541.  
  542.     public void StopRun()
  543.     {
  544.         _animator.SetBool("isRunning", false);
  545.     }
  546.  
  547.     public void Texting()
  548.     {
  549.         _animator.SetBool("isTexting", true);
  550.     }
  551.  
  552.     public void StopTexting()
  553.     {
  554.         _animator.SetBool("isTexting", false);
  555.     }
  556. }
  557. //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  558.  
  559. [RequireComponent(typeof(Rigidbody))]
  560. public class PathFollower : MonoBehaviour
  561. {
  562.     [SerializeField] private float _speed = 1.9f;
  563.     [SerializeField] private float _lookAtSpeed = .1f;
  564.     [SerializeField] private PathCreator _pathCreator;
  565.  
  566.     private Rigidbody _rigidbody;  
  567.     private float _distanceTravelled;
  568.  
  569.     private void Awake()
  570.     {
  571.         _rigidbody = GetComponent<Rigidbody>();
  572.  
  573.         _rigidbody.MovePosition(_pathCreator.path.GetPointAtDistance(_distanceTravelled));
  574.     }
  575.  
  576.     private void Update()
  577.     {
  578.         Vector3 currentDirection = transform.forward;
  579.         Vector3 targetDirection;
  580.  
  581.         _distanceTravelled += Time.deltaTime * _speed;
  582.  
  583.         Vector3 nextPoint = _pathCreator.path.GetPointAtDistance(_distanceTravelled, EndOfPathInstruction.Loop);
  584.         Vector3 currentPoint = transform.position;
  585.         nextPoint.y = currentPoint.y;
  586.         targetDirection = (nextPoint - currentPoint).normalized;
  587.  
  588.         transform.LookAt(Vector3.Slerp(currentPoint + currentDirection, currentPoint + targetDirection, _lookAtSpeed * Time.deltaTime)); ;
  589.         //transform.LookAt(nextPoint);
  590.  
  591.         //_rigidbody.MovePosition(nextPoint);        
  592.         transform.position = nextPoint;
  593.     }
  594. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement