问题在于使用脚本UnitScript
实例化预制件。实例化预制件时,我想手动设置变量:
GameObject unit = newUnit(this.transform.position); // Returns a prefab in the given position
unit.GetComponent<UnitScript>().myProperty = new MyObject(unit.GetComponent<UnitScript>());
print("myProperty was set");
问题出现在此Start()
的{{1}}方法中,其中UnitScript
显示为myProperty
,而不是我之前给出的值:
null
请注意,控制台按此顺序登录: myProperty已设置,myProperty为null
void Start() {
if (myProperty == null) {
print("myProperty is null");
}
}
方法:
newUnit
MyObject类如下所示:
return Instantiate(myPrefab, position, rotation) as GameObject;
// myPrefab is a public GameObject var that has a prefab given by the inspector
先谢谢,我打赌这个问题很愚蠢......
答案 0 :(得分:2)
将Instantiate(gameObject,position,rotation)作为GameObject返回; // gameObject是一个公共GameObject var,它有一个由检查员给出的预制件
尝试更改“gameObject”变量的名称,因为它已经存在。 gameObject指的是附加脚本的GameObject。
public GameObject PREFAB_GO;
不要忘记在检查员中重新分配。
所以它看起来像这样:
return Instantiate(PREFAB_GO, position, rotation) as GameObject;
修改强>
尝试查看MyObject()是否为空。
GameObject unit = newUnit(this.transform.position); // Returns a prefab in the given position
var test = new MyObject();
if (test == null)
{
print("test IS NULL");
}
unit.GetComponent<UnitScript>().myProperty = test;
print("myProperty was set");
<强> ANSWER 强>
发现问题/解决方案:MyObject类是子类UnityEngine.Object,由于某种原因,使用new初始化不起作用。更改为System.Object,一切正常。
这是作者在评论中提供的答案
答案 1 :(得分:0)
如果MyObject类继承自MonoBehaviour,那么这是一个基本行为。
事实上,你不能调用任何类的构造函数而不是继承MonoBehaviour。如果这样做,Constructor将返回null。这就是为什么你可以拥有一个null属性。
如果MyObject必须从MonoBehaviour继承,请创建一个初始化类的Init方法。在您的情况下,您可以使用附加脚本的新实例的AddComponent方法。不要忘记将所有内容从构造函数移动到启动或清醒方法。
你应该: unit.GetComponent()。myProperty = gameObject.AddComponent();
我们需要看到MyObject类来帮助你。
抱歉我的英文不好:)