Skip to content

Trigger

unity-animator-trigger-deep-dive

这里讲的是 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,类型 Trigger

Transition 设置:

c
Any State -> Attack
Condition:Attack
Has Exit Time:关闭
Transition Duration0.05

然后:

c
Attack -> Idle
Has Exit Time:开启
Exit Time:0.91
Condition:无
Transition Duration0.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 播完
-> 自动回 Idle

ResetTrigger 什么时候用

如果两个 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.SetTriggerAnimation Parameters

文章评价

读完这篇,留下你的看法

暂无审核通过的评价。

登录账号后才能评价。

本站访客数0总站访问量0本页访问量0