- 博客(52)
- 收藏
- 关注

原创 【Unity AI】基于 WebSocket 和 讯飞星火大模型
通过Content Size Filter和Vertical Layout Group 和 Horizontal Layout Group 的多层嵌套,以及两种版本的气泡UI,通过同一个类对其进行显隐和更新的控制,实现了较少字体时气泡随字体更新改变自身大小,较多字体时气泡固定并允许内容滚动显示的功能。负责播放UI音效(文字冒泡音效,),内部使用池化的思想,构建了一个大小固定的AudioSource池,对外暴露的Play接口会从池中获取闲置的或者最早使用的AudioSource,避免每次都重新创建该组件。
2024-10-03 13:00:32
1475
7

原创 【VSCode】VSCode Background 背景插件辅助窗口程序
在右边的细节面板调整行为,这些行为与窗口程序和settings.json息息相关,并且不会去检测VSCode的settings.json中是否含有所需的字段,因此强烈建议你先在VSCode的settings.json上创建所需要在面板上自定义的条目。点击应用当前壁纸组后,VSCode的settings.json会被替换,此时VSCode会提示重启窗口,重启后即应用修改(我尝试了各种办法,但最后还是不能在外部操纵VSCode的命令行为,因此该窗口程序仍然是一个半自动程序)这对于我而言是十分苦恼的。
2024-09-15 22:21:10
800

原创 【Unity案例】搭建射击系统与UI
上期将基础的移动系统搭建完毕后就可以开始搭建更加复杂的系统部分了前排提示,由于一开始仅思考如何完成操作相关功能,以至于到后面重构稍微有些困难,继续写下去恐成屎山,故在搭完射击和武器UI后不再继续泛化到敌人和敌人状态机本次主要完成了自由配置武器参数:武器所需的所有参数都可进行调整武器的追随准星:根据输入的武器槽位自动平滑的跟随指定武器的枪线,换弹时也会有相应提示武器的切换:不同武器根据数字键进行切换,在UI和准星上也会有所体现第一第三人称的切换:可以在第一第三人称间无缝切换请看VCR!
2024-09-04 17:01:01
1500
原创 【OpenGL】OpenGL游戏案例(二)
文本渲染部分依赖于一个库FreeType,在项目中只拿来读取ttf生成像素数据,然后记录在自定义的Character结构中。Destroyed决定是否要渲染其图像,Activated决定是否要启用其计时器,最后的状态则决定了是否要将其移除出列表。构造函数中负责初始化shader参数,初始化VAO和VBO,但VBO的具体顶点数据会在绘制时动态计算出来。刚碰撞时根据Type字段执行附加能力的逻辑,倒计时结束后执行取消附加能力的逻辑。当玩家消灭一个方块后,按固定概率随机生成或不生成一个随机能力的砖块。
2025-01-31 18:08:41
590
原创 【OpenGL】OpenGL游戏案例(一)
这个构造函数主要用于设置一个后处理器,它通过创建多个OpenGL对象(FBO、MSFBO、RBO、纹理)来实现图像的多重采样渲染、后期处理效果(如模糊、边缘检测等)。它还设置了相关的着色器参数,并为后期处理操作初始化了相关的渲染数据。
2025-01-21 17:57:38
1046
原创 【OpenGL/Assimp】渲染模型、半透明材质与封装光源
我所需要绘制的模型有半透明的面部贴图,因此需要使用透明度,这里需要注意的是,如果所有使用数据获取数据的地方都没有出错但仍没有透明效果,可以检查原始数据的问题,如图片本身的透明效果,在工程中加载图片时是否包含透明通道。从GitHub拉取源码,根据网络教程,借助CMake生成VS工程项目,并用VS将其编译为静态链接库(lib)或动态链接库(dll + lib)。在抽象Model,Mesh这些类时,我改动LearnOpenGL的最大的类是Mesh类,将其直接使用的GLAPI替换成了封装好的API,类如下。
2025-01-12 12:17:26
576
1
原创 【OpenGL】三种光源方式的计算
使用Ambient(环境光),Diffuse(漫反射),Specular(高光)三种颜色混合出最终光照效果。典型的GLSL Fragment 示例代码如下//片元的位置和法向,由顶点着色器传入(已经过插值)//CPU端赋值//灯光和视角位置//灯光和物体颜色// Ambient//较暗的灯光颜色模拟环境光// Diffuse//片元指向灯光的向量//通过夹角决定漫反射亮度(0~1)//片元指向摄像机的向量//入射光线在法线为norm的平面上的出射光线向量。
2025-01-09 20:05:29
527
原创 【OpenGL/C++】面向对象扩展——测试环境
封装的功能:注意事项:RunBase继承类展示:LearnOpenGL的教程示例,十个箱子在固定位置旋转,并有各自的贴图,在制作了RunBase类后,使用时只需要专注于教程和测试的图形学部分。无需重复复制和束缚在其他C++代码上。Main函数内容(使用示例):在制作该类前,我一直直接通过使用全局的函数名来调用不同的渲染代码,后来在使用glfw的按键绑定相关代码时出现了重定义的错误,后来想直接把这些东西放在类里,最后干脆再封装一下渲染流程,最后就成了这个RunBase类。
2025-01-09 19:13:00
752
原创 【C++/OpenGL】OpenGL面向对象
AddBuffer:传入缓存区和缓存区布局,根据缓存布局对象内部存储的数据,调用glEnableVertexAttribArray和glVertexAttribPointer来进行实际的布局指定。创建绑定纹理对象,设定默认参数,将纹理填入该纹理对象(通过glBindTexture和m_RendererID指定)中。Push:泛型函数,向m_Elements推入一个对象,向m_Stride累加大小。Renderer负责在渲染循环中调用,使用固定的渲染顺序,简化外部使用。
2025-01-08 01:22:44
1163
原创 【Unity/HFSM】使用UnityHFSM实现输入缓冲(预输入)和打断机制
参考Animancer在状态机中的InputBuffer,在UnityHFSM中实现类似的InputBuffer机制,同时扩展一个状态打断机制插件介绍:Animancer:Unity的动画插件,易于修改和扩展。UnityHFSM:Github上的一个开源分层状态机项目基于继承的方法使用UnityHFSM:UnityHFSM有非常方便的使用方法,可以在不创建新类的情况下创建状态和状态机,定义转换条件等,但如果状态逻辑比较复杂,并且有统一的父级行为,则建议使用类继承的方式定义状态和状态机类。
2024-12-16 18:41:06
1386
原创 【算法速刷(11/100)】LeetCode —— 101. 对称二叉树
如果使用递归思想,这道题则十分的好写。本题最重要的是如何同时比较两个镜像位置上的节点,并继续向下比较其镜像位置上的子节点,基于这点,我们至少知道递归的函数需要一左一右两个指针。并且比较当前镜像节点是否相同后继续向下递归,否则返回结果。来进行递归的查询二叉树镜像位置上的节点。
2024-11-20 23:21:32
283
原创 【C++/OpenGL】OpenGL初步学习——绘制一个矩形
最近在学点图形学,之前只是知道渲染管线,和一些图形学大概的知识,实际上对于Shader的编写经验几乎为0。因此打算开始学学OpenGL。毕竟听说这个比较底层,虽然工作肯定是写HLSL或者Unity的ShaderLab,但对于学习图形学想必还是很有用的,网上的相关资料和教程也是相当之丰富。最近学的基本上都可以用一个文件写下来,之后开始学对这些流程的抽象,因此现在先对写下的文件进行一个总结使用的库为GLFW + GLEW 的经典款搭配。
2024-11-20 23:13:30
1352
原创 【算法速刷(10/100)】LeetCode —— 23. 合并 K 个升序链表
按照最朴素的方法,每轮都对所给列表进行一次遍历,O(n)的复杂度获得值最小的节点,并将其上的链表指针后移一位,一旦为空则剔除数组。数组为空时结束循环。这样写时间复杂度较高,因为涉及到枚举最小值节点,数组的删除操作,但空间复杂度可以降到O(1)
2024-11-16 21:38:05
277
原创 【Unity/Animator动画系统】多层动画状态机实现角色的基本移动
最近打算做个Rougelike + RPG + 塔科夫 混搭风格的冒险游戏。暂且就当是一个有随机元素,有基地,死亡会掉落物品的近战塔科夫罢。花了三天时间,整合了Mixamo的动画和模型资源,通过改动一点Unity自带的第三人称模板的控制器实现移动和动画控制,然后自己做了个动画状态机。写这篇主要是记录制作动画状态机时出现的问题状况和解决方案。当下动画状态机实现了以下特性基于人物速度的站立到奔跑的混合动画基于人物朝向和速度的四方向混合动画(行走和蹲伏)
2024-11-16 17:33:27
1760
原创 【算法速刷(9/100)】LeetCode —— 42.接雨水
后来发现有点复杂化了,因为题目只需要累计的结果数字,不需要额外的东西,但因为先入为主的观念,我还是选择了从低到高从左到右依次遍历的模拟法,这种方法的复杂度基本上是O(N * MaxHeight),实际也是十分低效,但私以为思路也是值得一分享,最后用例通过319/323。注意构造的数组的值,不应低于当前位置的高度,假设左边高度始终低于当前高度,则在数组中记录为当前位置的高度,这样可以保证构造的数组减去原数组中当前位置高度不会出现负值。需要注意的是,在出栈的操作中,需要三个高度。这个算式的值域 >= 0。
2024-11-11 18:33:09
564
原创 【Unity/GameFramework】Start Force ——配置和表加载
首先思考如果不使用框架,那么我们大概率会专门包装做一个Json或者XML工具类,然后实现序列化和反序列化的方法,利用第三方库来对指定路径的文件进行具体序列化反序列化操作。在外部使用时,传入路径,指定类型,即可返回需要的对象。如果是和GameFramework一样做配置使用,那么我们就不仅仅只是序列化出来再交出去。我们还可以做一个类专门存储这一类反序列化出来的配置对象。并指定在某个时机(如初始化,游戏资源加载流程)来让其将所有配置统统反序列化出来,并向外暴露接口来访问这些反序列化的配置对象。
2024-11-11 16:51:35
1302
原创 【Unity/QFramework】QFramework学习笔记
QFramework是一个轻量级的游戏框架,并且整合了许多有用工具。源码只有800行不到,这既意味着其源代码足够凝练,不会束手束脚,也意味着在制作自己的游戏的时候,需要扩展和增加一下框架的功能。
2024-11-10 18:17:05
1575
原创 【Unity/GameFramework】Star Force —— 启动流程
第二步是进行语言的配置,首先从GameEntry.Localization中拿出language,然后将其赋值为GameEntry.Setting中存储的Language(当然是在有的前提下),之后对语言进行,检查,是不支持的语言就默认改成英语,这个操作同样要再同步回GameEntry.Setting。第三步是加载资源包变体,GameFramework不仅允许字体的本地化,同时还支援了资源包的本地化,即不同的语言对应了不同的资源包,更加的自由哇!接下来是Procedure的逐步初始化。
2024-10-29 18:15:01
964
1
原创 【Roblox/Lua】Roblox抽奖游戏设计概述
最近在写的Roblox游戏的结构文档,边写代码边整理出来的,代码之后看看再贴出来。不过有一说一这Roblox的Lua代码感觉贴出来也没什么用,可读性太差
2024-09-25 23:26:10
1015
原创 【算法】C++KMP算法的简洁实现
对于朴素的字符串匹配算法,如果想在主串中寻找到第一次出现子串的位置,需要依次枚举主串中的每一个位置作为起始位置进行匹配尝试,如果主串中存在许多与子串相似结构的部分,那么朴素算法会进行大量的无用枚举,时间复杂度非常之高。KMP算法区别于朴素算法的地方就是其在尝试匹配时,匹配失败后不会回溯主串的指针,而是通过一个预处理的next数组去回溯子串的指针,主串的指针会继续向后遍历。因此KMP算法只会遍历一次主串,这在主串长,子串短的情况下具有非常大的性能优势。
2024-09-25 23:20:17
472
原创 【设计模式】工厂模式
设计模式共23种,总共分为三大类:创建型模式,结构型模式,行为性模式工厂模式属于创建型模式,其聚焦于如何组织类去实例化一个对象,实际上就是在原本直接的new的基础上进行一个封装,达到可以方便随时变更,扩展,和其他类交互的功能。
2024-09-09 16:27:35
741
原创 【Unity】简单机甲运动系统——坦克式操控方式
我的代码是在官方的HDRP3DSample里提供的和的基础上改的,但基本就是复用了里面对移动速度的计算和光标输入的接受和隐藏这些鉴于UE仍然是我接触代码前最常使用的游戏引擎,因此我在地图原点放了一个空物体,充当,我的这个只负责接收玩家的鼠标输入,并使用其修改自身的旋转。该还是一个单例类,对外提供了获取自身的Quaternion和Transform的方法我还在中制作了一个列表,编辑器界面可以对其添加物体,添加的物体有以下字段跟随旋转的Transform。
2024-08-31 15:27:10
1968
原创 【Unity】案例 —— 胡闹厨房联机案例(玩家,大厅与连接部分)
来存储当前所有玩家的准备情况,服务器RPC会调用客户端RPC和对应委托,让各个客户端能够更新自己的屏幕显示状态,服务器端做完以上后会检查是否所有人都准备完成,准备完成则调用NetworkManager的加载场景函数加载进游戏场景,后面游戏场景内也是相似方式实现的。因此需要在有人退出时额外进行一次刷新操作,确保没人暂停时恢复游戏。当所有玩家开始游戏时,房间就不再有意义了,因为游戏中玩家只能回到主菜单,然后再进入服务器,并且游戏不允许中途加入,所以所有玩家准备后,要删除房间,使用自带的异步删除API。
2024-08-16 01:24:52
954
原创 【算法速刷(8/100)】LeetCode —— 21.合并两个有序链表
使用两个指针顺序遍历两个链表,每次都将最小值的那个加到结果链表上,最后如果两个链表不一样长,就将剩下的接到结果后面。无头结点的情况下,处处都需要进行判空,将初次赋值和其他时候分为两个情况,会比较长。有头结点的时候,无需判断首次赋值,可以节省许多的代码行数和判断。
2024-08-14 21:39:28
311
原创 【算法速刷(7/100)】LeetCode —— 200.岛屿数量
这题是典型的深搜题,只需要额外记录每个格子是否被搜索过,然后挨个进行陆地的深度搜索即可。(如果要使用lambda进行递归,需要显式指出变量的模板类型,不能使用auto推导)
2024-08-14 19:43:48
281
原创 【Unity/网络】Unity和内网穿透的网络测试 —— 以聊天室为例
首先先说一下写的聊天室案例使用MessageManager来作为RPC调用,提供全局添加Message方法的单例,其他类可以订阅对应的委托进行自己的处理,比如UI部分可以根据委托创建消息显示NetworkManager是Unity提供的网络类,配合UnityTransport实现网络的传输和连接的管理第一部分是输入消息内容并发送的部分第二部分是提供启动Host和Client的按钮部分第三部分就是消息的生成显示的部分。
2024-08-14 17:45:10
1653
1
原创 【算法速刷(6/100)】LeetCode —— 199.二叉树的右视图
该题实际上等于求每一层中的最右边的节点,可以使用队列结合二叉树的层次遍历实现。
2024-08-11 12:15:09
242
原创 【Unity】案例 —— 胡闹厨房联机案例(单机结构和GamePlay同步部分)
后者则是将自身调度Pause函数绑定到了GameInput的Pause相关委托上。针对客户端的订单生成同步,可以选择使用RPC或者网络变量进行同步,最大的区别是网络变量时刻同步这个列表本身,而RPC仅仅在创建或销毁时发一个通知,客户端收到后进行自己的逻辑处理,这意味着中途加入的玩家将不会获得之前的数据。物品的生成只能放在服务端,并且对于RPC而言,不该传输复杂类型,一是难以序列化,二是占用带宽,因此,对于需要生成的物品信息,使用index进行记录,对于需要挂载到的玩家或柜台的信息,使用。
2024-08-11 11:13:33
1714
原创 【Unity/XLua】xlua自带教程示例分析(9)—— 泛型方法
这个示例工程主要是为了说明在什么情况下Lua调用不了C#的泛型方法。以上规则对于扩展方法也是适用的,示例工程中也有测试。一个或多个泛型参数都可以被Lua调用。
2024-08-08 01:45:39
449
原创 【Unity/XLua】xlua自带教程示例分析(8)—— 热修复
热修复是使用lua进行游戏业务逻辑迭代的一个非常重要的部分,它可以在不重新编译,且不依赖反射的情况下轻松的实现逻辑上的更新替换。该案例内分多个小案例。
2024-08-08 00:49:27
418
原创 【Unity/XLua】xlua自带教程示例分析(7)—— 同步测试
这个方法直白的说可以将异步函数转换成一个同步函数,具体表现就是将在异步函数中向回调函数传入的值,直接改造成同步函数的返回值,使用一个新的lua变量接收async_to_sync (异步函数)的返回值即是构造好的同步函数。语句来转到lua脚本的运行。message_box内部访问上述两个C#静态函数并利用async_to_sync 将其改造成同步函数,返回一个封装了这两个函数的表以供其他模块require。然后自己构造一个模拟的异步充值的函数,再使用async_to_sync将其转换成同步函数。
2024-08-07 23:03:48
818
原创 【Unity/XLua】xlua自带教程示例分析(6)—— lua协程
前者定义了一个继承自Monobehavior的脚本组件,后者则使用lua去在Unity中实例化一个挂载该组件的GameObject,并将其设置为DontDestroyOnLoad,将其开启和停止协程的方法封装成一个表返回。接着在lua文件中去请求工具文件cs_coroutine,让其创建一个辅助lua协程的对象,并接收一个封装了该对象的创建和停止协程的方法的表。接着通过向start函数中传入lambda函数来创建协程,使用本地变量保存这些协程,传入stop函数中可以终止这些协程。
2024-08-07 20:19:27
651
原创 【算法速刷(5/100)】LeetCode —— 20.有效的括号
不匹配直接返回false。是右括号:检查是否匹配栈顶括号。栈不为空:还有剩余括号,返回false。题目要求比较明晰简洁,编码难度并不算高。栈不为空:进行条件判断。栈为空:无脑允许进栈。栈为空:返回true。使用栈可以快速解答本题。
2024-08-06 01:15:14
241
原创 【算法速刷(4/100)】LeetCode —— 155.最小栈
最小栈问题,有许多种办法进行解答,首先需要锁定的条件是要求在实现栈功能之外,要在常数时间内检索最小元素。这样可以避免最小栈始终记录每一层的最小元素,即使新增元素后最小值还是不变,可以节省一定的存储空间。维护一个最小栈,该栈仅在栈为空,或者新入栈元素不大于最小栈的栈顶元素时才会入栈。同理,该栈仅在栈不为空,且出栈元素等于最小栈的栈顶元素时才会出栈。以上操作都要求有O(n)的额外空间来记录栈对应层的最小值状态。一般这种O(1)查找最值都可以用一下方法。在这里说一下最小栈的方式。每天写几题,健康每一天。
2024-08-06 01:02:06
263
原创 【Unity/XLua】xlua自带教程示例分析(五)—— 优化GC
在Xlua中,使用[GCOptimize]可以避免C#和Lua间传递值类型(普通值类型,只包含值类型的strcut或嵌套struct,枚举类型,以及它们组成的数组)时发生gc alloc。首先最重要的一点是,类要加上LuaCallCSharp的标签,因为后面会在里面向Lua传入自己的this指针,因此lua是可以调用类的。monoBehaviour是在C#中set的变量,即this,所以这里是在使用C#函数处理lua对象。前五个委托接收Lua的id函数,不同的值类型数据都测了一遍(从C#传lua再传回来)
2024-08-06 00:17:10
1191
原创 【Unity/XLua】xlua自带教程示例分析(四)—— 使用C#接口和委托获取lua定义的表和对应特殊方法
其次是ICalc接口,该接口对应了luaCalc的返回值,其既声明了calc_mt元表中的字段,又声明了如Mult这个在luaCalc的New方法中才声明的字段。在lua中,其对应了set_item中的 self:notify({name = index, value = value}) 中输入的参数。最后是委托方法,该方法对应了luaCalc的New函数,输入的参数一样,使用ICalc接口来接收对应值。其次是get_Item和set_Item,也会在C#中使用[]运算符重载时调用,算是一种命名规范。
2024-08-05 17:57:45
753
1
原创 【Unity/XLua】xlua自带教程示例分析(三)—— 使用C#为lua注入依赖,使用lua绑定UI事件
其通过self(即Button上的LuaBehavior组件),传入组件名称来获取自身的Button组件,并为onClick事件添加监听函数。函数内容中使用到了注入的input依赖,该input是一个GameObject,获取其身上的InputField组件中输入的text值并打印。在UI面板上创建一个Button和一个InputField,将LuaBehavior挂载到Button下。这个脚本中只有一个start函数,基于该C#类的功能,这个lua函数会和C#类一样,在Start时执行。
2024-08-05 16:47:44
512
原创 【Unity/XLua】xlua自带教程示例分析(二)—— 使用C#控制Lua生命周期函数并为其注入Unity物体依赖
lua脚本中,访问了注入的lightObject,并由其成员函数获得该GameObject上的灯光组件使用CS.UnityEngine访问Unity的变量和函数,设置自身(self在后续C#中被设为了this)的旋转,以及灯光组件的颜色。
2024-08-05 16:13:00
582
原创 【Unity/XLua】xlua自带教程示例分析(一)——打印Hello world
第三步 使用LuaEnv的DoString方法直接运行字符串存储的lua语句(字符串前使用@可强制不进行转义)第二步 在类中或Start函数中创建Lua虚拟机环境。第四步 在结束使用后使用Dispose释放Lua环境。第一步 创建Monobehavior脚本。
2024-08-05 16:11:23
577
C++/STL控制台小游戏-赛博斗蛐蛐
2023-12-31
【C++/easyX】辉光管时钟工具源码
2023-12-13
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人