using UnityEngine; using System.Collections; using System.Collections.Generic; //适用于木雕和树木,点击时的摇晃效果 public class WoodElasticHit : MonoBehaviour { public float hitDuration = 1f; // 受击反馈持续时间 public float scaleAmount = 0.05f; // 缩放量 public float rotationAngle = 5f; // 旋转角度 public float damping = 10f; // 阻尼系数 public bool isTree; public GameObject TargetGameObject;// 每次受击间隔时间 private Vector3 originalScale; private Quaternion originalRotation; private List ScupBranches = new List(); void Start() { originalScale = TargetGameObject.transform.localScale; originalRotation = TargetGameObject.transform.rotation; if (!isTree) { for (int i = 0; i < TargetGameObject.transform.childCount; i++) { ScupBranches.Add(TargetGameObject.transform.GetChild(i)); } } } private Coroutine elasticFeedbackCoroutine; private int currentStageInt = 0; public void OnHit(float stage) { Debug.Log("Hit! "+stage); //摇晃效果 if (elasticFeedbackCoroutine != null) { StopCoroutine(elasticFeedbackCoroutine); } elasticFeedbackCoroutine = StartCoroutine(ElasticFeedback()); //木像掉落效果 if (!isTree) { //Debug.Log(currentStageInt + " + " + stage); if (Mathf.FloorToInt(stage*(ScupBranches.Count-1)) > currentStageInt ) { Debug.Log(currentStageInt + " - " + stage); currentStageInt++; Animator branchAnimator = ScupBranches[currentStageInt - 1].GetComponent(); if (branchAnimator != null) { // 触发掉落动画 branchAnimator.SetTrigger("FallTrigger"); } } // 检查 Animator 是否存在 } } public void ResetBranch() { Debug.Log("木像台重置源头"); currentStageInt = 0; for (int i = 0; i < ScupBranches.Count; i++) { Animator branchAnimator = ScupBranches[i].GetComponent(); if (branchAnimator!= null) { branchAnimator.SetTrigger("UpTrigger"); } } } 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); TargetGameObject.transform.localScale = new Vector3(originalScale.x * scaleFactor, originalScale.y * scaleFactor, originalScale.z); float rotationFactor = rotationAngle * dampenedSin; TargetGameObject.transform.rotation = Quaternion.Euler(0, 0, originalRotation.eulerAngles.z + rotationFactor); yield return null; } TargetGameObject.transform.localScale = originalScale; TargetGameObject.transform.rotation = originalRotation; } }