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

2024-02-21 01:12

本文主要是介绍【GameFramework框架内置模块】2、数据节点(Data Node),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

推荐阅读

  • CSDN主页
  • GitHub开源地址
  • Unity3D插件分享
  • 简书地址

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新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("节点:不存在");}}
}

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

2-3、实现及代码分析

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

DataNodeManager.cs

/// 数据结点管理器。
internal class DataNodeManager : IDataNodeManager
{private const string RootName = "<Root>";//根节点是Rootprivate 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
在这里插入图片描述
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干货文章。


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

博主主页有联系方式。

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

专栏方向简介
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和坑,让后来人可以有些参考。

这篇关于【GameFramework框架内置模块】2、数据节点(Data Node)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/730138

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi