| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> Unity快速入门之四 - Unity模型动画相关 -> 正文阅读 |
|
[游戏开发]Unity快速入门之四 - Unity模型动画相关 |
目录 版本:Unity 2020.3.17 本篇主题:了解Unity模型动画相关内容 快速入门,所以只能涉及到一些主要部分,并不能面面俱到,以比较能快速上手的方式理解和简单使用unity的模型动画功能,以及插件。以FBX与Generic类型的骨骼蒙皮动画为主要叙述,其他捎带。 官方链接:模型 - Unity 手册 3D资源文件-模型与动画基本概念 ????????首先,我们得知道,3d游戏中,我们说到一个模型动画的时候,包含两个部分,一个是模型,一个是动画,都来自于.fbx格式文件,或其他支持的格式文件:模型文件格式 - Unity 手册。本篇是以.fbx格式文件为叙述。 ? ? ? ? 模型基本组成是网格:网格 - Unity 手册。网格是指的由顶点组成三角片,再由三角片组成整个可见外观的数据集合。而一个模型可以包含多个这样的集合。比如人,如果需要,我们可以把身体、四肢、头都拆成单独的网格,并形成一个统一的.fbx文件。当然,如无必要,尽量不要拆分这么多网格。 引用参考,可以了解相关的更多概念,入门可以直接跳过,全部可能劝退:
资源常见的划分与命名方式 ? ? ? ? 通常,我们会将模型数据文件单独导成一个.fbx,而将其他的动画文件也导成独立的.fbx。分别按照model_name.fbx和model_name@animation_name.fbx的形式进行命名,则动画.fbx文件会自动生成一个内置的 animation_name.anim?动画剪辑组件,可供后续的 Animator组件使用。这些概念后面还会提到。 模型与动画类型?基础概念与使用场景 ? ? ? ?从Unity的角度来讲,模型动画类型有三种分别是 Legacy、Generic、Humanoid。Legacy基本是在被舍弃了,用的多的是Generic和Humanoid。而从程序的角度来讲模型动画是:顶点动画、蒙皮骨骼动画等等分类。 Unity Generic与Humanoid的若干基础点除盲:
常见的几种程序和美术意义上的动画类型:
模型导入设置官方链接: ????????模型导入每个参数的概念,在官方文档中其实都有列出来,但是可能对于部分参数,没有了解过的同学可能不太清楚用处,我就可能产生疑问的地方稍加说明。 ????????导入设置需要注意两点,一个是 Import类型参数,一个是非 Import类型参数,顾名思义,import参数是由外部导入的,而非 import基本都是Unity自身相关的。 Model?Scene: ? ? ? ? 这个标签下的参数,大部分跟3D资源导入Unity是有相互关系的。
? ? ? ? 跟导出FBX软件的设置有关,这里有一篇对比描述: Unity与3ds Max的单位关系(使用FBX文件)_a1780531的博客-CSDN博客_unity和3dmax单位比例
????????跟导出FBX软件的设置有关,轴转化烘焙,物件或模型的轴线信息不改变。由于一般我们在游戏中的角色或其他物体控制,是由游戏逻辑决定的,所以不由动画控制。
????????跟导出FBX软件的设置有关,是否使用混合形状。动画的实现方式有多种,骨骼动画是一种,混合动画也是一种,前面提到了。
? ? ? ? 跟导出FBX软件的设置有关,一般我们会选择在Unity内实现.
Mesh: ? ? ? ? 这个标签下的参数,基本跟Unity自身优化相关。
? ? ? ? 这个表明,是否在FBX模型导入时就决定使用碰撞,但是游戏一般会根据情况使用不同的特定碰撞体,而非原身的: 【unity】给物体加上collider碰撞器,以及触发的OnCollisionEnter等碰撞方法_冰冷的希望的博客-CSDN博客_unity 添加碰撞器 Geometry: ? ? ? ? 这个标签下的参数,基本大部分需要美术和渲染或TA程序参与讨论决定。
????????使用曲面细分函数时才需要开启。
? ? ? ? Unity默认优化即可,这篇文章的例子不使用BlendShape。
? ? ? ? 法线一般会由项目的渲染程序或者TA负责,一般也会在自己的项目中制定自己标准的材质,所以一般都是Import。Normals Mode默认即可。
? ? ? ? 跟导出FBX软件的设置有关,平滑组参数,默认即可,尽量使用模型文件中平滑组。Smoothing Angle 仅当 Normals = Calculate 时有效。
? ? ? ? 同样,切线、UI、光照贴图,也是需要跟渲染或TA讨论后才能确定。 Rig
? ? ? ? 这里我们来讲讲,Avatar Defintion的一个比较大的用处是用于 RootMotion,这个后面我们下面再细讲,跟预制上的组件相关。做根运动,是必须要这个东西的,但是游戏中很多时候并不需要根运动。 ? ? ? ? 而Skin Weights,默认是4根,这个骨骼蒙皮动画中,蒙皮受骨骼影响的数量,多了也会影响性能,这里必须要跟做动作的美术约定清楚,以免后面播放出现问题或重新绑定蒙皮。 Materials? ? ? ? 由于Animation内容比较多,换个顺序,先说下Material。 ? ? ? ? ?因为我们大多数材质都是项目项目定制,除非是做Demo掩饰,所以一般都是None,在项目预制中对模型材质进行处理。 Animation? ? ? ? 好了,另一个大头来了,Animation动画,首先,开始我们讲了,我们一般使模型和模型的动画分别单独导成独立的.fbx文件。当我们 Import Animation时可以看出明显的差别,看下面两个图: ? ? ? ? ?所以在独立的FBX模型文件中,如果Import Animation是看不到其他任何信息的,很好区分,需要注意。所以模型一般不勾选。 ????????而在本篇中,我们一个动画.fbx文件,一般是一个完整的动作,与模型分别导出。那么上面这个绿色三角标志的idle,就是一个包含60帧的等待动画剪辑。 特定资源属性:
????????跟导出FBX软件的设置有关,不做相关约束,这个Unity特性其实感觉有点鸡肋了,实际操作意义不大,约束 - Unity 手册
?????????跟导出FBX软件的设置有关,将美术软件中IK转为FK,好处肯定就是降低运算量了,坏处也明显,内存增加,而且不一定满足实际的逻辑表现要求。一般不需要,如果要做IK,会选择在运行时使用IK库。
? ? ? ? 曲线采样,一般都会使用,将欧拉旋转转化为四元数,除非你的表现出现了问题,才会禁止:欧拉曲线重新采样 - Unity 手册
? ? ? ? 这是针对动画剪辑的压缩,也是性能与表现的取舍问题,需要和美术或策划商量,而下面三个Error,是指的在采用压缩的情况下对平移旋转缩放关键帧的取舍算法问题,一般会需要美术动作同学根据实际情况去调整。
剪辑选择列表: ????????由于是一个.fbx对应一个Animation Clip,一个Clip对应一个.anim文件,所以此处一个动作基本是从0帧开始到满帧结束。当然,这里的方案有很多,比如有多个动画,放在了同一个.fbx文件中,这里就可以手动来切分创建多个Clip。 ? ? ? ? 再重复提到一点,因为Unity自己做了导入处理,当导入的动画文件名称命名为 model_name@animation_name.fbx时,会自动创建一个 animation_name.anim文件在.fbx的展开内容中可以看到,并用于Animator组件中。 特定剪辑属性: ? ? ? ? ?反应的是当前这个.fbx文件内,动画的总帧数。其帧数 >= Clip帧数。 循环与姿势控制:
展开部分:
组件Mesh? ? ? ? 在前面提到网格概念的时候,说到了一个模型是可以由多个网格组成的。而Unity中与网格一一对应的组件就是 MeshFilter+MeshRenderer(不带蒙皮)或 SkinnedMeshRenderer(带蒙皮):
而一旦我们把模型文件转成了预制,就可以在Inspector面板上看到,对应的骨骼节点和对应网格的Renderer: Animator?? ? ? ? 动画系统组件,用于在游戏中播放动画,动画 - Unity 手册。这里参数细节就不解释了,文档很清楚,它的作用就是对动画控制的一个集合。一般我们在模型预制之上会加入一个Animator用来控制动画的播放。 Animator Controller? ? ? ? 它是动画控制器,也是状态机,用于游戏中动画表现逻辑,具体用法,参见文档了:Animator Controllers - Unity 手册 btw:有的时候,并不会完全使用AnimatorContrroler提供的状态机管理功能,因为状态机的框架可以是独立的,只需要动画控制器能够播放对应的动画就足够了。所以AnimatorController具体怎么使用,依赖项目框架,没有定准,然后我们可以把它设置到Animator组件之下。至于下面的参数,暂时先保持不动吧,可以查看文档,也比较清楚。 ?Animation Clip? ? ? ? 动画剪辑,对应的是动画.fbx文件。前面模型导入过程中也提到过了,不记得了看到 Animation部分。官方文档:动画剪辑 - Unity 手册。 ? ? ? ? 我们可以在上面说到的AnimatorController中,创建一个状态,命名为“Idle”,并将Idle的动画剪辑设置进去: ?????????然后我们创建一个空脚本挂到预制上: ?????????加上一行代码,就可以播放了: ?????????中间省略了很多扩展的操作,比如blendtree,transition等等,但是对于基本的从导入到组件构成和基本播放都涵盖了。对于了解Unity的模型动画是个什么,和怎么用有个基本概念。
Humanoid Bake|RootMotion|Script? ? ? ? 基本导入配置调整为: ? ? ? ? 则可以在Animation看到: ? ? ? ? ?这里会多出三个 Root Transform XXX 选项。这里最主要的选项在于 Bake Into Pose 选项,一旦勾选,就意味着,假如说在动画软件中,做动画时就自带了 XYZ位置变化以及旋转变化时,那么在游戏中播动画时,就会表现出位移,但是播完动画后,就会被拉回原点。否则,游戏中播放动画,不会有位移表现,只是原地动作。 ? ? ? ? 但是一旦我们勾选了,预制体中,Animator组件的 Apply Root Motion 选项,则没有标记Bake Into Pose 的选项就会目标对象根据动画的变化发生实际位移变化。 ? ? ? ? 而一旦我们在其挂在脚本中实现了 OnAnimatorMove等函数,又会取消 Apply Root Motion标记的影响。 ? ? ? ? 如果既想要Root Motion生效,按照动画产生实时实际位移,又想要实现 OnAnimatorMove获得实时位置信息,则可以手动调用 Animator.ApplyBuiltinRootMotion()接口进行实现。 ? ? ? ? 这样说太抽象,写个伪代码:
自动化资源文件 ? ? ? ? 当导入一个模型及其动画,到其自动化可用的最小集合,一般包括:
? ? ? ? 如果想要完整,当然还会有其他的,比如材质、贴图文件,如果使用Humanoid类型,就还会有avatar相关的资源需要规整,所以先要规划好目录,具体怎么规划,那就是项目具体情况而定了。 自动化导入 ? ? ? ? 使用?AssetPostprocessor 类,继承这个类,并使用?OnPreprocessModel 接口进行处理模型与动画文件导入,用?OnPostprocessAllAssets 接口处理预制、动画等内容。当然还有其他接口,不过这里是一个方案罢了,下面列下可能会用到的参考,代码就不放了:
插件反向动力学 ????????再扩展一下,IK,反向动力学,也就是说,动画是在导入的动画基础之上(正向动力学),在游戏中通过与场景元素的交互,实时调整动画状态。 ????????如果我们要使用IK,Unity的Humanoid类型,是内置了IK API的,但是实现完全依赖于自身,所以除非自己的项目需要攻克这一部分,大概率是使用其他的IK插件了,这里推荐一下FinalIK,这个插件比较全,基本上常用的行走、看向这些IK都是可以一键搞定的。也支持Generic和Humanoid类型。 动态骨骼/布料 ? ? ? ? Dynamic Bone,Obj Cloth 也就是比如🐻、飘带、裙子的抖动之类的,会在播放动画的过程中,根据物理更加真实的反应身上物件的变化。 布娃娃 ? ? ? ? 布娃娃系统表现,比如糖豆人、动物派对那种软软的效果。 |
|
|
上一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/27 16:27:14- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |