- 博客(23)
- 收藏
- 关注
原创 游戏开发状态机与行为树的优缺点
状态机通过 “状态”“转换条件” 和 “动作” 描述逻辑:每个状态对应一种行为模式(如 “ idle 待机”“ attack 攻击”),当满足特定条件(如 “检测到敌人”)时,从当前状态切换到目标状态(如从 “idle” 切换到 “attack”)。组织逻辑,节点分为 “组合节点”(如选择器、序列)、“装饰节点”(如循环、条件判断)和 “叶子节点”(如 “攻击”“移动” 等具体动作)。例如,“寻找敌人” 节点可同时用于 “巡逻”“追击”“逃跑” 等行为逻辑。
2025-08-06 20:52:44
1355
原创 力扣225 用队列实现栈
使用队列实现栈,因为队列的先入先出,为了模拟栈我们可以记录并取出队列的队尾元素(每次插入元素都记录当前的元素为栈顶,不断更新),当需要取元素,我们先将队列的元素进行重新入队,将最后一个元素弹出即可,当同时我们需要记住更新栈顶元素,因此需要在进行循环的时候余2,倒数第二个为弹出操作之后的栈顶,倒数第一个为弹出时的栈顶。请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(myStack.empty();// 返回 False。
2025-07-14 20:03:04
473
原创 力扣232 用栈实现队列
只要输出栈不为空,输出栈只进行自身元素的输出操作,当输出栈元素为空的时候,我们将输入栈的元素依次从栈顶输入给输出栈,这样我们输入输出的顺序就是正确的。使用双栈,一个作为输入栈,一个作为输出栈,我们使用输入栈接受输入,在需要的时候将输入栈的数据输入到输出栈中。请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(
2025-07-14 19:35:57
318
原创 TypeScript执行流程
TypeScript 的执行本质是“编译时类型检查 + 运行时纯 JS 执行”编译阶段:TSC 将带类型的 TS 代码转换为纯 JS,同时进行类型验证。执行阶段:浏览器或 Node.js 直接运行编译后的 JS,与普通 JS 无异。这种设计让 TypeScript 既享受静态类型的安全性,又保持了 JavaScript 的灵活性和兼容性。
2025-07-10 16:17:04
793
原创 数据结构与算法——虚拟头节点
在链表操作中,虚拟头节点(dummy head)是一个附加的节点,它位于链表真正的头节点之前。例如,当链表为空或只有一个节点时,直接操作头节点可能导致空指针引用,而虚拟头节点可以提供一个稳定的起始点。如果操作可能改变头节点的指向(例如删除头节点、在头部插入节点),使用虚拟头节点可以避免对头节点的特殊处理。在双指针算法中,若需要指针从链表头的前一个位置开始(如保持固定间隔),虚拟头节点可提供稳定的起始点。若使用虚拟头节点,反而会导致指针在孤立节点上移动,与原链表失去关联,因此此处不需要虚拟头节点。
2025-05-17 16:29:29
803
原创 Lua 强引用和 弱引用
在 Lua 中,强引用(Strong Reference) 和 弱引用(Weak Reference) 是控制对象生命周期和垃圾回收行为的重要机制。它们的核心区别在于:强引用会阻止对象被垃圾回收,而弱引用不会。
2025-04-23 23:21:50
556
原创 C++ substr
在 C++ 中,类的substr方法用于从一个字符串中提取子字符串(substring)。这个功能非常实用,常用于字符串的截取、拼接等操作。
2025-04-10 11:39:58
1817
原创 游戏性能优化篇——大量UI同屏
开发一个需要处理大量UI元素的游戏,比如策略类或者MMO,这类游戏通常会有复杂的界面和众多交互元素。具体问题包括UI卡顿、高Draw Call、内存占用过大或者渲染性能低下。需要从多个层面入手,比如减少渲染开销、优化布局计算、管理更新频率、内存控制等。首先,UI的渲染优化是关键。Canvas的重绘是Unity中常见的性能瓶颈,过多的UI元素导致批次合并失败,从而增加Draw Call。应该建议将静态和动态元素分开到不同的Canvas,利用批处理。
2025-03-09 17:20:58
1107
原创 游戏性能优化篇——大量敌人同屏
大量敌人同时可见,这种情况下渲染和CPU计算可能是主要的性能问题。例如攻城战,敌人可能同时进行动画、物理模拟和AI计算,这些都是资源消耗点。通常优化可以从渲染、LOD、动画、实例化、遮挡剔除、AI优化等方面入手。如果需要敌人敌人大多数都在屏幕上可见,遮挡剔除可能效果不大,但LOD仍然有用,因为远处的敌人可以用低模。渲染方面,GPU的压力可能很大,所以合并绘制调用,使用GPU实例化(如Unity的SRP Batcher或GPU Instancing)可以显著减少Draw Call。
2025-03-05 15:15:22
1426
原创 设计模式学习记录
在Unity中,观察者模式可以用于实现事件驱动的架构,例如游戏中的敌人需要响应玩家的生命值变化,或者UI元素需要响应游戏角色的状态变化等。接下来,我们创建一个具体的GameService类,它实现了IGameService接口,并提供了实际的游戏服务功能。// 用于存放对象池中的对象。接下来,我们创建一个具体的主题类,例如Player,它可以注册和移除观察者,并在特定事件发生时通知它们。然后,我们定义一个IObserver接口,该接口包含一个Update方法,这是所有观察者必须实现的方法。
2024-12-02 11:44:00
1064
原创 Unity Vector2Int
Vector2Int是 Unity 引擎中的一个结构体,位于命名空间内。它用于表示二维空间中的位置或向量,但与Vector2不同的是,Vector2Int使用整数而不是浮点数来表示坐标值。这使得Vector2Int在处理需要精确整数值的场景时非常有用,例如在网格或地图上的位置表示、像素级别的图像处理等。
2024-11-11 14:44:36
913
原创 C# HashSet
参考文章HashSet是 C# 中的一种集合类型,位于命名空间内。它主要用于存储一组不重复的元素,这些元素没有固定的顺序。HashSet是基于哈希表实现的,这意味着它的内部结构允许高效的查找、添加和删除操作,通常情况下这些操作的时间复杂度接近 O(1),即常数时间复杂度。
2024-11-11 14:34:54
3011
原创 AB9 【模板】链表 牛客
insert x y:将yy加入链表,插入在第一个值为xx的结点之前。若链表中不存在值为xx的结点,则插入在链表末尾。保证xx,yy为int型整数。delete x:删除链表中第一个值为xx的结点。若不存在值为xx的结点,则不删除。输出一行,将链表中所有结点的值按顺序输出。若链表为空,输出"NULL"(不含引号)。接下来的nn行,每行一个字符串,表示一个操作。保证操作是题目描述中的一种。第一行输入一个整数nn (1≤n≤1041≤n≤104),表示操作次数。
2024-11-09 17:06:38
293
原创 PIO14 单组_保留小数位数 牛客
第一行有一个小数 n ( 1≤n≤109 )n ( 1≤n≤109 )。如果原来的小数位数多于 33 ,需要四舍五入到 33 位。给定一个小数 nn ,请你保留 33 位小数后输出。如果原来的小数位数少于 33 ,需要补充 00。输出一个小数,保留 33 位。
2024-11-09 13:04:05
310
原创 PIO13 多组_带空格的字符串_T组形式 牛客
给定 tt 组询问,每次给出一个长度为 nn 的带空格的字符串 ss ,请你去掉空格之后,将其倒置,然后输出。每组的第二行有一个字符串 ss,仅包含小写英文字符和空格,保证字符串首尾都不是空格。每组的第一行有一个整数 n ( 1≤n≤105 )n ( 1≤n≤105 )。第一行有一个整数 t ( 1≤t≤105 )t ( 1≤t≤105 )。输出 tt 行,每行一个字符串,代表倒置后的字符串 ss。保证 ∑n≤105∑n≤105。随后 tt 组数据。
2024-11-09 12:08:18
400
原创 C++ vector
vector是 C++ 标准模板库(STL)提供的一种序列容器,允许在运行时动态地插入和删除元素。vector基于数组的数据结构,但它可以自动管理内存,这意味着你不需要手动分配和释放内存。这使得vector成为 C++ 中常用的数据结构之一。vector以long long类型为例,定义一个二维vectorint n, m;// 读取二维数组的行数 n 和列数 m// 定义一个 n x m 的二维向量,存储数组元素// 读取二维数组元素i < n;++j) {
2024-11-09 10:56:32
626
原创 Unity 实验一RooaBall 课堂作业随笔
记录分数与结束条件设置、UI设置:在挂载在小球上面的代码中实现加入count变量,在碰撞中实现如何count的累加,当count达到固定数值时将结束面板激活或者切换场景(新场景中拥有激活的UI面板)。另外需要一个脚本控制摄像机移动,只需在场景中将摄像机调节到合适的角度,在脚本中记录两者的间距,在update函数中根据小球位置不断更新摄像机位置。// 平滑跟随的速度。//private void EndGame()//切换场景结束代码,非必须。// // 结束游戏,可以重载场景或其他操作。
2024-09-06 10:24:12
1231
原创 Unity的Input.GetAxis
Input.GetAxis()函数返回值为float类型的值,取值范围为-1~1,例如,对于游戏杆的水平轴,值为 1 表示游戏杆向右推到底,值为 -1 表示游戏杆向左推到底;对于Mouse X和Mouse Y,Mouse X用于控制物体绕Y轴旋转(即左右旋转),而Mouse Y用于控制物体绕X轴旋转(即上下旋转)。Unity支持多种输入设备,一些输入设备的控制方式相似,按键盘上的W键或上箭头键与将手柄的左摇杆向前推都代表“向上”,以下代码可以获取用户当前的纵轴输入和横轴输入。
2024-04-04 23:34:50
1743
3
原创 GAMES101 作业1
0), 你需要将这三个点的坐标变换为屏幕坐标并在屏幕上绘制出对应的线框三角形 (在代码框架中,我们已经提供了。填写一个旋转矩阵和一个透视投影矩阵。函数,所以你只需要去构建变换矩阵即可)。绕 z 轴旋转的变换矩阵。
2024-02-29 22:04:04
433
原创 GAMES101 作业0
使用Eigen::Matrix3d分别定义旋转矩阵和平移矩阵,(旋转矩阵使用rotation << cos(angle), -sin(angle), 0, sin(angle), cos(angle), 0, 0, 0, 1;初始化表示绕原点旋转,平移矩阵使用translation << 1, 0, 1, 0, 1, 2, 0, 0, 1;实现这一点,先将点 P 应用旋转矩阵,然后再应用平移矩阵。,再平移 (1,2), 计算出变换后点的坐标(要求用齐次坐标进行计算), 将该点绕原点先逆时针旋转 45。
2024-02-25 14:36:02
478
1
原创 贪心算法 力扣第122题:买卖股票的最佳时机 II
贪心是局部最优可以推出整体最优。这种方法模式一般将求解过程分成若干步骤,但每个步骤都应用贪心原则,选取当前状态下最好的选择(最优选择),并以此希望最后堆叠出的结果也是最好/最优的解。因此原则上做题思路是划分成多步,然后保证局部最优,当每一步都是局部最优时最终就可以得到全局最优解。eg:找零钱问题在拥有零钱面额10元,5元,1元,5毛,2毛,1毛若干的情况下,在找零57.8元时,给出所使用的零钱张数最少的方案。使用贪心算法,在满足情景的情况下选取面额由大到小的零钱。
2023-07-17 20:01:05
289
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅