【瑞模网】unity中animator中Trigger多次触发动画解决方法

前两天开发游戏时遇到一个十分令人心态爆炸的问题,我在做一个角色动画控制的时候,想用trigger来控制角色的攻击,但是测试的时候发现攻击动画会触发两次,后来找了半天终于看到了b站傅老師MrFu的黑魂复刻的视频中的解决方案。

方法步骤

1.假设我们有以下状态控制机

dle状态到Attack状态需触发命名为attack的Trigger,从Attack回到Idle则不用任何条件,如果控制Trigger触发时,连续播放了两次Attack的动画就可以继续使用接下来的步骤。

2.选中Attack

为其挂载一个新代码命名为FSMCleaSignals,并将以下代码粘贴于代码页中。

public class FSMCleaSignals : StateMachineBehaviour
{
    public string[] ckearAtEnter;
    public string[] ckearAtExit;
    // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        foreach (var signal in ckearAtEnter)
        {
            animator.ResetTrigger(signal);
        }
    }

    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks
    //override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    //{
    //    
    //}

    // OnStateExit is called when a transition ends and the state machine finishes evaluating this state
    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        foreach (var signal in ckearAtExit)
        {
            animator.ResetTrigger(signal);
        }
    }

    // OnStateMove is called right after Animator.OnAnimatorMove()
    //override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    //{
    //    // Implement code that processes and affects root motion
    //}

    // OnStateIK is called right after Animator.OnAnimatorIK()
    //override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    //{
    //    // Implement code that sets up animation IK (inverse kinematics)
    //}
}

3.回到unity中调整参数(也可以代码里动态赋值)

Element中填的是你要清空的Trigger的名字。

4.也可以把代码挂载在Idle上

如果将代码挂载在Idle上,则将需要清空的Trigger填在CkearAtEnter中。

全文的思路来源于:https://www.bilibili.com/video/av21513489/?p=14

Unity中,动画Trigger是一种特殊的动画事件,它允许你在动画播放的不同阶段触发特定的行为。通常,这用于控制游戏中的交互逻辑,比如角色的攻击、防御等动作。 当你创建一个包含Trigger动画曲线时,可以在时间轴上选择某个关键帧并设置为"Trigger"类型。当动画达到这个时间点时,会触发预设的脚本函数。 以下是基本步骤: 1. **创建动画**: 打开Unity引擎,选择你的GameObject,然后右键单击并选择 "Animator Controller" 创建一个新的控制器,然后添加你所需的动画状态和动画轨迹。 2. **编辑动画**: 在动画控制器窗口中,找到你想要添加Trigger的关键帧,选中它然后在右侧属性检查器的"Event"选项卡下设置为"Trigger"。 3. **编写C#脚本**: 首先,在项目里新建一个C#脚本(如:`AttackScript.cs`),然后将它附加到需要触发动画行为的游戏对象上。在脚本中,你可以定义一个委托(Delegate)并绑定到"AnimationClipPlayable.OnFinished"事件,例如: ```csharp public delegate void AnimationTriggerEventHandler(); private AnimationTriggerEventHandler _onTriggerCallback; public void OnAnimationTrigger() { _onTriggerCallback?.Invoke(); } void Start() { GetComponent<Animator>().OnTriggerEnter += OnAnimationTrigger; } ``` 4. **调用函数**: 当Trigger触发时,你想做的事情会在`OnAnimationTrigger()`方法内实现,比如切换场景、播放音效或更新角色状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值