Unity 角色朝向目标 / 动态转向动画

  • Post author:
  • Post category:其他



转载地址

在Unity中我们通常会改变角色或物体的朝向,一般实现朝向的方法可以视为静态和动态两种过程。具体是指:


  1. 静态过程

    ,即角色的朝向在一个Update帧中就完成,rotation 是立刻就改变的;


  1. 动态过程

    ,即角色的朝向在多个帧中持续实现的过程,表现为连续的动画过程;


一、静态角色转向

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