上回写了《月白》的美术总结后,和诺娃小伙伴在评论区讨论了Aseprite动画与Unity实时同步的流程,发现可以就这个主题再分享一些浅薄的经验。
尽管Aseprite提供了非常丰富的导出设置(详见风农翻译的教程),但在导入unity时,依旧需要经过许多手动步骤,例如设置图像属性,切图,生成animation clip,一旦源文件有了较大改动,这些步骤可能就会重复多次。这还不包括使用animator设置动画切换逻辑,一旦动画变得复杂,整个迭代流程就会很费劲。
教程视频
在2021.3.34以后的unity可以识别aseprite文件,支持拖拽到场景中生成game object,自动挂载animator controller与animation clip(按照aseprite tag分类),不再需要手动导出导入,如果源文件产生修改,保存后unity就会识别并更新。
特此录了两个视频供交流学习,观看前注意,此为个人向总结,适用于2D小体量游戏,不代表任何业内经验,欢迎指正。
P1:Aseprite像素动画一键导入Unity,自动生成动画序列
P2:使用代码及状态模式控制人物动画,不使用animator tigger切换人物动画(需要C#代码基础,非必需)
注意
- Aseprite文件自动生成的animator controller是只读的,一改就会报错。如果想要修改,就要在inspector面板中按export animation assets,勾选animator controller以及animation clip,但导出后的动画会失去和Aseprite源文件的同步,详见视频p1。
- 如果想要保持同步,不导出animation assets,也可以选择通过代码读取只读的animator,详见视频p2。
最后
在视频发布后,评论区有一些不同的观点,有的小伙伴觉得animator直接拉箭头好用,有的小伙伴觉得代码控制动画好用,这个见仁见智,看个人习惯哈。我的话是喜欢尽可能在代码里控制动画,减少对界面的依赖,所以把这套自己觉得好用的流程分享给大家,希望能有所帮助吧。
Run to Idle这种,隐约觉得这里或许可以在Character里通过一个类似CurrentState的set属性来对所有这类过渡状态进行识别和处理,相当于这样就把一些很细碎的东西不用单独作为一个State了,而是直接被隔离了出来,被属性这个地方做管理逻辑——尤其是只是为了播放一个临时动画的这种情况,似乎还蛮合适。
最近由 π 修改于:2024-06-12 12:27:20只不过这种思路下,按道理这种临时动画放到一个叠加动画层上是比较合适的,但由于你教程中的前提情境是 Animator是只读的,也用不了层,所以上面说的应该跟你这个教程的思路是不完美匹配的哈哈,仅作探讨了
不过你的控制器里倒是可以自己通过一些标签来标定出类似层的概念,比如 用isInTransition来判定是否正在过渡(这里等于是将RunToIdle这种过渡类动画定义为“Transition”了)
再比如被受击的时候也可以进行类似的有层感觉的定义(或许也一定程度上暗合了通常情况下Hit这类动画会被置于叠加层来管理的习惯了?)
@π:感谢阅读!
1.是的,层次状态机可以把代码变得更加易读,不然状态一多还是挺难管理的,不过我还没有研究过……《游戏编程模式》里有提到过这个概念。
2.对的,用代码控制的话不能用animator自带的叠加动画层和blender tree那些了
3.标签的想法也很不错。
谢谢提供新的思路!