您的位置:首页 > 移动开发 > Unity3D

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

2013-08-22 14:29 741 查看
         在上一篇文章《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脚本文件的下载地址:点此下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息