【问题标题】:Unity/C# - Using [Serializefield] in Inspector vs a Find MethodUnity/C# - 在 Inspector 中使用 [Serializefield] 与 Find 方法
【发布时间】:2020-06-30 19:40:52
【问题描述】:

我正在 Unity 中构建一个简单的单场景移动街机游戏,作为我学习编码的一部分。游戏可能有多个级别,比如 100 个。为了构建第一个级别,我使用了多个脚本,这些脚本都通过检查器中的 [serializefield] 相互引用。此外,还有多个显示信息的 UI 文本框,这些文本框也链接到检查器中的相关脚本。我这样做是因为我认为这是在做了一些研究之后最有效的方法(基本上避免了引擎在场景中寻找已经存在的对象)。我预制了所有内容,包括持有脚本的空游戏对象并移至第二层。

不过……

当我开始构建第二个关卡时,它基本上包含具有不同参数的相同游戏对象,我注意到当我将预制件放入场景中时,我必须手动重新链接检查器中的所有引用。有这么多的链接要超过数百个级别,这将是非常乏味的,我会一直错过一些链接。在场景中放置预制对象非常好,但必须直接在场景中为每个关卡重新建立参考。将预制件链接到预制件不起作用(我试过了)。因此,这种方式似乎有很多手动链接工作。

所以结果是……

我开始认为我最好将GameObject.Find("string")FindObjectOfType<> 用于我的所有引用,以避免在每个级别的检查器中不断地创建大量链接。

不过……

查看论坛,有人说 Find 方法效率低,应该避免,我不知道效率如何。这让我很担心,因为这将是一款手机游戏。他们中的大多数都推荐 [serializefield] 和 Inspector 中的链接作为最佳解决方案。

所以,我想知道你是否可以从你的经验中得到一些启发。什么最适合我的情况?其他我没有考虑过的选项?

非常感谢。

【问题讨论】:

  • 如果所有对象都链接在一起,那么您应该创建一个空的父游戏对象,拖动每个场景所需的所有对象并从中制作一个预制件。那么你就不会有那些缺失的参考资料了。
  • “并移至第二级”是什么意思?您指定要在“一个场景”内构建。
  • @Immorality,非常感谢你!!!我只是通过创建一个空的游戏对象并将整个层次结构插入其中来测试它。场景之间的链接被保留。然后,任何编辑都将应用于所有级别。另一个比看起来更容易的解决方案示例。解决了!

标签: c# unity3d


【解决方案1】:

您永远不需要搜索对象。只需确保使用某种静态字段跟踪这些对象的存在即可。

对于某些事物的许多实例(例如玩家或敌人):

  • 静态列表

对于经理类等:

跟踪对象池生命周期的最简单和最好的方法是:

public class Enemy : MonoBehaviour
{
    public static List<Enemy> instances = new List<Enemy>(100);
    void OnEnable () => instances.Add( this );
    void OnDisable () => instances.Remove( this );
}

稍加注意,此列表将自我维护始终正确 - 在确保您在调用所有 OnEnable 之前不访问此列表之后(在 StartUpdate 中完全没问题)。

如您所见 - 搜索只是懒惰。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-29
    • 2020-01-27
    • 2022-10-04
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多