• 【GameFramework框架内置模块】2、数据节点(Data Node)


    推荐阅读

    大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

    一、前言

    【GameFramework框架】系列教程目录:
    https://blog.csdn.net/q764424567/article/details/135831551

    二、正文

    2-1、简介

    这一篇讲数据节点DataNode,基本开发程序都会有类似数据节点作用的东西,数据节点的作用其实就是保存游戏运行时的一些缓存数据,比如用户登录信息、用户名、任务节点等等。

    数据一般会有增删改查这四种操作,在运行时的数据一般是使用单例或者静态属性,将数据存储在内存中

    而数据节点也是将数据存储在内存中,但是不用序列化数据,比使用单例或者静态属性要容易维护的多,特别时它的树形结构可以让我们很好的组织我们的数据结构,方便做增删改查操作。

    数据节点DataNode模块的数据的存储方式是以树形结构存储。
    在这里插入图片描述
    图:树形存储结构

    简单总结一下,就是数据节点DataNode模块的主要作用就是方便存储数据,高效查找数据。

    下面,我们就来看一下数据节点DataNode模块如何使用吧。

    2-2、使用说明

    示例代码:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityGameFramework.Runtime;
    
    public class Test02 : MonoBehaviour
    {
        void Start()
        {
            // 获取DataNode组件
            var component = UnityGameFramework.Runtime.GameEntry.GetComponent<DataNodeComponent>();
    
            // 设置不同类型的节点数据
            component.SetData("Player.Id", (VarInt32)10101);
            component.SetData("Player.Name", (VarString)"frank");
            component.SetData("Player.Sex", (VarBoolean)true);
            component.SetData("Player.Age", (VarInt32)30);
    
            // 获取节点上数据
            string name = component.GetData<VarString>("Player.Name");
            Debug.Log("获取节点上数据:" + name);
    
            // 根据父节点获取孩子数据
            var parent = component.GetNode("Player");
            var age = parent.GetChild("Age").GetData();
            Debug.Log("根据父节点获取孩子数据:" + age);
    
            // 判断节点是否存在
            var node = component.GetNode("Player.Age");
            if (node != null)
            {
                Debug.Log("节点:存在");
            }
            else
            {
                Debug.Log("节点:不存在");
            }
    
            // 移除节点
            component.RemoveNode("Player.Age");
    
            var del_node = component.GetNode("Player.Age");
            if (del_node != null)
            {
                Debug.Log("节点:存在");
            }
            else
            {
                Debug.Log("节点:不存在");
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52

    运行结果:
    在这里插入图片描述

    2-3、实现及代码分析

    源码:https://gitee.com/jiangyin/GameFramework/tree/master/GameFramework/DataNode

    DataNodeManager.cs

    /// 数据结点管理器。
    internal class DataNodeManager : IDataNodeManager
    {
        private const string RootName = "";//根节点是Root
        private DataNode m_Root;
     
        /// 根据类型获取数据结点的数据。
        public T GetData<T>(string path, IDataNode node=null) where T : Variable;
    
        /// 设置数据结点的数据。
        public void SetData<T>(string path, T data, IDataNode node=null) where T : Variable;
    
        /// 获取数据结点。
        public IDataNode GetNode(string path, IDataNode node=null);
    
        /// 移除数据结点。
        public void RemoveNode(string path, IDataNode node = null);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    可以看出来它的基本API就是增删改查:

    • 增和改都用 :SetData
    • 删:RemoveNode
    • 查: GetData

    在使用过程中,我们发现了一个类型Variable
    在这里插入图片描述
    Variable类型是什么呢,其实就是一个可变的数据类型。

    因为C#是强类型语言,没有用一个类型来表示所有的数据类型,一般数据类型都继承object基类,当不确定的数据类型要转成指定的类型,需要进行装箱和拆箱操作,将数据转成object,再强转为指定类型。

    而使用Variable类型,就跟object强转类似,但是又有区别,就是它类型不丢失,可以无感使用Variable类和直接使用泛型T一样的。

    Variable类就是GF框架中一个万能类。

    基类Variable.cs结构如下所示:

    Variable.cs

    /// 基类变量。
    public abstract class Variable : IReference
    {
        public Variable(){}// 初始化变量的新实例。
    
        public abstract Type Type{get;}// 获取变量类型。
    
        public abstract object GetValue();// 获取变量值。
    
        public abstract void SetValue(object value);// 设置变量值。
    
        public abstract void Clear();// 清理变量值。
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    三、后记

    如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


    你的点赞就是对博主的支持,有问题记得留言:

    博主主页有联系方式。

    博主还有跟多宝藏文章等待你的发掘哦:

    专栏方向简介
    Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
    Unity3D从入门到进阶入门从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
    Unity3D之UGUIUGUIUnity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
    Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
    Unity3D之数据集合数据集合数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
    Unity3D之VR/AR(虚拟仿真)开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。
    Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
    Unity3D之日常开发日常记录主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
    Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。
  • 相关阅读:
    【计算机组成原理】第三章 存储系统
    算法|344.反转字符串 541. 反转字符串II 卡码网:54.替换数字 151.翻转字符串里的单词 卡码网:55.右旋转字符串
    框架内容整理
    SpringBoot集成WebSocket--------Spring方式集成(一)
    checking for module ‘sqlite3‘ package ‘sqlite3‘ not found
    渗透学习-靶场篇-XSS之订单与shell箱子反杀
    深入理解计算机网络-4信号编码与调制2
    快速入门基础控制台API
    在Linux系统上用nmap扫描SSL漏洞的方法
    Java -- 每日一问:String、StringBuffer、StringBuilder有什么区别?
  • 原文地址:https://blog.csdn.net/q764424567/article/details/136158833