Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Unity C中运行时从另一个脚本访问脚本#_C#_Unity3d_Gameobject - Fatal编程技术网

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

C# 在Unity C中运行时从另一个脚本访问脚本#,c#,unity3d,gameobject,C#,Unity3d,Gameobject,就像在中一样,但区别在于它应该是从实例化的预置中完成的,所以我不能将带有我想要访问的变量的脚本的游戏对象拖到这个脚本中 这起作用了 public ScriptA script; void Update() { if (script.varX < 0) { // . . . } } publicscripta脚本; 无效更新(){ if(script.varX

就像在中一样,但区别在于它应该是从实例化的预置中完成的,所以我不能将带有我想要访问的变量的脚本的游戏对象拖到这个脚本中

这起作用了

public ScriptA script;

void Update() {
   if (script.varX < 0) {
      // . . .
   }
}
publicscripta脚本;
无效更新(){
if(script.varX<0){
// . . .
}
}
但是现在我得到了“objectreference not set to a instance of a Object”错误,我认为这是由于试图访问ScriptA的脚本附加到了一个实例化的预置


如何在运行时附加脚本和/或游戏对象?

您想使用AddComponent,如:

ScriptA script = gameObject.AddComponent<ScriptA>() as ScriptA;
ScriptA script=gameObject.AddComponent()作为脚本;
请参见此处的文档:
您想使用AddComponent,如:

ScriptA script = gameObject.AddComponent<ScriptA>() as ScriptA;
ScriptA script=gameObject.AddComponent()作为脚本;
请参见此处的文档:

如果场景中已经存在脚本类型,则需要首先查找脚本类型:

publicscripta脚本;
void Start()
{
script=GameObject.FindObjectOfType();
}
无效更新()
{
if(脚本变量…)
}

如果场景中已经存在脚本类型,则需要首先查找脚本类型:

publicscripta脚本;
void Start()
{
script=GameObject.FindObjectOfType();
}
无效更新()
{
if(脚本变量…)
}

满足链接的最佳方法是在实例化后填充下一行中的字段,这样可以避免难看的expenstive Find*调用(我假设执行实例化的脚本可以知道目标对象是什么,毕竟它知道实例化什么和在何处)


值得注意的是,新实例化的脚本的Awake()方法将在Instantiate()返回之前被调用,而其Start()将在下一帧的开头被调用,这是两个调用之间的主要区别,因此,如果实例化的脚本需要Awake()中的refections,您应该重构(将内容移动到Start())或者按照前面的建议使用Find*。

满足链接要求的最佳方法是在实例化后填充下一行中的字段,这样可以避免难看和昂贵的Find*调用(我假设执行实例化的脚本可以知道目标对象是什么,毕竟它知道实例化什么和在哪里)


值得注意的是,新实例化的脚本的Awake()方法将在Instantiate()返回之前被调用,而其Start()将在下一帧的开头被调用,这是两个调用之间的主要区别,因此,如果实例化的脚本需要Awake()中的refections,您应该重构(将内容移动到Start())或者按照前面的建议使用Find*。

您不需要将
作为脚本
将游戏对象附加到实例化的预置上怎么样如果游戏对象已经实例化,你可以使用游戏对象的
Find
FindWithTag
FindObjectOfType
FindObjectsOfType
来(希望)找到我帖子的直接答案:
ScriptA script=GameObject.AddComponent()实际上会将脚本添加到游戏对象中。我会更深入地了解我所拥有的内容,也许会编辑我的第一篇文章,以便更清楚,也许是我的错误,我解释了你不需要
作为脚本a
如何将游戏对象附加到实例化的预制件上如果游戏对象已经实例化,你可以使用游戏对象的
Find
FindWithTag
FindObjectOfType
FindObjectsOfType
来(希望)找到我帖子的直接答案:
ScriptA script=GameObject.AddComponent()实际上会将脚本添加到游戏对象中。我会更深入地了解我所拥有的内容,也许会编辑我的第一篇帖子以使其更清晰,也许是我在解释为什么
FindObjectOfType
而不仅仅是
。Find
或其他任何一个?@realmany
Find
返回游戏对象(可能是其他对象,我不确定)其中as
FindObjectOfType
查找您正在搜索的类型,在本例中为
ScriptA
。它比执行
GameObject.Find(“YourGameObject”).GetComponent()
更安全、更快。另一个有用的方法是
FindObjectsOfType
,它是复数形式,因此您可以通过这种方式填充
ScriptA
类型数组,如
ScriptA[]scripts=GameObject.FindObjectsOfType()
为什么
FindObjectOfType
而不仅仅是
。查找
或其他任何类型?@realmany
Find
返回一个游戏对象(可能是其他对象,我不确定),其中as
FindObjectOfType
查找您正在搜索的类型,在本例中是
ScriptA
。它比执行
GameObject.Find(“YourGameObject”).GetComponent()
更安全、更快。另一个有用的方法是
FindObjectsOfType
,它是复数形式,因此您可以通过这种方式填充
ScriptA
类型数组,如
ScriptA[]scripts=GameObject.FindObjectsOfType()
它的可能重复项不是重复项。我在我的帖子中链接了同一个问题,区别在于我需要从预制游戏对象访问另一个脚本,这不能用同样的方式完成。你实例化一个预制,然后引用该克隆,通过实例化方法提供给你,你…做重复目标中列出的事情…可能的重复不是重复。我在我的帖子中链接了同一个问题,区别在于我需要从预制游戏对象访问另一个脚本,这不能用同样的方式完成。你实例化一个预制,然后引用实例化方法提供给你的克隆,你…做复制目标中列出的事情。。。