从另一个脚本实例化预制件(要实例化的预制件为空)

时间:2014-06-12 16:59:11

标签: c# unity3d null instance

所以我有一个敌人的spawner,其方法是实例化预制件工作正常。简化为:

public class EnemySpawner : MonoBehaviour {

public GameObject EnemyPrefab;

public void setEnemies()
{
    Instantiate (EnemyPrefab, enemyPos, rotation);
}

void Start()
{
    setEnemies();
}

}

这很好用。但是当我从另一个脚本调用它时它不起作用:

public class Player : MonoBehaviour {
public EnemySpawner enemyspawner;

void Update(){
   if (Input.GetMouseButtonDown (0)) 
   {
      enemyspawner= new EnemySpawner();
       enemyspawner.setEnemies();
   }
}

我一直收到这个错误:

  

ArgumentException:要实例化的预制件为空。

我做错了什么?

编辑: 所以我认为我无法使用New关键字创建Monobeaviour。我将其更改为:

enemyspawner = gameObject.AddComponent<EnemySpawner> ();

enemyspawner.setEnemies();  

但那还不行。

1 个答案:

答案 0 :(得分:1)

我刚刚阅读了有关更改的评论:

newenemyspawner = gameObject.AddComponent<EnemySpawner>();

但是,您没有正确解决问题,因为您的预制件public GameObject EnemyPrefab;无法设置,您只能制定一个无法解决的解决方法。

使用新代码gameObject.AddComponent<EnemySpawner>();您正在将一个脚本附加到Player GameObject,这将在将来为您带来问题。


我的建议

创建一个空GameObject并将EnemySpawner附加到其上,并将其命名为 EnemySpawnerObj

然后从另一个类调用函数setEnemies()

EnemySpawner spwner = GameObject.Find("EnemySpawnerObject").GetComponent<EnemySpawner>();
spwner.setEnemies();

所以你正在做的是在场景中查找名为 EnemySpawnerObject 的GameObject,然后你得到名为 EnemySpawner 的组件,然后你可以调用该类实例。