在调用Instantiate()方法使用prefab创建对象时,接收Instantiate()方法返回值的变量类型必须和声明prefab变量的类型一致,否则接收变量的值会为null.
 
比如说,我在脚本里面定义:
public GameObject myPrefab;
那么在使用这个myPrefab做Instantiate()的时候,接收返回值变量的类型也必须是GameObject,如下:
GameObject newObject = Instantiate(myPrefab) as GameObject;

注意Instantiate()后面的as也要是GameObject。

又比如我们的prefab类型是我们自定义的UserObject,

public UserObject prefab;

那么在使用Instantiate()时我们需要写成:

UserObject newObject = Instantiate(myPrefab) as UserObject;

比较容易犯的一个错误是我们声明的类型是:

public GameObject myPrefab;

在Instantiate()返回值却想要用Transform,如下:

Transform newObject = Instantiate(myPrefab) as Transform;

这个时候就会出现newObject为null的问题。

这个问题看起来很诡异,也曾经给我带来了一些麻烦,后来经过搜索和自己的实验证明了以上的结论,希望看到这篇文章的朋友可以避免这个问题。

导致这个问题的具体原因还不是很清楚,也许和C#语言的某些特性有关,自己也是刚接触C#没多久,如果之后搞明白会在这篇文章的下面补充。

04-14 16:17