Appearance
Trigger
这里讲的是 Animator 里的 Trigger 参数,不是物理系统里的 Collider Is Trigger。
Trigger 是 Animator 里的“一次性信号”。
适合这种动作:
攻击一次
跳跃一次
受击一次
死亡一次
开门一次
拾取一次它不像 Bool 一直保持 true / false。官方文档说明:Trigger 被设置后会自动回到 false,适合触发状态机流转。
Trigger vs Bool
Bool 适合持续状态:
c
IsRunning
IsGrounded
IsDead
IsAiming比如:
c
animator.SetBool("IsRunning", true);
animator.SetBool("IsRunning", false);Trigger 适合一次性动作:
c
Attack
Jump
Hit
OpenDoor比如:
c
animator.SetTrigger("Attack");你不需要再写:
c
animator.SetTrigger("Attack", false); // 没有这种写法典型攻击动画设置
Animator 里创建参数:
c
Attack,类型 TriggerTransition 设置:
c
Any State -> Attack
Condition:Attack
Has Exit Time:关闭
Transition Duration:0.05然后:
c
Attack -> Idle
Has Exit Time:开启
Exit Time:0.9 或 1
Condition:无
Transition Duration:0.05代码:
c
using UnityEngine;
public class PlayerAttack : MonoBehaviour
{
private Animator animator;
private void Awake()
{
animator = GetComponent<Animator>();
}
private void Update()
{
if (Input.GetButtonDown("Fire1"))
{
animator.SetTrigger("Attack");
}
}
}逻辑是:
c
按下攻击键
-> SetTrigger("Attack")
-> Animator 满足 Attack 条件
-> 进入 Attack 状态
-> Attack 播完
-> 自动回 IdleResetTrigger 什么时候用
如果两个 Trigger 可能互相冲突,可以先取消另一个:
c
animator.ResetTrigger("Crouch");
animator.SetTrigger("Jump");常见场景:
c
Jump 和 Crouch 冲突
Attack 和 Dodge 冲突
Hit 和 Attack 冲突最常见错误
c
Animator 里没创建 Trigger 参数
参数名拼错:"Attack" 写成 "attack"
Transition 没加 Condition
Attack 状态没有回 Idle 的出口
用 Bool 做 Attack,忘记改回 false,导致一直攻击
Any State -> Attack 导致攻击动画反复打断自己
移动动画误用 Trigger,结果只触发一瞬间记住:
c
Trigger 是一次性信号。
SetTrigger 是发信号。
Transition 的 Condition 负责接收信号。
动作播完后,要有出口回到普通状态。参考:Unity 官方 Animator.SetTrigger、Animation Parameters。