具有默认值的Unity运行时脚本实例化

时间:2016-02-21 17:31:07

标签: c# unity3d parameters instantiation

我无法找到符合我情景的任何主题,所以我换了一个新主题。

我的预制件Light名为rewardHighlight

我有一个名为Reward的脚本,它有一个参数Highlight并使用Light rewardHighlight = (Light) Instantiate (Highlight);实例化Light。

我使用拖放功能将所述脚本的Highlight参数的默认值设置为RewardHighlight预制件。

当我将脚本拖放到对象上时,它可以正常工作。

当我使用Reward在运行时添加gameObject.AddComponent<Reward>();脚本时,我获得The thing you want to instantiate is null

所有人都非常感谢!

@Update

完整代码(为清晰起见而剥离):

Reward2.cs

using UnityEngine;
using System.Collections;

public class Reward2 : MonoBehaviour {

    public Light Highlight;
    private Light rewardHighlight;

    // Use this for initialization
    void Start () {
       rewardHighlight = (Light) Instantiate (Highlight);
       rewardHighlight.transform.position = new Vector3(transform.position.x, transform.position.y + 1, transform.position.z);
    }

    // Update is called once per frame
    void Update () {

    }
}

test.cs中

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

    // Use this for initialization
    void Start () {
        gameObject.AddComponent<Reward2>();
    }

    // Update is called once per frame
    void Update () {

    }
}

看起来Unity脚本会忘记&#39;它们在运行时的默认值。

1 个答案:

答案 0 :(得分:0)

AddComponent中致电Test.Start后,您需要为Highlight返回的Reward2实例上的AddComponent字段指定一个值。

例如,您的Test.Start可能看起来像这样:

void Start()
{
    Reward2 obj = gameObject.AddComponent<Reward2>();
    obj.Highlight = <SOME VALUE>;
}

现在,分配给Highlight的值不能仅仅是Light组件的实例,例如obj.Highlight = new Light()。原因是Instantiate方法创建游戏对象的实例而不是单个组件。如果您使用AddComponent<T>,它仍会创建游戏对象的实例,但会自动在新游戏对象上找到T类型的组件并返回该组件。

因此,为了完成这项工作,您可以将Test类更改为:

1)公开Light类型的字段,类似于Reward2类,并将该字段分配给Highlight属性:

public Light HighlightPrefab;
...
void Start()
{
    Reward2 obj = gameObject.AddComponent<Reward2>();
    obj.Highlight = HighlightPrefab;
}

2)Start方法中创建一个游戏对象,为其添加一个亮组件,然后将该组件分配到Highlight字段:

void Start()
{
    Reward2 obj = gameObject.AddComponent<Reward2>();

    GameObject gameObjectForLight = new GameObject();
    Light newLight = gameObjectForLight.AddComponent<Light>();

    //  Initialize newLight here

    obj.Highlight = newLight;
}

Reward2.Start调用Instantiate的任何一种情况下,它都会看到Highlight字段是一个组件,然后它将获得组件所附加的游戏对象,它将创建该游戏对象的新实例。