- 博客(51)
- 收藏
- 关注
原创 ToLua框架
对于自己实现的脚本比较麻烦,首先需要调用 LuaBinder.Bind(LuaState lua)其次需要将自定义的类写入CustomSetting.cs文件中,你将你的自定义类加入到customTypeList数组中的末尾,如果是静态类就还需加入staticClassTypes中。然后依次点击Lua菜单中的Clear wrap files 和Gen All。
2023-04-29 21:26:44
1196
1
原创 CICD中的Jenkins和Ansible解决方案
每一次重装系统或者是需要在服务器上正确运行软件,我们都需要重新安装所有的package、dependency并进行相应配置的微调。而这一过程可能就会因为疏忽导致错误,因此需要自动化部署持续整合,持续交付(CI/CD)的实践,我们能够周期性的对产品进行各种专业测试,如果出现问题我们也能快速找到发生问题的最近位置。同时我们还能进行报表分析和自动通知等其他操作。
2023-04-29 21:23:56
1531
1
原创 Unity一般打包流程
Player Settings提供了各种选项来帮助你完成最终游戏的出包,虽然说有很多不同的平台,但是大体上的设置会分为以下几个部分。以及一部分涉及到Roslyn Analyzers的选项,它可以静态地分析代码,并在代码中检测到潜在的错误、漏洞和优化机会。可以选择在运行脚本(ScriptOnly)、任何时候(Full)或者是从不(None)的时间选择记录类型。分辨率和启动前窗口设置,包括了支持的分辨率比例和是否默认全屏启动等选项;来选择需要打包的场景后出包到指定文件夹位置,也可以采用。
2023-04-29 21:23:21
6197
原创 unity NGUI使用方法
很多基本模块比如按钮、slider等都能从Prefab中直接拖拽到场景中实现,但都需要有一个Collider(Prefab已经自带)因为不仅是UI,所有带有Collider的游戏物体都能接收到OnClick, OnPress这样的事件——前提是需要在Main Camera里面添加上event System组件,然后自定义脚本添加以下函数:如果不想写代码,也可以直接拖拽UIEventTrugger脚本来实现相关功能。
2023-04-29 21:20:02
2278
原创 lua 基本语法
userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用。
2022-12-23 20:43:04
3999
原创 Unity + Mirror实现原创卡牌游戏局域网联机
局域网联机插件 Mirror:Mirror | 网络 | Unity Asset Store本地客户端测试多人游戏(不用打包)插件 : ParrelSyncMirror官方文档:General - Mirror (gitbook.io)点击开始之后会看到如下界面,需要其中一台电脑作为Host,其他玩家点击Client就可以直接连接Mirror演示场景连接成功效果:首先需要注意的事情:该组件控制着游戏物体在网络中的独特ID,他的 选项表示是否确保物体只生成在服务端。在每一个运行过程中生成的预制体都需要添加该组
2022-12-05 17:34:04
5546
2
原创 游戏优化之空间划分
每种空间分区数据结构基本上都是将一维数据结构扩展成更高维度的数据结构。网格是连续的桶排序BSPs,k-d trees和包围盒是线性搜索树四叉树和八叉树是多叉树。
2022-11-20 21:18:53
968
原创 Unity 资源热更新
这些目录包含着不同版本的资源文件,以及用于版本控制的Files.txt,里面存放着资源文件的名称和md5码。客户端版本号我们是4位来标识,假设是X.Y.Z.WX:【巨大版本号】这一位其实就是1,没事一般不会动他,除非有太巨大的变化,目前反正还是1;Y:【整包更新版本号】:我们游戏一般一个月会有一个比较大的版本迭代,这种版本会走商店,每次提交Y值+1;
2022-11-17 20:28:43
1727
原创 浅析GC-垃圾回收
CLR(Common Language Runtime):CLR的核心功能包括,而且还负责对代码实施严格的类型安全检查,保证代码的准确性,这些功能都可以提供给面向CLR的所有语言CLR并不关心是使用何种语言进行编程开发,只要编译器是面向CLR而进行编译的即可,这个中间的结果,就是IL(Intermediate Language), 最终面向CLR编译得到的结果是:IL语句以及托管数据(元数据)组成的托管模块。
2022-11-14 22:05:24
757
原创 帧同步和状态同步
网络同步主要目的在于保证各个端口的游戏表现一致,而对于大多数游戏,不仅客户端的表现要一致,而且需要客户端和服务端的数据是一致的。所以,同步是一个网络游戏概念,只有网络游戏才需要同步,而单机游戏是不需要同步的。
2022-11-09 19:25:42
2363
原创 ECS框架浅析
在传统的面向对象设计中(OOP),进行框架设计首先就要进行类的层次结构,而在这一过程中就会出现多重继承困难、层次结构不易改动的现象。而且游戏开发中一种比较常见的现象就是,由于操作和数据没分离,A对B造成了伤害,是A去打了B,还是B受到了A的伤害,函数应该放在哪里?ECS就没有这种疑惑,数据存放在Component类、逻辑计算直接由System负责这和传统的面向对象或是 Actor 模型是截然不同的。OO 或 Actor 强调的是对象自身处理自身的业务,然后框架去管理对象的集合,负责用消息驱动它们。
2022-11-06 17:12:50
3175
原创 A*寻路算法
深度优先算法(BFS)在所有方向上平等的探索,是最好写的寻路算法Dijkstra算法优先考虑低成本的路径,在游戏中可以规定远离敌人、避开森林需要更高的成本,所以当移动成本发生变化的时候我们使用该算法而不是BFSA*寻路是对Dijkstra算法的修改,针对单个目标时进行了优化,Dijkstra的算法可以找到所有位置的路径;A 查找到一个位置的路径,或多个位置中最近的路径。它优先考虑似乎更接近目标的路径。下图依次表示他们的搜索区间。
2022-10-12 11:16:34
3136
原创 unity任务系统
进行持久化储存,虽说这会污染注册表,当时我们将所有任务的数据编写在一个string中,这样产生的影响就会少很多。但一般不推荐按这样做,因为Resource文件夹只读,而且打包时会全部进行压缩后打包。回调是为了模拟实际场景中从服务端数据库读取数据(异步)的过程, 仅在客户端交互的情况可以直接忽略。目前只考虑客户端进行任务数据的管理,与服务端进行交互不在本篇的介绍范围内。或自定义的文本格式的配置,这样不会让Excel打包时占据额外空间。中能够安装额外的插件,直接导出为。配置,实际项目中一般都是将。
2022-09-25 23:56:24
1867
原创 渲染管线概论
渲染管线(渲染流水线)是将三维场景模型转换到屏幕像素空间输出的过程。图形渲染管线主要包括两个功能:一是将物体3D坐标转变为屏幕空间2D坐标,二是为屏幕每个像素点进行着色。
2022-09-21 16:07:00
758
原创 图论算法个人总结
Kruskal 算法是在一开始的时候就把所有的边排序,然后从权重最小的边开始挑选属于最小生成树的边,组建最小生成树。适用于稀疏图Prim 算法是从一个起点的切分(一组横切边)开始执行类似 BFS 算法的逻辑,借助切分定理和优先级队列动态排序的特性,从这个起点「生长」出一棵最小生成树。适用于稠密图。
2022-09-06 22:33:20
241
原创 回溯算法和BFS
第一种解法即便经过了排序优化,也明显比第二种解法慢很多假设nums中的元素个数为n。先说第一个解法,也就是从数字的角度进行穷举,n个数字,每个数字有k个桶可供选择,所以组合出的结果个数为k^n,时间复杂度也就是O(k^n)。第二个解法,每个桶要遍历n个数字,对每个数字有「装入」或「不装入」两种选择,所以组合的结果有2^n种;而我们有k个桶,所以总的时间复杂度为O(k*2^n)这是对最坏复杂度上界的粗略估算。
2022-09-03 15:43:39
794
原创 二叉树算法个人总结
所有递归的算法,本质上都是在遍历一棵(递归)树,然后在节点(前中后序位置)上执行代码。你要写递归算法,本质上就是要告诉每个节点需要做什么。比如归并排序算法,递归的sort函数就是二叉树的遍历函数,而merge函数就是在每个节点上做的事情,有没有品出点味道?
2022-08-25 16:11:24
378
原创 动态规划刷题个人总结
其实j代表的并不是索引,而要理解为状态,我们根据下一字符来决定转移到哪个状态假设我们匹配的字符串为"ABABC",开始匹配时pat处于初始0状态,5状态表示终止状态,如果遇到除ABC之外的字符直接转移到0状态要确定状态转移的行为,得明确两个变量,一个是当前的匹配状态,另一个是遇到的字符;确定了这两个变量后,就可以知道这个情况下应该转移到哪个状态。...
2022-08-11 15:12:03
250
原创 排序算法总结
Θ 渐进紧确界存在正常量 n 0 , c 1 , c 2,使得c1g(n)≤f(n)≤c2g(n)where:n≥n0f(n)=Θ(g(n))同理可理解 O 渐进上界与Ω 渐进下界。
2022-08-03 13:18:21
92
原创 C# CLI(公共语言基础结构)
C#生成的不是机器码,而是中间语言——CommonIntermediateLanguage(CIL)。在执行时在会被转换为机器码注意区分CLI和CIL,充分理解含义当然,代码想要执行,转换为机器码是不够的。还需要一个负责管理C#程序执行的代理,也就是虚拟执行系统(VirtualExecutionSystem),。不仅负责加载和运行程序,还负责安全保障,垃圾回收等额外功能CLI标准包含以下规范虚拟执行系统(VE)——运行时CIL——通用中间语言。...
2022-07-29 17:50:17
2057
原创 C# 自定义集合
每个元素都可以通过索引来单独访问,List是有序集合,在调用自带方法Sort()之后会是元素按照字母顺序重新排序。如果元素类型实现了泛型或者非泛型接口排序算法就默认用它来决定排序的顺序。如果没有实现,或者是默认逻辑不符合要求,可以调用的重载版本,他获取一个作为实参和的区别在于,前者知道如何将我自己和同一类型的另一实例进行比较,后者知道如何比较给定类型的两个实例实现排序逻辑的时候要保证全序,确保相同数据的排列组合会产生一致的结果,比如判断可传递,与自身相等…...
2022-07-25 21:38:54
444
原创 C# 再述值类型
值类型和引用类型的主要区别在于复制策略的不同,这就造成了在内存中以不同的方式存储。值类型的变量直接包含值,变量引用的位置就是值在内存中的实际存储位置。值类型变量之间进行赋值时,会在新变量的位置创建一个内存副本,不可能引用同一个副本(除非其中一个时out或ref参数,根据定义,表示这个参数是另一个变量的别名)值类型的值一般都是短时间存在的,大多情况下只是作为表达式的一部分或者是用于激活方法。在这种情况下,值类型的变量和临时值通常是存储在被称为“栈”的临时存储池中,他的清理代价低于需要进行垃圾回收的堆他的值是对
2022-07-10 22:47:56
143
原创 Unity 射线与碰撞范围检测【踩坑记录】
射线检测在2D和3D的区别比较大一定要加上对应的Collider组件对应的函数只检测对应的Collider,是不会检测到Collider 2D的(这个让我有一次debug了好久才发现)对应API如下可以使用和来使射线可视化此外因为Ray都是由两个Vector3变量构造而成的,而2D世界都是,只能用变量表示了。当从物体中心点发出时,检测到的第一个碰撞体却是自己。那我们该怎么解决这个问题呢?答案是这样如果碰撞体是我们射线所在起点的内部时,我们不让它返回该碰撞体。的形式是int。它表示的是你图层的序号的二次方倍
2022-07-07 23:12:58
5626
原创 详解四元数
小人只能理解实数范围内的运算,只是将i当作自身平方为-1的特殊符号。几何意义上,复数范围内的乘,把前一个复数看作是作用在第二个复数上的函数固定原点,将(1,0)这个点拉到z点位置,变换之后的w点就是乘积结果,在二维空间中有且仅有一个变换能得到这个结果这个过程中涉及到拉伸和旋转,拉伸十分好理解,因为一维数轴也能进行。那么旋转呢?这不本就是一个二维平面才有的概念吗?所有旋转都对应着唯一的旋转度数,我们可以将其投影到一维数轴上想象一个点在单位圆上移动,该点与(-1,0)的连线与复数轴产生交点,一维小人观察复数轴这
2022-06-21 21:17:32
6183
原创 games101 相机、透镜、光场、色彩
对于更小的传感器想要得到相同的FOV,需要将焦距调小(Focal length)H = T x ET: 曝光时间,被快门(Shutter)控制E: Irradiance (辐照度)F/N : N指的就是焦距除以直径如图所示的组合能使相片达到相同亮度理想的透镜有这些性质:公式可由相似三角形推出引入一个新概念:Circle of Confusion如果Object不在Focal Plane上,就会聚焦在Image上,然后光线继续传播到Sensor Plane上,这时候在Sensor Plane上形成的圆就是C
2022-06-20 19:47:46
312
原创 计算机网络组成复习笔记
数以亿计的计算互连设备:主机(host)= 端系统(end system)运行网络应用程序分组(packet)交换设备:通信链路(link):fiber, copper, radio, satellite传输速率 = 带宽(bandwidth)网络 (Networks):设备、路由器、交换机和链路的集合,由机构组织管理提供网络应用基础架构允许终端系统上运行分布式应用程序,并彼此交换数据: Web, email, games, e-commerce, database, VOIP, P2P file sha
2022-06-14 21:35:10
2723
原创 计算机操作系统复习笔记
操作系统应具有五个方面的功能处理机管理(CPU)存储器管理设备管理文件管理方便用户使用的用户接口——为了让用户方便、快捷、可靠的操作计算机硬件并执行自己的程序,操作系统提供了用户接口操作系统提供的接口分为两类::用户可以使用的,利用这些操作命令来组织和控制作业的执行:用户通过程序使用的,编程人员可以使用它们来请求操作系统服务当子进程被撤消时,应将其从父进程那里获得的资源归还给父进程。在撤消父进程时,也必须同时撤消其所有的子进程。调用进程创建原语Creat ( )按下述步骤创建一个新进程:申请空白PCB。为新
2022-06-09 17:47:42
2733
原创 games101 材质与外观
材质就是BRDF,BRDF定义了光线与物体如何交互,从而不同的材质产生了不同的视觉效果首先认为现在在研究的这个漫反射材质是均匀的,这也意味着:假设入射光是各个方向均匀射向这个着色点的,并且每一个入射光的光强都是相同的;同时在着色点上,光是均匀地被反射到每个方向;着色点本身既不发光,也不吸收光。我们可以定义一个名为反射率这么一个该概念,英文名为albedo(color),albedo可以是单通道的一个数,也可以是三个数RGB,我们定义他的范围在[0,1]区间内,引入不同颜色BRDF,所以这个BRDF的值就是,
2022-06-03 20:52:33
351
原创 games101 物理动画基础
关节动画基本概念关节 – 如果两个刚体互相连接且能够发生相对运动,则这两个刚体的关联部分称为关节关节链 – 将一系列依次相连的刚体通过关节连接而成的开链末端影响器 – 关节链的自由末端(End effector)关节链结构的自由度(Degree of freedom - DOF) – 状态空间的维 度,完全确定关节链结构状态所需的独立变量个数正向运动学(direct/forward kinematics)研究如何从给定的状态向量计算各个链杆的位置(包括各个关节的位置),尤其是末端影响器的位置
2022-05-25 14:17:56
464
原创 games101 光线追踪
Shadow Mapping在确定遮挡关系的时候, z-buffer的深度值是相对于摄像机镜头,也就是眼睛所见来确定物体是否被遮挡,这个很容易理解。眼睛能看不见的地方,当然被挡住了。那我们换个角度想想,阴影是如何产生的?通过移动视口到光源位置,可以观察到这个位置每个东西都是明亮的,因为从光的角度来看是没有阴影的。从光源的角度将场景的深度渲染到一张深度缓冲区中,我们可以在场景中获得一张阴影或者无阴影的贴图,一张阴影贴图。软硬阴影在下面的图中,a点与光源之间没有任何物体遮挡,因此是照亮(lit)的。而
2022-05-23 19:49:42
350
原创 games101 几何
几何归类隐式几何只表示各个点之间满足的关系,比如球在三维空间中的表示:x² + y² + z² = R²可以很容易的判断一个点在物体内还是外,但是很难画出这样的几何体,不容易找到所有点。显式几何参数映射:通过一个函数,把二维空间上的点坐标当做参数,映射到三维空间上。如:f(u,v)=( (2 + cos u) 8 cos v,(2 + cos u) * sin v,sin u)更多的隐式表示方法Constructive Solid Geometry(构造立体几何法)通过布尔运算表示复杂几
2022-05-11 16:15:05
375
原创 games101着色(7~9)
深度缓存1. 何为深度深度其实就是该象素点在3D世界中距离摄象机的距离(绘制坐标),深度缓存中存储着每个象素点(绘制在屏幕上的)的深度值!深度值(Z值)越大,则离摄像机越远。2. 为什么需要深度?在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这样的效果并不是我们所希望的。而且如果出现上图这种情况,这种方法便失效了。而有了深度缓冲以后,绘制物体的顺序就不那么重要了,都能按照远近(Z值)正常显示,这很关键。3.深度
2022-05-06 10:02:47
125
原创 games101 光栅化(5~6)
光栅化的介绍什么是屏幕屏幕在图形学中定义为一个像素的二维数组,数组的大小就是屏幕的分辨率什么是光栅化将屏幕空间中的多边形解释成像素为什么选择三角形作为基本图形组成最基础的多边形 :能组成其他多边形独特性质: 确定一个平面, 能清晰定义内外采样(Samping)走样的定义:由于低频取样而造成的信息失真 图形数字化过程中,图形映射到光栅系统的整数位置而产生的图形畸变。**函数中定义:**把一个函数离散化的过程采样三角形中每个像素的中心点,为了提高采样的效率,我们只在边界区内进行采样
2022-04-26 11:32:12
95
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人