ArgumentException:要实例化的预制件为null

时间:2014-10-24 21:51:29

标签: unity3d instantiation unityscript

我收到错误而且我不知道为什么。从错误中我可以看出第12行出了问题,我想。

脚本较大但不需要解决问题。 但如果你真的需要它,你可以要求它。

以下是代码:

if(RandomInt==2) {
    var randomNumberB = Random.Range(3,5);
    for(var b = 0; b < randomNumberB; b++) {
        var xCoB = childVector3.x + Random.Range(0,10);
        var zCoB = childVector3.z + Random.Range(0,10);
        var randomRotationB = Quaternion.Euler(0,Random.Range(0,360),0);
        var chancheB = Random.Range(0,2);
        if(chancheB == 0) {
            var bushC = Instantiate(bushes[Random.Range(0,bushes.length)], Vector3(xCoB, childVector3.y, zCoB), randomRotationB);
            bushC.transform.name = "bush";
        } else {
            Instantiate(cactus, Vector3(xCoB, childVector3.y, zCoB), randomRotationB).transform.name = "cactus";
        }
    }
}

2 个答案:

答案 0 :(得分:3)

制作cactus预制件。

然后创建一个公共变量:

 public GameObject cactus;

然后通过de Editor将预制件拖放到脚本变量中。然后你可以实例化。

 if(cactus != null)
 {
    GameObject g = Instantiate(cactus, new Vector3(xCoB, childVector3.y, zCoB), randomRotation) as GameObject;

    g.name = "cactus";
 }

答案 1 :(得分:1)

如果预制件位于根资源文件夹中,则很容易。如果您希望它们位于Resources的子文件夹中,则会有所不同。您需要在。

中创建“Prefabs”文件夹

因为您使用的是Javascript

  1. 在资产/资源中给出一个名为“Your Prefab.prefab”的预制件:

    var NewGameObject : GameObject = Resources.Load("Your Prefab"),Vector3.zero,Quaternion.identity);
    

    这将允许您引用该预制件,并将其加载到内存中。

  2. 如果您希望在资产/资源的文件夹中包含预制件或更多预制件,则必须执行以下操作:

    2a上。在Assets / Resources中创建一个名为“Prefabs”的文件夹。

    2B。在那里创建您的文件夹(例如“Resources / Prefabs / Your Prefab Folder”);

    2c中。给出一个名为“Your Prefab.prefab”的预制件:

    var NewGameObject : GameObject = Resources.Load("Prefabs/Your SubFolder/Your Prefab"),Vector3.zero,Quaternion.identity);
    
  3. 注意:

    不要忘记删除“.prefab”扩展程序。

    Unity手册指出,您可以从Resources加载资源,而无需提供包含文件夹名称的路径。当然关于预制件(和javascript?)似乎不是真的(Unity 4.6)。