我使用可编写脚本的对象为我的 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/