ai怎样导出所选部分_【项目记录】《三弦》开发日志2 - 人物动画及AI

26c700fe42a3effbb353e544f1621e4f.png

这周更新了一下人物动画。参考Unity自带的ThirdPersonCharacter样例,人物的控制分为两层,第一层为动画控制,直接对 Animator的参数进行更改,控制人物的动画;第二层为AI控制,进行人物的决策控制,并输出指令利用第一层的控制系统对角色进行控制。粗略的简单层级关系图如下所示:

e2dc1aa93ddad20044a0ebd2d9c9bca3.png

下面记录一下具体实现的步骤。

骨骼绑定+动画

这里使用了Mixamo,一个带自动骨骼绑定功能的动画库(需要Adobe Creative Cloud会员)。

在Maya中把模型导出为FBX,以下是当时的选项(关闭了Animation,并勾选了若干输出选项)。

c6202d6f9430067841d89871f5197983.png

导出模型后,登陆http://www.mixamo.com,点击Upload Character上传模型。在上传过程中遇到过几次失败,尝试调整FBX导出选项(如果操作得当的话,模型的材质,BlendShape都是可以保留的)。上传成功后,需要手动标注一些重要关节点的位置。如下图所示,其中的带有颜色的圈圈即为需要手动调整的部分。

e63943d191bebc206072625d0492ff1b.png

设定完成后,按Next,系统就会自动进行骨骼绑定。当然绑好的带人骨骼的模型也是可以直接上传的。完成绑定之后,就可以在动画库中挑选所需要的动画了。基本的动画这里面还是比较齐全的,而且基本都是mocap的动画,效果非常自然。下图中,左侧为动画库搜索栏,右侧为人物动画演示;最右端为一些动画的微调,但是够调节的东西十分有限。

5f114dd7d29d6b249b01c5a66d62d901.png

选择好动画后点击下载,然后选择好下载的格式即可。

a4f9fa0a8006fa54319db2b5494fdd88.png

下载完成后导入Unity中,在Rig一栏最好选择Humanoid来支持人物动画的混用。Avator需要选上,这里选的是CreateFromThisModel,来支持动画更改gameobject的坐标。

1018a82a4f6cd920ef210ff4c4e2db7b.png

在Animations一栏中选择好动画的起始终止帧。勾选LoopTime表示动画会循环播放。另外如果在上一步定义了Avator的话,在这一步会显示loop match,如果动画有行走或者转向这里的绿灯会变红。所以变红并不是说明动画有错误,而是告诉开发者动画将会改变模型的哪方面的数值。

3e17ce8416914289fe6859141a3f54f3.png

Animator设计

Unity自带的ThirdPersonCharacter实现了最基础的动画状态机,我以此为基础,增加了一substate,命名为Action用于加入自定义的动画:

fa470ec200b2df002da40405aef7438b.png

事实上Animator的设计,根据角色动画的需要可以有很多不同的样式。这里放一个我觉得做得比较好的例子:

268ba6b3d809b1246ba23b1a0043b010.png

状态机如上,基本的陆地行走(Locomotion),空中动画(Fall)和跳跃动画(Jump)之外还增加了游泳(Swim)动画。Locomotion为一个BlendTree,设计如下:

8ff6d23625d3cdd8ed19144001cc1cd8.png

红点所在位置为Idle动画,往上走分别是由慢到快的行走动画,总共有四个层级,左右两边是选择动画,下方是向后走的动画。一个行走的状态已经使用了20个动画了。

7aa294b71bfd76977a06a15751a1355f.png

另外还有在死亡,受伤,进行攻击时触发的动画。

e6260bf4a93b8d201316801dee0bfded.png

以受伤动画为例,来自不同方向的伤害会播放不同的动画。

不过由于我们游戏里的人物没有那么复杂的状态,所以基本的动画系统即可。

动画控制层级设计

这里直接使用的是Unity 源生的ThirdPersonCharacter.cs的代码。

人物AI设计

人物的AI一般可以用一个状态机来表示,我设计的人物状态机如下:

7c6c03e0bb7d1b66da34fafb0732ea5a.png

一开始人物在喝酒(Drinking),在玩家与之对话之后,会与玩家争吵(Argument),之后会追逐(Chase)玩家。判定追上,会攻击玩家(Hit),然后进入缓冲状态(Wait),之后重新开始追逐玩家。

由于有了上一级的动画控制代码,在这里只需要进行代码的调用而不用触碰动画本身了。比如Chase状态的Update代码如下:

m_stateMachine.AddUpdate (State.Chase, delegate {
        // Move toward the MainCharacter
	Vector3 toward = MainCharacter.Instance.transform.position - transform.position ;
        // Call the Move function from the previous level
        m_character.Move( (toward.normalized + avoidObstacle ) * speed , false , false );
	
        // Check if you can Hit the Main Character
        if ( CheckMCInFront())
		m_stateMachine.State = State.Hit;
});

把各种零部件拼装好后,一个带有AI的角色也就完成了

测试

放到场景中看一下效果:

45ad7830ce535bf55fe91329131390d4.png

开始是一个在喝酒的糟老头。

4ca2f3e123ae059569225f76d6161f46.png

交谈后会站起来,开始追逐玩家。

60871cd1b42e712662e59fbd5694b3d0.png

抓到玩家后会来一记右勾拳。

嗯,大概就是这么一个效果啦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值