我无法找到符合我情景的任何主题,所以我换了一个新主题。
我的预制件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;它们在运行时的默认值。
答案 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
字段是一个组件,然后它将获得组件所附加的游戏对象,它将创建该游戏对象的新实例。