我正在学习教程(准确地说是 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
。
我尝试了一种不同的方法:我将 Player 的游戏对象拖放到 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。
最佳答案
您可能在场景中有不止 1 个带有标签“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);
}
关于c# - 跟踪游戏对象变换 - 为什么使用 FindGameObjectWithTag 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31406110/