- 博客(28)
- 资源 (1)
- 收藏
- 关注
原创 C#语法糖(按照实用性排序)
这里整理了C#日常开发的语法糖,按实用度排序语法糖本质是编译器帮你生成等价的完整代码,不影响运行性能,只负责让代码更短、更易读、更少出错。
2026-07-06 11:02:35
267
原创 ItemInfo
这些逻辑既不适合放在 Protobuf 的 Item 里(协议类是纯数据载体,不该有业务逻辑),也不适合放在 ItemData 里(配置表是静态只读的,不能存运行时逻辑),更不适合全塞到 ItemController 里(会让控制器变成臃肿的上帝类)。Protobuf 生成的 Item 类属于网络层数据契约,它的字段是为通信服务的,随时可能因为协议迭代而调整:比如新增字段、字段改名、把剩余时间改成时间戳、把数量从 int 改成 long、拆分 / 合并字段等。} // 对外只读,内部才能修改。
2026-07-03 17:49:59
226
原创 关于unity的序列化
脚本挂物体,保存场景Inspector 能看到的字段ScriptableObject .asset 文件预制体里的脚本数据JsonUtility 保存数据ScriptableObject = 序列化 ✅MonoBehaviour 面板可见字段 = 序列化 ✅普通脚本代码 = 不序列化 ❌编译成 DLL = 不序列化 ❌运行时内存数据 = 不序列化 ❌你现在是不是 100% 通透了?Unity 到底能序列化哪些类型,不能序列化哪些(比如字典为什么不能序列化)。
2026-03-27 15:42:02
437
原创 值类型的 TryParse 系列方法
核心逻辑统一:所有[值类型].TryParse都遵循“安全转换+返回布尔值+out输出结果”的规则,结合&&可实现“转换成功+额外筛选”的短路逻辑。高频场景覆盖:整数(int/long)、浮点数(double/decimal)、布尔值、日期、枚举是开发中最常用的 TryParse 类型,用法完全复用你的示例逻辑。最佳实践:凡是处理“非绝对可靠的字符串输入”(如用户输入、文件解析、接口返回),优先用 TryParse 而非 Parse,避免程序因格式错误崩溃。
2026-03-17 11:14:36
267
原创 unity值属性修改步骤
这四行代码是 Unity 修改尺寸的标准流程:先读取尺寸到临时变量→修改临时变量→赋值回原属性;X 轴设为distance是让连线长度匹配节点间距,Y 轴设为lineWidth是固定连线粗细;核心原则:值类型属性(如 Vector2/Vector3)不能直接修改子属性,必须通过临时变量中转。
2026-03-16 16:36:49
458
原创 关于反编译中数据的变化
理解这个区别,就能明白为什么普通脚本的 int EnemyHp = 10 是“代码常量”,而 ScriptableObject 的 int EnemyHp = 10(最终变成 .asset 里的 20)是“序列化数据”。当你要创建一个 Enemy 对象时,运行时会根据这个蓝图(元数据)分配内存,然后执行蓝图中的 IL 指令(比如 ldc.i4.s 10)来初始化字段。值的来源 IL 指令中的立即数(如 10)是代码的一部分 文件中的数值(如 20)是独立于代码的持久化数据。内存中的二进制 = 蛋糕本身。
2026-03-12 11:13:25
256
原创 代码常量值 vs 序列化数据:Enemy Hp 示例核心区别解析
维度普通Enemy脚本(int Hp=10)ScriptableObject版Enemy(int Hp=10)值的存储形态编译后嵌入程序集(.dll)的二进制指令中初始值嵌入程序集,运行后可存入内存实例,序列化后写入.asset文件值的修改方式只能改代码重新编译,运行时无法修改(除非代码逻辑赋值)1. 改代码重新编译;2. Inspector直接改值(序列化到.asset);3. 运行时赋值(仅内存临时修改)是否涉及序列化❌ 完全不涉及。
2026-03-11 15:59:47
462
原创 序列化(Serialization)核心概念解析
不是编辑器里的文本字符二进制(如你写的int字符的 ASCII 码),也不是磁盘上的脚本文件;必须是程序运行时在内存中创建的、有明确结构和语义的对象 / 数据:比如 Unity 中ScriptableObject实例的id=1001(内存中是int类型的二进制值,程序知道这是「玩家 ID」);比如 C# 中List<string> names = new(){"张三","李四"}(内存中有链表结构、字符串的 Unicode 编码,程序知道这是「名字列表」)。
2026-03-11 14:19:03
213
原创 游戏数据分类总结:静态配置(.asset)vs 动态交互(服务器数据)
基于 RoleTable/RoleData 代码,结合实际开发场景,梳理游戏中不同类型数据的存储/使用规则,明确“哪些数据该做 .asset 配置,哪些该和服务器交互”。
2026-03-05 17:19:30
326
原创 ScriptableObject 子类与 [Serializable] 普通类 核心对比
相同点:都支持 Unity 序列化,能在 Inspector 编辑,支持复杂数据结构;核心差异:ScriptableObject 是 “独立资源类”,可生成 .asset 文件、有 GUID、能被资源管理;[Serializable] 普通类是 “附属数据类”,无独立文件、依附于其他对象;使用原则:需要独立存储、全局复用的用 ScriptableObject;仅作为字段嵌套、临时存储的用 [Serializable] 普通类。
2026-03-05 14:06:43
207
原创 unity资源一览
Shader 文件(.shader/.shadergraph):渲染着色器,定义模型 / UI 的渲染方式(如卡通渲染、透明效果),是材质的核心依赖;AssetBundle 相关(.manifest/.bundle):打包后的资源包,用于热更新 / 分平台打包,属于资源体系的 “打包产物”;Unity 资源体系覆盖所有游戏开发所需的素材和配置,核心包括场景、预制体、.asset、材质、纹理、音频、模型、脚本等;导航网格(.navmesh):场景烘焙后的寻路网格,存储场景可行走区域,属于场景关联资源;
2026-03-04 19:12:55
302
原创 游戏开发中接口的使用
打个通俗的比方:IRole就像一份 “角色动画协议”,规定所有角色都必须具备 “处理动画播放完成” 的能力,但具体怎么处理(比如玩家攻击动画完了要算伤害,怪物死亡动画完了要掉装备),由每个角色自己决定。public 接口访问修饰符,设为public是因为角色系统是游戏核心模块,需要被动画管理器、战斗管理器等其他模块访问(游戏开发中核心接口通常公开)。IRole 接口名称,行业约定:接口名以I开头(便于一眼识别是接口),Role表明这个接口归属 “角色” 模块。接口(Interface)在 C# 中是一种。
2026-01-06 16:14:55
907
原创 类类型------一切皆对象
相似性:在Python中,类(class)也是对象,是元类(type)的实例。type()函数返回的也是一个表示类型的对象。引用部分存储在栈(Stack)中:在您的代码中,变量 _shopPanelTypes 以及列表中的每个元素引用都存储在栈内存中。在C#中,Type对象本身也是一个对象,它属于“类类型”(System.Type类)的实例,其作用是描述和表示其他类型(如类、结构、接口等)的元数据。您提供的搜索结果中多次提到了Python的“一切皆对象”概念,这与C#在哲学上是相通的,但实现机制不同。
2025-12-22 20:55:50
194
原创 编辑器工具--直接将精灵拖进场景并自动创建物体然后赋值给Image组件
【代码】编辑器工具--直接将精灵拖进场景并自动创建物体然后赋值给Image组件。
2025-12-17 16:29:00
218
原创 Unity 中的Resources 和 StreamingAssets两个资源文件夹
在 Unity 中,Resources 和 StreamingAssets 是两个预定义的特殊文件夹,核心作用都是存放「运行时需要动态加载的资源」,但二者的设计逻辑、资源处理方式、使用场景差异极大。本质:Unity 预留的「原始资源目录」,名称必须严格为 StreamingAssets(大小写敏感),仅能有一个(Assets/StreamingAssets)。适合存放「无需 Unity 序列化的原始文件」(如视频、音频、配置文件、AssetBundle 包)。不支持热更新(资源打包进主包,无法单独替换);
2025-12-14 19:35:46
1306
原创 关于预制体的拼接
简单说:你相当于 “拿 item 预制体当参照物摆了个位置”,但没告诉面板 “这个位置要记下来”,删除后自然就没了,运行时实例化的 item 会按「默认位置」(比如父物体的原点 0,0,0)生成,不会按你之前拼的来。你临时拖进面板预制体的 item,调整的是「这个临时 item 实例的位置」—— 一旦删除这个临时 item,它的位置数据就彻底消失了,后续运行时实例化的新 item,不会 “记住” 你之前拼的相对位置。正确做法:让实例化的 item “记住” 你拼的位置(可视化调整,新手友好)
2025-12-02 18:20:44
647
原创 Unity中的自动序列化
保存场景、预制体、ScriptableObject等资源。✅ Unity自动保存字段值到 .asset 文件。实现热重载(在编辑时修改数值立即生效)✅ 关闭Unity再打开,数据仍然存在。✅ 在版本控制中,这些值会被跟踪。在编辑器和运行时之间传递数据。
2025-11-26 16:17:03
283
原创 关于普通数据类和ScriptableObject类的使用区别
我别的地方想用的时候直接调用类名就可以了对吧” - ❌ 不对。✅ 未来可能在Inspector中编辑。方式二:作为数据容器类(不推荐)✅ 在多个场景间共享配置。方式一:运行时动态创建。
2025-11-26 16:09:57
334
原创 游戏前端界面常用框架
这样在前端获取组件或者transform会更方便。把A封装成transform类的扩展方法。游戏前端页面常用的框架。2. 可能返回null。3. 不会自动添加组件。真正的区别在于设计哲学。方法A:“组件保证器”
2025-11-25 19:43:45
211
原创 接口引用方式如何避免循环依赖
依赖关系变成:GameManager → IAudioService ← AudioManager。GameManager 只依赖 IAudioService 接口,不知道具体实现。AudioManager 实现接口,但不需要反向引用 GameManager。
2025-11-20 16:23:48
163
原创 关于使用缓存对游戏实际运行期间对电脑运存的占用
使用 Dictionary<StoreType, RepeatedField> dataCache 这种字典缓存确实会占用电脑的运存,但这是合理的资源使用。建议使用方案1的轻量级缓存,它在内存占用和性能提升之间取得了很好的平衡。// 3个商店类型总数据量:3 × 15 × 50 ≈ 2.25KB。商品数量有限,通常每个商店类型只有10-30个商品。标准做法 - 这是游戏开发中常见的内存换性能策略。// 假设每个商店类型有 10-20 个商品。数据量很小 - 商店配置数据是有限的。方案1:轻量级缓存(推荐)
2025-11-14 19:11:16
334
原创 客户端框架
这是一个MVC模式的列表项基类框架,提供了列表项的基础结构和生命周期管理。这是一个可复用列表项框架,基于Unity的UI系统设计。这个框架特别适合需要高效复用、动态更新的UI列表场景。onRefresh 处理数据更新。实现Model-View分离。
2025-11-10 16:00:50
208
原创 ScriptableObject
在 Unity 游戏引擎中,ScriptableObject 是一个非常重要的类,它用于创建无需附加到特定游戏对象(GameObject)的数据容器或资源。ScriptableObject 的实例是独立存在的,它本身就是一个资源文件(.asset 文件),保存在项目中,不依赖于任何场景或游戏对象。物品/武器数据:创建一个 WeaponScriptableObject,为每种武器定义攻击力、射速、图标、预制体引用等。技能/技能数据:定义技能名称、冷却时间、效果、动画等。本地化数据:存储不同语言的文本。
2025-11-06 19:20:31
262
原创 通过观察者模式实现游戏客户端框架当中的事件系统
这种设计让游戏系统中的各个模块能够独立开发、测试和维护,同时通过事件机制进行协调工作,是游戏架构中常用的解耦手段。SaveGameState, // SaveSystem类。UpdateDeathUI, // UIManager类。OnPlayerDeath, // Player类。维护观察者列表 - 为每个主题(事件)维护对应的观察者列表。// 当玩家死亡时,所有注册的系统都会自动响应。// 只需要触发事件,不关心谁在监听。
2025-11-06 14:16:56
679
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅