主题
GameData
DataEditorAttribute 双端
命名空间 GameData
csharp
public class DataEditorAttribute : Attribute构造函数
DataEditorAttribute 双端
csharp
public DataEditorAttribute()属性
FunctionBias 双端
csharp
public FunctionBias FunctionBias { get; set; }公式函数的推荐运行端。此值用于数据编辑器筛选函数,不表示属性本身只存在于某一端。
ShowOnNode 双端
csharp
public bool ShowOnNode { get; set; }ShowFullPathOnNode 双端
csharp
public bool ShowFullPathOnNode { get; set; }ShowLinkAsDropdownOnNode 双端
csharp
public bool ShowLinkAsDropdownOnNode { get; set; }GameDataCategory 双端
命名空间 GameData
csharp
public abstract class GameDataCategory<TSelf> : IGameDataCategory<TSelf>, IGameData<TSelf>, IGameData where TSelf : GameDataCategory<TSelf>, IGameDataCategory<TSelf>构造函数
GameDataCategory 双端
csharp
protected GameDataCategory(IGameLink<TSelf> link)属性
Link 双端
csharp
public IGameLink<TSelf> Link { get; }Catalog 双端
csharp
public static IEnumerable<TSelf> Catalog { get; }Name 双端
csharp
public string Name { get; set; }方法
RedirectTo 双端
csharp
public static void RedirectTo(TSelf data, IGameLink<TSelf> linkTo)TryUnregister 双端
csharp
public static bool TryUnregister(IGameLink<TSelf> link, out TSelf? removed)Removes the value currently registered for a canonical link.
link— The canonical link whose current registration should be removed.removed— The removed value, ornullwhen the link was not registered.
返回: true when a registration was removed.
Get 双端
csharp
public static V? Get<V>(IGameLink<V> gameLink) where V : IGameData<V>, TSelfGetLink 双端
csharp
public static IGameLink<TSelf>? GetLink(int hashCode)GetData 双端
csharp
public static TSelf? GetData(int hashCode)GetLinkByHashLocal 双端
csharp
public static IGameLink<TSelf>? GetLinkByHashLocal(int hashCodeLocal)ToString 双端
csharp
public override string? ToString()GameLink 双端
命名空间 GameData
csharp
public readonly struct GameLink<TCategory, V> : IGameLink<V>, IGameLink, IEquatable<IGameLink> where TCategory : GameDataCategory<TCategory>, IGameDataCategory<TCategory> where V : TCategory, IGameData<V>表示数编表的泛型结构体,提供对特定游戏数据类型的类型安全引用。
备注
GameLink 是星火引擎数据驱动系统的核心组件,作为轻量级的值类型结构体, 提供对数编表(GameData)的高效、类型安全的引用机制。它是实现数据与逻辑解耦的关键桥梁。 核心特性: 值类型结构体 - 内存开销极小,适合大量使用 类型安全 - 泛型设计确保编译时类型检查 全局唯一性 - 通过哈希码机制确保全局唯一标识 延迟加载 - 只在访问 Data 属性时进行实际数据查找 多种构造方式 - 支持字符串ID、UTF8字节数组和哈希码构造 序列化友好 - 可安全地进行序列化和网络传输 哈希码机制: GameLink 使用双重哈希码设计确保全局唯一性: 全局HashCode = 本地HashCode ⊕ 类型HashCode 这种设计确保: 不同类型的数据不会产生哈希冲突 相同ID的不同类型数据可以安全共存 实现O(1)时间复杂度的高效查找 使用场景: 游戏对象配置引用 - 单位、技能、物品等通过 GameLink 关联配置数据 数据编辑器生成 - 自动生成的静态引用,便于全局访问 网络同步 - 通过哈希码在客户端和服务端之间同步数据引用 动态数据查找 - 运行时通过ID或哈希码动态创建引用 典型用法: // 1. 通过字符串ID创建 var heroLink = new GameLink<GameDataUnit, GameDataUnit>("HostTestHero"); // 2. 通过UTF8字节数组创建(推荐用于静态定义,性能更好) var heroLink2 = new GameLink<GameDataUnit, GameDataUnit>("HostTestHero"u8); // 3. 通过哈希码创建 var heroLink3 = new GameLink<GameDataUnit, GameDataUnit>(12345); // 4. 访问数据(延迟加载) var heroData = heroLink.Data; // 可能为 null // 5. 安全的数据访问 if (heroLink.Data is GameDataUnit hero) { // 使用hero数据 }
构造函数
GameLink 双端
csharp
public GameLink(int hashCodeLocal)表示数编表的泛型结构体,提供对特定游戏数据类型的类型安全引用。
备注
GameLink 是星火引擎数据驱动系统的核心组件,作为轻量级的值类型结构体, 提供对数编表(GameData)的高效、类型安全的引用机制。它是实现数据与逻辑解耦的关键桥梁。 核心特性: 值类型结构体 - 内存开销极小,适合大量使用 类型安全 - 泛型设计确保编译时类型检查 全局唯一性 - 通过哈希码机制确保全局唯一标识 延迟加载 - 只在访问 Data 属性时进行实际数据查找 多种构造方式 - 支持字符串ID、UTF8字节数组和哈希码构造 序列化友好 - 可安全地进行序列化和网络传输 哈希码机制: GameLink 使用双重哈希码设计确保全局唯一性: 全局HashCode = 本地HashCode ⊕ 类型HashCode 这种设计确保: 不同类型的数据不会产生哈希冲突 相同ID的不同类型数据可以安全共存 实现O(1)时间复杂度的高效查找 使用场景: 游戏对象配置引用 - 单位、技能、物品等通过 GameLink 关联配置数据 数据编辑器生成 - 自动生成的静态引用,便于全局访问 网络同步 - 通过哈希码在客户端和服务端之间同步数据引用 动态数据查找 - 运行时通过ID或哈希码动态创建引用 典型用法: // 1. 通过字符串ID创建 var heroLink = new GameLink<GameDataUnit, GameDataUnit>("HostTestHero"); // 2. 通过UTF8字节数组创建(推荐用于静态定义,性能更好) var heroLink2 = new GameLink<GameDataUnit, GameDataUnit>("HostTestHero"u8); // 3. 通过哈希码创建 var heroLink3 = new GameLink<GameDataUnit, GameDataUnit>(12345); // 4. 访问数据(延迟加载) var heroData = heroLink.Data; // 可能为 null // 5. 安全的数据访问 if (heroLink.Data is GameDataUnit hero) { // 使用hero数据 }
GameLink 双端
csharp
public GameLink(string id)通过字符串标识符初始化 GameLink 实例。
id— 字符串标识符,将自动计算哈希码
备注
该构造函数会自动计算字符串的哈希码,并将其作为本地哈希码使用。 建议对于固定的字符串引用使用 UTF8 字节数组构造函数以获得更好的性能。
GameLink 双端
csharp
public GameLink(ReadOnlySpan<byte> id)通过 UTF8 字节数组初始化 GameLink 实例。
id— UTF8 编码的字节数组标识符
备注
这是创建静态 GameLink 引用的推荐方式,特别是在 ScopeData 等静态类中定义时。 UTF8 字面量(如 "id"u8)在编译时处理,性能优于字符串构造函数。
属性
Data 双端
csharp
public V? Data { get; }获取与此链接关联的游戏数据实例。
备注
这是一个延迟加载属性,只有在首次访问时才会进行实际的数据查找。 查找过程通过 IGameLink{``0}) 方法完成, 时间复杂度为 O(1)。 重要提示:返回值可能为 null,这种情况可能发生在: 对应的数据尚未创建或注册 数据已被销毁或移除 链接指向的ID或哈希码无效 建议在使用前进行空值检查: if (link.Data is var data && data != null) { // 安全使用数据 }
Id 双端
csharp
public string? Id { get; }获取此链接的字符串标识符。
备注
字符串标识符主要用于调试、日志记录和人类可读的引用。 在全局范围内应当是唯一的,但系统不强制执行此约束。
HashCode 双端
csharp
public required int HashCode { get; init; }获取此链接的全局唯一哈希码。
备注
全局哈希码是通过 Combine``2(``0,``1) 方法 将本地哈希码和类型哈希码组合而成的。这确保了: 不同类型的相同本地哈希码不会冲突 每个 GameLink 在全局范围内具有唯一标识 支持高效的数据查找和比较操作 此哈希码用于: 数据字典中的键值 网络同步中的数据标识 GameLink 实例的相等性比较
HashCodeLocal 双端
csharp
public required int HashCodeLocal { get; init; }获取此链接在其数据分类中的本地哈希码。
备注
本地哈希码是在特定数据分类(TCategory)范围内的标识符。 它与分类哈希码组合形成全局唯一的哈希码。 这种设计允许不同分类的数据使用相同的本地标识符而不产生冲突。
方法
Equals 双端
csharp
public override bool Equals(object? obj)确定指定的对象是否等于当前的 GameLink 实例。
obj— 要与当前实例比较的对象
返回: 如果指定的对象是 IGameLink 且具有相同的 HashCode,则为 true;否则为 false
备注
相等性比较基于全局哈希码,这确保了: 不同类型的 GameLink 不会被视为相等(即使具有相同的本地哈希码) 高效的比较操作(O(1) 时间复杂度) 与 GetHashCode 方法的一致性 支持与任何实现 IGameLink 接口的对象进行比较, 包括不同泛型参数的 GameLink 实例。
GetHashCode 双端
csharp
public override int GetHashCode()返回此 GameLink 实例的哈希码。
返回: 32位有符号整数哈希码
备注
返回的哈希码与 HashCode 属性相同, 确保了与 Object) 方法的一致性。 这使得 GameLink 可以安全地用作字典键或集合元素。
operator == 双端
csharp
public static bool operator ==(GameLink<TCategory, V> left, IGameLink right)确定两个 GameLink 实例是否相等。
left— 要比较的第一个 GameLink 实例right— 要比较的 IGameLink 实例
返回: 如果两个实例相等则为 true,否则为 false
operator != 双端
csharp
public static bool operator !=(GameLink<TCategory, V> left, IGameLink right)确定两个 GameLink 实例是否不相等。
left— 要比较的第一个 GameLink 实例right— 要比较的 IGameLink 实例
返回: 如果两个实例不相等则为 true,否则为 false
operator == 双端
csharp
public static bool operator ==(IGameLink left, GameLink<TCategory, V> right)确定两个 GameLink 实例是否相等。
left— 要比较的 IGameLink 实例right— 要比较的 GameLink 实例
返回: 如果两个实例相等则为 true,否则为 false
operator != 双端
csharp
public static bool operator !=(IGameLink left, GameLink<TCategory, V> right)确定两个 GameLink 实例是否不相等。
left— 要比较的 IGameLink 实例right— 要比较的 GameLink 实例
返回: 如果两个实例不相等则为 true,否则为 false
operator == 双端
csharp
public static bool operator ==(GameLink<TCategory, V> left, IGameLink<TCategory> right)确定两个 GameLink 实例是否相等。
left— 要比较的第一个 GameLink 实例right— 要比较的泛型 IGameLink 实例
返回: 如果两个实例相等则为 true,否则为 false
operator != 双端
csharp
public static bool operator !=(GameLink<TCategory, V> left, IGameLink<TCategory> right)确定两个 GameLink 实例是否不相等。
left— 要比较的第一个 GameLink 实例right— 要比较的泛型 IGameLink 实例
返回: 如果两个实例不相等则为 true,否则为 false
operator == 双端
csharp
public static bool operator ==(IGameLink<TCategory>? left, GameLink<TCategory, V> right)确定两个 GameLink 实例是否相等。
left— 要比较的泛型 IGameLink 实例right— 要比较的 GameLink 实例
返回: 如果两个实例相等则为 true,否则为 false
operator != 双端
csharp
public static bool operator !=(IGameLink<TCategory>? left, GameLink<TCategory, V> right)确定两个 GameLink 实例是否不相等。
left— 要比较的泛型 IGameLink 实例right— 要比较的 GameLink 实例
返回: 如果两个实例不相等则为 true,否则为 false
ToString 双端
csharp
public override string ToString()返回此 GameLink 实例的字符串表示形式。
返回: 包含类型信息和标识符的字符串
备注
字符串格式优先显示最易读的标识符: 如果存在字符串 Id,显示为 "GameLink<类型>: Id" 如果没有 Id 但存在 Data 且有名称,显示为 "GameLink<类型>: 数据名称" 如果都没有,显示为 "GameLink<类型>: #哈希码" 这种格式设计便于调试和日志记录,能够快速识别 GameLink 的类型和引用的数据。
IGameData 双端
命名空间 GameData
csharp
public interface IGameData<out T> : IGameData where T : IGameData<T>Represents game data interface.
属性
Link 双端
csharp
new IGameLink<T> Link { get; }Name 双端
csharp
new string Name { get; }IGameDataCategory 双端
命名空间 GameData
csharp
public interface IGameDataCategory<TSelf> : IGameData<TSelf>, IGameData where TSelf : IGameDataCategory<TSelf>属性
TypeHashCode 双端
csharp
static abstract int TypeHashCode { get; }IGameLink 双端
命名空间 GameData
csharp
public interface IGameLink<out T> : IGameLink, IEquatable<IGameLink> where T : IGameData<T>属性
Data 双端
csharp
new T? Data { get; }