自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(55)
  • 收藏
  • 关注

原创 【设计模式&C#】工厂方法模式(相比简单工厂模式更加具有灵活性和扩展性的工厂模式)

工厂方法模式是一种创建型设计模式,通过抽象工厂类将对象创建与使用解耦,提高系统扩展性。其核心是将具体对象的创建延迟到子类实现,符合开闭原则,支持运行时多态。优点包括创建与使用分离、易于扩展和维护;缺点是会增加系统复杂度。适用于产品种类多、需动态扩展的场景。示例展示了动物工厂模式实现,通过DogFactory和CatFactory分别创建Dog和Cat对象,客户端只需调用工厂方法即可获得具体实例,无需关心创建细节。

2025-07-21 23:52:52 373

原创 【设计模式&C#】简单工厂模式(用于简化获取对象实例化的复杂性)

简单工厂模式是一种创建型设计模式,它通过工厂类集中管理对象的创建,解耦客户端与具体类的依赖。该模式的优点包括简化对象创建、集中管理对象和易于扩展,但缺点在于违反单一职责原则和开闭原则。示例代码展示了动物工厂创建Dog和Cat对象的过程,当请求不存在的动物类型时会返回空值。这种模式适用于需要简化对象创建且客户端不关心具体实现类的场景。

2025-07-21 23:49:03 267

原创 【设计模式&C#】享元模式(用于解决多次创建对象而导致的性能问题)

享元模式是一种通过共享对象内部状态来减少内存占用的结构型设计模式。它将对象状态分为内部状态(可共享)和外部状态(由客户端传入),通过工厂类管理共享对象实例。该模式的优点在于显著减少对象数量、降低内存使用,但增加了系统复杂性,并需考虑线程安全问题。适用于存在大量相似对象、大部分状态可共享的场景。示例代码展示了摩托车对象的共享实现,通过颜色和型号作为键管理共享实例,客户端只需传入账号等外部状态即可获取对象。

2025-07-20 23:22:55 669

原创 【Lua】多脚本引用

Lua中package.loaded表用于记录已加载模块。通过require("脚本名")加载后,该模块引用会存入package.loaded["脚本名"]。若脚本有返回值,则存储第一个返回值;无返回值则存true。未加载时值为nil。该机制确保模块不会被重复加载,每次require都会先检查package.loaded表。package.loaded本质是Lua全局表_G的子表。

2025-07-20 23:17:33 463

原创 【Lua】大G表

Lua中的_G表存储了所有全局变量,包括其自身(_G._G==_G)。通过_G表可以检查全局变量是否存在,如检测print函数。示例展示了如何重定义print来跟踪其调用情况,以及如何遍历_G表列出所有全局变量。从Lua5.2开始,_ENV逐渐替代了_G的功能。_G表包含全局变量、内置函数、标准库模块及其自身的引用。

2025-07-20 23:00:00 287

原创 【设计模式&C#】外观模式(用于解决客户端对系统的许多类进行频繁沟通)

外观模式是一种简化复杂系统调用的设计模式,通过创建外观类封装子系统逻辑。示例展示了汽车系统如何通过Car类统一管理引擎、车门和车灯等组件的操作。优点包括简化接口、降低耦合度;缺点可能增加额外复杂性。该模式适用于需要统一管理多个子系统交互的场景,如车辆控制、家庭影院等系统。

2025-07-19 21:48:38 346

原创 【设计模式&C#】状态模式(用于解决解耦多种状态之间的交互)

状态模式是一种管理对象行为的设计模式,通过将不同状态封装为独立类来提升代码可维护性。该模式包含三个核心组件:状态接口定义统一行为规范、具体状态类实现实际逻辑、上下文类(SceneStateController)维护当前状态引用。示例展示了游戏场景状态管理实现,包括开始(StartState)、主菜单(MainMenuState)和战斗(BattleState)三种状态,通过状态控制器进行切换。优点在于消除条件判断、易于扩展;缺点是会增加类数量和性能开销。适用于游戏角色状态、网络连接状态等需要频繁状态切换的场

2025-07-19 21:44:11 416

原创 【C#】引用(Reference)&句柄(Handle)

编程中的引用与句柄机制对比:引用是语言级的托管指针,直接访问堆对象,由GC自动管理;句柄是系统级的资源标识符(通常为整数ID),通过API间接访问系统资源(如文件、窗口等),需要手动管理且安全性更高。两者在所属层级、访问方式和生命周期管理上存在本质差异。

2025-07-18 17:13:58 459

原创 【Unity】IEnumerator&Coroutine

摘要:IEnumerator是.NET接口,作为协程方法迭代器,定义了MoveNext()、Current等迭代方法。在Unity中,协程必须包含yield语句才能实现暂停功能,编译器会将其转换为状态机实现分帧执行。Coroutine是Unity的协程控制句柄,用于管理协程实例,可通过StartCoroutine获取并用于停止协程。两者配合实现Unity的协程系统,其中IEnumerator提供迭代逻辑,Coroutine提供运行控制。

2025-07-18 16:39:09 311

原创 【Lua】闭包可能会导致的变量问题

摘要:Lua闭包特性分析示例展示了counter()函数如何通过闭包保持局部变量count的状态。每次调用counter()会创建独立的闭包实例,各自维护独立的count变量。因此a()的连续调用会递增输出1,2,3,而新实例b()则从1开始计数。这验证了闭包能捕获并持久化局部变量,且不同闭包实例拥有独立变量空间的特性,解释了函数调用间状态保持和实例隔离的现象。

2025-07-18 15:16:39 378

原创 【Lua】题目小练2

Lua题目小练2【附答案】

2025-07-17 17:40:27 710

原创 【Lua】题目小练1

Lua题目小练2【附答案】

2025-07-17 14:40:09 498

原创 【Unity】一个WWW访问的例子

该代码实现了一个Unity网络请求功能,通过协程方式请求API获取图片数据。主要流程:1)使用WWW请求图片API接口;2)解析返回的JSON数据获取图片URL;3)再次使用WWW请求图片URL;4)将下载的纹理转换为Sprite并显示在UI Image上。代码包含JSON解析(LitJson)、异步加载和图片显示处理,最终会调整Image组件大小匹配图片原始尺寸。

2025-07-16 22:29:52 198

原创 【Unity】IL2CPP相关理论知识学习

IL2CPP是一种将C#代码编译为C++并最终生成机器码的编译技术。其优势包括:性能优化效果显著,尤其在移动和主机平台;支持跨平台开发;安全性更强,生成二进制文件难以反编译;完全AOT编译减少运行时开销;改进内存管理;支持64位架构;利用现代C++编译器优化。缺点在于编译时间较长、包体积增大、调试困难及不支持动态创建泛型。IL2CPP的编译流程是将C#转换为IL,再生成C++代码,最后编译为原生可执行文件,完全脱离虚拟机运行。

2025-07-16 22:22:25 536

原创 【Unity】Mono相关理论知识学习

Mono是一种基于JIT编译的跨平台.NET运行时技术,主要特点包括:支持即时编译提升运行效率、构建速度快、调试体验好、包体较小且兼容性强。但它存在iOS平台禁用、性能低于AOT编译方案、安全性较弱、GC效率低等缺点。Mono的工作流程是将C#编译为IL中间语言,运行时通过虚拟机动态转换为机器码执行(JIT模式)或解释执行。该技术适合开发调试阶段,但在性能敏感场景下存在局限。

2025-07-16 22:09:46 396

原创 【Git】git lfs自动跟踪大文件

本文介绍了一个使用Git LFS管理大文件的自动化脚本方案。首先通过git lfs install安装Git LFS,然后创建并配置detect_large_files.sh脚本,该脚本会扫描项目中超过100MB的文件,并自动为这些文件类型添加Git LFS跟踪规则。脚本运行后需要赋予执行权限,最后通过git lfs track查看跟踪状态,并将.gitattributes的改动提交到版本库。

2025-07-15 13:57:09 407

原创 【Unity】使用LitJson的例子

LitJson是一个高效的.NET JSON处理库,支持对象序列化/反序列化和动态解析。摘要展示了其核心功能:1) 将PersonOfJson对象转为JSON字符串;2) 从JSON字符串还原对象;3) 处理复杂JSON结构,包括嵌套数组和键值对。代码示例演示了JsonMapper.ToJson()和ToObject<T>()方法的使用,以及如何通过JsonData动态访问JSON数据。该库特别适合需要轻量级JSON处理的Unity项目,支持自定义类序列化和LINQ查询。

2025-07-13 00:59:36 600

原创 【Unity】AssetBundle管理器

本文介绍了一个Unity AssetBundle管理器的实现代码。该管理器通过SingletonAutoMono实现单例模式,提供同步和异步加载AB包及资源的功能。主要功能包括:1) 同步/异步加载主包及其依赖;2) 三种资源加载方式(名称、类型、泛型);3) 资源缓存管理;4) 同步/异步卸载AB包。代码使用字典存储已加载的AB包和资源,支持依赖管理,并针对不同平台(Android/iOS)自动选择主包名称。异步加载基于协程和Task实现,提供了完整的错误处理和回调机制。

2025-07-07 23:15:15 1127

原创 【Unity】AB包之间存在依赖关系时的使用

摘要:本文介绍了Unity中AB包依赖关系的两种处理方式。当AB包之间存在资源引用时,方案一需要手动加载所有相关包;方案二通过主包获取依赖配置文件,自动加载所需依赖包。文中提供了具体代码示例,分别演示了已知和未知依赖关系时的处理流程,包括加载主包、获取依赖信息、加载依赖资源等关键步骤。这两种方法确保了被引用资源能正确加载,为资源管理提供了灵活解决方案。

2025-07-05 17:21:32 359

原创 【Unity】AB包卸载资源

本文介绍了AB包在游戏开发中的卸载方法及其重要性。AB包卸载能有效解决内存泄漏,提升游戏性能和稳定性。提供了两种卸载方式:推荐使用Unload(false)保留场景引用,或Unload(true)完全卸载。同时指出,必须先卸载才能重新加载同名的AB包,否则会报错。这些方法为动态资源加载和热更新提供了可靠的内存管理保障。

2025-07-05 17:14:19 247

原创 【Unity】异步加载AB包

摘要:本文展示了如何使用Unity的AssetBundle系统异步加载资源。代码提供了两个方法:LoadABAsync用于加载3D模型(GameObject),LoadABAsync2用于加载图片(Sprite)。两种方法都通过AssetBundle.LoadFromFileAsync从StreamingAssets路径异步加载AB包,然后使用LoadAssetAsync方法获取指定资源。其中包含三种加载方式:泛型方式、Type参数方式和纯名称方式。资源加载完成后会进行实例化(3D模型)或赋值给UI组件(图

2025-07-05 16:54:08 412

原创 【Unity】同步加载AB包

摘要:Unity中同步加载AssetBundle(AB包)的三种方式:1.通过LoadFromFile从"Asset/StreamingAssets"路径加载cube包;2.获取包资源时建议使用泛型或Type指定类型,避免同名资源混淆,提供LoadAsset三种写法;3.最后实例化加载的资源。备注:异步加载原理相同。(135字)

2025-07-05 16:32:04 233

原创 【Unity】UniTask的简单学习总结

UniTask在Unity异步编程中具有显著优势:它结合了Coroutine和Task的优点,支持async/await语法且几乎不产生GC(值类型结构),兼容Unity生命周期和IL2CPP环境(WebGL/移动端)。相比Coroutine(缺乏返回值、异常处理困难)和Task(GC压力大、生命周期管理差),UniTask提供完整异步支持(返回值、异常捕获、取消操作)、高效内存管理以及跨平台稳定性,是Unity现代异步编程的更优解。

2025-07-04 12:13:18 240

原创 【Unity】AssetBundle打包

Unity AssetBundle打包流程与解析摘要:Unity提供AssetBundleBrowser工具进行资源打包,可自定义压缩包名称并查看打包信息。生成的AB包包含资源文件和manifest文件(记录依赖关系等关键信息)。打包选项包括目标平台选择、输出路径设置及三种压缩方式(推荐LZ4)。其他重要参数包括是否清空文件夹、严格模式等。manifest文件为资源加载提供必要信息,是AB包管理的关键组成部分。

2025-07-02 13:27:55 414

原创 【Unity】AssetBundle热更新简单的理论知识

AssetBundle热更新技术解析 AssetBundle是Unity针对不同平台的压缩资源包,包含模型、贴图等非编译资源,但不支持C#脚本直接打包。相比Resources固定资源,AB包支持自定义存储、压缩和动态更新。热更新优势在于修复Bug、避免重装、快速迭代,实现流程包括:客户端获取服务器资源地址→对比差异文件→下载更新AB包。该技术既能减小安装包体积,又能实现资源和脚本的热更新。

2025-07-02 11:10:21 412

原创 【Unity】WebSocket客户端

《Unity中的WebSocket客户端实现》摘要: 该代码实现了一个Unity单例模式的WebSocket客户端管理器,主要功能包括: 使用ClientWebSocket建立WebSocket连接,支持自动重连机制 通过锁机制(lock_)确保线程安全 实现消息接收处理,支持文本和二进制两种数据类型 包含完善的异常处理和连接状态管理 使用CancellationTokenSource控制异步操作的取消 采用内存流(MemoryStream)处理分片消息的完整接收 关键特性: 单例模式确保全局唯一实例 自动

2025-06-30 18:56:07 1225 2

原创 【网络】WebSocket学习总结

避免网络阻塞:WebSocket会受到网络阻塞的影响,当有太多的数据连接同时请求时,服务器性能会下降,使用更合适的线程池和异步IO操作可以避免线程阻塞,提高WebSocket的并发性能。使用CDN(内容分发网络)加速:可以将静态资源缓存到离用户更近的节点上,提高传输速度和性能,CDN可以缓存WebSocket的初始握手,避免不必要的网络延迟;更好的服务端资源管理:WebSocket可以保持持续活动的连接状态,服务端可以更好地管理客户端的连接,减少服务端的开销和处理时间。通过单一的TCP提供了持久化连接;

2025-06-26 10:52:43 446

原创 【Unity】给出两个旋转角度,判断是应该左转还是右转

这个函数计算从当前角度到目标角度的最短旋转路径,并返回旋转的方向和角度。如果结果是正数,表示从左边旋转更合适;如果是负数,表示从右边旋转更合适。要判断从左边旋转还是从右边旋转更合适,可以比较两个方向的旋转角度,并选择较小的那个。// 将角度限制在 -360 到 360 之间。Debug.Log("从左边旋转更合适");Debug.Log("从右边旋转更合适");// 如果角度大于180,选择反向旋转。

2025-05-15 14:37:25 614

原创 【Unity】一个AssetBundle热更新的使用小例子

AssetBundle是本次生成的所有的AssetBundle文件的配置文件,其中的AssetBundleManifest属性描述了文件的信息和依赖关系。//读取AssetBundle下名称为AssetBundle的文件。//读取AssetBundle下名称为AssetBundle的文件。//加载出需要用到的AssetBundle文件。

2025-05-05 21:32:10 1926

原创 【Unity】使用XLua进行热修复

(4)运行Hotfix Inject In Editor。//打印“已被修复”(1)将XLua的Tool拖入Asset。编写脚本(注意类上带有[Hotfix])Debug.Log("未被修复");(3)运行Genrate Code。print('已被修复')

2025-05-04 22:25:11 945

原创 【Unity】XLua访问C#文件

Debug.Log("Static Say:我是未被修改的");Debug.Log("Say:我是未被修改的");(3)lua文件在场景创建一个物体。

2025-05-03 21:46:32 576

原创 【Unity】使用XLua实现C#访问Lua文件

/修改lua数据,但不会对原lua文件造成影响。加载自定义文件夹下的lua文件(假设文件路径为Asset/Lua/test.lua)(2)使用LuaFunction优点:灵活性高,减少C#与Lua的桥接代码。先引入XLua文件中的Plugins和XLua文件夹于Asset文件中。,及时释放资源:luaEnv.Dispose();

2025-05-02 21:33:33 845

原创 【Unity】使用事件管理器的方式解耦MVP

传入的事件</param>/// <param name="name">事件对应名称 </param>/// <param name="name">事件对应名称</param>/// <param name="name">事件名称</param>/// <param name="name">事件名称</param>/// <param name="name">事件名称</param>/// <param name="name">事件名称

2025-05-02 00:28:49 1039

原创 【Unity】MVP框架的使用例子

其中MVP与MVC最大的不同就是,View层的数据更新被迁移至Presenter层完成,这里的View层只负责数据的显示,不负责数据的更新操作,好处在于易于进行单元测试。在MVC的使用中,会发现View层直接调用了Model层的引用,即这两个层之间存在着一定的耦合性,而MVP则可优化MVC中存在的这个视图层与数据层之间的耦合问题。RolePresenter_MVP.cs:上为视图层中的组件绑定事件业务、直接更换视图层更新UI显示的数据,下能提醒数据层进行数据处理。2.运行游戏,点击按钮,生命值会减少。

2025-05-01 21:42:58 635

原创 【Unity】一个UI框架例子

/unityAction(string), string为InputField的整个文本。//unityAction(float), float为Slider改变后的value值。

2025-05-01 18:44:36 2002

原创 【Unity】如何解决UI中的Button无法绑定带参数方法的问题

1.直接为Button绑定一个带参数方法,报错了。将该方法通过另一个方法进行封装即可。

2025-04-30 16:22:00 532

原创 【Unity】使用Socket建立客户端和服务端并进行通信的例子

socket.Send(new UTF8Encoding().GetBytes(newSocket.RemoteEndPoint.ToString() + "已经上线"));//监听Socket。//开始监听,若监听到访问则创建一个Socket表示与其的连接。//创建监听Socket,并绑定ip。//创建要连接的ip并尝试连接该ip。//告诉其他客户端,有客户端登录。//创建线程监听客户端发来的消息。//创建代表本地的socket。//接收来自服务端的消息。//设定监听最大数量。

2025-04-29 21:54:31 810

原创 【Unity】使用LitJson保存和读取数据的例子

LitJson 是一个轻量级的 JSON 解析和生成库,广泛应用于 .NET 环境中。优点:轻量级,易用,性能优秀,支持LINQ和自定义对象的序列化和反序列化。//可以把每个键值对都看成JsonData对象进行使用。//将数据转为字符串。//将字符串转为对象。//设有json数据。

2025-04-29 21:49:33 772

原创 【Unity】MVC的简单分享以及一个在UI中使用的例子

/初始化生命值,若在PlayerPrefs中没有这个属性则创建它,并将其的数值设置为100。MVC在游戏当中的使用:作为UI框架使用较多,M为数据层面,V为UI层面,C是连接和管理两个模块的业务层。Controller(控制层/业务逻辑层):处理业务逻辑,包括事件监听、触发数据更新、触发界面更新。有些小的项目只用一个脚本就能包括的逻辑,使用MVC框架后会增加结构的复杂性;Model(模型层/数据层):负责数据的处理、例如增删查改等等。//自己的单例(作为系统访问MVC的入口)

2025-04-28 22:48:47 2279

原创 【Unity】一个关于引擎缓存变量值的臭坑!

初步判断应该是Inspector会保存第一次值的问题🤔,如有其他见解,欢迎指正!或者在Start方法里对该变量进行赋值即可。然后你下次再去对这个值进行初始化,

2025-04-28 16:54:25 209

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除