我正在按照教程(正好是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。
答案 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
如果您的脚本未附加到您的播放器游戏对象,则可以将播放器游戏对象设置为脚本的公共属性。然后在编辑器中,抓住你的玩家游戏对象并将其放在你的类属性的正确情况下。在这种情况下,您的声明应为:
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");
}`
如果您的调试日志出现问题,可能会尝试捕获异常。