54 lines
1.8 KiB
C#
54 lines
1.8 KiB
C#
|
using System.Collections;
|
|||
|
using System.Linq;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
public class BlinkController : MonoBehaviour
|
|||
|
{
|
|||
|
public SkinnedMeshRenderer skinnedMeshRenderer;
|
|||
|
public int blinkBlendIndex; // 眨眼表情在BlendShapes中的索引
|
|||
|
public float blinkWeight = 0.0f; // 眨眼表情的初始权重值
|
|||
|
public float blinkDuration = 0.2f; // 眨眼动画持续时间
|
|||
|
public float blinkInterval = 3.0f; // 眨眼间隔时间
|
|||
|
|
|||
|
private float blinkTimer = 0.0f; // 计时器,用于控制眨眼间隔
|
|||
|
void Start()
|
|||
|
{
|
|||
|
// 设置眨眼表情的初始权重值
|
|||
|
skinnedMeshRenderer.SetBlendShapeWeight(blinkBlendIndex, blinkWeight);
|
|||
|
}
|
|||
|
|
|||
|
void Update()
|
|||
|
{
|
|||
|
blinkTimer += Time.deltaTime;
|
|||
|
|
|||
|
// 如果计时器超过了眨眼间隔时间,就触发眨眼动画
|
|||
|
if (blinkTimer >= blinkInterval)
|
|||
|
{
|
|||
|
StartCoroutine(BlinkCoroutine());
|
|||
|
blinkTimer = 0.0f; // 重置计时器
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
IEnumerator BlinkCoroutine()
|
|||
|
{
|
|||
|
// 将眨眼表情的权重值逐渐变为100,然后再逐渐恢复为0,实现眨眼动画
|
|||
|
for (float t = 0.0f; t < blinkDuration; t += Time.deltaTime)
|
|||
|
{
|
|||
|
float weight = Mathf.Lerp(blinkWeight, 100.0f, t / blinkDuration);
|
|||
|
|
|||
|
skinnedMeshRenderer.SetBlendShapeWeight(blinkBlendIndex, weight);
|
|||
|
yield return null;
|
|||
|
}
|
|||
|
|
|||
|
for (float t = 0.0f; t < blinkDuration; t += Time.deltaTime)
|
|||
|
{
|
|||
|
float weight = Mathf.Lerp(100.0f, blinkWeight, t / blinkDuration);
|
|||
|
skinnedMeshRenderer.SetBlendShapeWeight(blinkBlendIndex, weight);
|
|||
|
yield return null;
|
|||
|
}
|
|||
|
|
|||
|
// 将眨眼表情的权重值恢复为初始值
|
|||
|
skinnedMeshRenderer.SetBlendShapeWeight(blinkBlendIndex, blinkWeight);
|
|||
|
}
|
|||
|
}
|