Unity3D游戏开发之动画脚本 Animation Scripting
2015-02-11 08:45
246 查看
有时你需要程序化的驱动你的角色骨骼. 例如你可能需要你的角色的头注视3d空间的某个点. 这个活最好让脚本来干. 幸运的是, Unity做这个很容易. 在Unity 中所有骨骼来驱动蒙皮网格(skinned mesh)的变换(Transforms). 因而你可以给角色的骨骼写脚本,就和其他GameObject一样.
很重要的一点是动画系统updates the Transforms 是在Update() function调用之后 ,LateUpdate() function 调用之前. 因而如果你要调用 LookAt() function 你应该在 LateUpdate() 中调用,覆盖动画播放.
布娃娃系统Ragdolls 也是用同样的方法制作出来的. 你可以简单的把刚性物体(Rigidbodies), 角色关节(Character Joints) 和 胶囊碰撞体(Capsule Colliders)连接给不同的骨骼. 这样物理系统就可以作用于蒙皮角色(skinned character).
动画播放时为了让角色受动画系统的控制,可以设置物体为动力学物体(isKinematic),当需要让他受物理控制时把该属性取消。
角色死亡时,可以销毁原始模型,创建一个布娃娃代替。同样,飞机车辆等的爆炸效果,最好也是替换成另外一个由一批带有刚体的部件组成的预制件,部件上可以增加一些粒子特效来实现烟雾火焰等效果。
动画融合(Animation Blending)可以实现动作转化时的平滑过渡。动画混合(Animation Mixing)和附加动画(Additive Animations)可以削减游戏创建的动画片段的数量。动画可以和其他动画以各种组合一起使用。
让一些动画只应用给身体的一部分。例如,有个一个挥手动画,想要在空闲角色或正行走的角色播放挥手动画。没有动画混合,您必须创建两个手挥舞着动画:一个用于空闲,一个用于行走。而通过调用AddMixingTransform(),叠加动画混合变换到动画。不过,如果你添加肩膀变换作为混合变换,来做挥手动画,那么挥手动画将从肩膀位置处受完全控制,身体的其余部分将不会受到它的影响,将继续播放空闲或行走动画。因此,只需要一个挥手动画。
?
1 2 3 | var mixTransform : Transform = transform.Find(“root/upper_body/left_shoulder”); animation[“wave_hand”].AddMixingTransform(mixTransform); |
附加动画和动画混合都可以让我们减少对游戏中要制作动画的数量,尤其对于一些表情动画现在你只需要制作一个左倾( lean-left) 和右倾( lean-right)动画. Unity将为此倾斜动画新建一个层并置于walk, idle 或 run循环的层级之上.
叠加型动画通过将两个动画彼此相减进行计算,并将其存储为两个动画的差值。当使用叠加动画时,在每个使用叠加动画的变换上也在播放一些其他非叠加动画,这是至关重要的。否则,动画将添加在最后一帧的结果上面,这当然不是你想要的。
动画层(Animation Layers)
例如有一个射击动画,一个空闲和行走循环动画,想要在行走和空闲动画之间连续过渡,基于玩家的速度。但当玩家射击时,仅显示射击动画,因此,射击动画基本上有更高优先级。要做到这点最简单的方法是在射击时简单的保持行走和空闲动画,然后我们需要确保射击动画比空闲和行走动画在更高的层。这意思是射击动画将首先接收融合权重。行走和空闲动画仅当射击动画不使用融合权重100%时,接收权重。因此,交叉淡入淡出射击动画时,权重将从0开始很短时间内变为100%,在开始时步行和空闲层仍然会收到融合权重,但当射击动画完全切入时,它们不再接收权重,这正是我们所需要的!
?
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 | function Start () { //循环播放 animation.wrapMode = WrapMode.Loop; //射击动作不循环 animation["shoot"].wrapMode = WrapMode.Once; // idle 和walk 设置低优先级默认为. animation["shoot"].layer = 1; //停止 animation.Stop(); } function Update () { //按键 if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1) animation.CrossFade("walk"); else animation.CrossFade("idle"); // 开火 if (Input.GetButtonDown ("Fire1")) animation.CrossFade("shoot"); } |
相关文章推荐
- Unity3D游戏开发之如何用脚本控制动画播放?
- unity动画插件Hotween的使用 – unity3d游戏开发
- unity3D游戏开发十八之NGUI动画
- 3ds Max 高端动画脚本开发与挑战实例
- [Unity3D]Unity3D游戏开发之当仙剑奇侠传遇上Mecanim动画系统
- Unity3D游戏开发之使用Mecanim动画系统控制2D动画
- Unity3D游戏开发之设置动画(Animations)属性
- [Unity3D]Unity3D游戏开发之基于Trigger的触发式动画设计
- Unity3D游戏开发之动画模型导入
- Unity3D游戏开发之动画混合与动画重定向
- unity3D游戏开发十八之NGUI动画
- 【unity3d游戏开发之疑难杂症】解决Unity3d脚本支持中文问题
- [Unity3D]Unity3D游戏开发之自己主动寻路与Mecanim动画系统的结合
- [Unity3D]Unity3D游戏开发之自动寻路与Mecanim动画系统的结合
- Unity3D游戏开发之使用Mecanim动画系统控制2D动画
- Nds开发动画函数
- 开发自动化测试脚本的技巧和心得
- 准备编写ogl2dlib的动画脚本编辑器
- 创新性应用-使用脚本加速DB2存储过程的开发-常红平
- 开发自己的脚本引擎(一)先吹吹水,再干事情。