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