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

标签 c# reference unity3d 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

我尝试了一种不同的方法:我将 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/

相关文章:

c# - 使用过时版本的 MyAssembley.XmlSerializers.dll

c# - Crystal 报表不显示任何数据

c# 十进制到字符串的货币

asp.net - web.config 程序集元素和项目文件引用元素有什么区别

c++ - 如何通过引用访问动态分配数组的特定索引?

azure - AzCosmosDBSqlContainer : "Object reference not set to an instance of an object."

C# windows 窗体在 Windows 7 中崩溃

c# - 在 Unity3D 中无延迟地截取屏幕截图

c# - 将 JSON 转换为字典列表

unity3d - 获取 Sprite 的宽度