在上一篇《游戏诞生之日01 - 美术篇 快速搭建和渲染游戏的第一个场景》里,我们得到了一个静态渲染的游戏场景。

接下来我们需要加入人物动画,为游戏注入活力。

第五块拼图 - 动画素材从哪里来

动画文件中包含了很多关键帧,计算机根据当前时间对这些关键帧进行插值,形成了人物或物体的动画。创作动画的过程就是创作关键帧的过程。

动画的创作是一个需要经验积累的过程,需要了解动画原理,并且对创作对象进行充分地进行观察和尝试。这不够轻量,我们首先要先建立一条最短路径。

如果你看过前一篇文章的话,你能猜出我们将怎么做:充分利用已经有的资源库,先让人物跑起来,有需要的话后期再进行迭代

Mixamo动作库

Mixamo 就是一个免费的动作库,支持自动蒙皮和绑骨,动画文件直接在网页上就能进行预览。这正是我们想要的。

Mixamo网站

我们可以上传自己的模型,然后选择任意动作后在网页上预览动作,此外还能修改一些预设的参数如步幅,播放速度等。当调整完成后选择下载就可以将动画下载到本地。

下载的动画素材

这样就得到了一系列动画素材了。

骨骼规范

模型库的动画使用的模型和我上传的模型,初始姿势不一样,手脚长度不一样,怎么做到将对应动画应用到对应位置的呢?

这就涉及到骨骼规范的问题。模型师在制作模型的过程中会遵循一系列的命名和父子排布规则来建立骨骼。当动画系统识别到对应骨骼之后,会进行动画重定向,即将动画的运动范围依据骨骼的长度进行缩放,以便让一个小矮人的动画也能通用到巨人身上。这在动作捕捉的流程中也是很重要的。

例如之前下载的 POLYGON - City Pack 资源中,模型就是标准的人物骨骼,如果将Standard Assets中的动画控制器赋予人物,就直接能应用其中的动画。

人物骨骼

在Unity中有两套Avatar系统,人形动画系统Humanoid,以及通用动画系统Generic。对于一些非人形骨骼的怪物,或是有特殊定制的人物,会选择Generic通用动画系统,而我这里则选择更加直观的Humanoid人形动画系统。

Humanoid

自定义模型动画

除了识别人物身上自带的骨骼,Mixamo还有一个强大的功能:自动蒙皮绑骨。这对于想要对模型进行自定义的开发者来说,真是好消息。手动刷蒙皮真是一件很繁琐的工作。

为了测试自动蒙皮绑骨,我在3dsMax中将模型的骨骼全部删除,再简单地建了立方体和圆环,作为测试模型的帽子和手镯。

导入Mixamo 选择关节

将自定义的模型上传Mixamo,拖动圆环到颈部,四肢的关节处,然后网站自动进行解算。

自定义模型动画

可见自动蒙皮绑骨的效果也很不错,甚至手指也的动画也很自然。这为未来的迭代中魔改人物模型提供了可能性。

第五块拼图 - 动画素材 蒙皮绑骨 Mixamo网站

  • 付出成本: 1
  • 上手难度: 1
  • 可控性: 3
  • 表现效果: 6
  • 性价比: 4.5

第六块拼图 - 如果动画库里没有的动作呢

我们有了一段段的循环动画片段,但目前还存在几个问题:

  1. 动画库可能缺少我们想要的动作。
  2. 每个动画片段的初始位置并不一样,播放时直接切换片段会显得非常生硬。
  3. 有些特殊需求无法满足,如上身保持射击姿势,下身依据玩家输入走走停停。

我们可以使用混合动画片段来解决这些问题。相比从零开始创造出一个新的动画而言,混合动画要容易得多。

动画片段管理:动画状态机 Animator

动画控制器(Animator Controller)是Unity提供的动画切换解决方案。在Animator中每一个动画片段被视为一种状态,一个Animator则构成一个状态机。

我们使用Animator就可以实现动画的插值过渡混合

Animator

如上图,图中包含了角色在地面的状态,在空中的状态,下蹲的状态。当动画机启动时默认进入在地面上的状态,三个状态间可以相互切换。

过渡不同的动作姿势:动画过渡 Animation Transition

不同的动画可以顺着Transition的连线自动插值过渡,这样就实现了动作间的平滑切换。我们可以在Animator中任意连接Transition,并且在属性窗口中,可以对过渡动画时间,状态变化条件等属性进行设置。

过渡箭头的属性
状态切换

如上图,当Animator的参数发生改变后,状态也随之改变。人物也就随之做出平滑的过渡动画了。

混合不同的动作片段:混合树 BlendTree

如果我们想要的动作并非一个渐入渐出的过渡,而是两个动画的叠加状态,例如:

0.4 * 走路 + 0.6 * 跑步 = 快步走路动画

我们可以使用混合树对两个动作进行混合,用速度作为混合权重,就得到了走路状态逐渐加速至跑步状态的动画。

简单地混合走路和跑步动画

不仅仅走路的跑步这样的动画可以混合,像是走路的拳击这样不相干的动画同样可以进行混合,说不定还会有意外收获。

除了使用速度作为权重值的1D混合树,我们还可以使用速度+方向作为权重值,用2D混合树混合出更复杂的结果。

2D混合树示例

如上图,动画不仅受向前的速度影响,还受左右转向影响。属性窗口清晰地显示出动画混合树的状态空间。

每个片段仅使用一部分:动画遮罩 AvatarMask

因为我们Avatar使用了标准的Humaniod系统,就可以对一些骨骼进行屏蔽组合。

AvatarMask 屏蔽身体的骨骼
瞄准动画

例如当人物要举枪瞄准时,我们可以在原来的跑步动画上覆盖一个瞄准的上身动作。

这里还涉及到动画的层(Layers),多层动画可以进行覆盖和叠加,还可以调整每一层占的权重,上图中动画就分为了基础移动动画层与控制上身的手臂动画层。

简单地开始制作动画:反向动力学 IK

如果以上解决方案均不能得到满意的动画片段,或是做一些手脚位置较为固定的动作,可以考虑使用反向动力学进行动画制作。

人物身上有很多关节和骨骼,如果使用前向动力学,每一个骨骼的位置都由父节点确定,如果要调节手臂动画就需要调节肩膀-大臂-小臂-手腕的骨骼,效率太低。而反向动力学则是先确定子骨骼的位置,再逆向确定父骨骼的位置,四个节点就可以控制人的基本姿态,调节起来更加轻松快速。

要使用反向动力学,需要自己挂载一个代码脚本,想了解更多可以参考博客《Unity IK 反动力学动画》。

public class IKTest : MonoBehaviour
{//我们的目标胶囊体public Transform Target;//获取要操作的animatorpublic Animator Animator;//unity自带的ik方法,开启ik通道会执行private void OnAnimatorIK(int layerIndex){//设置右脚骨骼的权重,0-1,可自行改变查看效果Animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1f);Animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1f);//设置右脚骨骼的ik目标为胶囊体的坐标和旋转Animator.SetIKPosition(AvatarIKGoal.RightFoot, Target.position);Animator.SetIKRotation(AvatarIKGoal.RightFoot, Target.rotation);}
}

反向动力学 示例

我想这些解决方案组合起来,已经足够应付一般的运动和演出了,是时候该继续往下走了。

第六块拼图 - 动画二次编辑 Unity动画系统

  • 付出成本: 3
  • 上手难度: 2
  • 可控性: 4
  • 表现效果: 5
  • 性价比: 1.8

第七块拼图 - 怎么结合到人物控制中

这里会稍稍引入一些程序的简单知识,以保证理解的连贯性。

我们在控制人物时经常需要和动画系统进行交互,考虑下面两个常见的场景:

  1. 当用户输入前进指令的时候,人物向前移动,播放向前的动画。
  2. 玩家点击鼠标时,播放掏枪射击动画,玩家射出子弹。

分析这其中的逻辑关系,可以分为两类情形:

程序传递消息到动画系统

如在用户输入前进命令或射击命令时,程序需要告诉动画系统播放哪一段动画,在Animator中,这是通过状态机的Parameter参数来实现的。步骤是这样的:

检测到程序输入 -> 程序设置状态机的参数-> 动画播放完成(或动画不需要退出时间) -> 判断过渡箭头的条件 -> 依据条件切换状态

我们可以用以下接口来实现这个消息传递。

Animator.SetBool(string ParameterName, bool ParameterValue);

动画系统传递消息到程序

有一些反馈并不是即时的,需要依靠动画系统时间来进行触发。例如用户点击鼠标后到人物掏出枪射击是有一定延迟的。点击鼠标仅仅是告诉动画系统要播放射击动画,而射击事件则需要动画系统在射击那一帧进行触发。同类的事件还可能存在于格斗游戏的连招,或是动作游戏的弹反机制中。

动画系统传递消息的机制是AnimationEvent,使用这样的方式能够实现恰好在射击那一帧发射出子弹,更加真实可信。

制作人物控制器可以参考Unity的示例项目Standard Assets,或是AngryBots2。为了通用AI和玩家的动画逻辑控制,建议将接收输入与动画控制拆分为两部分。

在Unity中快速制作人物动画https://www.zhihu.com/video/1176986907514454016

这样就完成了基本的人物动画。人物动画是GamePlay的重要构成部分,还有很多地方值得挖掘,我们到适当的时机再继续深入。

第七块拼图 - 人物控制 第一/第三人称控制器

  • 付出成本: 3
  • 上手难度: 2
  • 可控性: 4
  • 表现效果: 5
  • 性价比: 1.8

我们又新增三块拼图,现在能够做出一个可动的场景了。但是为了完成场景的交互,以进一步实现游戏的玩法设计,我们还需要引入更多的模块。

思维导图

下一章打算研究一下特效和物理相关的话题,做出更为可信的效果,敬请期待。

这一系列文章将会收藏于专栏之中,希望大家多多支持。

游戏诞生之日 - 游戏开发流程研究​zhuanlan.zhihu.com

只要对游戏开发有兴趣,欢迎加入交流群 Unity游戏开发流程研究 479984340

unity人物旋转移动代码_游戏诞生之日02 - 美术篇 快速制作人物动画相关推荐

  1. unity人物旋转移动代码_求教,人物控制,视角随鼠标移动,且绕角色旋转。

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 小弟是美工,刚接触编脚本没几天,今天试着修改了一下unity3d 自带的视角控制脚本MouseLook.cs 其中第45行是小弟添加的,实现了绕角色旋转的 ...

  2. unity人物旋转移动代码_Unity3D实现人物移动示例

    一个是通过W.A.S.D来移动人物(示例一),另个是按屏幕上的按钮来移动人物(示例二).很简单,只改了几行代码. 下面是"Assets"文件夹里面的资源. 示例一: using S ...

  3. matlab将图片旋转的代码_空间曲线绕空间直线旋转生成的旋转曲面方程

    校内建模的一道题,虽然我认为这么trivial的东西前人早就造好轮子了,但是找遍所有能找到的网络资料.文献都没找到答案,只好自己造了个轮子. 设空间曲线 : 绕 : 旋转得到的曲面方程为 ,则 的方程 ...

  4. unity人物旋转移动代码_Unity3D研究院之脚本实现模型的平移与旋转(六)

    123 说: 雨松大大,有个问题想请教一下,我用UNET构建了个小场景,在电脑上可以客户端可以连接到服务器,Windows和Linux都可以,发布到安卓缺连不了,这是问什么呢 说: 求教一下,刚刚接触 ...

  5. intitle:客服机器人代码_游戏客服能影响企业发展?千万别大意

    对于长期处在客服岗位上的人来说,扛着负能量,冲到前线去解决玩家的问题,去挽救失陷的口碑,已经成为了工作日常,而这么一帮对游戏发展.用户留存起到重要作用的人,却常常被玩家当成了"机器人&quo ...

  6. matlab将图片旋转的代码_【MATLAB】钟表

    文章来源于我的B站专栏: MATLAB实现钟表​www.bilibili.com GIF:最终效果 整个实现的是在figure内直接通过line.text.circle绘制表盘.刻度.数字.指针(时针 ...

  7. matlab将图片旋转的代码_基于Matlab的PMSM模型初探

    本文首发自微信公众号"汽车技术馆"! 随着新能源车辆的普及,电机的控制技术逐渐成为了热门的话题,尤其是目前在电机上普遍使用的永磁同步PMSM技术,其实不止是新能源的电机驱动使用了这 ...

  8. matlab将图片旋转的代码_我的MATLAB魔方新玩法:拼出任意图案!

    更新: 添加代码链接:nkyang/MagicCube 有时间的话,会陆续把之前文章的代码都整理好了传到github上去,这样个人文章里面就不会出现代码,文章可读性更好. 我又回来更新了,在上一次的文 ...

  9. 反恐精英代码_游戏《反恐精英:全球攻势》《军团要塞2》源代码遭泄露

    据外媒报道,两款热门游戏<反恐精英:全球攻势>和<军团要塞2>的源代码被泄露.这两种第一人称射击游戏都非常受用户欢迎,据统计全球有3亿玩家在玩CS:GO. 事件发生后,引发了许 ...

最新文章

  1. Python学习day5作业-ATM和购物商城
  2. 雷蛇键盘灯光配置文件_指尖的流光溢彩,雷蛇黑寡妇蜘蛛V3竞技版开箱
  3. unite testing
  4. python 值传递还是引用传递_python函数是值传递还是引用传递
  5. boost::describe模块实现打印功能的测试程序
  6. usbserials
  7. 前端学习(764):创建对象的三种方式
  8. NullPointerException的处理新方式,Java14真的太香了
  9. python序列化模块struct_Python-序列化模块-json-62
  10. 小程序组件的使用(一)创建组件
  11. jquery操作radio,checkbox
  12. Linux中重定向的实验总结,Linux中重定向命令行的总结
  13. 20个PCB快捷键操作,提升绘图效率
  14. java action 参数_Structs复习 Action传递参数
  15. ImageIO 先read再write 文件变小了
  16. android p 小米6,小米6 想升级 Android P,系统软件工程师发话:可适配
  17. 2021年中国化妆品发展现状及进出口状况分析:消费升级局面下,化妆品市场依旧景气 [图]
  18. 3d卷积神经网络应用,神经网络仿真软件
  19. labview振动,声音分析软件,提供源代码。
  20. 如何在 React Component 之外获取 Redux Store

热门文章

  1. Swift之从SIL深入分析函数的派发机制
  2. iOS经典面试题之使用runtime associate方法关联的对象释放及dealloc底层原理
  3. 1.3 Hive架构原理
  4. 2013\Province_C_C++_A\4.颠倒的价牌
  5. 7.3.2 非阻塞IO(non-blocking IO)
  6. PAT (Basic Level) Practice (中文)1010 一元多项式求导 (25 分)
  7. The SetStack Computer
  8. 【C/C++9】天气APP:Oracle的虚表/日期/序列,索引/视图/链路/同义词,数据库高可用性
  9. 【机器视觉】Qt联合Halcon编程之显示图片
  10. 【Protocol Buffer】Protocol Buffer入门教程(八):Windows平台部署Protobuf环境