无法通过调用外部脚本中的函数来实例化预制对象 (Unity/C#)
Trouble instantiating prefab object by calling function in external script (Unity/C#)
我无法让一个脚本从另一个脚本调用实例化函数。下图说明了我如何设置游戏对象。
我有 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
}
对我做错了什么有什么想法吗?
你的问题实际上是在Instantiate(thing3Obj);
行。
换句话说......当您实例化脚本时,您不会分配变量,在您的情况下 thing3Obj
。无论您是否已通过 Inspector 分配它们,在实例化时,您都会获得未分配的 class 的干净副本。您需要在调用之前分配它,这就是它给出 Null 异常的原因。
如果我正确理解您的设置:
- 反应 在 Thing1
- Thing3Instantiation 在 Thing3
上
因此,当 Reaction 醒来时,它会尝试在自己的游戏对象 (Thing1) 上找到名为 Thing3Instantiation 的组件。但它不在 Thing1 上,而是在 Thing3 上,所以 GetComponent
returns null
.
因此,您的 NullReferenceException。
我无法让一个脚本从另一个脚本调用实例化函数。下图说明了我如何设置游戏对象。
我有 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
}
对我做错了什么有什么想法吗?
你的问题实际上是在Instantiate(thing3Obj);
行。
换句话说......当您实例化脚本时,您不会分配变量,在您的情况下 thing3Obj
。无论您是否已通过 Inspector 分配它们,在实例化时,您都会获得未分配的 class 的干净副本。您需要在调用之前分配它,这就是它给出 Null 异常的原因。
如果我正确理解您的设置:
- 反应 在 Thing1
- Thing3Instantiation 在 Thing3 上
因此,当 Reaction 醒来时,它会尝试在自己的游戏对象 (Thing1) 上找到名为 Thing3Instantiation 的组件。但它不在 Thing1 上,而是在 Thing3 上,所以 GetComponent
returns null
.
因此,您的 NullReferenceException。