Files
2026-03-04 10:03:45 +08:00

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];
}
}
}
}