在Unity中我们通常会改变角色或物体的朝向,一般实现朝向的方法可以视为静态和动态两种过程。具体是指:
-
静态过程
,即角色的朝向在一个Update帧中就完成,rotation 是立刻就改变的;
-
动态过程
,即角色的朝向在多个帧中持续实现的过程,表现为连续的动画过程;
一、静态角色转向
Unity中角色的静态转向主要使用
Transform.LookAt(目标位置)
。
1.1 C# 脚本
//***初始化
public Transform Player; // 需要修改方向的物体或角色
public Transform LookTarget; // 需要朝向的目标
//***修改Player朝向
Player.transform.LookAt(LookTarget.position);
1.2 Unity 实现
1.3 修改
有时候我们期望物体只是朝向这个目标,旋转只在X和Z轴,不涉及Y轴。我们只需要将LookAt 目标位置的Y值,设置为Player自身的Y值即可。
//***修改Player朝向
Player.transform.LookAt(LookTarget.position);
二、动态角色转向
Unity中角色的动态连续转向过程一般要在持续一段时间中,以增量的形式不断累加,以达到持续的效果。主要会使用到
Quaternion.Slerp( Quaternion a, Quaternion b, float t )
,以及
协程 StartCoroutine(协程函数名) + IEnumerator(协程函数名)
来实现。
2.1 C# 脚本
//*** 5.0f * Time.deltaTime 速度完成转向
Player.rotation = Quaternion.Slerp(Player.rotation, //1-5 Group 先后随机转向Guide
Quaternion.LookRotation(new Vector3( LookTarget.position.x - Player.position.x,0, LookTarget.position.z - Player.position.z)),
5.0f * Time.deltaTime);
// 使用协程完成每次
bool turnArround = false; // bool类型标识
//***实现功能---每次按下 T 键,完成转向
void Update()
{
if (Input.GetKeyDown(KeyCode.T)) // 触发条件---键盘T键按下
{
turnArround = true;
}
if (turnArround == true)
{
StartCoroutine(TurnArround());
}
}
IEnumerator TurnArround() //*** 5.0f * Time.deltaTime 速度完成转向
{
Player.rotation = Quaternion.Slerp(Player.rotation, //1-5 Group 先后随机转向Guide
Quaternion.LookRotation(new Vector3( LookTarget.position.x - Player.position.x,0, LookTarget.position.z - Player.position.z)),
5.0f * Time.deltaTime);
yield return new WaitForSeconds(1f);
turnArround = false;
}
2.2 Unity 实现
每次键入T键,Player完成连续转向动作。效果如下。
写在最后
转载地址:
http://t.csdn.cn/iE3Qb