MayHeCome/Assets/XX/TreeElasticHit.cs
2024-12-18 17:55:34 +08:00

65 lines
1.7 KiB
C#

using UnityEngine;
using System.Collections;
public class TreeElasticHit : MonoBehaviour
{
public float hitDuration = 1f; // 受击反馈持续时间
public float scaleAmount = 0.05f; // 缩放量
public float rotationAngle = 5f; // 旋转角度
public float damping = 10f; // 阻尼系数
public float intervalBetweenHits = 5f; // 每次受击间隔时间
private Vector3 originalScale;
private Quaternion originalRotation;
void Start()
{
originalScale = transform.localScale;
originalRotation = transform.rotation;
StartCoroutine(AutoHit());
}
IEnumerator AutoHit()
{
while (true)
{
yield return new WaitForSeconds(intervalBetweenHits);
OnHit();
}
}
public void OnHit()
{
StopAllCoroutines();
StartCoroutine(ElasticFeedback());
}
IEnumerator ElasticFeedback()
{
float timeElapsed = 0f;
while (timeElapsed < hitDuration)
{
timeElapsed += Time.deltaTime;
float progress = timeElapsed / hitDuration;
float dampenedSin = Mathf.Sin(progress * Mathf.PI * damping) / (progress * damping + 1);
float scaleFactor = 1 - (scaleAmount * dampenedSin);
transform.localScale = new Vector3(originalScale.x * scaleFactor, originalScale.y * scaleFactor, originalScale.z);
float rotationFactor = rotationAngle * dampenedSin;
transform.rotation = Quaternion.Euler(0, 0, originalRotation.eulerAngles.z + rotationFactor);
yield return null;
}
transform.localScale = originalScale;
transform.rotation = originalRotation;
StartCoroutine(AutoHit());
}
}