繁体   English   中英

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

[英]Instantiating prefabs from another script (The prefab you want to instantiate is null)

因此,我有一个敌人生成器,可以实例化工作正常的预制件。 简化:

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:您要实例化的预制为null。

我究竟做错了什么?

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

enemyspawner = gameObject.AddComponent<EnemySpawner> ();

enemyspawner.setEnemies();  

但这仍然行不通。

我刚刚读了您对更改的评论:

enemyspawner = gameObject.AddComponent<EnemySpawner>(); new enemyspawner = gameObject.AddComponent<EnemySpawner>();

但是,您没有正确解决问题,您只是做了一个无法解决的方法,因为您的预制public GameObject EnemyPrefab; ,将不会被设置。

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


我的建议

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

然后从另一个类调用函数setEnemies() ,您可以这样做:

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

因此,您正在做的是在场景中查找名为EnemySpawnerObject的GameObject,然后获取名为EnemySpawner的组件,然后可以调用该类实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM