Unity Animancer插件基本使用
Posted 夜槿笙歌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity Animancer插件基本使用相关的知识,希望对你有一定的参考价值。
Animancer是什么?资源商店主页
一、快速播放
我们来通过Animancer实现一个最基本的动画播放效果。
首先创建一个脚本PlayAnimationOnEnable
,编写如下代码
public AnimancerComponent animancer;
public AnimationClip clip;
private void OnEnable()
animancer.Play(clip);
很容易理解,就是在OnEnable()
时播放一个指定的动画片段。
接下来为角色添加Animator
、Animancer Component
和刚刚编写的PlayAnimationOnEnable
,并为字段赋值
接下来运行游戏就可以看到效果了
此时角色身上的Animancer Component
组件可以看到当前动画的各项参数
二、基础移动
下面我们来实现通过按键控制角色在Idle
于Walk
之间转换。
新创建一个脚本BaseMovement
。在代码中监听Y轴上的输入。然后根据监听到的数值判断角色状态,并播放相应的动画
public AnimancerComponent animancer;
public AnimationClip idle;
public AnimationClip walk;
private void Update()
float y = Input.GetAxis("Vertical");
animancer.Play(y > 0.1f ? walk : idle);
给对应字段赋值后,启动游戏看下效果
三、基础动作
下面来实现一个开枪效果。在默认状态下,角色处于Idle
状态,当点击鼠标左键时,角色进入射击状态,射击完成后再返回Idle
状态。
首先创建一个脚本BasicAction
,编写如下代码。这里通过动画播放完成后的回调事件,使角色返回Idle
状态
public AnimancerComponent animancer;
public AnimationClip idle;
public AnimationClip shoot;
private void OnEnable()
animancer.Play(idle);
private void Update()
if (Input.GetMouseButtonDown(0))
var state = animancer.Play(shoot);
state.Events.OnEnd = OnEnable;
看下效果
此时我们必须等待射击动画播放完成才能再次射击,这是因为Animancer
在动画播放过程中并不会重新执行Play()
。解决方法也很简单,只需要在Play()
执行后将状态的Time
设置为0即可
// ...
private void Update()
if (Input.GetMouseButtonDown(0))
var state = animancer.Play(shoot);
state.Time = 0;
state.Events.OnEnd = OnEnable;
看下效果
四、过渡
前面的射击动画由于不存在过渡,看起来很生硬,所以接下来我们给动画添加上过渡效果。
添加过渡效果非常简单,只需要在Play()
方法中添加一个过渡时间的参数(Lite版只允许设置为0.25)
public AnimancerComponent animancer;
public AnimationClip idle;
public AnimationClip shoot;
private void OnEnable()
animancer.Play(idle,0.25f);
private void Update()
if (Input.GetMouseButtonDown(0))
var state = animancer.Play(shoot,0.25f);
state.Time = 0;
state.Events.OnEnd = OnEnable;
看下效果
另外,Play()
方法还可以设置第三个参数,用来指定淡入淡出的模式。将其设置为FadeMode.FromStart
可以使动画始终从开始淡入。这样一来也就不需要设置Time
为0了。
// ...
private void Update()
if (Input.GetMouseButtonDown(0))
var state = animancer.Play(shoot,0.25f,FadeMode.FromStart);
state.Events.OnEnd = OnEnable;
在前面的示例中,我们使用的都是AnimationClip
接收动画剪辑。但这种方式对于过渡时的各项参数不够直观。Animancer
为我们封装了一个更加实用的类型ClipTransition
。我们只需要将脚本中的AnimationClip
换成ClipTransition
,即可在检视面板中直观地看到和设置动画的各项过渡参数
此外,ClipTransition
还可以允许我们对单个的动画剪辑设置触发事件
public AnimancerComponent animancer;
public ClipTransition idle;
public ClipTransition shoot;
private void OnEnable()
// 直接在动画剪辑上绑定事件
shoot.Events.OnEnd = OnShootEnd;
animancer.Play(idle);
private void OnShootEnd()
animancer.Play(idle);
private void Update()
if (Input.GetMouseButtonDown(0))
animancer.Play(shoot);
五、综合应用
下面通过一个案例来对前面的内容进行串联。我们需要通过一个有限状态机来控制角色在行走、待机、射击状态之间切换。创建一个脚本BasicCharacter
并编写如下代码
public AnimancerComponent animancer;
public ClipTransition idle;
public ClipTransition shoot;
public ClipTransition walk;
/// <summary>
/// 角色状态
/// </summary>
private enum PlayerState
Move,
Shoot
private PlayerState _curState;
private void OnEnable()
_curState = PlayerState.Move;
shoot.Events.OnEnd = OnShootEnd;
/// <summary>
/// 射击结束回调
/// </summary>
private void OnShootEnd()
_curState = PlayerState.Move;
/// <summary>
/// 移动
/// </summary>
private void Move()
_curState = PlayerState.Move;
float y = Input.GetAxis("Vertical");
animancer.Play(y > 0.1f ? walk : idle);
/// <summary>
/// 射击
/// </summary>
private void Shoot()
if (Input.GetMouseButtonDown(0))
_curState = PlayerState.Shoot;
animancer.Play(shoot);
private void Update()
switch (_curState)
case PlayerState.Move:
Move();
Shoot();
break;
case PlayerState.Shoot:
Shoot();
break;
代码很简单,来看下效果
六、参考资料
[1]. https://kybernetik.com.au/animancer/docs/
Unity Rain Ai 插件基本使用
1.下载安装Rain 插件
原先可以在unity的Asset Stroe 下载到,但是现在Rain 的开发公司因为人工智能的发展,公司得到投资,所以下架了rain插件。
所以我给出网盘链接
链接:https://share.weiyun.com/5BKFvOn 密码:wsikw8
链接失效请联系我。
2.向指定目标移动
导入后可以看到在顶部已经有了RAIN
创建一个地板和一个Ai对象如图:
选择要操作的Ai对象,创建AI子物体
我们可以看到AI自物件上有这么一个组件
参数如下:
AI:当前这个rain 控制器的名字
Body:所控制的物体
Mind:思考方式(免费版只有BasicMind)
Behavior Tree :使用的行为树
Open Behavior Editor:打开行为树编辑窗口
3.让物体到达我们指定的点
我们打开行为树编辑窗口
Behavior Tree :当前的行为树
我们先创建一棵行为树(点击框,选create),给行为树一个名字(注意不能输入中文)
rain会为我们创建1个root默认节点(默认是SEQ[依次执行其子节点]),不懂的请自己查询行为树节点类型
创建一个move的子节点
我们发现我们缺少一个移动target
如图创建一个导航目标
修改导航目标名称为tar1
我们可以点击这个按钮使tar1沉降到plan上
在行为树上设置目标(注意:一定要+"")
face target 就是面向的方向
为AI物件指定使用的行为树
点击运行,我们看到缓缓移动到目标点,且下面行为树,颜色从运行中(黄色)到运行成功(绿色)
3.沿着指定路径移动
如图创建route 路径
在创建的route对象上 点击增加新路点,并将Waypoint Route对象改名为Route
创建如图所示的行为树
注意我框住的2个内容,i表示迭代变量(当前路点)
在move节点中设置对应的目标
因为我设置的是pingpong运动所以会来回往复。
4.智能规避障碍物
我们在中间放一个障碍物我们发现它直接穿透了,这不是我们想要的效果。
创建一个导航网格,使其能包住我们需要运算的场景。
点击生成网格
运行后发现已经比较完美的绕开障碍物了。
希望这个教程对您有所帮助,谢谢!
以上是关于Unity Animancer插件基本使用的主要内容,如果未能解决你的问题,请参考以下文章
Unity安装配置Python使用protobuf转换Excel表格数据并在unit中使用
Unity安装配置Python使用protobuf转换Excel表格数据并在unit中使用