【问题标题】:Unity StateMachineBehaviour : Start function called once?Unity StateMachineBehaviour:启动函数调用一次?
【发布时间】:2019-02-05 06:46:53
【问题描述】:

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

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

我的问题只是关于优化,我的 AI 需要获取 GameObject "Player" 才能攻击它。所以我现在在我的 OnStateEnter 方法中得到它,我觉得这很糟糕,因为每次调用动画时我都会得到它,我只想在开始时得到它一次。

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

那么,有没有办法拥有一个启动函数或只获取一个元素一次? 我可以创建一个仅在第一次调用并获取 GameObject 的 bool,但如果在我的函数中运行,这将是“无用的”。

有什么建议吗?谢谢

【问题讨论】:

  • 好吧,如果我用 Debug 创建一个 Start 函数,什么都不会出现,所以我猜在 StateMachineBehaviour 中没有实现 start 函数?或者也许我错过了一些东西。

标签: c# unity3d


【解决方案1】:

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

还有 AwakeOnEnable 但我很确定它们没有在 StateMachine 中使用,并且可能不会按预期运行。


但是,您可以使用 OnStateMachineEnter

在转换到 StateMachine 时在第一个更新帧上调用。转换到 StateMachine 子状态时不会调用此方法。

或者使用一个简单的布尔标志,比如

bool alreadyExecuted = false;

OnStateEnter()
{
    if(alreadyExecuted) return;

    // Do your stuff

    alreadyExecuted = true;
}

(只是猜测)
在 Inspector 中,您实际上可以启用和禁用 StateMachineBehaviours 之类的组件。所以它可能也可以在脚本中以相同的方式使用

enabled = false;

但我在 API 中没有找到任何关于它的信息,而且由于我目前在我的智能手机上,我无法对其进行测试。

【讨论】:

  • 我说的是在我的问题结束时制作一个布尔值,我对此并不满意,因为它每次都是检查,但也许我在这里有点太挑剔了。可能没有其他方法可以做到这一点。
  • 您也许可以在运行时禁用该行为,但我目前只能对此进行推测(请参阅我的更新)
  • 而且额外的布尔检查真的不用担心;)
猜你喜欢
  • 1970-01-01
  • 2022-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多