Unity3d Animation动画详解。。。

2023-10-27

 

 

动画脚本 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时,由于shoot 和 idle/walk 在不同的layers 中
   //   它们将不会影响互相之间的重放.
   // - 由于 shoot 在高一级的 layer, 当faded in 时shoot动画将替换
   //   idle/walk 动画 .
   animation["shoot"].layer = 1;
 
   // Stop animations that are already playing停止已经播放的动画
   //(万一 user 忘记的话,自动disable播放)
   animation.Stop();
}
 
function Update () {
   // Based on the key that is pressed,基于按下的键
   // play the walk animation or the idle animation播放走,站动画
   if (Mathf.Abs(Input.GetAxis("Vertical")) > 0.1)
      animation.CrossFade("walk");
   else
      animation.CrossFade("idle");
 
   // Shoot射击
   if (Input.GetButtonDown ("Fire1"))
      animation.CrossFade("shoot");
}
默认情况下 animation.Play() 和 animation.CrossFade() 将停止或淡出在同一层里面的动画. 这是我们在绝大多数情况下需要的. 在我们shoot, idle, run 范例中, 播放 idle 和 run 将不会影响到 shoot动画 反之亦然 (you can change this behavior(行为) with an optional parameter(任意参数) to animation.CrossFade if you like).
动画混合Animation Mixing
动画混合可以让你缩减你必须为游戏制作的动画片断数量 ,方法是制作只对身体某个部分起作用的动画. 这意味着这些动画可以和其他动画合并起来一起使用.
如果你想给一个动画添加 animation mixing transform to an animation by calling AddMixingTransform() on the given AnimationState.
混合范例Mixing Example
例如你可能有一个挥手(hand-waving)动画. 你可能需要让一个空闲站立(idle)角色或者一个走动(walking)角色 来挥手. 如果没有动画混合你可能需要制作两个挥手hand-waving动画 : 一个给 idle, 一个给walking. 可是, 如果你将挥手(hand-waving)动画作为一个mixing transform 添加到shoulder transform,挥手动画将只控制肩膀. 身体余下部位不受其影响, 下半身会继续播放 idle 或者 walk 动画. 因而你只需要一个挥手(hand-waving)动画.
/// Adds a mixing transform using a Transform variable
var shoulder : Transform;
animation["wave_hand"].AddMixingTransform(shoulder);
Another example using a path.
function Start () {
   // Adds a mixing transform using a path instead
   var mixTransform : Transform = transform.Find("root/upper_body/left_shoulder");
   animation["wave_h和"].AddMixingTransform(mixTransform);
}
附加动画 Additive Animations
附加动画和动画混合可以让你缩减为游戏制作的动画片断的数量,并且对面部动画(facial animations)来说非常重要.
让我们来看看如果创建一个在跑和转身时身体可以自动倾斜的角色.
你已经制作好了一个 walk 和 run循环, 现在你还要制作一个走动左倾( walk-lean-left), 走动右倾(walk-lean-right), 跑左倾(run-lean-left), 跑右倾(run-lean-right)动画.
这意味着你需要多做4个动画片断! 制作这么多数量的动画会累死人的. 而附加动画(Additive animations) 和混合(Mixing) 可以大大减少这些工作量!
附加动画范例 Additive Animation Example
附加动画允许你在顶层覆盖其他所有可能播放的动画的效果( allow you to overlay the effects of animation on top of any others that may be playing). 当你制作一个附加动画时, Unity将计算动画片断里的第一帧 (first frame)和当前帧(current frame)的差异. 然后它将在所有其他播放的动画之上应用这个差异(Then it will apply this difference on top of all other playing animations).
现在你只需要制作一个左倾( lean-left) 和右倾( lean-right)动画. Unity将为此倾斜动画新建一个层并置于walk, idle 或 run循环的层级之上.
下面是代码Here is the code to make that happen:
private var leanLeft : AnimationState;
private var leanRight : AnimationState;
 
function Start () {
   leanLeft = animation["leanLeft"];
   leanRight = animation["leanRight"];
 
   // Put the leaning animation in a separate layer
   // So that other calls to CrossFade won't affect it.
   leanLeft.layer = 10;
   leanRight.layer = 10;
 
   // Set the lean animation to be additive 混合模式为附加
   leanLeft.blendMode = AnimationBlendMode.Additive;
   leanRight.blendMode = AnimationBlendMode.Additive;
 
   // Set the lean animation ClampForever
   // With ClampForever animations will not stop
   // automatically when reaching the end of the clip
   leanLeft.wrapMode = WrapMode.ClampForever;
   leanRight.wrapMode = WrapMode.ClampForever;
 
   // Enable the animation 和 fade it in completely
   // We don't use animation.Play here because we manually adjust the time
   // in the Update function.
   // Instead we just enable the animation 和 set it to full weight
   leanRight.enabled = true;
   leanLeft.enabled = true;
   leanRight.weight = 1.0;
   leanLeft.weight = 1.0;
 
   // For testing just play "walk" animation 和 loop it
   animation["walk"].wrapMode = WrapMode.Loop;
   animation.Play("walk");
}
 
// Every frame just set the normalized time
// based on how much lean we want to apply
function Update () {
   var lean = Input.GetAxis("Horizontal");
   // normalizedTime is 0 at the first frame 和 1 at the last frame in the clip
   leanLeft.normalizedTime = -lean;
   leanRight.normalizedTime = lean;
}
提示Tip:
当使用附加动画时它会判断你同时也在播放一些其他的使用了附加动画的非附加动画(it is critical that you are also playing some other non-additive animation on every transform that is also used in the additive animation), 否则动画将添加到最后一帧结果的顶部(animations will add on top of the last frame's result). 这通常不是你所需要的 (This is most certainly not what you want).
程序动画角色Procedurally Animating Characters
有时你需要程序化的驱动你的角色骨骼. 例如你可能需要你的角色的头注视3d空间的某个点. 这个活最好让脚本来干. 幸运的是, Unity做这个很容易. 在Unity 中所有骨骼来驱动蒙皮网格(skinned mesh)的变换(Transforms). 因而你可以给角色的骨骼写脚本,就和其他GameObject一样.
很重要的一点是动画系统updates the Transforms 是在Update() function调用之后  ,LateUpdate() function 调用之前. 因而如果你要调用 LookAt() function 你应该do that in LateUpdate() to make sure that you are really overriding the animation.
布娃娃系统Ragdolls 也是用同样的方法制作出来的. 你可以简单的把刚性物体(Rigidbodies), 角色关节(Character Joints) 和 胶囊碰撞体(Capsule Colliders)连接给不同的骨骼. 这样物理系统就可以作用于蒙皮角色(skinned character). (什么是布娃娃系统,当你在射击类游戏中打死对手时可以注意到当角色快接近地面时,他的四肢开始瘫软在地面上,这个不是动画师调出来的,而是布娃娃系统自动计算出来的。)
动画重放和取样Animation Playback 和 Sampling
这一部分 将说明引擎如何在动画重放时取样.
动画片断制作时总是有一个特定的速率. 举例来说, 你可能在Max 或Maya at 创建了一个帧速为 60 frames 每秒(fps)的动画. 当导入 Unity后, 输入模块将读取帧速, 所以导入的动画帧速还是60fps.
可是, 游戏运行时的速率是不断变化的. 有的电脑帧速快有的电脑帧速慢, 即使是同一台电脑前一秒和后一秒因为视角的不同帧速也不一样. 基本上当游戏开始运行时我们无法确定一个精确的帧速. 这意味着即使我们的动画片断制作时是 60 fps, 它重放时也许用的是另外一个速率, 例如 56.72 fps, 或 83.14 fps. 它可以变成任何一个速率.
Unity 对这些变化的速率取样, 不在于其制作时的速率. 幸运的是,3d电脑图形动画不是由分散的动画组成, 确切地说是由连续的曲线构成的. 这些曲线可以让我们在任何时间点取样; 而不是适配某一个原始帧的时间点. I这也意味着如果游戏运行速率高于原始制作速率, 动作事实上看起来会更平滑流畅.
对绝大多数应用场合,  Unity对变化帧速的采样我们无需对其进行干预. 可是, 如果你的某个游戏逻辑所依赖的动画变化或道具(transforms or properties)结构十分特殊, 那你必须知道这一点.  举例说, 如果你有一个动画是把一个物体30帧内从 0旋转到180度, 你想从代码中得知什么时候动画完成一半, 你不能写一段条件语言来检查现在旋转值是不是90度. 因为 Unity 依照游戏的变化速率来对动画采样, 它可能在旋转快到90度时进行采样, 或者是刚好过90度的时候采样. 如果你需要通报动画中一个特殊点到达时, 你可以使用 AnimationEvent 来替代.
同样需要注意的是变化的帧速采样结果, 一个使用WrapMode.Once 模式重放的动画的采样不一定是精确的最后一帧( last frame). 在游戏中很有可能是刚好结束前的某一帧, 在下一帧时间可能超过动画的长度, so it is disabled 和 not sampled further. 如果你需要动画的最后一帧采样精确,你可以使用WrapMode.ClampForever. 如果是那样的话动画将不停的对最后一帧进行采样直到你自己停止动画. 
 

 

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity3d Animation动画详解。。。 的相关文章

  • Matplotlib 动画迭代 pandas 数据帧列表

    我有一个 pandas DataFrame 列表 每个数据框有 2 列 到目前为止 我有一个函数 当给定索引 i 时 它会采用与索引 i 相对应的框架 并根据第二列的数据绘制第一列的数据图 list f0 f1 f2 f3 f4 f5 f6
  • Android 卷页动画

    我对 Android 动画有点陌生 目前我正在开发一个故事活动 需要像 iPhone 中那样使用卷页动画 我发现 iPhone 中有一种方法可以做到这一点 但我仍然找不到在android中做的方法 所以请帮我解决这个问题 谢谢大家 谷歌代码
  • 停止 CSS 动画但让其当前迭代完成

    我有以下 HTML div class rotate div 以及以下 CSS webkit keyframes rotate to webkit transform rotate 360deg rotate width 100px hei
  • 我可以使用文本叠加执行类似 imsave() 的操作吗?

    我在用imsave 依次制作许多 PNG 我将它们合并为 AVI 并且我想添加移动文本注释 我用ImageJ http imagej nih gov ij features html制作 AVI 或 GIF 我不需要轴 数字 边框或任何东西
  • C - 比较字符串文字与字符数组

    我是 C 新手 对于如何通过字符数组使用字符串仍然有点困惑 在我的 C 程序中 我接受用户的命令 char command 20 scanf s command 当然 之后我想弄清楚他们输入了什么命令 类似于 if command hell
  • 我怎样才能有一个像这样的动画SliverAppBar?

    我希望这些动画之间能够平滑 我尝试使用AnimatedSize AnimatedOpacity and AnimatedPositioned但几乎没有错误 我不知道如何使用这些SliverAppBar 在其他例子中我看到人们使用Layout
  • WPF XAML 网格可见性触发器

    我的网格第一行有一条状态消息 我希望它在可见性发生变化时滑入和滑出 第一个可见性触发器效果很好 可以快速打开第一个网格行 一旦我添加 折叠 触发器 就什么都不起作用了 当可见性设置为折叠时 如何反转动画以滑动关闭
  • iOS 按钮在动画期间不可点击

    当我使用类别方法向按钮添加动画时 我无法单击该按钮 似乎它已被禁用 compassCalibrateButton pulse 1 5 continuously YES compassCalibrateButton userInteracti
  • 在项目后对本机动画平面列表项目做出反应

    我正在寻找一种方法来制作一个又一个的动画平面列表项目 当一个项目完成他的动画时 下一个项目 来自平面列表 将出现在屏幕上 class AnimatedFlatList extends React PureComponent state se
  • 在 Swift 2.0 中将字符转换为 Int

    我只想转换一个特点进入一个Int 这应该很简单 但我发现以前的答案没有帮助 总有一些错误 也许是因为我正在 Swift 2 0 中尝试它 for i in unsolved characters fileLines String i toI
  • WIN32,C++:是否可以在不隐藏窗口的情况下对窗口进行动画处理?

    我有一个编辑控件 一个文本字段 我想要为其设置动画 我想要的动画是它滑出 为该文本字段创建一条额外的线 我可以为我的文本字段设置动画并使其变大 但是要显示滑动动画 我首先必须隐藏它 这意味着整个文本字段会滑出 就像第一次从无到有一样 而不是
  • requestAnimationFrame 报告的帧速率有时高于显示器的刷新速率

    我使用以下内容来记录应用程序的帧速率 let lastCalledTime let fps let frame 0 let csv Frame Timestamp FPS const refreshLoop gt window reques
  • SwiftUI 动画滑入和滑出

    我有一个视图将显示在另一个视图上 视图动画完美地从右侧滑入 但是当我单击 关闭 按钮时 视图消失 而没有在消失之前滑回右侧的所需动画 我尝试过使用 opacity self isShowing 1 0 但随后视图淡入和淡出 我需要它滑入和滑
  • 如何使用固定的 pandas 数据框进行动态 matplotlib 绘图?

    我有一个名为的数据框benchmark returns and strategy returns 两者具有相同的时间跨度 我想找到一种方法以漂亮的动画风格绘制数据点 以便它显示逐渐加载的所有点 我知道有一个matplotlib animat
  • 使用完成处理程序在 Swift 中调用连续动画

    我正在制作一个可以显示化学反应动画的应用程序 每个原子都是一个 SCNSphere 并通过 SCNActions 进行动画处理 我尝试使用 runAction 中的完成处理程序在当前操作完成后调用下一个动画 因为每个原子必须做出很多不同的运
  • VisualStateManager 和生成的转换

    正当我以为我明白的时候VisualStateManager 有些事情证明我错了 我正在使用 WPF 4 并且尝试简单地在鼠标悬停时放大某个项目 并在鼠标离开时将其缩小 我想我只需定义每个状态VisualStateGroup然后指定一个Vis
  • Safari 中的 css3 边框半径动画过渡不起作用

    尝试在 Safari 中对图像的边框半径进行 css3 轻松过渡 它只是有点闪烁进入悬停状态 而不是平滑过渡 任何帮助深表感谢 我的代码如下 CSS all a hover img webkit border radius 50 moz b
  • 3D 旋转 - 透视

    public class MainActivity extends Activity LinearLayout rotator protected void onCreate Bundle savedInstanceState super
  • 使用宏从 Excel 电子表格中删除任何非指定字符

    我正在尝试通过删除任何非标准字符来清理 Excel 中的 CSV 文件 我唯一关心保留的字符是 A Z 0 9 和一些标准标点符号 任何其他字符 我想删除 当它找到包含我未指定的任何字符的单元格时 我已经得到了以下宏来删除整行 但我不确定如
  • UIView animateWithDuration:delay: 工作很奇怪

    我在使用 iPhone 动画块时遇到了一个奇怪的问题 这段代码 UIView animateWithDuration 2 delay 0 options 0 animations void controller setBackgroundC

随机推荐

  • 数据提取之JSON与JsonPATH

    JSON JavaScript Object Notation 是一种轻量级的数据交换格式 它使得人们很容易的进行阅读和编写 同时也方便了机器进行解析和生成 适用于进行数据交互的场景 比如网站前台与后台之间的数据交互 JSON和XML的比较
  • Andriodjie——欢迎页3秒跳转到主页+banner图片轮播

    Welocomepublic class Welocome extends Activity private final long SPLASH LENGTH 3000 Handler handler new Handler Overrid
  • 在设计BUCK分立电路中,电感该如何选择,需要注意哪些地方

    在Buck电路中 电感器是用于实现降压的核心元器件之一 通常情况下 选择合适的电感值可以提高电路的效率和稳定性 避免输出电压不稳定或者出现脉冲干扰等问题 选择电感大小需要考虑以下几个因素 输出电压和电流 电感值会影响到输出电压和电流的稳定性
  • Python程序设计选择题

    1 关于 Python 程序格式框架的描述 以下选项中错误的是 A Python语言的缩进可以采用Tab键实现 B Python单层缩进代码属于之前最邻近的一行非缩进代码 多层缩进代码根据缩进关 系决定所属范围 C 判断 循环 函数等语法形
  • android-apt plugin is incompatible with the Android Gradle plugin. Please use 'annotationProcessor'

    android apt plugin is incompatible with the Android Gradle plugin Please use annotationProcessor 分三步走 1 progect中类似于 clas
  • Mybatis查询 字段类型转换错误

    问题描述 Cannot convert string aaa to java sql Timestamp value nested exception is java sql SQLDataException Cannot convert
  • gauge自动化框架踩坑(六):关于csv

    一 语法 关于csv文件 官方文档只给出了语法 并没有举出实际的例子来说明 如何使用 语法
  • Error creating bean with name ‘userService‘: Unsatisfied dependency expressed through field‘userMap‘

    今天在做项目时遇到了idea报 Could not autowire No beans of UserMapper type found 的错误 记录以下解决过程 我的mapper注解使用的是 Mapper 在使用 Autowrited注解
  • Java校招面试经验汇总,看完直接跪服

    美团技术一面20分钟 晚7点 因为想到下周一才面试 我刚准备出去打个羽毛球 北京的电话就来了 面试官各种抱歉 说开会拖延了 1 自我介绍 说了很多遍了 很流畅捡重点介绍完 2 问我数据结构算法好不好 挺好的 其实心还是有点虚 不过最近刷了很
  • Android 录音功能无法正常使用

    具体现象 最近在做一个APP需要安装在智能手表上 有一个录音的功能 将开发的apk安装在手机和pad上面都能正常使用 录音文件也可以正常播放 但是安装到手表后 启动录音功能几秒钟录音文件就达几百兆 且录音文件不能够正常播放 通过调试信息也看
  • Python学习笔记(十九)————json相关

    目录 1 什么是json 2 json有什么用 3 json格式数据转化 4 Python数据和Json数据的相互转化 1 什么是json JSON 是一种轻量级的数据交互格式 可以按照 JSON 指定的格式去组织和封装数据 JSON 本质
  • Grafana 系列-统一展示-2-Prometheus 数据源

    系列文章 Grafana 系列文章 Grafana Prometheus 数据源 Grafana 提供了对 Prometheus 的内置支持 本文会介绍 Grafana Prometheus 也包括 Prometheus 的兼容实现 如 T
  • js保留有效数字

    JavaScript中数字保留有效数字位数的方法有三种 toFixed toExponential toPrecision 这三种方法都会把数字转成字符串 1 toFixed 根据小数点后的指定位数将数字转为字符串 不会使用指数计数法 2
  • 使用Vue手动封装树形控件组件

    提示 如果当下认为一件事很难做 那么不用犹豫直接做就OK 巨大的提升往往出现在反复的挣扎过后 跳出舒适圈 不断挑战自我 毕竟还年轻 因为已经完成了 索性就用上帝视角一次性把需要注意的东西都列出来 不怎么会循序渐进 原谅俺 1 需求整理 如上
  • 什么是过拟合和欠拟合

    今天突然被以前同学人问到什么是机器学习中的 过拟合 过拟合就是训练的时候效果很好损失函数值可以降得很低 但是到测试数据集的时候表现就不那么好了 就是过分依赖于现有训练数据集的特征造成的 可以加大数据集来进行训练 比如在图像领域可以通过拉伸旋
  • Fabric核心模块

    Fabric由五个核心模块组成的程序组 1 peer 主节点模块 负责存储区块链数据 运行维护链码 2 orderer 交易打包 排序模块 3 cryptogen 组织和证书生成模块 4 configtxgen 区块和交易生成模块 生成创始
  • Linux Clock

    http www wowotech net pm subsystem clk overview html Linux common clock framework 1 概述 http www wowotech net pm subsyste
  • 500 Request processing failed; nested exception is java.lang.NullPointerException

    类型 异常报告 消息 Request processing failed nested exception is java lang NullPointerException 描述 服务器遇到一个意外的情况 阻止它完成请求 报错原因 这种报
  • TensorFlow2 Fashion-MNIST图像分类(二)

    1 图像分类数据的标准化 本篇内容是 TensorFlow2 Fashion MNIST图像分类 一 的第二部分 请先阅读第一部分中的内容 上一部分内容最后提到 模型训练结果出现不拟合现象 主要原因就在于特征数据没有进行标准化处理 因此本部
  • Unity3d Animation动画详解。。。

    动画脚本 Animation Scripting Unity s 动画系统允许你创建一个漂亮的动画蒙皮角色 动画系统支持动画融合 混合 添加动画 步调周期时间同步 动画层 控制动画回放的所有方面 时间 速度 混合权重 每个顶点有1 2 4个