我有一个非常奇怪的问题。
我使用navmesh工具和自定义脚本创建了一个AI,该脚本在到达旧目标后不断为navmesh代理分配新目标。
我不得不 …
问题 - 以及解决方案 - 不在你的身上 AIMovement 脚本,或者在从胶囊更换到新模型时执行的任何编辑,甚至在您在问题中提供的任何脚本和组件中都没有。问题是你的微妙之处 MapController 已经存在的课程(甚至在你的更改之前),以及你之前没有遇到过这个错误的事实是一个随意的问题。
AIMovement
MapController
正如你在评论中所说,你正在建立 HealthPickUpPositions 和 AmmoPickUpPositions 你的属性 MapController 在它的课堂 Start() 方法。而你正在阅读那些属性的值 Start() 组件类的方法。问题是:一旦在加载的场景上设置了gameObject,就会运行Start消息,但是 的 该对象的顺序开始 强> 不依赖于你的游戏逻辑(它取决于场景层次结构,预制件,对象实例编号和其他东西,无论......)和 的 应该被认为是随机的 强> 。
HealthPickUpPositions
AmmoPickUpPositions
Start()
在你的具体情况下, Start() 你的 AIMovement 正在被召唤之前 Start() 的 MapController ,即在设置属性的正确值之前 - 因此,您读取的所有内容都是零向量(默认值)。
因此,团结有一个类似的消息 Awake() 在gameObjects上。您也不知道对象被唤醒的顺序,但您可以确保任何对象 Start() 消息将仅在所有消息发送后发送 Awake() 消息已经发送。更多关于此 这里 , 这里 , 这里 和 这里 。
Awake()
的 解决方案 强> :将类的所有内部初始化逻辑放在Awake方法中;以及Start方法中与其他游戏对象(假设它们已初始化)的所有连接。