【问题标题】:FindGameObjectsWithTag not returning objectsFindGameObjectsWithTag 不返回对象
【发布时间】:2016-12-07 21:47:48
【问题描述】:

前言 /* 我最近开始搞统一:像大多数人一样制作初学者的乒乓球游戏,我现在一直在尝试使用 3d 对象。我的想法是做一个塔防游戏,所以我有一个塔和一个临时目标假人。塔有一个脚本,它应该允许它找到最近的带有敌人标签的物体并画一条线,但这里有一个问题:*/

我的 GameObject.FindGameObjectsWithTag("Enemy") 函数返回一个空数组,尽管场景中有一个已标记且启用的对象。

public class Attack : MonoBehaviour
{

    GameObject[] enemies;
    float dist;
    GameObject target = null;
    bool targeted = false;
    float range = 1000;

    bool FindTarget()
    {
        bool found = false;
        enemies = GameObject.FindGameObjectsWithTag("Enemy");
        //print(GameObject.FindGameObjectsWithTag("Enemy"));
        foreach (GameObject enemy in enemies)
        {
            float tmpd = Vector3.Distance(enemy.transform.position, transform.position);
            if (tmpd <= range && dist > tmpd)
            {
                dist = tmpd;
                target = enemy;
                found = true;
            }
        }
        return found;
    }

    // Update is called once per frame
    void Update()
    {
        if (!targeted)
            targeted = FindTarget();
        else {
            Debug.DrawLine(target.transform.position, transform.position, Color.red);
            dist = Vector3.Distance(target.transform.position, transform.position);
            if (dist > range)
                targeted = false;
        }
    }
}

我已经查看了一千个其他线程,但找不到我的问题所在。任何帮助将不胜感激。

【问题讨论】:

  • 这可能是个愚蠢的问题,但你100%确定敌人真的有那个确切的标签
  • 这些对象是否启用 (activeInHierarchy) ?
  • 是的,我也遇到过这种情况,所以我从字面上复制了文本以确保它是相同的。就我在检查器屏幕上看到的而言,它们已启用,所有刻度都已打勾,我还需要检查什么?
  • 现在它可以工作了。我实际上并没有改变代码或场景中的任何内容。它刚刚决定开始工作。我不知道。

标签: c# unity3d unity5


【解决方案1】:

如果您还没有调试过这段代码,您可以检查if (tmpd &lt;= range &amp;&amp; dist &gt; tmpd) 是否通过。

但是让我们假设您已经调试了代码并且实际上还没有找到任何对象,那么我建议您使用它:

var allObjects = GameObject.FindObjectsOfType(typeof(GameObject)) as GameObject[]; // this will grab all GameObjects from the current scene!
foreach(GameObejct obj in allObjects) {
    if(obj.Tag == "Enemy") {
        // do some magic here
    }
}

编辑:

如果前面的例子不起作用,你可以使用这个:

List<GameObject> allObjects = new List<GameObject>();
Scene activeScene = SceneManager.GetActiveScene();
activeScene.GetRootGameObjects( allObjects );
foreach(GameObject obj in allObjects) {
    if(obj.Tag == "Enemy") {
        // do some magic here
    }
}

【讨论】:

  • 你可以在函数中看到一个注释掉了,比如我用来调试代码的 //print(enemies)。我在代码中使用的 FindObjectsOfType 遇到了同样的问题:我正在打印 allObjects 的内容,因为它应该被填充并且它是空的。
  • 您使用的是哪个 Unity 版本?
猜你喜欢
  • 2021-05-28
  • 2014-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-18
相关资源
最近更新 更多