在外部脚本(Unity / C#)中调用函数无法实例化预制对象

时间:2019-05-03 21:54:28

标签: c# function unity3d instantiation

我无法让一个脚本从另一个脚本调用实例化函数。下图说明了如何设置游戏对象。

enter image description here

我有2个对象物Thing1和Thing2,它们根据附加到它们的运动脚本在屏幕上移动。 Thing1还附加了一个反应脚本。当Thing1和Thing2碰撞时,Thing 3应该出现。 Thing3附带有一个实例化脚本,该脚本包含带有实例化命令的函数。

当我在实例化脚本中调用实例化函数时(将其放在Thing3的Start函数中),它可以正常工作。但是,当我从那里拿走它并尝试将其放入Thing2附带的反应脚本的“开始”功能中时,我无法使其正常工作。目前,我在编译时没有出错,但是一旦游戏开始,我就会得到以下提示(Thing1和Thing2的行为似乎也受到不利影响):

"NullReferenceException: Object reference not set to an instance of an object"

当我查找该错误的原因时,我发现最典型的原因是未将预制对象附加到脚本。但是,我确实在脚本上附加了一个预制件。它附加到包含实例化功能的实例化脚本。

下面是实例化脚本的代码,以及在实例化脚本中调用实例化函数的反应脚本的代码。

//Instantiation
public class Thing3Instantiation : MonoBehaviour
{
    public GameObject thing3Obj;

    void Start()
    {
        //CreateThing3();
    }

    public void CreateThing3()
    {
        Instantiate(thing3Obj);
    }
}

//Reaction
public class Reaction : MonoBehaviour
{
    private Thing3Instatiation thing3instantiation;

    void Awake()
    {
        thing3instantiation = GetComponent<Thing3Instantiation>();
    }

    void Start()
    {
        thing3instantiation.CreateThing3();   //This line triggers the null error
    }

关于我在做什么错的任何想法吗?

2 个答案:

答案 0 :(得分:2)

如果我正确理解您的设置:

  • 反应在Thing1上
  • Thing3Instantiation 位于Thing3

因此,当反应唤醒时,它将尝试在其自己的gameObject(Thing1)上找到名为Thing3Instantiation的组件。但是它不在Thing1上,而是在Thing3上,因此GetComponent返回null

因此,您的NullReferenceException。

答案 1 :(得分:1)

您的问题实际上在Instantiate(thing3Obj);行。

换句话说...实例化脚本时,对于thing3Obj,不会分配变量。不管您是否通过Inspector进行了分配,实例化后,您都会获得该类的干净副本,且未分配。您需要在调用之前分配它,这就是为什么它会给出Null异常的原因。