Unity 使用Odin插件解决多层字典配置文件问题

本人能力有限,如有不足还请斧正

1.先说要干啥

首先,Unity不支持字典直接在Inspector可视化 所以用到了odin插件

其次,这个例子是要对稍微复杂一点的配置结构进行解析

比如:本地化,阵营配置,资源配置

当然用so文件不是为了数据持久化,而是方便在编辑器内配置相关数据以快速迭代

2.看代码

cs 复制代码
using Sirenix.OdinInspector;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public enum E_Type { 
    A,
    B,
    C,
    D
}
public interface IFather { }
[Serializable]
public class xiaoMing : IFather {
    public string content;
}
[Serializable]
public class xiaoHong : IFather
{
    public string content;
}
[Serializable]
public class ruiRui : IFather
{
    public string content;
}
[Serializable]
public class naiLong : IFather
{
    public string content;
}
[CreateAssetMenu(fileName = "测试", menuName = "单字典")]
public class TestLocal : SerializedScriptableObject
{
    //单层字典套枚举
    [SerializeField]
    [DictionaryDrawerSettings(DisplayMode = DictionaryDisplayOptions.ExpandedFoldout,
        KeyLabel = "类型", ValueLabel = "具体哪一个人")]
    Dictionary<E_Type, IFather> dict0 = new Dictionary<E_Type, IFather>() { 
        {  E_Type.A,new xiaoMing()}, 
        {  E_Type.B,new xiaoHong()}
    };
}  

[CreateAssetMenu(fileName = "测试", menuName = "双层字典")]
public class TestLoca2 : SerializedScriptableObject
{
    //多层字典套枚举
    [SerializeField]
    [DictionaryDrawerSettings(DisplayMode = DictionaryDisplayOptions.OneLine,
        KeyLabel = "家庭", ValueLabel = "家庭组成")]
    Dictionary<string, Dictionary<string, TestLocal>> dict1 = new Dictionary<string, Dictionary<string, TestLocal>>();
}

TestLocal类中的单层字典dict0可以将实现了IFather接口的不同类实例,按照枚举E_Type进行分类存储,方便对同一类型下的对象进行管理和访问

在此基础上,TestLoca2类中的双层字典dict1,其键为表示 "家庭" 的字符串,值为TestLocal类型的对象。这样就可以进一步将不同类型的对象集合(即TestLocal实例),按照 "家庭" 的概念再次分类,实现了数据的多层次管理

可以拓展为:

角色管理 :游戏中有多种类型的角色,每个角色拥有不同的属性和技能。可以把不同类型的角色看作是实现IFather接口的不同类实例,利用TestLocal类中的单层字典dict0,按照角色类型(对应枚举E_Type)进行分类存储。比如E_Type.A代表战士类角色,E_Type.B代表法师类角色等。而TestLoca2类中的双层字典dict1,其键可以设定为不同的阵营或团队名称,值为TestLocal类型的对象,这样就能进一步将不同类型的角色集合按照阵营进行管理。例如 "联盟" 阵营和 "部落" 阵营,每个阵营下有不同类型的角色 ,方便对大量角色进行有序管理和快速查找

关卡配置 :不同关卡可以视为不同的 "家庭" 概念(即双层字典dict1的键) ,每个关卡中又有不同类型的元素,如敌人类型、道具类型等,这些元素可以利用单层字典dict0,按照类型枚举进行分类配置。例如在某一关卡中,E_Type.A表示普通敌人,E_Type.B表示精英敌人,通过这种方式可以灵活地配置每个关卡的元素组成和分布

3.配置图

这是单字典

这是双字典

实际上是三层字典,但是 因为最小的那一层 如下图

是作为一个so文件"折叠"起来的,因此我就起名叫双层字典了

相关推荐
会思考的猴子2 小时前
Unity VFX 属性 Postion 和 TargetPostion
unity
hai3152475436 小时前
九章编程法 · 猜数字游戏 (GW-BASIC 重构版) *
人工智能·microsoft·游戏引擎·游戏程序
思麟呀8 小时前
在C++基础上理解CSharp-5
开发语言·c++·c#
心前阳光10 小时前
Unity资源导入之自动化资源导入
unity·自动化·游戏引擎
心前阳光10 小时前
Unity之2021.3.45f2c1发布安卓程序遇到的问题
android·unity·游戏引擎
纪纯11 小时前
PicoVR Unity Integration SDK 3.4 常用交互API
unity·游戏引擎·vr·pico
z落落12 小时前
C#ToolStrip+StatusStrip 状态栏实时显示系统时间+NotifyIcon系统托盘
开发语言·c#
龙智DevSecOps解决方案12 小时前
3A 游戏优化技术栈:如何打通引擎级分析工具与 DevOps 持续集成管线?
unity·性能优化·游戏开发·技术美术·perforce·unrealengine
ctrl_v助手13 小时前
VisionPro (R) QuickBuild相机的连接
服务器·笔记·数码相机·c#
葛兰岱尔13 小时前
从 SolidWorks 到 Three.js,从 Inventor 到 Unity——制造业CAD模型“几何-语义一体化“转换,不再是天方夜谭!
开发语言·javascript·unity