- 博客(19)
- 收藏
- 关注
原创 二次检查(Double Check),防止ArgumentException
在Unity单线程的异步环境下,对共享字典进行并发操作时容易出现ArgumentException异常。文章通过一个对象池管理场景,展示了两个异步方法同时加载相同资源并尝试添加到字典时导致的问题。解决方案采用双重检查机制:第一次快速检查是否存在池对象,加载资源后进行第二次检查,确保不会重复添加。这种方法避免了加锁带来的性能损耗,同时解决了并发操作导致的参数异常问题。
2025-11-24 10:50:07
71
原创 更好的利用ChatGPT进行项目的开发
本文探讨如何有效利用ChatGPT提升项目开发质量。文章提出四点建议:1)精确提炼需求,提升与AI和团队沟通能力;2)区分核心与边缘功能设计标准;3)让ChatGPT全程参与项目,及时更新代码状态,借鉴其创新思路;4)注意AI可能存在的算法错误,建议开发者保持批判性思维,理解而非盲目复制代码。合理使用ChatGPT不仅能提高效率,更能促进开发者自身的技术成长。
2025-11-23 10:56:16
130
原创 开发思想-组合模式和接口多态的一点思考
本文探讨了组合模式和接口在游戏开发中的应用场景。组合模式适用于创建由多种属性组合而成的对象(如游戏障碍物、武器等),通过配置而非继承来生成不同特性的对象,减少子类数量。接口则更适合用于系统间的解耦(如点击系统与方块系统的交互),通过定义通用接口(如IClickable)实现模块间的松耦合。核心建议是:对象创建采用组合模式,系统交互通过接口桥接。这种架构既能保持对象创建的灵活性,又能确保系统间的清晰边界。
2025-11-21 12:31:07
332
原创 开发思想-(数据驱动+组合模式)VS 继承
摘要:本文通过消除类游戏方块设计案例,对比了传统继承方式和数据驱动组合方式的差异。传统继承方案需要为每种方块创建子类(如NormalBlock、CanNotMoveBlock等),导致类数量爆炸。而数据驱动方案通过配置文件定义方块属性(如canMove、canClear)和行为模块(如FireRocketBehaviour),使策划能自由组合出新型方块(如可移动但不可消除的火箭方块)。组合优于继承的核心在于:继承是"类型决定能力",需预先定义类;组合是"能力拼出类型"
2025-11-21 07:45:43
700
原创 利用<<左移运算符优雅的设计游戏能力的任意组合和判断
摘要:本文探讨了游戏开发中道具消除方块的优雅实现方案。针对常规方案中使用多个布尔变量或枚举列表导致代码复杂度高的问题,提出了基于位运算的优化方案: 使用二进制位标记道具类型(如Rocket=1<<0,Bomb=1<<1) 通过按位或运算组合多种消除能力(如Rocket|Bomb=0011) 通过按位与运算快速判断是否可被特定道具消除(时间复杂度O(1)) 该方案相比遍历列表的O(n)复杂度更高效,且代码更简洁优雅,适合需要频繁进行能力组合和判断的游戏场景。
2025-11-20 11:23:47
966
原创 面经-抽象类与接口的区别?什么时候使用抽象类,什么时候使用接口?
抽象类与接口的核心区别在于:抽象类适用于具有血缘关系的类族共享状态和逻辑(如游戏中的小兵类),可包含字段和部分实现;而接口主要用于多继承和能力组合,只定义行为契约。使用场景上,当需要表示"is-a"关系且共享实现时用抽象类(如各类小兵继承基础小兵类),当需要表示"can-do"能力或定义API契约时优先选择接口。接口更灵活,适合依赖注入和测试场景。
2025-11-20 08:01:28
102
原创 Unity开发微信小游戏,接入微信排行榜
本文介绍了微信小游戏排行榜功能的实现方案。主要内容包括:1)后台账号设置需添加排行榜标识;2)通过PostMessage发送用户等级数据;3)群排行功能需要初始化分享设置并处理OnShow回调;4)好友排行榜需计算UI元素在屏幕中的物理坐标,通过ShowOpenData显示;5)使用RawImage作为排行榜绘制区域,需旋转180度。文中详细说明了坐标转换逻辑和微信SDK调用方法,并指出打包时需勾选相关选项以确保OpenData资源正确导出。
2025-11-19 15:17:56
291
原创 面经-Hash、Hash表、Hash桶到Dictionary
哈希表(Hash Table)hash表是一个存储数据的结构。假如我想存入一个key-value。key是字符串"cat",value是"猫猫"。哈希表会:1. 对 key 调用哈希函数,得到一个 hash2.把 hash 对哈希表大小取模(mod),取模就是取余,结果会得到一个余数,余数类似数组的下标,代表位置。int index = (hashKey % 哈希表的Length)3.把 key和value 放到这个哈希表的index位置的元素里面,这个元素称之为桶。
2025-11-19 10:07:26
1037
原创 面经-String和StringBuilder
该文对比了string和StringBuilder的核心特性:1)不可变vs可变性:string每次修改创建新实例,StringBuilder采用链表结构实现动态扩容;2)线程安全性:string因不可变天然线程安全,StringBuilder非线程安全;3)驻留机制:string字面量自动驻留且可手动驻留,StringBuilder不涉及驻留。文章重点解析了string修改操作的内存机制和StringBuilder的链表实现原理,以及运行时字符串的驻留规则。
2025-11-17 11:36:09
148
原创 Unity开发微信小游戏,接入游戏圈
本文介绍了Unity游戏调用微信小游戏圈(游戏圈)功能的实现流程。首先通过C#代码声明外部JS方法,然后在JS端实现具体的游戏圈创建逻辑。接着建立桥接函数实现C#与JS的交互,最后修改WXSDK模板配置文件引入JS代码。关键步骤包括:使用DllImport声明外部方法、实现JS端的createPageManager接口、创建桥接文件.wx.jslib以及在index.js中引入新开发的wxutils.js模块。该方案完整实现了从Unity端调用微信小游戏圈功能的技术路径。
2025-11-17 10:15:45
169
原创 Unity面经-List底层原理、如何基于数组、如何扩容、List存储泛型、List有关在内存中的结构
本文解析了动态数组(List)的工作原理及其内存管理机制。文章首先阐述了普通数组的特性:固定长度、连续内存分布、O(1)访问时间。随后详细介绍了List如何通过底层数组实现动态扩容,包括Capacity/Count属性、默认2倍扩容机制及内存复制过程。文章还分析了插入删除操作的时间复杂度,并澄清了内存存储的常见误区,指出值类型并非总是存在栈中,在List中会直接存储在堆上且不发生装箱。最后解释了List及其元素的GC回收机制,强调正确理解这些特性对优化性能的重要性。
2025-11-16 23:06:59
886
原创 Unity开发微信小游戏,严谨的跳过Splash
本文探讨了Unity中跳过启动画面的不严谨做法及优化方案。原方案在BeforeSplashScreen阶段调用停止方法存在问题,改为在BeforeSceneLoad阶段调用更为合适。同时针对微信小游戏的WASM代码裁剪问题,介绍了三种保留代码的方法:[Preserve]属性标记、项目内强制引用以及link.xml配置文件。文章特别强调了微信小游戏首场景精简的重要性,并提供了动画系统等模块的代码裁剪防护示例,为Unity项目优化提供了实用解决方案。
2025-11-16 00:05:37
1328
原创 Unity面经-值类型与引用类型
本文比较了值类型和引用类型的区别,重点介绍了String的特殊性质及其不变性特征。分析了装箱拆箱的原理及其性能影响,建议使用泛型避免频繁装箱。详细讲解了.NET垃圾回收机制,包括标记-压缩算法和分代回收策略,并对比了Unity采用的贝姆垃圾回收机制的局限性。全文围绕内存管理和性能优化展开,为开发者提供了实用的编程建议。
2025-11-15 08:06:56
681
原创 Unity面经-协程
Unity协程与线程对比及应用解析 协程是Unity主线程分步执行的逻辑流,线程是操作系统级别的并行计算。协程特点:非并行、不利用多核、可安全访问UnityAPI、适合流程控制;线程特点:真正并行、能利用多核、不可操作Unity对象、适合耗时计算。协程应用场景包括分帧处理、条件等待和定时循环。其异步效果通过主线程调度实现,本质是通过IEnumerator接口的MoveNext方法分步执行。底层利用yield构建迭代器集合,Unity根据Current类型决定何时继续执行。
2025-11-15 01:41:40
494
原创 IDisposable,约定清理类中资源的代码写在Dispose()
IDisposable接口的核心作用是为资源释放提供统一规范。它通过定义Dispose()方法,约束所有需要释放资源的类遵循相同的行为约定。示例中,使用IDisposable可以确保资源清理方法名称一致(都叫Dispose),避免不同开发者使用不同命名(如MyDispose或ADispose)造成的混乱。虽然从功能上看自定义方法也能实现资源释放,但IDisposable接口提供了标准化的行为契约,这在多类协作时尤为重要。接口的本质是建立统一的编程规范,确保代码行为的一致性。
2025-11-14 03:01:01
234
原创 1. 快速排序
快速排序通过选择支点数字将数组分为左右两部分,递归处理直到子数组长度为0或1。示例以[5,7,3,1,4,9,6,8]演示了排序过程:首轮以5为支点分为[3,1,4]、[5]、[7,9,6,8],递归处理后最终得到有序数组[1,3,4,6,7,8,9]。该算法时间复杂度为O(n log n),通过Unity实现的C#代码展示了包含日志的分区与合并过程,使用深度缩进直观呈现递归调用层次。
2025-11-13 03:15:23
305
原创 Unity开发微信小游戏,如何区分开发版、体验版、线上
利用WX.GetAccountInfoSync().miniProgram.envVersion判断微信小游戏当前运行环境是否为开发版、体验版、线上版。
2025-11-12 01:57:58
313
原创 Unity开发微信登陆—利用ShareSDK微信登录
没用的前言 微信登录愁了我整整一周,Mob的客服哥哥也是让我烦了一周,总算是最后成功了,坑很多,我把整个详细的流程记录下来,供Unity开发的朋友们做参考,也是我自己的一个记录。开发前的准备 1. 首先你要有微信的开发者资质,交了三百块给微信开放平台,并且企业认证通过,这样你就可以拥有微信登录开发的资格。 2. 下载官方示例程序包吗,g
2017-11-19 02:47:06
9650
2
转载 Unity中的Input.Touch,移动端的触摸操作
这篇博文将简单的记录,如何用unity处理在移动设备上的触控操作。 iOS和Android设备能够支持多点触控。在unity中你可以通过Input.touches属性集合访问在最近一帧中触摸在屏幕上的每一根手指的状态数据。简单的触控响应实现起很简单,不过一些复杂的触控响应或触控手势什么的,还是使用一些第三方的插件吧,当然你也可以自己封装。不管什么情况,了解决unity原生api还是非常必
2016-01-03 23:49:03
43600
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅