07-创建动画
1. 创建动画
1.1 选中我们的青蛙🐸

1.2 点击 Window

会打开 Animation 的窗口

上面显示了,如果你想 Frog 创建动画,你需要创建一个 Animator 控制器和 Animator Clip「动画片段」

1.3 创建 Animator
你可以直接点击 create 创建,它会自动创建和控制器。

- 添加 Animator 控制器




因为不仅仅是青蛙要动画,我们的小汽车也需要动画。

Animation 是一个片段,Animator Controller 是一个动画控制器。一个控制器 可以控制动画的多个片段,所以我们需要添加控制器 Animator Controller。









我们就可以看见 Animation 看起来像一个时间轴:

我们就可以把每个时间点显示的图片放在上面就可以了。
全选 20 张 idle 图片

拖入成功如下图:

我们可以看见,现在的动画不到一秒钟:

原因是我们现在的采样率的问题。
显示我们 Samples 。


我们可以看见,我们现在的采样率是一秒钟 60 张,而我们只有 20 张图片。

所以,我们可以把我们的采样率改成 20,这样我们就可以完整的显示一秒了。

这样就可以了。

这里我们使用按秒显示。
1.4 我们如何查看动画效果呢?

当然,你现在点击运行游戏,游戏的青蛙现在也是会动的。
但是我们现在还没实现跳跃的动画。
1.5 创建跳跃动画
当然,现在没有之前的 create 的窗口了:

那怎么办呢?


- 保存路径和之前一样
- 保存名称:
Frog_Jump.anim






青蛙已经可以动起来了。

跳跃我们是不需要循环播放的,取消即可。


1.6 显示 Animator

我们可以直接拖拽,摆放到你想摆放的位置。
- 鼠标滚轮可以调整大小;
- 鼠标滚轮按住,就可以调整位置;
左侧有 Layers,不同的 Layers 执行不同的图层。

不过,在我们的项目中,用不到,就不多讲了。
我们要用到的是 Parameters。
这个参数很重要,涉及一种动画,切换到另外一种动画状态的条件。
我们现在点击运行,你会发现 Frog_idle 一直在运行:

要从 Frog_idle 到 Frog_Jump 需要有一个状态的连线。「橘黄色代表默认执行的」
1.7 添加连线

这个就是把它设为动画图层的当前状态。

不过,我们还是要默认播放 Frog_idle。
我们需要添加的是 Frog_idle 到 Frog_jump:



但是我们现在还没有 Conditions。也就是它切换的条件。
所以,我们要添加我们的条件:

可以看见,我们可以添加四种切换条件。
我们使用出发的方式 Trigger:



每次,只要我 Trigger 一下,就会触发切换到这个状态。
添加 conditions:


那我们现在可以点击运行测试一下:

当时你认真观察👀会发现,它卡在最后一帧。那么我们要怎么解决这个问题呢?
——播放完后,要返回回来。


返回的条件是什么呢?
选择返回的那条连接线,我们不需要额外的 conditions。


- Has Exit Time:这个切换条件,是有固定的切换时间的。
- Exit Time:代表退出的时间,是一个向量化的时间。0 到 1 之间。
- 1 代表百分之百,完全播放完,才会切换到下一个条件。「所以,我们这里可以写成 1 ,代表百分之百完成跳跃之后,我们切换回 Frog_idle。
切换的时候,我们不需要两个动画的混合,所以下面的我们可以选择取消:

在有些 3D 动画是需要混合的,比如跑动切换回站立的时候。
这样有一个缓慢的过渡动画,看起来会比较真实。
那么跳跃回来的时候,我们需要完全播放完。那么 idel 过去的时候,我们可以不需要完全播放。

因为,我们有可能随时点一下 Jump 所以,Frog_idle 不需要完全播放完成。
应该在点击屏幕的时候,马上进行跳跃。——也就是不需要 Has Exit Time:

同时,我们也不需要过渡:

保存你的项目,我们点击 Play 测试一下。
你会发现,现在点击参数 Parameters 的 Jump 就能正常的进行动画的切换了。
那么你会知道,我们是需要代码来调用 Jump 而不是手动点击 Jump 的状态。
如何使用代码切换动画的状态呢?

2. 编写跳跃触发代码
我们要用到 Animator 就要导入我们的 Animator 组件。
// --snip---
public class PlayerController : MonoBehaviour
{
// 组件一般写在上面
// 一般用两种方法: 一种就是 public 但是不推荐,因为 public 实现,需要我们自己去 Unity 里面去拖拽
// private 我们可以实现获取 Frog 自身身上的 Rigidbody2D 组件
private Rigidbody2D rb;
private Animator anim;
// --snip---
private void Awake() // 会在 start 之前执行
{
rb = GetComponent<Rigidbody2D>(); // 获得自身身上的组件
anim = GetComponent<Animator>(); // 获取 Animator 组件
}
// --snip---
}
我们可以对我们的代码进行分区:
//--snip---
#region INPUT 输入回调函数
public void Jump(InputAction.CallbackContext context)
{
//--snip---
}
//--snip---
public void GetTouchPosition(InputAction.CallbackContext context)
{
}
#endregion
}
这样分区的好处是什么呢?——代码块可以折叠


完美😍折叠。
欢迎关注我公众号:AI悦创,有更多更好玩的等你发现!
公众号:AI悦创【二维码】

AI悦创·编程一对一
AI悦创·推出辅导班啦,包括「Python 语言辅导班、C++ 辅导班、java 辅导班、算法/数据结构辅导班、少儿编程、pygame 游戏开发、Linux、Web全栈」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 布置作业 + 项目实践等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh
C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其他地区线上。微信:Jiabcdefh
方法一:QQ
方法二:微信:Jiabcdefh

- 0
- 0
- 0
- 0
- 0