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