我对Unity很陌生,所以我正在看一些教程,在其中一个教程中,他们采用了这种模式:
GameController.cs
public class GameController : MonoBehaviour {
[HideInInspector] public RoomNavigation roomNavigation;
void Awake()
{
roomNavigation = GetComponent<RoomNavigation>();
}
}
RoomNavigation.cs
public class RoomNavigation: MonoBehaviour {
GameController controller;
void Awake()
{
controller = GetComponent<GameController>();
}
}
对我来说,这似乎是循环引用的一个很明显的例子,但是看到它是在他们的官方教程之一上的,我想我可能会缺少关于GetComponent
的东西。有人可以澄清它是否是循环引用,如果可以,为什么他们会这样讲?
答案 0 :(得分:2)
因为ObjectA引用了ObjectB,而ObjectB 也引用了ObjectA,但这并不意味着“彼此引用”。
几十年来,计算机科学一直在与doubly linked lists交涉。
不,因为除非GC是天真的实现,否则GC知道类似这样的东西,但是C#.NET具有良好的(或者至少不是天真的)GC系统。它不会检查是否有对象有任何引用,它自上而下起作用:Main
引用了GameObject
,引用对象是SomeObject
,其中引用了ObjectA
,引用了ObjectB
,引用了ObjectA
(哦,已经被跟踪了,继续...)。
在其他策略中,例如将新创建的对象放入池中以定期检查是否仍保持活动状态,并且一旦它存活了一段时间,它就会将其放入可能仍保持活动状态的池中,并对其进行检查不经常。或使用一个名为isDead
的字段,该字段被类的Deconstructor标记为true(这种情况会在C ++底层Unity代码中向下传播),该字段会为GC标记一个对象。
如果两个对象都被隔离(即,其父级游戏对象已被破坏),它们也将被破坏。
可能是。但这完全是主观的,这里不是主题。这两个对象是否彼此了解?他们可以成为一个对象吗?这些类是否具有子类型并且可以互换?
请记住,GameObject
已经知道Transform
,Transform
已经知道GameObject
,这是完全合理的理由。