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

来源:互联网 发布:数据库原理 pdf 网盘 编辑:程序博客网 时间:2024/06/05 16:50

         在上一篇文章《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<CharacterController>();    }    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脚本文件的下载地址:点此下载

原创粉丝点击