Unity StateMachineBehaviour:启动函数被调用一次?

时间:2018-10-11 15:00:35

标签: c# unity3d

我正在统一制造我的第一个敌人AI。我正在尝试使用动画控制器来完成状态机。

我刚刚发现了StateMachineBehaviour脚本,当AI处于状态时会调用该脚本。它具有多种方法,包括OnStateEnter。每当AI进入状态时都会调用它。

我的问题仅在于优化,我的AI需要获得GameObject“ Player”才能对其进行攻击。所以我暂时在我的OnStateEnter方法中获取它,这感觉很糟糕,因为每次调用动画时都获取它,所以我一开始只希望获取一次。

我基本上需要一个启动功能,但它不起作用,我进行了研究但未发现任何结果。我试图观看有关制作完成状态机的人的视频,但他们只是多次获得相同的GameObject(例如:https://youtu.be/dYi-i83sq5g?t=409)。

那么,有没有一种方法可以拥有启动功能或仅获取一次元素? 我可以创建一个仅在第一次调用并获得GameObject的布尔值,但是如果在我的函数中运行,那将再次是“无用的”。

有什么建议吗?谢谢

1 个答案:

答案 0 :(得分:1)

否,与MonoBehaviour不同,StateMachineBehaviour仅没有Start消息OnStateEnterOnStateExitOnStateIKOnStateMoveOnStateUpdate

也有AwakeOnEnable,但我很确定它们在StateMachine中没有使用,并且可能无法达到预期的效果。


但是您可以使用 OnStateMachineEnter

  

在过渡到StateMachine时在第一个Update帧上调用。过渡到StateMachine子状态时不会调用此方法。

或使用简单的布尔标志,例如

bool alreadyExecuted = false;

OnStateEnter()
{
    if(alreadyExecuted) return;

    // Do your stuff

    alreadyExecuted = true;
}

(只是一个猜测)
实际上,您可以在Inspector中启用和禁用类似StateMachineBehaviours的组件。因此,也许可以使用脚本以同样的方式使用

enabled = false;

但是我没有在API中找到任何有关它的信息,并且由于我目前正在使用智能手机,因此无法对其进行测试。