游戏在unity中的资产拆解:
1. unity游戏是由场景组成
2. 场景由游戏对象组成
3. 游戏对象由组件组成
组件决定了游戏对象的功能unity提供了基础组件:
- transform-位姿组件
- light-光源组件
- camrea-相机组件
- animator-动画组件
- box collider-触发器组件
- sprite renderer-图片绘制组件
- navigation agent-导航组件
- character control-角色控制组件
- 定制化组件-mono behavior组件(脚本组件)
等等等等组件 。。。。。
人物动画骨骼白嫖工具mixamo:https://www.mixamo.com/unity
unity动画系统分为三个部分:
– 动画片段 animation clip-对物体变化形态的一种展示
– 动画状态机 animator Controller-帮助我们跟踪当前动画的播放状态,根据设置决定何时切换动画片段
– 动画组件 animator Component-管理控制动画状态机与替身,提供脚本访问动画组件的能力
– 替身 Avatar(人形动画)-人形动画的骨骼标准
动画片段本身是以YMAL语言编写,动画文件实际是一个描述物体变化的文件在unity中的大多资源文件都是YMAL文件,包括但不限于:
– 动画片段
– 动画控制器
– 预制件(perfab)
– 场景文件
动画复用
当动画对多个游戏物体/对象时,会在YMAL文件中说明动画生效的对象名称(当游戏对象的名字与文件中不一致,unity则无法正常播放)
因此面对复杂的人体动画则会使用avatar系统(即为骨骼映射)
unity内现存的几类动画类型:
1. None-不会有独立的动画片段游戏对象
2. Legacy-unity历史遗留的动画文件(暂不考虑)
3. Generic – 普通动画,面向飞禽走兽类等物体游戏对象
4. Humanoid – 人形动画
AVATAR则是unity内定义的肌肉群动画
apply root motion属性是否将动画的位移实际生效(即动画文件中的位移效果应用至场景中)
updata mode则是动画的刷新模式
* normal与 updata{} 同步,与帧数同步
* animate physics 与物理引擎同步,每次进行碰撞则计算动画方式(例如动作游戏,交互性较强)
CullingMode(剔除模式),是图形学的一个概念,只当没有被摄像机看到时是否继续执行动画
Root motion 与 rigibody的权衡利弊
root motion设计初衷,是将动画表现与实际物理变化做适配
rigibody则是真实物理碰撞
若将动画clip中的变化数据应用至rigibody驱动的游戏对象时,需要权衡利弊
animator control是unity的一种图形化动画状态管理交互界面,是控制多个动画文件播放和切换的工具
animator control同样是YAML文件
在unity中动画状态分为三种:
* 独立的动画片段
* 多个动画片段组成的blend tree
* 嵌套的另一个动画状态机
小tips:在复杂的状态机中可以使用auto live link去定位当前播放的动画
动画状态(AinamtorStateInfo)分为:
1. name
2. tag
3. Motion,管理的动画clip或者blend treespeed,相较为动画clip的播放倍速,不可在脚本内控制
4. Multiper,播放倍速变量,可由脚本控制(需关联浮点变量)
在脚本中调用动画变量时,可用hash置做匹配,unity内置的了hash转化,如下
{
int scalerHash;//变量值
Animator animator;
void Start()
{
animator = GetComponent<Animator>();
scalerHash = Animator.StringToHash("Scaler");
animator.SetFloat(scalarHash, animationScalar);
}
}
5. Motion time,选管理动画片段进度(从0→1),可由脚本控制(需关联浮点变量)
6. Mirror镜像,只对人形动画生效
7. Cycle offset,播放开始时进行进度偏移(调整动画的起始点)
Foot IK,反向动力学
由动捕捉,美术制作产生的,由骨骼根节点展开的,到肢体末梢节点依次计算其位移、旋转和缩放,最终决定每一块骨骼的位置,被成为正向动力学。
Foot IK 实际使用了IK的动画矫正机制
Unity的avatar系统,预先设置了手脚IK goal,因此带来了很多坑
Foot IK会将动画中手脚更往IK goal靠近矫正,但是不一定能满足高质量的动画需求
通过代码调整IK goal的位置,并不会调整Foot IK矫正逻辑
在脚本中调用IK需要激活IK Pass
定时炸弹 Write Defaults