using UnityEngine; namespace Artngame.TEM { public class BuildingShaker : MonoBehaviour { public Transform[] floorArray; private Transform groundObj; private Vector3[] posNew; private Vector3[] posOld; private Vector3[] velArray; public float m; private float k; private float c; private Vector3 startPos; private void Start() { groundObj = GameObject.FindGameObjectWithTag("Ground").transform; startPos = base.transform.position - groundObj.position; posNew = new Vector3[floorArray.Length]; posOld = new Vector3[floorArray.Length]; velArray = new Vector3[floorArray.Length]; for (int i = 0; i < posNew.Length; i++) { posNew[i] = Vector3.zero; posOld[i] = floorArray[i].position; velArray[i] = Vector3.zero; } k = 2f * m; c = k / 10f; } private void FixedUpdate() { base.transform.position = groundObj.position + startPos; ShakeBuilding(); } private void ShakeBuilding() { float num = 0.02f; for (int i = 0; i < floorArray.Length; i++) { Vector3 vector = posOld[i]; Vector3 zero = Vector3.zero; zero = ((i != 0) ? ((i != floorArray.Length - 1) ? (((0f - k) * (vector - posOld[i - 1]) + k * (posOld[i + 1] - vector)) / m) : ((0f - k) * (vector - posOld[i - 1]) / m)) : (((0f - k) * (vector - base.transform.position) + k * (posOld[i + 1] - vector)) / m)); zero -= c * velArray[i] / m; posNew[i] = vector + num * velArray[i]; velArray[i] += num * zero; } for (int j = 0; j < floorArray.Length; j++) { Vector3 position = new Vector3(posNew[j].x, floorArray[j].position.y, posNew[j].z); floorArray[j].position = position; posOld[j] = posNew[j]; } } } }