脚本在一个游戏对象上正常工作,但在另一个游戏对象上不正常

Script working properly on one gameobject, but not on another

我有一个非常难运行的问题。

我使用 navmesh 工具和自定义脚本创建了一个 AI,一旦到达旧目的地,它就会不断为 navmesh 代理分配新目的地。

我不得不为这个 AI 替换模型(之前是一个胶囊),所以我这样做了,复制了几乎所有组件,调整了一些参数,如代理高度等,然后 运行 它。

胶囊 AI 可以正常工作,但具有正确模型的 AI 显然不能。
调试后,我发现建模 AI 的目的地列表包含 if Vector3.zero,而胶囊 AI 在其目的地列表中具有正确的 vector3s。

这是我的 AI 目标脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class AIMovement : MonoBehaviour
{

private NavMeshAgent _navMeshAgent;                         //reference to the navmesh agent
private MapController _mapControllerScript;                 //reference to the map controller script to access waypoints
private List<Vector3> _wayPoints = new List<Vector3>();
private Vector3 _destination;

// Use this for initialization
void Start()
{
    _mapControllerScript = GameObject.Find("Map_01").GetComponent<MapController>();
    SetWayPointLocations();
    _navMeshAgent = this.GetComponent<NavMeshAgent>();

    Debug.Log(_mapControllerScript.ToString());
    Debug.Log(_mapControllerScript.HealthPickUpPositions.ToString());
    Debug.Log(_navMeshAgent);
    Debug.Log(_wayPoints);
    foreach (Vector3 waypoint in _wayPoints)
    {
        Debug.Log(waypoint);
    }
}

// Update is called once per frame
void Update()
{
    MoveAroundMap();
}

void MoveAroundMap()
{
    if (_navMeshAgent.transform.position.x == _destination.x &&
        _navMeshAgent.transform.position.z == _destination.z
        || _destination == new Vector3(0, 0, 0)
        )
    {
        Debug.Log("Acquiring new position");
        _destination = _wayPoints[Random.Range(0, _wayPoints.Count-1)];
    }

    _navMeshAgent.SetDestination(_destination);
}

void SetWayPointLocations()
{
    foreach (Vector3 waypoint in _mapControllerScript.HealthPickUpPositions)
    {
        _wayPoints.Add(waypoint);
    }
    foreach (Vector3 waypoint in _mapControllerScript.AmmoPickUpPositions)
    {
        _wayPoints.Add(waypoint);
    }
}
}

这里是控制台:可以清楚的看到胶囊AI的坐标是正确的,而坏掉的AI坐标是(0, 0, 0).

这是 层次结构 window:Capsule 是工作的 AI,Character_Piccolo 是非工作的。

这是 Capsule 的 检查员正在工作的 AI

这是模型的检查员损坏的AI

抱歉拖了这么久,但我想确保你们掌握了所有需要的信息。

提前致谢!

问题 - 以及解决方案 - 不在您的 AIMovement 脚本中,也不在您从胶囊更改为新模型时所做的任何编辑中,甚至不在您的任何脚本和组件中在问题中提供。问题是你 MapController class 一直存在的微妙之处(甚至在你进行更改之前),而你之前没有遇到此错误的事实是偶然的。

正如您在评论中所说,您正在其 Start() 方法中设置 MapController class 的 HealthPickUpPositionsAmmoPickUpPositions 属性。您正在读取组件 class 的 Start() 方法中这些属性的值。问题是:一旦在加载的场景中设置了游戏对象,Start 消息就会运行,但是对象启动的顺序 不取决于您的游戏逻辑(它取决于场景层次结构,预制件,对象实例编号和其他东西,随便什么......)和应该被认为是随机的

在您的特定情况下,AIMovementStart()MapControllerStart() 之前被调用,即在设置属性的正确值之前- 因此,你读到的都是零向量(默认值)。

因此,unity 在 gameObjects 上有一个名为 Awake() 的类似消息。您也不知道对象将被唤醒的顺序,但您可以确保任何 Start() 消息仅在所有 Awake() 消息已发送后才会发送。关于此的更多信息 here, here, and here.

解决方法:将你的classes的所有内部初始化逻辑都放在Awake方法中;以及 Start 方法上与其他游戏对象(假设它们已初始化)的所有连接。