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

一、前言

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

二、正文

2-1、简介

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

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

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

数据节点DataNode模块的数据的存储方式是以树形结构存储。
【GameFramework框架内置模块】2、数据节点(Data Node)-LMLPHP
图:树形存储结构

简单总结一下,就是数据节点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("节点:不存在");
        }
    }
}

运行结果:
【GameFramework框架内置模块】2、数据节点(Data Node)-LMLPHP

2-3、实现及代码分析

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

DataNodeManager.cs

/// 数据结点管理器。
internal class DataNodeManager : IDataNodeManager
{
    private const string RootName = "<Root>";//根节点是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);
}

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

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

在使用过程中,我们发现了一个类型Variable
【GameFramework框架内置模块】2、数据节点(Data Node)-LMLPHP
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();// 清理变量值。
}

三、后记

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


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

博主主页有联系方式。

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

02-21 11:20