使用默认值的 Unity 运行时脚本实例化

本文关键字:运行时 脚本 实例化 Unity 默认值 | 更新日期: 2023-09-27 18:35:32

我找不到任何与我的场景匹配的主题,所以我做了一个新主题。

我有一个名为 rewardHighlightLight 类型的预制件。

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

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

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

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

所有的帮助非常感谢!

@update

完整代码(为清楚起见,已剥离):


奖励2.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 () {
    }
}

测试.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 脚本在运行时"忘记"了它们的默认值。

使用默认值的 Unity 运行时脚本实例化

Test.Start 中调用 AddComponent 后,您需要为 AddComponent 返回的Reward2实例上的Highlight字段分配一个值。

例如,您的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字段是一个组件,然后它将获取组件附加到的游戏对象,并将创建该游戏对象的新实例。