我正在统一制造我的第一个敌人AI。我正在尝试使用动画控制器来完成状态机。
我刚刚发现了StateMachineBehaviour脚本,当AI处于状态时会调用该脚本。它具有多种方法,包括OnStateEnter。每当AI进入状态时都会调用它。
我的问题仅在于优化,我的AI需要获得GameObject“ Player”才能对其进行攻击。所以我暂时在我的OnStateEnter方法中获取它,这感觉很糟糕,因为每次调用动画时都获取它,所以我一开始只希望获取一次。
我基本上需要一个启动功能,但它不起作用,我进行了研究但未发现任何结果。我试图观看有关制作完成状态机的人的视频,但他们只是多次获得相同的GameObject(例如:https://youtu.be/dYi-i83sq5g?t=409)。
那么,有没有一种方法可以拥有启动功能或仅获取一次元素? 我可以创建一个仅在第一次调用并获得GameObject的布尔值,但是如果在我的函数中运行,那将再次是“无用的”。
有什么建议吗?谢谢
答案 0 :(得分:1)
否,与MonoBehaviour
不同,StateMachineBehaviour
仅没有Start
消息OnStateEnter
,OnStateExit
,OnStateIK
,OnStateMove
和OnStateUpdate
。
也有Awake
和OnEnable
,但我很确定它们在StateMachine中没有使用,并且可能无法达到预期的效果。
但是您可以使用
OnStateMachineEnter
在过渡到StateMachine时在第一个Update帧上调用。过渡到StateMachine子状态时不会调用此方法。
或使用简单的布尔标志,例如
bool alreadyExecuted = false;
OnStateEnter()
{
if(alreadyExecuted) return;
// Do your stuff
alreadyExecuted = true;
}
(只是一个猜测)
实际上,您可以在Inspector中启用和禁用类似StateMachineBehaviours
的组件。因此,也许可以使用脚本以同样的方式使用
enabled = false;
但是我没有在API中找到任何有关它的信息,并且由于我目前正在使用智能手机,因此无法对其进行测试。