65 lines
1.7 KiB
C#
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());
|
||
|
}
|
||
|
}
|