Advertisement
sergezhu

Telekinesis

Dec 5th, 2020 (edited)
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.00 KB | None | 0 0
  1. public class StonesController : MonoBehaviour
  2. {
  3.     [SerializeField] private GameObject _stoneSource;    
  4.     [SerializeField] private Transform _spawnAreaPoint;
  5.    
  6.     [Range(0, 10)]
  7.     [SerializeField] private float _spawnAreaSize;    
  8.    
  9.     [Range(0, 20)]
  10.     [SerializeField] private int _stoneCount;
  11.  
  12.     [Range(0, 10)]
  13.     [SerializeField] private float _levitateSpeed = 1f;
  14.  
  15.     [Range(0, 1)]
  16.     [SerializeField] private float _levitatePower = .1f;
  17.  
  18.     [Range(100, 1000)]
  19.     [SerializeField] private float _pushPower = 500f;
  20.  
  21.     private GameObject[] _stones;
  22.     private Transform[] _stoneTransforms;
  23.     private Rigidbody[] _stoneRigidbodies;
  24.  
  25.     private Vector3[] _initPositions;
  26.     private bool _levitate = false;
  27.      
  28.     private void Awake()
  29.     {
  30.         Spawn();
  31.     }    
  32.  
  33.     private void Spawn()
  34.     {
  35.         _stones = new GameObject[_stoneCount];
  36.         _initPositions = new Vector3[_stoneCount];
  37.         _stoneTransforms = new Transform[_stoneCount];
  38.         _stoneRigidbodies = new Rigidbody[_stoneCount];
  39.  
  40.         for (int i = 0; i < _stoneCount; i++)
  41.         {
  42.             _initPositions[i] = _spawnAreaPoint.position + new Vector3(Random.value - .5f, Random.value - .5f, Random.value - .5f) * _spawnAreaSize;
  43.             _stones[i] = Instantiate(_stoneSource, _initPositions[i], Quaternion.identity);
  44.             _stoneTransforms[i] = _stones[i].transform;
  45.             _stoneRigidbodies[i] = _stones[i].GetComponent<Rigidbody>();
  46.         }
  47.     }
  48.  
  49.     private void StartLevitate()
  50.     {
  51.         _levitate = true;
  52.  
  53.         foreach (var stone in _stoneRigidbodies)
  54.         {
  55.             stone.useGravity = false;
  56.         }
  57.     }
  58.  
  59.     private void UpdateLevitate()
  60.     {
  61.         for (int i = 0; i < _stoneCount; i++)
  62.         {
  63.             Transform stoneTransform = _stoneTransforms[i];
  64.             Rigidbody stoneRigidbody = _stoneRigidbodies[i];
  65.             Vector3 targetPosition = new Vector3(stoneTransform.position.x, _initPositions[i].y, stoneTransform.position.z);
  66.             targetPosition += new Vector3(Random.value - .5f, Random.value - .5f, Random.value - .5f) * _levitatePower;
  67.             //stoneTransform.position = Vector3.Lerp(stoneTransform.position, targetPosition, Time.fixedDeltaTime * _levitateSpeed);
  68.             stoneRigidbody.MovePosition(Vector3.Lerp(stoneTransform.position, targetPosition, Time.fixedDeltaTime * _levitateSpeed));
  69.         }
  70.     }
  71.  
  72.     private void Push()
  73.     {
  74.         _levitate = false;
  75.  
  76.         Vector3 force = Vector3.forward * _pushPower;
  77.  
  78.         foreach(var stone in _stoneRigidbodies)
  79.         {
  80.             stone.useGravity = true;
  81.             stone.AddForce(force);
  82.         }
  83.     }
  84.  
  85.     private void Update()
  86.     {
  87.         if (Input.GetKeyDown(KeyCode.W))
  88.         {
  89.             StartLevitate();
  90.         }
  91.         else if (Input.GetKeyDown(KeyCode.Space))
  92.         {
  93.             Push();
  94.         }
  95.     }
  96.     private void FixedUpdate()
  97.     {
  98.         if (_levitate) UpdateLevitate();
  99.     }
  100. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement