69 lines
1.7 KiB
C#
69 lines
1.7 KiB
C#
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];
|
|
}
|
|
}
|
|
}
|
|
}
|