将任意类型的数据以树状结构的形式进行保存,用于管理游戏运行时的各种数据。
常规用法
获取数据结点组件
1 |
DataNodeComponent dataNodeComponent = GameEntry.GetComponent<DataNodeComponent>(); |
获取根数据结点
1 |
IDataNode root = dataNodeComponent.Root; |
移除所有数据结点
1 |
dataNodeComponent.Clear(); |
数据结点相关操作
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 |
IDataNode node = /* 某个数据结点 */; // 获取数据结点的名字 string nodeName = node.Name; // 获取数据结点的完整名称 string nodeFullName = node.FullName; // 获取数据结点的父数据结点 IDataNode nodeParent = node.Parent; // 获取数据结点的子数据结点数量 int nodeChildCount = node.ChildCount; // 获取数据结点的数据 Variable nodeValue = node.GetData(); // 设置数据结点的数据 node.SetData(/* 此示例忽略数据参数 */); // 根据索引检查是否存在子数据结点 bool hasChildByIndex = node.HasChild(0); // 根据名称检查是否存在子数据结点 bool hasChildByName = node.HasChild("ChildName"); // 根据索引获取子数据结点,若不存在则返回 null IDataNode nodeChildByIndex = node.GetChild(0); // 根据名称获取子数据结点,若不存在则返回 null IDataNode nodeChildByName = node.GetChild("ChildName"); // 根据名称获取子数据结点,若不存在则创建并返回 IDataNode nodeNewChildByName = node.GetOrAddChild("ChildName"); // 根据索引移除子数据结点 node.RemoveChild(0); // 根据名称移除子数据结点 node.RemoveChild("ChildName"); // 获取全部子数据结点,返回数组结果,会有额外内存分配 IDataNode[] nodeChildren = node.GetAllChild(); // 获取全部子数据结点,可重复使用预先分配好的 List 存储结果,避免内存分配 List<IDataNode> nodeChildrenResult = new List<IDataNode>(); node.GetAllChild(nodeChildrenResult); // 移除当前数据结点的数据和所有子数据结点 node.Clear(); |
通过绝对路径获取或设置数据
1 2 3 4 5 6 7 8 9 10 11 12 |
VarString varPlayerName = "Ellan"; // 使用绝对路径设置数据结点的数据 dataNodeComponent.SetData("Player.Name", varPlayerName); // 可以使用绝对路径获取数据结点的数据变量 Variable playerNameVariable = dataNodeComponent.GetData("Player.Name"); // 也可以使用绝对路径获取数据结点的数据值 string playerNameValue = dataNodeComponent.GetData<VarString>("Player.Name"); Log.Info("玩家姓名是 '{0}' '{1}'", playerNameVariable.ToString(), playerNameValue); |
通过参照某个数据结点和相对路径获取或设置数据
1 2 3 4 5 6 7 8 9 10 11 |
// 获取某个数据结点 IDataNode playerNode = dataNodeComponent.GetNode("Player"); // 使用相对路径设置数据结点的数据 dataNodeComponent.SetData<VarInt>("Level", 99, playerNode); // 使用相对路径获取数据结点的数据 // 等价于 dataNodeComponent.GetData("Player.Level") Variable playerLevelVariable = dataNodeComponent.GetData("Level", playerNode); Log.Info("玩家等级是 '{0}'", playerLevelVariable.ToString()); |
内置变量类
数据结点上的数据仅允许使用从 Variable 类派生的对象,当前包含了以下内置变量类型。
- VarBool bool 变量类型
- VarByte byte 变量类型
- VarBytes byte[] 变量类型
- VarChar char 变量类型
- VarChars char[] 变量类型
- VarColor UnityEngine.Color 变量类型
- VarColor32 UnityEngine.Color32 变量类型
- VarDateTime System.DateTime 变量类型
- VarDecimal decimal 变量类型
- VarDouble double 变量类型
- VarFloat float 变量类型
- VarGameObject UnityEngine.GameObject 变量类型
- VarInt int 变量类型
- VarLong long 变量类型
- VarMaterial UnityEngine.Material 变量类型
- VarObject object 变量类型
- VarQuaternion UnityEngine.Quaternion 变量类型
- VarRect UnityEngine.Rect 变量类型
- VarSByte sbyte 变量类型
- VarShort short 变量类型
- VarString string 变量类型
- VarTexture UnityEngine.Texture 变量类型
- VarTransform UnityEngine.Transform 变量类型
- VarUInt uint 变量类型
- VarULong ulong 变量类型
- VarUnityObject UnityEngine.Object 变量类型
- VarUShort ushort 变量类型
- VarVector2 UnityEngine.Vector2 变量类型
- VarVector3 UnityEngine.Vector3 变量类型
- VarVector4 UnityEngine.Vector4 变量类型
自定义变量类
使用者可以自定义所需的变量类型。
例如,有一个用于记录构建信息的 BuildInfo 类。
1 2 3 4 5 6 7 8 9 |
/// <summary> /// 构建信息类。 /// </summary> [Serializable] public class BuildInfo { public string GameVersion = string.Empty; public int InternalVersion = 0; } |
若想把此类型的值用于数据结点中,需要定义相应的变量类 VarBuildInfo 后,即可使用了。
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 |
/// <summary> /// 构建信息变量类。 /// </summary> public class VarBuildInfo : Variable<BuildInfo> { /// <summary> /// 初始化构建信息变量类的新实例。 /// </summary> public VarBuildInfo() { } /// <summary> /// 初始化构建信息变量类的新实例。 /// </summary> /// <param name="value">值。</param> public VarBuildInfo(BuildInfo value) : base(value) { } /// <summary> /// 从构建信息类到构建信息变量类的隐式转换。 /// </summary> /// <param name="value">值。</param> public static implicit operator VarBuildInfo(BuildInfo value) { return new VarBuildInfo(value); } /// <summary> /// 从构建信息变量类到构建信息类的隐式转换。 /// </summary> /// <param name="value">值。</param> public static implicit operator BuildInfo(VarBuildInfo value) { return value.Value; } } |
参考手册
最佳实践
暂无。
常见问题
暂无。