目录
1 资源准备:先从unity的 Asset store下载一些free的资源
2 在project/Asset里找到角色模型和动画
2.1 在prefab里找到角色资源
2.2 找到动画资源,一般在Animation下的模型文件fbx下层
2.3 准备工作
2.4 拖拽模型文件里的动作到Animator
2.5 模型贴图文件丢失了,不影响测试动作,暂时先这样吧
2.6 跑步动作OK
2.7 拖入多个动作,设置多个动作 state直接的关系,形成循环
2.8 增加参数, 控制2个动作组成的循环,切换的条件
2.9 点击 2个动作state之间的 transition 线,添加转换条件
2.10 测试动作state的转换条件
2.11 动作之间的退出时间
2.12 动作之间的过渡持续时间(动作融合过渡时间)
3 用脚本控制动作
3.1 GetComponent ().SetTrigger()
3.2 脚本
3.3 实测OK
1 资源准备:先从unity的 Asset store下载一些free的资源
- 先从unity的 Asset store下载一些free的资源
- 在unity里打开
- 下载 download
- 导入 import
2 在project/Asset里找到角色模型和动画
在project/Asset里找到角色模型和动画
2.1 在prefab里找到角色资源
- 找到导入的资源包
- 找到prefabs
- 找到一个模型文件,一般就是角色
2.2 找到动画资源,一般在Animation下的模型文件fbx下层
- 找到动画资源,一般在Animation下的模型文件fbx下层
- Animation文件夹下面,首先是模型fbx文件
- 模型文件里包含了动画文件
2.3 准备工作
- 新建一个Animator Controller
- 然后关联到挂包含Animator组件的角色模型/物体上的 controller里
2.4 拖拽模型文件里的动作到Animator
- 双击Animator Controller
- 打开Animator
- 拖拽模型文件里的动作到Animator
2.5 模型贴图文件丢失了,不影响测试动作,暂时先这样吧
- 模型贴图文件丢失了
2.6 跑步动作OK
- 测试 OK
2.7 拖入多个动作,设置多个动作 state直接的关系,形成循环
- 拖入多个动作
- 设置entry 默认接下来的动作
- 然后设置run 和 wave之间的关系,make transition(过渡)
- 注意动作本身的属性
- run是loop的
- wave是不loop的
- 因此,如果只是从 RUN指向 WAVE ,执行到WAVE就会停止
- 因此,如果只是从 RUN指向 WAVE ,又回到RUN,执行到RUN就会继续WAVE。。。。如此循环下去
2.8 增加参数, 控制2个动作组成的循环,切换的条件
如果我们想在run切换到wave的时候,设置切换的条件,需要先加参数
参数的4种类型
- float
- int
- bool
- trigger
这里创建一个trigger类型的参数,改名为wave
2.9 点击 2个动作state之间的 transition 线,添加转换条件
- 点击 2个动作state之间的 transition 线
- 在conditions里点+
- 添加一个wave 条件
2.10 测试动作state的转换条件
- 不勾选wave参数时,始终执行run
- 勾选了wave参数时,相当于满足了一次 wave的trigger触发条件
- 可以看到会执行一次wave动作
2.11 动作之间的退出时间
- has exit time
- 这个可以勾选掉
- 否则必须播放完当前动作,才能播放下一个动作
2.12 动作之间的过渡持续时间(动作融合过渡时间)
- 这个也可以勾选掉,
- 勾选掉之后,动作之间会直接切换,比较生硬
- 有得情况下,动作直接会有一个过渡变化,但是切换没那么快
3 用脚本控制动作
3.1 GetComponent<Animator>().SetTrigger()
- GetComponent<Animator>().SetTrigger("wave");
- 用来设置 Animator的某个trigger的值
3.2 脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestPlayer1 : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){if(Input.GetKeyDown(KeyCode.Q)){//触发wave参数GetComponent<Animator>().SetTrigger("wave");}}
}