下面是一个示例代码,演示如何在切换目标位置时增加缓冲时间的方法:
using System.Collections;
using UnityEngine;
public class CharacterController : MonoBehaviour
{
public float moveSpeed = 5f; // 移动速度
private Vector3 targetPos; // 当前目标位置
void Start()
{
SetRandomTargetPosition(); // 初始随机移动
}
void Update()
{
if (Vector3.Distance(transform.position, targetPos) < 0.1f)
{
// 等待一段时间后再开始移动到新的随机目标位置
StartCoroutine(WaitAndSetNewTargetPosition());
}
}
IEnumerator WaitAndSetNewTargetPosition()
{
yield return new WaitForSeconds(0.5f); // 增加缓冲时间,等待角色完全停下后再开始移动
SetRandomTargetPosition(); // 开始向新的目标位置移动
}
void SetRandomTargetPosition()
{
Vector3 randomPos = Random.insideUnitSphere * 10f;
randomPos.y = transform.position.y;
targetPos = randomPos;
StopCoroutine("MoveToTarget"); // 停止之前的协程(如果有)
StartCoroutine("MoveToTarget"); // 启动新的协程
}
IEnumerator MoveToTarget() // 协程函数,用于让角色移动到目标位置并播放跑步动画
{
while (true)
{
if (Vector3.Distance(transform.position, targetPos) > 0.1f)
{
Vector3 direction = (targetPos - transform.position).normalized;
transform.position += direction * moveSpeed * Time.deltaTime; // 每帧移动一小段距离
}
else
{
yield return new WaitForSeconds(0.1f);
continue;
}
yield return null;
}
}
}
在这个示例中,角色会一直随机移动,直到到达当前目标位置。当角色完全停下时,增加了0.5秒的缓冲时间,然后再开始向新的随机目标位置移动。这样可以确保角色能够平稳地转向并加速到新的目标位置,避免了因突然切换方向而导致速度异常的问题。同时,在移动过程中使用了归一化向量来控制角色的朝向,并且每帧只移动一小段距离,以获得更平滑和自然的运动效果。