跟踪游戏对象变换 - 为什么使用FindGameObjectWithTag不起作用?

时间:2015-07-14 12:05:55

标签: c# unity3d reference unity5 navmesh

我正在按照教程(正好是survival shooter),我正处于实施NavMesh的阶段。他们的原始剧本是这样的:

 Transform _player;
 NavMeshAgent nav;

 void Start()
 {
     _player = GameObject.FindGameObjectWithTag("Player").transform;
     nav = GetComponent<NavMeshAgent>();
 }

 void Update()
 {
     nav.SetDestination(_player.position);     
 }

到目前为止没什么特别的。我按下游戏,奇怪的是敌人(我场景中只有一个)只到达玩家的初始位置(0,0,0),而不是在玩家移动时跟随它。我意识到播放器的位置未在_player字段中更新,并且保持在0,0,0

我尝试了一种不同的方法:我将玩家的游戏对象拖放到UI中的属性上(我首先将该属性公开,然后将其更改为GameObject)。在这种情况下,它完美无缺:

 GameObject _player;
 NavMeshAgent nav;

 void Start()
 {
     //Player is not retrieved here as before, but it's passed assigning the GameObject to the property directly through the UI
     nav = GetComponent<NavMeshAgent>();
 }

 void Update()
 {
     nav.SetDestination(_player.transform.position);     
 }

在这个阶段,我想知道:

FindGameObjectWithTag方法是否会复制对象而不是返回对GameObject的引用?为什么它在第一个实例中不起作用。顺便说一下,我使用Unity 5。

2 个答案:

答案 0 :(得分:1)

您可能在场景中有多个带有“播放器”标记的对象。我更改了你的代码来检测这种情况。

Transform _player;
NavMeshAgent nav;

void Start()
{
    GameObject[] playerObjects = GameObject.FindGameObjectsWithTag("Player");
    if(playerObjects.Length>1) 
    {
        Debug.LogError("You have multiple player objects in the scene!");
    }
    _player = playerObjects[0].transform;
    nav = GetComponent<NavMeshAgent>();
}

void Update()
{
    nav.SetDestination(_player.position);     
}

答案 1 :(得分:0)

我发现可能存在许多不同的问题:

所以这是你应该测试的:

  • 首先你应该尝试: GameObject.FindGameObjectWithTag("Player").GetComponent<Transform>();

  • 如果您的播放器gameObject具有唯一名称,请尝试使用

Transform playerTransform = GameObject.Find("MyPlayerName").transform

  • 如果它仍然不起作用,如果将此脚本分配给您的播放器,则可以使用this

  • 访问gameObject
  • 如果您的脚本未附加到您的播放器游戏对象,则可以将播放器游戏对象设置为脚本的公共属性。然后在编辑器中,抓住你的玩家游戏对象并将其放在你的类属性的正确情况下。在这种情况下,您的声明应为:

public GameObject myPlayer;

  • 但在测试任何这些方法之前,您应该通过在此编辑器中使用您的播放器名称来测试问题是否来自GameObject.FindGameObjectWithTag。假设您的gameobject玩家名称是MyFantasticPlayer。然后试试这个:

    `GameObject myPlayer = GameObject.FindGameObjectWithTag("Player");
    if(myPlayer.name == "MyFantasticPlayer")
    {
       Debug.Log("Not problem with FindGameObjectWithTag");
    }else{
    Debug.Log("Problem");
    }`
    

如果您的调试日志出现问题,可能会尝试捕获异常。