项目描述:
在很多游戏场景中我们都会发现:当玩家进行移动时,玩家的宠物也会跟着进行移动。此时我们会发现如果宠物是一直播放行走的动画,那就有点不合理。只有玩家移动时,宠物跟着移动并播放移动的动画,玩家停止移动时,宠物的动画也停止播放。
技术难点:
1.怎样获取摇杆数值,并使玩家玩家基于摇杆发生移动。(请查看小编写的摇杆数值获取的文章)
2.宠物的动画怎样才能够按照玩家的是否移动来判断动画的是否播放,而不是播放完整个动画在进行停止。
一:Animator(动画控制器)
Unity的版本更新后就淘汰掉了旧的动画系统,采用了新的动画系统,及基于 Animator(动画控制器)进行动画的播放与暂停。
创建Animator(动画控制器),挑选好需要使用的Animation(动画),为宠物搭建好动画控制逻辑。如下图所示:
Camel_walk_slow:宠物需要播放的动画。
二:代码
搭建好了动画控制器,下面就是代码部分的编写:
1.调用XR
using UnityEngine.XR.Interaction.Toolkit;
2. 声明变量
public ActionBasedController _RightController;
public Animator Camel;
private Vector3 _Position;
获取手柄控制器:ActionBasedController
获取动画控制器:Animator
声明三维向量,储存玩家的位置信息。
3.逻辑控制
先在Start方法中将初始位置赋值给三维向量。
void Start()
{
_Position = transform.position;
}
在Update方法中进行编写,此方法是unity的自带方法,为每帧都会进行调用。
var _Vector2 = _RightController.translateAnchorAction.action.ReadValue<Vector2>();
var _Vector3 = new Vector3(_Vector2.x, 0, _Vector2.y);
transform.Translate(_Vector3 * Time.deltaTime);
if (transform.position != _Position)
{
Debug.Log("我移动了");
Camel.Play("Camel_walk_slow");
Camel.speed = 1;
_Position = transform.position;
}
else
{
Camel.speed = 0;
}
将获取的手柄数值转换为二维向量,在转换为三维向量,并通过transform的Translate方法实现移动。
判断位置是否发生改变:
将玩家的位置和赋值过的三位向量进行比较,若是不相等则代表,位置发生了改变,则执行宠物进行移动的代码(Camel.Play("Camel_walk_slow");),并将移动的位置实施赋值给定义的三维向量。
在移动的时候宠物动画速度正常进行(Camel.speed = 1;)
在停止移动时将宠物动画的播放速度变成0,及时停止动画的运行(Camel.speed = 0;)
三:绑定
注意!!!!
脚本编辑好之后,需要将脚本挂载玩家的上面。