c# - 创建具有常量唯一 ID 的可编写脚本的对象

标签 c# unity3d

我使用可编写脚本的对象为我的 Unity 游戏创建项目。假设我创建了一根棍子、一把剑和一个 Helm 。现在要使用它们,我需要将它们拖到一个列表中,在游戏开始时,每个项目都会获得一个分配的 ID,这也是列表中的位置,因为我只需循环遍历列表来分配 ID。现在我可以通过使用它拥有的索引来访问该项目,或者,如大多数关于 ScriptableObjects 的教程所示,然后我们可以将项目和 id 添加到 Dictionary 以更好地访问它们。

Stick 为 0,Sword 为 1,Helmet 为 2。现在我决定用补丁移除剑,因此 Helm 的 ID 为 1。现在每个存档都被破坏了,因为剑变成了 Helm 。

我如何处理分配的固定 ID,这些 ID 在我真的想再次分配之前不会改变并且不会被另一个项目占用?我当然可以为我创建的每个 ScriptableObject 对 id 进行硬编码,但正如您想象的那样,管理硬编码的 ID 似乎不是一个好主意。

最佳答案

创建一个字符串“ID”变量,当脚本对象验证时检查它是否为空。如果为空则创建一个GUID,如果不是,则什么都不做。

public string UID;
        private void OnValidate()
        {
    #if UNITY_EDITOR
            if (UID == "")
            {
                UID = GUID.Generate().ToString();
                UnityEditor.EditorUtility.SetDirty(this);
            }
    #endif
        }
我就是这样做的,它还将可编写脚本的对象设置为脏对象,因此在您重新启动统一编辑器时它不会重置。
您可以更进一步,将 UID 字段设为只读,以防止意外更改。

关于c# - 创建具有常量唯一 ID 的可编写脚本的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58984486/

相关文章:

c# - 如何在统一编辑器中使用 Input.Location 和模拟位置

c# - 如何将 blender 中的所有 Action (动画)导出到文件中。 fbx?

c# - 简单词差异算法

c# - 内存泄漏问题

ios - unity 5 "Build & Install iPhone player"对话框不消失

c# - 使用鼠标光标在特定轴上拖动 3D 对象

c# - 将文件写入名称递增的路径

c# - 更改 DeploymentItem 的名称

c# - Entity Framework 核心 2.1 : Access and change options after configuring DbContext?

unity3d - vuforia图像目标为白色(未显示我的图像目标)