Unity3d动画脚本 Animation Scripting(深入了解游戏引擎中的动画处理原理)

时间:2024-01-08 17:34:56

也许这一篇文章的内容有点枯燥,但我要说的是如果你想深入的了解游戏引擎是如何处理动画片断或者素材并

让玩家操控的角色动起来栩栩如生,那么这真是一篇好文章(当然我仅仅是翻译了一下)

动画脚本 Animation Scripting

Unity's 动画系统允许你创建一个漂亮的动画蒙皮角色. 动画系统支持动画融合,混合,添加动画,步调周期时间同步.动画层.控制动画回放的所有方面(时间,速度,混合权重) 每个顶点有1.2.4个骨骼影响的mesh,基于物理系统的布娃娃系统,另外还有程序动画.为了获得最佳效果推荐您在制作模型和动画绑定前阅读一下 Modeling Optimized Characters 章节.

制作一个动画角色主要包括两个方面; 在世界中移动  由此产生的动画. 如果你想了解角色移动相关的更多内容, 请参阅Character Controller page.   实际上角色动画是由Unity's 脚本界面完成的 .

你可以下载 example demos 中预设置好的动画角色. 当你学完本页的基础部分你还可以看一看 animation script interface.

如果需要你可以点击并快速转到以下主题:

·         Animation Blending    动画融合

·         Animation Layers      动画层

·         Animation Mixing       动画混合

·         Additive Animation      附加动画

·         Procedural Animation    程序动画

·         Animation Playback 和 Sampling   动画重放和取样

Animation Blending 动画融合

在现今的游戏中Animation Blending是一项保证游戏动画顺畅过渡的基本的特性.动画师创建的动画例如: walk循环, run 循环, idle原地空闲动画 或射击动画.在游戏的任何时间点你都有可能从空闲站立转换到走动,反之亦然. 当然你不希望两个不同的动作之间突然跳转, 你需要动画平滑过渡.

而这个问题的解决就依赖动画融合技术. 在Unity中你可以让同一个角色拥有任意数量的动画.所有这些动画融合添加成为一个总的动画.

首先我们来为一个角色添加两个动画原地空闲站立和走动并平滑的使这两个动画过渡. 为了使我们在写脚本时简单些, 首先我们设置动画的 Wrap Mode为 Loop. 然后关闭 Play Automatically来让我们的脚本来独占动画的播放.

我们第一个动画脚本很简单; 我们需要一些方法来探查角色移动的有多快, 然后在走和站立之间淡入淡出. 在这个简单的测试中我们使用 pre-setup input axes.

function Update () {

if (Input.GetAxis("Vertical") > 0.2)

animation.CrossFade ("walk");

else

animation.CrossFade ("idle");

}

下面我们来让这个脚本运行:

1.       创建一个js脚本 Assets->Create Other->Javascript.

2.       把代码拷贝进去

3.       把脚本拖拽给角色 character (It needs to be the same GameObject as the animation)

点击Play 按钮, 当你按上下键时角色会走动,松开上下键时角色站立不动.

动画层Animation Layers

层是一个非常有用的概念它可以让你将动画片段任意成组并且区分优先顺序.

在Unity's动画系统中, 你可以混合任意数量的动画片段. 你可以手工分配权重或者直接使用animation.CrossFade(),来自动分配权重.

混合权重混合权重总是在应用前被规格化 normalized

比如说我们现在有一个 walk cycle 和一个run cycle, 权重都是1 (100%).当unity计算最终动画时会规格化权重, 这意味着walk占50% 权重,   run cycle占50% 权重.

这在大多数情况下都是不错的, 但当两个动画片段同时运行而其中一个权重明显大于另外一个. 那么你需要手动调整权重值,但如果你使用动画层来解决这个问题过程会容易得多.

制作动画层的范例Layering Example

例如现在你有一个射击动画, 一个空闲站立,一个走动循环  . 你需要在走和站两个动作间持续的淡入淡出(在玩家走动速度的基础上) 但当玩家射击时我们只想展示射击动画. 因而射击动画此时的优先度最高.

为了达到这一目的最简单的方法是在射击时简单的保持 walk 和 idle动画. 接下来需要确定shoot animation在一个比idle 和walk更高的层. 这意味着shoot animation 将首先收到混合权重.   walk 和idle 只有在 shoot animation不使用 100% 混合权重的情况下接收权重. 所以当 CrossFading the shoot animation in, 权重将从0开始很短时间内到达 100%. 在开始阶段 walk 和idle 层将依然可以收到混合权重 但当 shoot animation 完全切入时, 他们就收不到权重了.  这才是我们需要的!

function Start () {

// Set all animations to loop 设置所有动画为循环

animation.wrapMode = WrapMode.Loop;

// except shooting 除了射击(不循环)

animation["shoot"].wrapMode = WrapMode.Once;

//放置idle 和 walk 进低一级别的 layers  (默认 layer 总是 0)

// This will do two things这将作两件事情

// - 当 calling CrossFade时,