设置对象属性并检查Start()是否为null无效

时间:2016-03-22 17:29:34

标签: c# unity3d

问题在于使用脚本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

先谢谢,我打赌这个问题很愚蠢......

2 个答案:

答案 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类来帮助你。

抱歉我的英文不好:)