2016-12-07 187 views
0

序言/ * 我最近开始摆弄团结:做一个初学者的乒乓球比赛,因为大多数做的,我一直在试图用现在的3D对象的工作。我的想法是做一个塔防游戏,所以我有一个塔和一个临时目标虚拟物。塔有一个脚本,它应该允许它找到与敌方标记最近的对象,并画出一条线,但这里是问题:*/FindGameObjectsWithTag没有返回对象

我的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; 
     } 
    } 
} 

我看了虽然有一千个其他线程,并找不到我的问题是什么。任何帮助将不胜感激。

+1

这可能是一个愚蠢的问题,但你是** 100%**确定敌人真的有这个确切的标签 –

+0

是否启用这些对象('activeInHierarchy')? –

+0

是的,这也发生在我身上,所以我直接复制了文本以确保它完全相同。 只要我能从检查员屏幕上看到它们就被启用,所有的滴答滴答都会打勾,我还需要检查什么? – totalolage

回答

0

如果您还没有调试此代码,您可以检查if (tmpd <= range && dist > tmpd)是否正在通过。

但是让我们假设你已经调试的代码,并acctualy没有发现任何物体,那么我建议你使用这样的:

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 
    } 
} 
+0

你可以在函数中看到有一个注释掉,比如我用来调试代码的print(敌人)。我在您的代码中使用FindObjectsOfType时遇到了同样的问题:我在打印allObjects的内容后应该填充它,并且它是空的。 – totalolage

+0

你正在使用哪个Unity版本? –

相关问题