Unity教程中的循环参考

时间:2019-05-27 01:03:35

标签: c# unity3d

我对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的东西。有人可以澄清它是否是循环引用,如果可以,为什么他们会这样讲?

1 个答案:

答案 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已经知道TransformTransform已经知道GameObject,这是完全合理的理由。