Unity3d 团结,从另一个预制场中产生一个预制场

Unity3d 团结,从另一个预制场中产生一个预制场,unity3d,Unity3d,我不熟悉团结。我有一个不可见的游戏对象,叫做A,只有一个脚本,它多次实例化一个预置B。我需要B的衍生克隆来引用A,我已经了解到,为了让它工作,A本身必须是一个预制体(如果我错了,请纠正我)。衍生B对象对鼠标单击做出反应并调用A的方法。问题是,在这个被调用的A方法中,A本身的变量具有我不期望的值,例如,在Start()中初始化为0且从未使用过的某个变量的值为12。似乎每个衍生对象B都有一个对其“自己的”a的引用,a的变量都有随机值。我错过了什么 为了让它工作,A本身必须是一个预制件(如果我错了,请

我不熟悉团结。我有一个不可见的游戏对象,叫做A,只有一个脚本,它多次实例化一个预置B。我需要B的衍生克隆来引用A,我已经了解到,为了让它工作,A本身必须是一个预制体(如果我错了,请纠正我)。衍生B对象对鼠标单击做出反应并调用A的方法。问题是,在这个被调用的A方法中,A本身的变量具有我不期望的值,例如,在Start()中初始化为0且从未使用过的某个变量的值为12。似乎每个衍生对象B都有一个对其“自己的”a的引用,a的变量都有随机值。我错过了什么

为了让它工作,A本身必须是一个预制件(如果我错了,请纠正我)

我假设您正在将脚本中的相关字段prefact
B
设置为
A
的prefact,这不是您想要的<代码>一个根本不必是预制件

预置是一个序列化的游戏对象,它包含特定的共享默认值,以便通过编辑器和编辑器/游戏脚本轻松管理游戏对象。在处理大量类似对象时使用预制件;每个预制实例都将与另一个类似,但有几个修改的属性除外。这允许在一次单击中对预制实例进行大规模实例化修改。例如,将枪射弹对象存储为预制件允许您通过单击修改所有枪射弹的默认大小,同时允许基于每个实例进行属性自定义。你可以将预置视为可以用来实例化游戏对象的模板

当通过
A
(以下称为
ScriptA
)上的脚本生成prefate
B
的实例时,只需将生成的B实例(以下称为
ScriptB
)上脚本上的必填字段设置为
ScriptA
gameObject
(或某些其他)字段,例如:

// ScriptA's method which spawns instances of prefab B
GameObject bInstance = Instantiate(prefabB);
ScriptB scriptOnBInstance = bInstance.GetComponent<ScriptB>();

scriptOnBInstance.referenceToAGameObject = this.gameObject;
//ScriptA的方法,该方法生成预置B的实例
GameObject bin实例=实例化(预制b);
ScriptB ScriptonBinInstance=BinInstance.GetComponent();
ScriptonBinInstance.ReferenceToGameObject=this.gameObject;
为了让它工作,A本身必须是一个预制件(如果我错了,请纠正我)

我假设您正在将脚本中的相关字段prefact
B
设置为
A
的prefact,这不是您想要的<代码>一个根本不必是预制件

预置是一个序列化的游戏对象,它包含特定的共享默认值,以便通过编辑器和编辑器/游戏脚本轻松管理游戏对象。在处理大量类似对象时使用预制件;每个预制实例都将与另一个类似,但有几个修改的属性除外。这允许在一次单击中对预制实例进行大规模实例化修改。例如,将枪射弹对象存储为预制件允许您通过单击修改所有枪射弹的默认大小,同时允许基于每个实例进行属性自定义。你可以将预置视为可以用来实例化游戏对象的模板

当通过
A
(以下称为
ScriptA
)上的脚本生成prefate
B
的实例时,只需将生成的B实例(以下称为
ScriptB
)上脚本上的必填字段设置为
ScriptA
gameObject
(或某些其他)字段,例如:

// ScriptA's method which spawns instances of prefab B
GameObject bInstance = Instantiate(prefabB);
ScriptB scriptOnBInstance = bInstance.GetComponent<ScriptB>();

scriptOnBInstance.referenceToAGameObject = this.gameObject;
//ScriptA的方法,该方法生成预置B的实例
GameObject bin实例=实例化(预制b);
ScriptB ScriptonBinInstance=BinInstance.GetComponent();
ScriptonBinInstance.ReferenceToGameObject=this.gameObject;

能否提供附加到A
游戏对象的脚本
?能否提供附加到A
游戏对象的脚本
?起初,我的游戏对象A不是预制的,因为我只需要它的一个实例;我将其转换为一个预置,因为我试图从编辑器(通过拖放)给预置B一个对a的引用,假设这是给预置B的克隆一个对a的引用的正确方法。但是这样,在编辑预置B并单击apply之后,我看到对a的引用丢失了,所以为了避免这种情况,我将a转换为预置。现在我明白了这完全没有意义,我可以通过编程方式给一个游戏对象一个对另一个游戏对象的引用。@RaffaeleTasso如果答案解决了你的问题,请接受它,将这个问题标记为已回答,并帮助其他有同样问题的人轻松找到解决方案。作为另一个信息片段,预置不会序列化(存储)场景中包含对象引用的字段的任何值,因为无法保证该对象在其他场景中的存在。但是,对预置的引用将被存储,因为它们被序列化到磁盘,并且可以从整个项目的任何地方访问。因此,为什么在B的预置中对场景GameObject实例的引用丢失了,但对预置的引用保留了下来。感谢您的澄清,这是有意义的。在unity论坛上,对于同一个问题,一位用户建议将相关变量和方法标记为静态对象。考虑到这两种解决方案都是可行的,你认为哪种方法最好?@ RaffaLeasSoo我宁愿不使用静态字段来解决这个问题,因为它们会中断实例化。如果您决定在一个场景中有一个以上的实例,那么静态字段将需要成为实例字段,并且在每次使用时都需要手动重构。但是,如果你使用实例字段,你只需将消费者脚本中使用的对A的引用更改为A的另一个实例