Unity初级(八)

@[TOC]动画

六.动画(上)

1.一些知识

模型中包含动画,由模型师来做,我们在获得的时候就决定了模型能做什么动画Unity模型格式推荐.fbx模型在Inspector面板上类似Prefab模型子物体中包含各种零件、网格和动画

2.旧版动画

Window -> Animation 创建动画(ctrl + 6 / Command + 6)需选中一个游戏对象Samples:每秒播放多少帧横轴表示帧数编辑时选上录制按钮,改帧的Image和把图片拖到时间条上都可以Add Property:添加动画物体需要修改属性Rect TransformImageDoposheet:逐帧编辑Curves:曲线图

3.新版动画

Mecanim动画系统方便的实现任性动画的设置和重用方便的实现动画剪辑的设置可视化的动画控制界面对动画播放的精确控制模型及动画设置Model 模型标签Scale Factor:模型的缩放比例 Unity长度单位为米,一些模型软件长度单位是厘米,所以默认要设置0.01Rig 动画配置标签Animation TypeNone:无动画Legacy:旧版动画Generic:通用动画(非人型动画)Humanoid:新版人型动画Avatar Definition:骨骼配置Configure:配置,成功后前面会有个会打开新场景,能看到模型骨骼Mapping:骨骼映射图实线圈:必须配置的骨骼,如果缺失,会影响整个动画的执行虚线圈:可选骨骼,配置会让动画更精细人是面对我们的,屏幕右边的是左臂,屏幕左边的是右臂三种方法做映射:屏幕上选中拖进去,Hierarchy中选中拖进去,拖到下面的列表中Mapping -> Automap 自动映射Muscles & SettingsPreview:预览Animation 动画面板Import Animation:导入动画,必选Clips:动画片段截取片段:调整Start和End的帧数,横轴单位是由(秒:帧)表示的,帧率是30FPSloop match:绿色没有问题,黄色红色都表示有问题Loop Time:是否循环播放Loop Pose:会结合最后一帧和第一帧做一个中和Root Transform Rotation:动画旋转Bake into Pose:动画朝向不会改变Root Transform Position(X)Root Transform Position(Y)Bake into Pose:动画位移不会改变Mirror:镜像动画

4.Animation组件

用来播放旧版动画Animation:默认在执行什么动画Animations:集合,表示这个模型会什么动画,如果模型中包含A动画但是这个集合中没有A动画,则不能切换// 声明动画组件 private Animation _animation; // 获得组件 _animation = GetComponent(); // 按键切换动画 if (Input.GetKeyDown(KeyCode.W)) { _animation.CrossFade(“Walk”); } else if (Input.GetKeyUp(KeyCode.W)) { _animation.CrossFade(“Idle”); }

5.Animator组件

Controller:动画状态机Runtime Animator ControllerAvatar:骨骼Apply Root Motion:应用根动画,跟Bake into Pose联动

6.Animator Controller:动画状态机

滚轮缩放,alt加左键移动画面,把动画拖到状态机中松手,会自动新建状态,delete键删除联系

Inspector面板设置

Motion:执行的动画Speed:动画播放速度Mirror:镜像动画Transitions:联系列表Has Exit Time:有停止播放的时间,勾选上之后播放完前一个动画才会切换到下一个动画Settings:过渡设置Fixed Duration:自动过渡Transition Duration:过渡时间Transition Offset:过渡的偏移量Interruption Source:打断源,动画可以被打断Conditions:切换条件参数,大于或小于,具体数值多个条件的时候,是与的关系,满足了所有条件之后才会切换

Animator状态机设置

Layers:层Parameters:参数,切换不同的状态FloatIntBoolTrigger右键Make Transition:建立联系,可以联系自己Set as Layer Default State:设置为层默认状态CopyCreate new BlendTree in StateDelete

通过代码控制状态机:

// 获取Animator组件 private Animator _animator; _animator = GetComponent(); // 设置 _animator.SetInteger(string name, int value); _animator.GetInteger(string name); _animator.SetFloat(string name, float value); _animator.GetFloat(string name); _animator.SetBool(string name, bool value); _animator.GetBool(stirng name); _animator.SetTrigger(string name); // 将一个字符串类型的参数名称转成一个对应的HashCode int Animator.StringToHash(string name); // 使用整型id设置,可以稍微提高效率 _animator.SetInteger(int id, int value); _animator.GetInteger(int id); _animator.SetFloat(int id, float value); _animator.GetFloat(int id); _animator.SetBool(int id, bool value); _animator.GetBool(int id); _animator.SetTrigger(int id); Add Behaviour 给状态添加行为,会生成一个脚本,里面包含StateMachineBehaviour回调// 参数 // animator:状态机所在的Animator组件,可以通过它.gameObject拿到游戏对象 // stateInfo:动画状态信息,用来区分不同的状态 // layerIndex:动画层下标,从0开始 // 回调函数 // 进入状态的时候调用一次 override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {} // 在某个状态停留的时候持续调用,每帧一次 override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {} // 退出状态的时候调用一次 override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {} // 会在OnAnimatorMove方法之前调用,如果使用了Apply Root Motion进行移动,就不要使用这个,unity会放弃自动位移 override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {} // 调用IK动画方法OnAnimatorIK之后调用 override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {} // 判断状态名字是否为指定的 if (stateInfo.IsName(“idle”)) { Debug.Log(“name idle”); } // 判断状态的标签是否为指定的 if (stateInfo.IsTag(“idle”)) { Debug.Log(“tag idle”); }

你可能感兴趣的:(Unity初级(八))