Unity3D学习笔记05:四元数控制人物旋转

         在上一篇文章《Unity3D学习笔记04:角色控制器CharacterController控制人物移动旋转》我们学习了怎么使用角色控制器CharacterController来实现主角任务的移动和转身,那么在Unity3D中,人物的旋转是靠四元数Quaternion来实现的,我们今天就来把上一篇文章的项目代码改写一下,使其用四元数实现和角色控制器一样的转身效果,项目工程需要新建的模型,模型组件设置在上一篇文章中已经有详细的叙述,我们这里就不再重复说明,请大家转到上一篇文章浏览下载。

         我们新建一个C#文件,重命名为“quaternionScript”,然后编写代码如下,代码大部分和上一篇文章内工程的代码相同 ,只是在转身的地方作了一些修改。

using UnityEngine;
using System.Collections;

public class quaternionScript : MonoBehaviour
{
    //定义主角角色控制器
    CharacterController hero;

    //点数组
    public Transform[] points;

    //下一个点的下标,主角移动速度
    public int nextIndex;
    public int moveSpeed = 10;

    void Start()
    {
        //初始化主角移动速度
        nextIndex = 0;
        //获得主角的角色控制器组件
        hero = GetComponent();
    }
    void Update()
    {
        //如果主角距离点的距离大于0.2,则算出主角的朝向,移动主角人物
        if (Vector3.Distance(ignoreY(points[nextIndex % points.Length].position), ignoreY(transform.position)) > 0.2f)
        {
            //主角的朝向即为下一个点坐标减去主角坐标的向量
            Vector3 direction = (ignoreY(points[nextIndex % points.Length].position) - ignoreY(transform.position)).normalized;
            //主角转身的终止角度即是朝向下一点的向量
            Quaternion endRotation = Quaternion.LookRotation(direction);
            //差值设置主角的角度,开始角度是主角当前角度,终止角度是主角朝向下一点的角度
            this.transform.rotation = Quaternion.Lerp(this.transform.rotation,endRotation, 0.1f);
            //移动主角
            hero.SimpleMove(transform.forward * moveSpeed);
        }
        else
        {
            //如果到达点,则使下一点作为目标点
            nextIndex++;
        }
    }
    //这个函数用来取消向量的Y轴影响,比如主角的高度与点之间可能有一段距离,我们要忽略这段距离
    Vector3 ignoreY(Vector3 v3)
    {
        return new Vector3(v3.x, 0, v3.z);
    }
}

       在代码改动的地方已经添加了注释,我们把这个脚本文件拖到主角身上,别忘记了把上一个脚本文件删除。然后给点数组设置具体值,最后运行效果和上一篇的一致,主角人物在到达一点后转身向下一点继续运动。

       附上quaternionScript脚本文件的下载地址:点此下载

你可能感兴趣的:(Unity3D学习笔记)