繁体   English   中英

在Unity C#中的运行时从另一个脚本访问脚本

[英]Accessing a script from another script at runtime in Unity C#

就像在这里一样,但是不同之处在于它应该是从实例化的预制件完成的,因此我不能将具有要访问的具有变量的脚本的GameObject拖到该脚本中。

在此处输入图片说明

这在工作

public ScriptA script;

void Update() {
   if (script.varX < 0) {
      // . . .
   }
}

但是现在我收到“对象引用未设置为对象实例”的错误,我认为这是由于试图访问ScriptA的脚本已附加到实例化的预制件上而引起的。

如何在运行时附加脚本和/或GameObject?

您要使用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()返回之前被调用,而其Start()将在下一帧的开始处调用,这是两次调用之间的主要区别,因此如果您实例化了脚本需要Awake()中的内容,您应该重构(将内容移动到Start()),或者按照前面的建议使用Find *。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM