使用默认值的 Unity 运行时脚本实例化
本文关键字:运行时 脚本 实例化 Unity 默认值 | 更新日期: 2023-09-27 18:35:32
我找不到任何与我的场景匹配的主题,所以我做了一个新主题。
我有一个名为 rewardHighlight
的 Light
类型的预制件。
我有一个名为 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 脚本在运行时"忘记"了它们的默认值。
在 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
字段是一个组件,然后它将获取组件附加到的游戏对象,并将创建该游戏对象的新实例。