4

我正在学习一个教程(确切地说是生存射击游戏),并且我正处于实现 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.

我尝试了一种不同的方法:我将 Player 的游戏对象拖放到 UI 中的属性上(我先将属性设为 public,然后将其更改为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。

4

2 回答 2

1

场景中可能有超过 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);     
}
于 2016-05-10T21:31:24.137 回答
0

我看到可能存在很多不同的问题:

所以这是你应该测试的:

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

  • 如果您的玩家游戏对象具有唯一名称,请尝试使用

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

  • 如果它仍然不起作用,如果此脚本已分配给您的玩家,您可以使用以下命令访问游戏对象this

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

public GameObject myPlayer;

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

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

如果您的调试日志显示有问题,则可能尝试捕获异常。

于 2015-07-17T14:58:47.083 回答