Unity3D跟随脚本
2016-01-31 10:55
411 查看
//定义一个变量来引用要跟随的对象
public Transform TargetObj = null;
//定义一个对象引用角色的animator组件
protected Animator animator;
//定义一个角色控制器变量引用角色控制器
protected CharacterController controller;
//定义一个时间变量,主要用在使用Animator组件设置浮点函数
private float SpeedDempTime = 0.25f;
private float DirectionDempTime = 0.25f;
void Start()
{
//对前面定义的两个组件类型的变量animator和controller进行初始化
animator = GetComponent<Animator>();
controller = GetComponent<CharacterController>();
if (animator) //当组件存在时
{
//对animator组件中的一个属性animator 和 speed 进行随机化设置
//animator 和speed 的作用就是控制animator动画的播放
animator.speed = 1 + Random.Range(-0.4f, 0.4f);
}
}
// Update is called once per frame
void Update()
{//控制角色跟随的主要逻辑
if (animator && TargetObj)
{
//是跟随者跟随的目标一起运动,同时两者之间保持一定的距离之内
if (Vector3.Distance(TargetObj.position, animator.rootPosition) > 3)//是一个物体跟随另一个物体, 判断两个物体之间保持在硬顶的距离之内
{
animator.SetFloat("Speed", 1, SpeedDempTime, Time.deltaTime);
//定义俩个矢量
Vector3 curentDir = animator.rootRotation * Vector3.forward; // 定义角色的正方向 也就是角色的前方
//通过计算判断两者之间的位置关系
Vector3 wanterDir = (TargetObj.position - animator.rootPosition).normalized;
//if else语句:判断物体和当前物体之间的位置关系,主要用到了点积和差积的矢量的操作 来进行方向的判断
if (Vector3.Dot(curentDir, wanterDir) > 0)//当物体大于0 也就是物体的前方
{
//通过差积来判断左右
animator.SetFloat("Direction", Vector3.Cross(curentDir, wanterDir).y, DirectionDempTime, Time.deltaTime);
}
else
{
animator.SetFloat("Direction", Vector3.Cross(curentDir, wanterDir).y > 0 ? 1 : -1, DirectionDempTime, Time.deltaTime);
}
}
else
{
animator.SetFloat("Speed", 0, SpeedDempTime, Time.deltaTime);
}
}
}
public Transform TargetObj = null;
//定义一个对象引用角色的animator组件
protected Animator animator;
//定义一个角色控制器变量引用角色控制器
protected CharacterController controller;
//定义一个时间变量,主要用在使用Animator组件设置浮点函数
private float SpeedDempTime = 0.25f;
private float DirectionDempTime = 0.25f;
void Start()
{
//对前面定义的两个组件类型的变量animator和controller进行初始化
animator = GetComponent<Animator>();
controller = GetComponent<CharacterController>();
if (animator) //当组件存在时
{
//对animator组件中的一个属性animator 和 speed 进行随机化设置
//animator 和speed 的作用就是控制animator动画的播放
animator.speed = 1 + Random.Range(-0.4f, 0.4f);
}
}
// Update is called once per frame
void Update()
{//控制角色跟随的主要逻辑
if (animator && TargetObj)
{
//是跟随者跟随的目标一起运动,同时两者之间保持一定的距离之内
if (Vector3.Distance(TargetObj.position, animator.rootPosition) > 3)//是一个物体跟随另一个物体, 判断两个物体之间保持在硬顶的距离之内
{
animator.SetFloat("Speed", 1, SpeedDempTime, Time.deltaTime);
//定义俩个矢量
Vector3 curentDir = animator.rootRotation * Vector3.forward; // 定义角色的正方向 也就是角色的前方
//通过计算判断两者之间的位置关系
Vector3 wanterDir = (TargetObj.position - animator.rootPosition).normalized;
//if else语句:判断物体和当前物体之间的位置关系,主要用到了点积和差积的矢量的操作 来进行方向的判断
if (Vector3.Dot(curentDir, wanterDir) > 0)//当物体大于0 也就是物体的前方
{
//通过差积来判断左右
animator.SetFloat("Direction", Vector3.Cross(curentDir, wanterDir).y, DirectionDempTime, Time.deltaTime);
}
else
{
animator.SetFloat("Direction", Vector3.Cross(curentDir, wanterDir).y > 0 ? 1 : -1, DirectionDempTime, Time.deltaTime);
}
}
else
{
animator.SetFloat("Speed", 0, SpeedDempTime, Time.deltaTime);
}
}
}
相关文章推荐
- unity, yield return new WaitForSeconds(waitTime) 在 Time.timeScale=0下卡死
- Unity热更新ULua(一)
- 构建ASP.NET MVC5+EF6+EasyUI 1.4.3+Unity4.x注入的后台管理系统(54)-工作流设计-所有流程监控
- Unity中的旋转和缩放
- unity, 如果碰撞使用2d物理,为防止颤动,需将更新position的代码写在FixedUpdate里
- Unity和Android互调的基本操作
- Unity里vertexShader里压扁模型来实现比较low的阴影
- Unity初探—SpaceShoot
- Unity3d报奇怪的错误CompareBaseObjectsInternal can only be called from the main thread.
- Unity3d 获取时间戳或获取北京时间
- Unity PlayerPrefs类进行扩展(整个对象进行保存)
- unity3D学习 1
- Unity5 GI与PBS渲染从用法到着色代码
- unity2DStudyTip
- Visual Studio Community 2013的安装方法
- Unity3D 固定功能函数
- Unity残影
- unity下lua.txt 在notepad++中开发环境配置
- 关于如何彻底消除unity中的弹力
- Unity Profiler之Android真机调测