Unity/C#-在Inspector中使用[Serializefield]与查找方法

Unity/C#-在Inspector中使用[Serializefield]与查找方法,c#,unity3d,C#,Unity3d,我正在Unity中构建一个简单的单场景移动街机游戏,作为我尝试学习编码的一部分。游戏可能有多个关卡,比如说100关卡。为了构建第一个级别,我使用了多个脚本,它们都通过inspector中的[serializefield]相互引用。此外,还有多个显示信息的UI文本框,这些文本框还链接到inspector中的相关脚本。我这样做是因为我认为这是在做了一些研究之后最有效的方法(基本上避免引擎在场景中寻找已经存在的对象)。我预制了所有东西,包括空的游戏对象,其中包含脚本并移动到第二级 然而 当我开始构建第

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

然而

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

所以结果是

我开始认为我最好使用
GameObject.Find(“string”)
FindObjectOfType
作为我的所有参考,以避免在每个关卡的检查器中不断创建大量链接

然而

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

所以,我想知道你是否能从你的经历中得到一些启示。什么对我的情况最有效?我没有考虑过的其他选择


非常感谢。

您不需要搜索对象,永远都不需要。只是确保这些物体的存在是通过某种静态场来跟踪的

对于许多情况(如玩家或敌人):

  • 静态列表
对于经理课程等:

  • SerializableField指向
  • 静态单态场
跟踪对象池生命周期的最简单和最好的方法是:

public class Enemy : MonoBehaviour
{
    public static List<Enemy> instances = new List<Enemy>(100);
    void OnEnable () => instances.Add( this );
    void OnDisable () => instances.Remove( this );
}
公共类敌人:单一行为
{
公共静态列表实例=新列表(100);
void OnEnable()=>instances.Add(这个);
void OnDisable()=>instances.Remove(此);
}
在确保在调用所有
OnEnable
之前不访问此列表(在
Start
Update
中完全可以)后,无需太过小心,此列表将自行维护为始终正确


正如你所希望看到的,搜索只是一种懒惰。

你不需要搜索对象,永远都不需要。只是确保这些物体的存在是通过某种静态场来跟踪的

对于许多情况(如玩家或敌人):

  • 静态列表
对于经理课程等:

  • SerializableField指向
  • 静态单态场
跟踪对象池生命周期的最简单和最好的方法是:

public class Enemy : MonoBehaviour
{
    public static List<Enemy> instances = new List<Enemy>(100);
    void OnEnable () => instances.Add( this );
    void OnDisable () => instances.Remove( this );
}
公共类敌人:单一行为
{
公共静态列表实例=新列表(100);
void OnEnable()=>instances.Add(这个);
void OnDisable()=>instances.Remove(此);
}
在确保在调用所有
OnEnable
之前不访问此列表(在
Start
Update
中完全可以)后,无需太过小心,此列表将自行维护为始终正确


正如你所希望看到的那样,搜索只是在偷懒。

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