当前位置: 首页 > article >正文

Unity中列表List使用出类似字典Dictionary的感觉

首先为什么会有这个标题?

因为字典很好用,只需要键就能拿到值,这种感觉是真的爽,新手最喜欢用了,遇事不决就字典,但是也有不好的地方,字典的内存开销比列表List要大,遍历也是List占优势(内存连续,但是查询、删除、插入是不如字典的)。

明明各有千秋,为什么我要使用List呢?标题是Unity,哈哈哈懂了吧,一般情况下字典无法在untiy的inspector页面上展示出来,这就使得添加数据和查看数据成为了麻烦,但巧了List可以。

欸,这个时候必定有杠精要来说,你不会自定义属性绘制器吗,这样不就展示出来了吗?

欸,就等你这句话了,对此,我都说了"一般情况下",各位想重写的可以去写,unity不提供,是因为Unity的序列化系统并不直接支持标准的.NET Dictionary类型,一般来说序列化的数据都能再inspector上显示。

欸,但是别急,想在inspector上看到依旧是有很多方法的,不建议写。毕竟已经有大佬写了:

(这三个都是,都可以使用)

SerializableDictionaryForUnity

SerializableDictionaryLite

unity3d-ordered-dictionary

这里先介绍List如何使用出字典的感觉:

[CreateAssetMenu(fileName = "New Audio Data",menuName = "ScriptableObject/Audios Data")]
public class AudioScriptableObject : ScriptableObject
{
    [Tooltip("音频组")]
    public List<AudioWithTag> audio;
}

[System.Serializable]
public class AudioWithTag
{
    public string tag;
    [Tooltip("音频")]
    public AudioClip audio_clip;
}

这是我写的一个用于创建ScriptableObject的数据对象工具,这是个音频数据对象

可以看到用的就是List,在inpector上展示如下:

我们拿数据怎么拿?

如下:

             //找到对应tag的音频
            AudioWithTag audio = audio_data.audio.Find((_audio)=>
            {
                return _audio.tag.Equals("Enter");
            });

这是因为List中有查询的方法,当然还有是否存在的方法,

优化一下,在该类中定义获取方法。

    /// <summary>
    /// 获取音频
    /// </summary>
    /// <param name="tag">音频tag</param>
    /// <param name="audio">返回的音频</param>
    /// <returns>找到则返回true,否则返回false</returns>
    public bool TryGetAudioGroup(string tag,out AudioClip clip)
    {
        if(audio!=null)
        {
            Debug.LogError($"音频组为空");
            clip = null;
            return false;
        }
        AudioWithTag audio_withtag = audio.Find((_clip)=>{
            return _clip.tag.Equals(tag);
        });
        if(audio_withtag == null || audio_withtag.audio_clip == null)
        {
            Debug.LogError($"音频{tag}没有找到!");
            clip = null;
            return false;
        }
        clip = audio_withtag.audio_clip;
        return true;
    }

是不是在找的时候用出了字典的感觉,字典我们拿数据是TryGetValue这个方法,方式相似,代码量相当。


http://www.kler.cn/a/458549.html

相关文章:

  • springcloud篇2-feign、gateway
  • 大数据-260 实时数仓 - 项目背景与需求 实时数仓架构 需求分析 技术选型 逻辑架构
  • MicroDiffusion——采用新的掩码方法和改进的 Transformer 架构,实现了低预算的扩散模型
  • 神经网络-VggNet
  • 刷新页面一次,错误地进行了多次重复调用后端服务
  • rk3588 android12 root
  • MySQL ConnectorODBC 5.1.4 for 32-bit Windows 安装与应用指南
  • 科技成果鉴定测试有哪些注意事项?
  • STM32-笔记17-PWM波型
  • 深度解析 Python 网络框架:Django、Tornado、Flask 和 Twisted
  • 【学生管理系统】权限管理之用户管理
  • 紫光同创-盘古200pro+开发板
  • 小程序配置文件 —— 12 全局配置 - pages配置
  • 攻防世界 robots
  • 使用Python实现基于区块链的供应链管理:提升透明度与效率
  • C++--------内存结构
  • git设置项目远程仓库指向github的一个仓库
  • 将时间戳转换成年月日时分秒的字符串(ubuntu20.04,C++)
  • 《Vue3 二》Vue 的模板语法
  • 低代码开发中 DDD 领域驱动的页面权限控制