我的u3d游戏编程之路
因为最近进行求职的缘故,需要一个地方来show自己的所学所用。并非所有的求职网站都有相应的作品展示区域,因此选择了在csdn完成作品的展示。在这里只展示部分在我编程过程中完成的难点问题。有些东西也只是执行思路不涉及具体代码。以供交流,希望能给同样刚刚入门u3d的同学一些帮助。
相关内容:
1.随机地图生成
这个组件是基于mesh写出的地图地形。unity其实自带了有地图生成的功能,其中完善的组件也很丰富。但是在一开始我电脑坏掉的那段时间,使用一台破电脑跑自带地图卡的飞起之后,就没再使用过这个东西。当然,这也是个人喜好,我个人更偏向于随机生成的地图,由代码控制生成地形,只要地图能自由畅通,不断更换的地图会有更好的新鲜感。(其实一半以上原因是因为我懒得做美工而且极其缺乏美术细胞。)
基于mesh生成的地形,其实现原理,无非是数组的具现化。我们都知道,unity中,mesh是以数组的形式存储顶点坐标,法线及其uv信息。再以数组的形式,每三个为一组不划分的进行读入。因此,3d地图的实现可理解为一个3维数组。
在我的实现过程中,首先是可通行区域的2维数组划分。(因为除了日常可通行的区域外,游戏场景肯定还包括暗渊,高点等不能正常通过的区域穿插其中。)因此,这个二维数组的建立便是决定后续可通行的区域,往后,无论是高度为几的区域都是在此基础上进行建立的。
以下为一个数组示例,其体现了一座桥,及桥地下是可通行的路面。
可以看到,第一张矩阵是从纵向中间穿过的道路。第三张矩阵是横向中间穿过的道路。而第二张矩阵就要稍微抽象点。但其实并不难理解,人们不可能从高度1一下跨到高度3的位置,因此需要一个一个高度2的阶梯或是斜坡完成高度的过度。在这,我统一使用的是一个三角形的斜坡(因为阶梯并不是不会,而是太麻烦,况且本来也不是成品,我一向如此偷懒~)
效果是有点丑陋的…没办法,这个斜坡是自动生成的,在我的程序中,将地图分割成了多个不同高度的区域,于是我将可通行的区域划分为多个,在相邻区域间随机取一个点,对其周遭四格进行斜坡的生成。这个过程听起来是简单的,但执行起来有一点麻烦,因为有些区域并不清楚其厚度(也就是区域的宽)如果取值过大的话会造成一个斜坡横跨了两个区域(这是bug)。而为了规避这种情况,只能取一个点,也就形成了这样的布局,其坏处就是,不仅丑,而且坡度过大。(大概在40-50度的坡度,因为加入了细节运算,坡上的点位会有上下偏移。)
而后续关于这块的改进我也想好了。无非是进行区域生成的时候更加智能一些,以保证,取1-n个点位的时候,不会出现横跨两个区域的现象。当然,这个问题需要后续来解决。暂时我打算先完成其他游戏主体部分。
关于为什么使用mesh,其实我的初衷是游戏的随机性。(受到太吾绘卷的毒害我发现随机比固定剧情有意思多了。这也是我偷懒的借口……)但后续发现还是有很多其他好处的。
(1)性能优化
在我的地图中,以上这个地形是以一个mesh进行绘制的。没有错,虽然地图挺大的(80 x 80 x 3,原谅我没见过世面的样子),但是其实它就是一个东西,而且在斜面生成处我费了些功夫,除了必要的面,基本没渲染其他的面。因此它很节约静态内存。它看起来是一个非常完整的路面,但是就只有一个架子,敲碎上面的砖块,下面就是空的。
(2)渲染优化
在学习shader的过程中,曾经看过几篇帖子是关于合并mesh的,为的就是讲shader的渲染次数减少,而这样生成的地图可以少到甚至只有一个,因此渲染次数并不多。
(3)游戏性
我针对这个随机生成地图想过很多游戏性的方案。例如在后续的地图上随机生成风眼(已经有做了,但我还缺个龙卷风),生成水下山洞,生成熔浆海等。这些随机生成的事物都存在其生成的不确定性,位置的不确定性,大小的不确定性,但其是否存在,其实都取决于地图布局,而他们的出现,可能会给地图带来其他的加成效果。例如,移速加快战斗时自带浮力,玩家可漂浮进行战斗。获得更加稀有的物品和一些奇遇。以及进入一个世外桃源的机会等等。
这些事物的生成都需要依赖于随机地图的区域划分,又为随机地图的存在增加一些筹码。
地图生成的部分大概就只讲这些。毕竟我也正在起步,其实还没有完善更多的内容以供参考。但如果想试试的朋友,请务必注意mesh的渲染顺序,这个点坑过我这个新手很多次。
2.细节优化
其实上面说的地图可以非常大,只需要增加其基础渲染的size即可。但是这就会出现细节过差的问题。针对这个点我说一下我关于游戏地图,细节点的制作。
在上面我们说到,mesh的渲染是以三角形为基础进行的。因此,我完成细节优化的方式就是往里面加入点。往三角形中加入一个点,以确定一个新的三个三角形,其效果类似这样。
每加入一次,便相当于该三角形被细节化一次。当然,这是不够的,我们的基础size是3,哪怕加入一个细节点,产生的三角形size至少还是1。因此再加入一次便是这个样子。
没有错,从这个三角形可以看出来我写这个程序的算法,是使用一个数组存储三角形顶点,然后每3个遍历一次,因此一个三角形一次细节化是加入一个点,两次是4个点,这是不停的对三角形进行细化,每次细化都是对原有的三角形一次精细。
当然,这还是不够,两次细化之后,size也仍然有0.75左右。这也是我的地图还是很丑的原因。在这里需要提到一个坑。mesh的顶点是有限制的,65k之后,每存储进去一个,会挤出去一个,而程序只会报一个警报。(天杀的警报,程序员只看error不看waring造成我当时卡在这个程序好几个小时。)
这个坑也是阻止我细节优化的关键位置。再多的话,地图就会错乱。因此,这也是我前面说到甚至只需要一个mesh就能实现地图的保留说法的原因。因为不可能只用一个mesh。想要继续进行细节优化,智能进行mesh的划分。其实这点还算容易解决。该地图实现的内容在二次优化时卡顿,则加入两个mesh最少可再进行一次,以此类推,在四次优化时,细节点位的size就会小到0.175,五次会小到0.0875。已经足够使用。而五次优化所需要不过是20-30个mesh。其实对于内存应该还是不会有特别大影响,尤其是细节,其实更多是针对一些特殊需求的地方。例如墙壁,坡道,对于平地来说,盖上草皮其实毫无差别。因此可着重细节化需求的位置。可节省大量的运算内存和静态内存。
在这除了提一下这些,还要说到另外一个坑。关于运算内存的坑。
其实一开始我所想的细节化是这样的
也就是每个线取一个中点进行细节,再对点位进行浮动。
但这个想法也让我的程序卡顿了整整两天。每次运算都需要巨量的时间,着实恐怖。
关于这点,后续我也大概知道了原因。这种细节化的思路,需要考虑相邻三角形的细节点位问题。因为相邻三角形必然会有一个细节点与之相重合,如果不管他,则会出现错位问题,如果管他,就需要再进入原来的vert数组里进行一次遍历。其效率可想而知,相当于每个for循环里都嵌套了无数for循环用来查询。因此这个方法被我pass了。也提醒一下后来的朋友,这个方法看似比以上更加合理,但需要考虑到如上问题。否则你就会像我一样run的时候,卡在那半天动不了,直想砸电脑。
今天先分享到这,后续可能写一些关于shader的学习历程,还有最近使用到的一个很实用的光雾。以及之前使用java无引擎编辑游戏时,需要到的一些困难。
我的u3d游戏编程之路相关推荐
- 看完知乎轮子哥的编程之路,我只想说,收下我的膝盖...
点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 作者:vczh 来源:https://dwz.cn/sWwZoQEl vczh,本名陈 ...
- 一个体育生的编程之路
(一)打字与考盘算机等级 记得小学时,学校里有个老师会用电脑,当时觉得电脑是个很神奇的高科产品.后来咱们学校得到浪潮捐献的一台电脑,看见那个老师在用电脑玩扑克牌.这是我第一次见到电脑长啥样. 高中时有 ...
- 我的编程之路:「懒惰」是程序员最大的美德
首先给大家介绍一下自己吧 大家好,我是 justjavac,一名全栈工程师,目前正在出版<代码之谜>.熟悉我的人可能知道我还有一个中文昵称「迷渡」,取「雾失楼台,月迷津渡」之意,一般用在豆 ...
- 【专业造轮子】 一位大神的编程之路,让我大吃一惊
vczh,本名陈梓瀚,因知乎的个人信息介绍上写有 "专业造轮子",所以江湖人称 "轮子哥". vczh 大学时代就在微软实习,毕业后即加入微软.开始时是在微软上 ...
- 基于python的modbus协议编程_通往未来的网络可编程之路:Netconf协议与YANG Model
近年来,随着全球云计算领域的不断发展与业务的不断增长,促使网络技术也不断发展,SDN技术应运而生,从最初的基于Openflow的转发与控制分离的核心思想,人们不断的去扩展SDN的外延,目前,人们可以达 ...
- 43岁老程序员的编程之路,我是如何做到退休的?龙叔真的退休了吗?
大家好,我是龙叔,今年43岁,做了18年的程序员,去年我还在公司任职CTO,今年就不上班退休在家里了,很多人可能会比较好奇,四十多岁退休是怎么做到的?退休之后我在干些什么? 很多粉丝都问过我这些问题, ...
- 1. 我的自学编程之路
我是真正零基础开始学Python的,从一开始的一窍不通,到3个月后成功搭建了一个动态网站(没有用任何框架).相比于计算机大牛,我更加知道一个小白将会遇到什么坑,遇到哪些难点.我把我的学习过程写在下面, ...
- 行业律师的IT编程之路
于国富是北京市盛峰律师事务所的主任律师,同时也是一位计算机编程爱好者.他将自己的专业与个人爱好很完美地结合在一起,开创了一条适合自己的成功之路.<程序员>杂志专访北京市盛峰律师事务所主任律 ...
- c/c++游戏编程之用Easyx封装按钮
c/c++游戏编程之Easyx图形库基础(一) EasyX基础 c/c++游戏编程之Easyx图形库基础(二) 绘制图片 c/c++游戏编程之Easyx图形库基础(三) 用Easyx封装按钮 文章目录 ...
最新文章
- 汪国华 基因组分析的生物信息学算法
- 用verilog表示两个4x4矩阵的乘法运算?及单个矩阵的求逆
- vscode编辑python_VsCode中编写python环境配置
- Ring3下Inline Hook API
- jshell_五分钟的JShell
- Java 获取 URL 响应头信息
- python不联网安装selenium_Anaconda python 离线安装selenium3.141很容易
- cublas matlab,Check failed: status == CUBLAS_STATUS_SUCCESS (11 vs. 0) CUBLAS_STATUS_MAPPING_ERROR
- 洛谷P2568 GCD(莫比乌斯反演)
- 第0003 天:论团队分工、成长
- 粉尘防爆设备-尘密性设备
- Struts2标签库(三)之表单标签
- 【PID优化】基于matlab粒子群算法PID控制器优化设计【含Matlab源码 1122期】
- Hyper-V 2016 系列教程56 SCVMM 2016 Client的安装
- 网络基础知识(黑马教程笔记)-4-http请求与响应的处理
- web-----简单小游戏项目
- Excel常用技巧(三)——函数
- 一分钟整明白web前端和Java后端的就业前景
- 电脑桌面怎么添加HTML,电脑上怎么把浏览器网页添加到桌面
- 71.JAVA编程思想——JAVA与CGI