在运行时在 Unity C# 中从另一个脚本访问脚本
Accessing a script from another script at runtime in Unity C#
和here一样,但不同的是它应该是从一个实例化的预制件中完成的,所以我不能将具有我想要访问的变量的脚本的游戏对象拖到这个脚本。
这是有效的
public ScriptA script;
void Update() {
if (script.varX < 0) {
// . . .
}
}
但现在我收到了 "Object reference not set to an instance of an object" 错误,我认为这是因为尝试访问 ScriptA 的脚本附加到实例化的预制件。
如何在运行时附加脚本 and/or 游戏对象?
您想使用 AddComponent,例如:
ScriptA script = gameObject.AddComponent<ScriptA>() as ScriptA;
在此处查看文档:
https://docs.unity3d.com/ScriptReference/GameObject.AddComponent.html
看来你需要先找到你的脚本类型,如果它已经存在于场景中:
public ScriptA script;
void Start()
{
script = GameObject.FindObjectOfType<ScriptA>();
}
void Update()
{
if(script.variable...)
}
满足链接的最佳方法是在实例化后的下一行中填写字段,这样就可以避免丑陋和昂贵的 Find* 调用(我假设执行实例化的脚本可以意识到目标对象是什么,毕竟它知道实例化的内容和位置)
值得注意的是,新实例化的脚本的Awake()方法会在Instantiate()之前被调用returns,而它的Start()会在下一帧开始时被调用,这是一个主要区别在这两个调用之间,因此如果您的实例化脚本需要 Awake() 中的反射,您应该重构(将内容移至 Start())或按照之前的建议使用 Find*。
和here一样,但不同的是它应该是从一个实例化的预制件中完成的,所以我不能将具有我想要访问的变量的脚本的游戏对象拖到这个脚本。
这是有效的
public ScriptA script;
void Update() {
if (script.varX < 0) {
// . . .
}
}
但现在我收到了 "Object reference not set to an instance of an object" 错误,我认为这是因为尝试访问 ScriptA 的脚本附加到实例化的预制件。
如何在运行时附加脚本 and/or 游戏对象?
您想使用 AddComponent,例如:
ScriptA script = gameObject.AddComponent<ScriptA>() as ScriptA;
在此处查看文档: https://docs.unity3d.com/ScriptReference/GameObject.AddComponent.html
看来你需要先找到你的脚本类型,如果它已经存在于场景中:
public ScriptA script;
void Start()
{
script = GameObject.FindObjectOfType<ScriptA>();
}
void Update()
{
if(script.variable...)
}
满足链接的最佳方法是在实例化后的下一行中填写字段,这样就可以避免丑陋和昂贵的 Find* 调用(我假设执行实例化的脚本可以意识到目标对象是什么,毕竟它知道实例化的内容和位置)
值得注意的是,新实例化的脚本的Awake()方法会在Instantiate()之前被调用returns,而它的Start()会在下一帧开始时被调用,这是一个主要区别在这两个调用之间,因此如果您的实例化脚本需要 Awake() 中的反射,您应该重构(将内容移至 Start())或按照之前的建议使用 Find*。