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

本文关键字:FindGameObjectWithTag 不起作用 为什么 游戏 对象 转换 跟踪 | 更新日期: 2023-09-27 18:02:31

我正在遵循一个教程(确切地说是生存射击游戏),我正处于执行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。

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

场景中可能有多个带有"Player"标签的对象。我修改了你的代码来检测这种情况。

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);     
}

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

下面是你应该测试的内容:

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

  • 如果你的玩家gameObject有一个唯一的名字,尝试使用

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

  • 如果它仍然不起作用,如果这个脚本被分配给你的球员,你可以通过使用this

  • 访问gameObject
  • 如果你的脚本没有附加到你的玩家游戏对象,你可以设置你的玩家游戏对象作为一个公共属性到你的脚本。然后在编辑器中,抓取你的玩家游戏对象,并把它放在你的类属性的右边。在这种情况下,你的声明应该是:

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");
    }`
    

如果你的调试日志说有问题,也许试着捕捉一个异常。

相关文章:
  • 没有找到相关文章