C# Unity教程中的循环引用
我对Unity还很陌生,所以我看了一些教程,其中一个教程是这样做的: GameController.csC# Unity教程中的循环引用,c#,unity3d,C#,Unity3d,我对Unity还很陌生,所以我看了一些教程,其中一个教程是这样做的: GameController.cs public class GameController : MonoBehaviour { [HideInInspector] public RoomNavigation roomNavigation; void Awake() { roomNavigation = GetComponent<RoomNavigation>();
public class GameController : MonoBehaviour {
[HideInInspector] public RoomNavigation roomNavigation;
void Awake()
{
roomNavigation = GetComponent<RoomNavigation>();
}
}
public class RoomNavigation: MonoBehaviour {
GameController controller;
void Awake()
{
controller = GetComponent<GameController>();
}
}
公共类游戏控制器:单行为{
[HideInInstitt]公共房间导航房间导航;
无效唤醒()
{
roomNavigation=GetComponent();
}
}
RoomNavigation.cs
public class GameController : MonoBehaviour {
[HideInInspector] public RoomNavigation roomNavigation;
void Awake()
{
roomNavigation = GetComponent<RoomNavigation>();
}
}
public class RoomNavigation: MonoBehaviour {
GameController controller;
void Awake()
{
controller = GetComponent<GameController>();
}
}
public class RoomNavigation:monobhavior{
游戏控制器;
无效唤醒()
{
控制器=GetComponent();
}
}
对我来说,这似乎是一个非常明显的循环引用的例子,但鉴于这是他们的一个官方教程,我想我可能遗漏了一些关于GetComponent
的内容。有人能澄清一下它是否是循环引用吗?如果是,为什么要这样教?这里没有问题
仅仅因为ObjectA引用了ObjectB,ObjectB也引用了ObjectA,这并不意味着“它们相互引用”
计算机科学已经研究了几十年
这会导致垃圾收集出现问题吗?
不,因为GC知道这样的东西,除非它是GC的一个简单实现,但是C#NET有一个很好的(或者至少不是简单的)GC系统。它不会检查任何对象是否有自上而下的引用:Main
有一个对GameObject
的引用,它有一个对SomeObject
的引用,它有一个对ObjectA
的引用,它有一个对ObjectB
的引用,它有一个对ObjectA
的引用(哦,那个已经被跟踪了,继续…)
在其他策略中,例如将新创建的对象放入池中,定期检查是否仍处于活动状态,一旦其处于活动状态一段时间,它将其放入一个可能仍处于活动状态的池中,而该池的检查频率较低。或者使用名为isDead
的字段,该字段被类的解构器标记为true(这将发生在C++基础底层统一代码中的方式),它为GC.< /P>标记对象。
如果两个对象都变得孤立(即它们的父游戏对象被销毁),它们也将被销毁
那么代码风格或软件架构问题呢?
可能吧。但这完全是主观的,不在这里。这两个对象必须相互了解吗?它们可以是一个对象吗?这些类有子类型并且可以互换吗
请记住,GameObject
知道Transform
和Transform
已经知道GameObject
,这是完全合理的理由。这里没有问题
仅仅因为ObjectA引用了ObjectB,ObjectB也引用了ObjectA,这并不意味着“它们相互引用”
计算机科学已经研究了几十年
这会导致垃圾收集出现问题吗?
不,因为GC知道这样的东西,除非它是GC的一个幼稚实现,但是C#.NET有一个好的(或者至少不是幼稚的)GC系统。它不检查任何对象是否有任何自上而下的引用:Main
有一个对GameObject
的引用,它有一个对SomeObject
的引用,它有一个对ObjectA
的引用,它有一个对ObjectA
的引用(哦,那个已经被跟踪了,继续…)
在其他策略中,例如将新创建的对象放入池中,定期检查是否仍处于活动状态,一旦其处于活动状态一段时间,它将其放入一个可能仍处于活动状态的池中,而该池的检查频率较低。或者使用名为isDead
的字段,该字段被类的解构器标记为true(这将发生在C++基础底层统一代码中的方式),它为GC.< /P>标记对象。
如果两个对象都变得孤立(即它们的父游戏对象被销毁),它们也将被销毁
那么代码风格或软件架构问题呢?
可能吧。但这完全是主观的,不在这里。这两个对象必须相互了解吗?它们可以是一个对象吗?这些类有子类型并且可以互换吗
请记住,
GameObject
已经知道了Transform
和Transform
已经知道了GameObject
,这是完全合理的理由。它似乎与a(循环引用)的定义不匹配[对我来说,这是完全有效的。@Enigmativity如果我理解正确,GameController
将有roomNavigation
,它本身将有一个对GameController
的引用,它本身将有一个对roomNavigation
的引用,依此类推。GetComponent
是否获得现有组件或创建一个新组件?GetComponent获取现有组件。如果您有两个单独的组件,需要相互了解,但不应组合成一个组件(即需要将组件放在单独的游戏对象上),那么使用循环引用就完全可以了。在这种情况下,不需要这些单独的组件,我假设它们存在的唯一原因是避免出现可能会让观众感到困惑的大代码块。此外,GetComponent相对较慢,GameObject.Find和GameObject.FindObjectsOfType甚至较慢。如果需要多次ess另一个组件或在每个更新帧访问它,然后你应该存储对它的引用。循环引用的常见情况是在mc上有一个玩家控制器脚本,在NPC上有脚本,控制他们的移动,存储他们的健康、武器、更改动画等。这些脚本可能需要相互交互(战斗、ai路径等)。它似乎与定义不匹配