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()); } }