很多游戏中,我们通过向前移动来控制角色到达目的地,
这要求我们的控制角色要直面目的地,当角色没有面对目标,
我们需要旋转过后再往前走,简单的往前可以是LookAt(),然后直接往前走。
有过程的旋转可以通过
Vector3 forwardDir = targetGameObject.transform.position - transform.position;
forwardDir=forwardDir.normalized;
transform.forward = Vector3.Lerp(transform.forward, forwardDir, CharacterState.Instance.rotateAroundSmoothing * Time.deltaTime);
语句来实现,但是这不能保证旋转过后再往前走。
所以下面给出旋转了再走的代码:
IEnumerator TurnAroundAndWalkToAim()
{
Vector3 lookAtTarget = target.transform.position - transform.position;
Quaternion targetRotation = Quaternion.LookRotation(lookAtTarget, transform.up);
while (Mathf.Abs((transform.rotation.eulerAngles - targetRotation.eulerAngles).y) > 0.1f)
{
transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, CharacterState.Instance.rotateAroundSmoothing * Time.deltaTime);
yield return 0;
}
myController.SimpleMove(CharacterState.Instance.moveSpeed * transform.forward);
}
这里0.1f可以改大改小。
使角色转弯则是在旋转的同时保持角色往前行进即可。
Vector3 targetDir = targetPos - transform.position;
forwardDir=forwardDir.normalized;
transform.forward = Vector3.Lerp(transform.forward, targetDir, CharacterState.Instance.rotateAroundSmoothing * Time.deltaTime);
myController.SimpleMove(myState.moveSpeed * transform.TransformDirection(new Vector3(0, 0, 1)));