基于ET的四叉树场景管理组件
前言 四叉树/八叉树的场景管理广泛应用于RPG类型游戏,其优点在于缩小了判断检测所需的范围,只需要通过简单的矩形的碰撞检测找到对应相交的四叉树/八叉树节点,再对节点内的Entity进行相交判断即可,而无需遍历场景内所有的物体进行碰撞检测。极大的优化了类似于MMORPG这种多人游戏的技能释放判定检测。
感谢Yogi大佬提供的思路,自身在已有思路下进行了动态增加/移除四叉树中管理物体的接口拓展。
实现思路:
确定划分颗粒度(代表一个节点内的物体数量,一旦超过这个数量就要进行下一层的划分),最小划分范围(代表一个节点x的最小范围,小于这个范围则不再划分)
将场景中需要管理的GameObject与其Render中的Bounds通过ObjectBase类进行整合,同时因为一个Bounds可能会与四叉树的多个节点,即存储在多个QuadTreeNode种,可以用ActiveCount记录下当前判定范围下(如摄像机视椎体)与其所在QuadTreeNode碰撞的个数
将ObjectBase统一加入到AllItems的字典中,每个Objectbase对应一个ItemIndex,方便进行移 ...
基于ET的模块化管理及其声音模块
前言 毕设中的demo需要用到声音模块,但是对于一些个人小项目来说Wwise的接入显然是不现实的。因此也根据了另外一个成熟框架-GameFramework中的声音框架进行了对ET的部分适配,对于GF中部分的OOP思路进行了ECS化(组件代替继承,分发代替虚函数),其中底层仍用到了Unity自带的AudioClip、AudioSource等组件。
本文参考了花花的GameFramework解析:声音,并进行了一定的修改。
模块化管理组件(ModuleComponent) 在以前制作demo的过程中我们通常会把不同的全局模块采用统一的单例类管理,方便进行模块的插入、删除、使用、交互,而在ET中我同样采取了这样的思路,并且把这个单例管理类作为Entity插入到Game.Scene内名为”Game”的zoneScene中,其在客户端中仅存在一个,而在服务器中可以管理多个,同时我将一些传统的显示模块,如CameraModule(相机模块)、EffectModule(特效模块)、SceneTreeModule(场景四叉树管理模块)、SoundModule(声音模块 ...
Leetcode:851 喧闹与富有
851. 喧闹和富有
解题思路:
这题主要是对拓扑排序的考察,因为题目要求的是拥有钱不少于person x,所以我们可以根据richer建立有向无环图deg,同时用vis存储对应入度数,即对于richer中每个关系rich来说,建立rich[0]到rich[1]的有向边,因此拓扑排序得到的结果就会是由富有->贫穷,而根据拓扑排序的结果,我们可以用当前遍历到的元素x的answer更新其相邻节点的answer,即若满足quiet[answer[x]] <quiet[answer[y]],则answer[y]=answer[x]。
以下为C++代码:
123456789101112131415161718192021222324252627282930313233343536373839404142434445class Solution {public: vector<int> loudAndRich(vector<vector<int>>& richer, vector<int>& quiet) ...
图形学:判断两个矩形是否相交
12参考资料:https://www.jianshu.com/p/754ac621e6e3
回想起以前和同事讨论的一道面试题,判断两个矩形是否相交,当时一开始只想到了最简单的根据某个矩形的中心点建立坐标系分情况讨论的方法。如今也算是重新补充一下
整体思路我们直接截取到Unity的Rect中Overlap方法来作为实现:
整体的思路是通过两个矩形的xMin,yMin,xMax,yMax进行比较,需要符合x1Min<x2Max&&x1Max>x2Min&&y1Min<y2Max&&y1Max>y2Min,我们粗略地画出符合这个要求的图。
可能单靠这个图不是很明确,我们再把x,y分别拉成一维的直线
最后:△同样的思路可以拓展至三维
拓展部分高维判断碰撞盒相交
Shader:透明度混合,平面下的外/内轮廓,立体下的外轮廓,菲涅尔现象,内发光现象总和
前言 在设计毕设的战棋游戏时,因为想要让每个格子(Quad)显示其外轮廓/内轮廓线,而standard并不支持,因此参考了一些思路实现了背面法线外扩,但是对于平面来说,以矩形举例,其四周的法线存在多条,并且在剔除正面的情况下不存在背面的Vert,所以这种思路显然是不行的。所以对于平面来说,最好的方法是多使用一个Pass,在pass的vert中进行顶点缩放,绘制出比当前顶点大/小的平面,且对z轴进行细微调整防止zfighting,这样其与实际内层Pass套在一起就能营造出外轮廓的感觉。
其次就是菲涅尔现象,用到了Schilick菲涅尔近似等式,即F(v,n)=F0+(1-F0)(1-dot(v,n))^5,其中v是视角方向,n是表面法线。
最后是内发光现象,其思路其实与菲尼尔类似,通过1-dot(v,n)的结果与_RimColor(即外发光颜色)进行乘积后获取,拓展到外发光,其实就是外轮廓(cull front后外延)+内发光中frag的处理。
代码实现Effect.shader:
123456789101112131415161718192021222324 ...
Leetcode:506.相对名次
506. 相对名次
解题思路: 主要思路是通过vector<int> 存储每个运动员的得分[0]和初始位置[1],而后通过sort()对vector<vector<int>> arr根据[0]从大到小进行排序,得到顺序后对result(vector<string>)进行赋值操作,具体为result[arr[i][1]]=to_string(i+1) 和result[arr[i][1]]=t[i]。
△可以将arr优化为vector<int>,记录下原始位置,排序的lambda函数变为[&](int i,int j){return score[i]>score[j];}
以下为C++代码:
12345678910111213141516171819202122232425262728293031323334class Solution {private: string t[3]={"Gold Medal","Silver Medal ...
ET:引用第三方插件
前言 ET 6.0正式版发布后,将Model、ModelView、Hotfix、HotfixView进一步移出了Unity/Assets部分,因此第三方导入只能通过修改csproj的方法添加。
添加方法:Model、ModelView、Hotfix、Hotfix部分:
Rider:直接对Project右键选择Add/Add Reference,添加对应的dll即可
直接打开对应project的csproj,在其中加入下列代码,以Mountains.Feedback为例子
123<Reference Include="MoreMountains.Feedbacks, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"> <HintPath>Library\ScriptAssemblies\MoreMountains.Feedbacks.dll</HintPath> </Reference>
第三方插件编译后的dll存放在Library/ ...
Shader剔除模拟Slider效果
前言 想在战棋demo中增加UI的血条效果,原本用的是之前所用的直接slider制作或直接修改UI中sizedelta.x的方法来实现,但是却发现会不可避免的造成Image中的sprite拉伸的情况,后来自己尝试的同时问了下同事得到了两种方案。
方案1:slider+Rect Mask蒙版制作思路:直接对UGUI中的slider结构进行一个小修改,新加入前景色和后景色作为血条颜色和背景色,同时在原Slider中的Fill加入了Rect Mask,对前景色进行蒙版处理,用于解决UGUI中Slider中Fill在修改value时会rect Transform定死为Stretch Left的情况,前景色和后景色的RectTransform都设置为 Middle Left。
实际效果:
方案2:通过shader进行蒙版剔除制作思路: 通过UI Shader中的uv.x与参数_Clip做一个剔除,即Clip(i.uv.x-_Clip),来达到类似于slider的效果,感谢同事的思路,感觉挺方便的。
在明确了思路的情况下,直接找到builtin中UI-Default. ...
Shader学习:基于噪声的消融效果
前言 早些时间过了一遍Games101,但是中间间隔了一段长时间的实习后发现自己忘了不少。所以在复习Games101的过程中也去跟着shader入门精要去实现一些毕设Demo可能要用到的效果。
概述 消融效果常见于游戏中的角色死亡、地图销毁等效果。
其原理比较简单,概括来说就是噪声纹理+透明度测试,我们使用对噪声纹理采样的结果和某个控制消融程度的阈值比较,如果小于阈值,就使用clip函数把它对应的像素裁剪掉,这些部分就对应了图中被”销毁”的区域。而镂空区域边缘的烧焦效果则是将两种颜色混合,再用pow函数处理后,与原纹理颜色混合后的效果。
代码实现Dissolve消融:
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021 ...
LeetCode. 519 随机翻转矩阵
519. 随机翻转矩阵
解题思路: 算法整体主要考察了二维数组的Random洗牌方法,核心思路是将二维数组转换为一维数组,用一维数组的洗牌算法思路来解决。
我们可以联系到一般的洗牌方法:假设数组的元素个数为count,则我们从0~count-1随机取任意一个数,将该数作为索引在数组中对应元素与最后一个元素进行交换,并且返回该元素作为当前随机抽选到的数,这样可以保证每次取值都不重复,且当循环count次后可以达到洗牌的效果。
得到基本思路后,我们可以通过两种方法来实现:
模拟整个的洗牌过程,初始化一个数组,其索引对应真实值(对应二维数组),每次取到真实值与最后一个元素进行交换,重复过程
根据思路得到的代码:
123456789101112131415161718192021222324252627282930313233343536373839class Solution {private: int _m,_n,_count; int *arr;public: //MARKER:类似于洗牌算法的一种思路 Solution(i ...