与here类似,但区别在于它应该是从实例化的预制件中完成的,因此我无法将具有我想要访问的变量的脚本的GameObject拖到此脚本中。
这是有效的
public ScriptA script;
void Update() {
if (script.varX < 0) {
// . . .
}
}
但是现在我得到“对象引用未设置为对象的实例”错误,我认为这是因为尝试访问ScriptA的脚本附加到实例化的事实预制。
如何在运行时附加脚本和/或GameObject?
答案 0 :(得分:2)
看起来你需要先找到你的脚本类型,如果它已经存在于场景中:
public ScriptA script;
void Start()
{
script = GameObject.FindObjectOfType<ScriptA>();
}
void Update()
{
if(script.variable...)
}
答案 1 :(得分:1)
您想使用AddComponent,例如:
ScriptA script = gameObject.AddComponent<ScriptA>() as ScriptA;
请参阅此处的文档: https://docs.unity3d.com/ScriptReference/GameObject.AddComponent.html
答案 2 :(得分:0)
满足链接的最佳方法是在实例化之后填充下一行中的字段,这样就可以避免丑陋且费力的Find *调用(我假设实例化的脚本可以知道什么是毕竟,目标对象知道实例化的内容和位置
值得注意的是,新实例化的脚本'Awake()方法将在Instantiate()返回之前调用,而其Start()将在下一帧的开头调用,这是两个调用之间的主要区别,所以如果您的实例化脚本需要Awake()中的refectence,您应该重构(将内容移动到Start())或使用之前建议的Find *。