【杂谈】假期里做的一些内容(Unity 编辑器扩展、道路寻路系统、室内灯光LOD系统)

前言

  难得最近闲下来一些,决定更一篇杂谈,把去年暑假和今年寒假里折腾的一些值得记录的东西写一下。不过最近也确实很烦恼,临近找工作也确实在考虑以后要干什么了。以前的想法一直是工作几年攒些钱然后自己去做游戏,毕竟坚定想做游戏这条始终没有动摇过(其实或许游戏也只是一种表现形式),但或许其实自己早就对每天忙得不明所以的生活有些厌倦了,想早点开始做自己感兴趣的事情。

  但具体到现在,就是两个选择:一方面想在毕业前能上架一个游戏所以一直在急着做开发,因为工作之后精力和时间都更少了,而且我也担心自己一旦走向工作的道路就很难回头(比如满足于工作的平淡生活或者认清了现实等等);另一方面又应该去花时间准备找工作,毕竟自己做游戏这事开发周期又长又很难挣钱,如果真不准备找工作的话自己的积蓄估计顶多也就撑几个月,但如果想找自己觉得还算满意的工作,能更快的积累资金,又得刻意去准备一些拿得出手的项目、研究、然后刷刷算法题等等,基本也就告别毕业前上游戏的想法了。虽然当时选择了两年制的研究生让时间变得更紧张了,也是导致我最近比较烦恼的主要原因,但长远来看也并不后悔,毕竟我也从来没觉得真有什么是必须要作为研究生才能学到的东西。

  不过有时候也在想,既然想选择自己做游戏,确实应该放下很多东西,也许是自己一直没能做到这点…所以其实这篇文章里的东西就是这么来的,也就是最后自己还是选择了做游戏,去年暑假也正式回归自己的游戏中,至于找工作的事只能少花一些时间准备,剩下的看缘分了~

  回归正题,其实这篇内容也是上一篇杂谈的续作,仍然是那个校园(或者说现代城市)场景,也是续接之前所说的场景空旷的问题。

道路寻路系统

  校园或者说城市场景中道路是必不可少的,烘托气氛的行人可以少,但不能没有。下面的一个场景用于简单模拟校园中的一段道路:

白色表示道路
    而游戏项目中的需求也很简单,如果场景中有一个行人,我告诉它目标位置,他就能沿着道路走并找到终点,也就是寻路。Unity中提供的Navigation就能实现这一点,只需要把白色物体标为Navigation Static,点击Bake,就生成了对应的可行走区域,效果如下:

Unity Navigation寻路

  很简单效果也很不错,但并不正确。因为路明明很宽,但因为是最短路径寻路,所以行人都很统一的找到了一条最近的路线并沿着边缘行走。显然这不是我们想要的效果。最开始我的想法是找找有没有解决类似问题的插件以及改源码,但后来考虑到自己的需求其实并没有那么复杂,而且使用Unity Navigation这种反倒对性能消耗比较大,于是选择自己写一个简单的路径点寻路系统,在指定目标地点后行人能采用更接近于人的行走方式移动至终点。先上一张效果图:

简单路径点寻路,细节可以再根据需求打磨完善,但基本结构已经有了

在实现上则是采用了路径点以及点与点之间路宽的思路,通过扩展编辑器实现了场景中对道路的简单编辑,并且支持批量移动、删除、复制等操作,同时也支持撤回与重做。(这里因为数据结构的关系无法自动序列化,需要手动序列化从而使路径数据能够持久存储)

扫描二维码关注公众号,回复: 14926642 查看本文章
添加一条新的道路并修改目标地点

再次寻路

撤回刚刚所做的更改,然后修改一些参数,也可以达到最上图中类似Unity Navigation寻路的效果:(这里只是修改参数实现的类似效果,并不是说实现了道路范围内的最短路径寻路,真要实现的话应该需要额外的代码)

修改参数以达到不同的寻路效果

  上边这些部分是在去年暑假完成的,当时还添加了通过权重使行人会以一定概率选择更远的道路的功能(因为现实如此,人不总是沿着最短的道路行走,但因为部分情况下效果不理想而且目前采用了下述的方案,这一方法就被废弃了)。当然最后还是考虑到性能问题,觉得没有必要对大量的氛围感路人使用自动寻路,于是在路径点之上添加了编辑路径的功能,也就是预设好的道路,并在道路上通过调整参数自动生成来来往往的行人,也是今年寒假修改了需求后实现的(说实话实现没花多长时间,倒是思考游戏里到底需要什么样的效果、以及什么样的效果就已经足够烘托氛围花了很久,中间还特意找了些有类似的系统的其他游戏中看了看别人的效果):

红色为在路径点之上编辑的道路,绿色点为起点,蓝色点为终点

预热(类似Unity粒子系统中的功能)并在玩家靠近时根据参数在道路上自动生成行人

室内灯光LOD系统

  这个东西其实也是续接上一篇中的光照问题,当然其实也不止灯光,但主要处理在灯光问题,真要说的话目前是个半成品,后续有时间会继续完善。应用场景如下:教学楼或者写字楼都有很宽敞的窗户,玩家在窗户外一定距离内可以透过窗户看到室内的细节(包括室内的多个顶灯产生的较为柔和的照明效果),而较远距离下则主要体现灯光的作用(因为在夜晚,一栋楼有多少窗户在亮着区别十分明显),再远距离就无所谓了。首先要把管线改成延迟渲染管线,不然物体受光数量有限制不说,逐片元着色效率还低,然后假设根据实际需求搭建的一个场景如下:

  其实这么堆光源相当不合适,而且实际建筑物远比这个要大,只是半个建筑物内的场景加光源,不优化我的小笔记本跑起来帧率就可以掉到快个位数,所以优化是必须的(这可能也是很多游戏室内室外不连通、室外看不到室内、室外看到的室内是假的的原因)。

  目前的优化逻辑也十分简单:因为场景的特点,当摄像机在一个房间内时就不可能看到其他房间内的东西,而且当玩家不处在有窗户的正面一侧时,玩家也是看不到室内的。而且当玩家稍微远离时也只会加载一个大光源,基本效果还是不错的。实际项目场景测试中,在半个建筑的室内细节加灯光场景下,与只使用了LOD Group的情况相比提升了100多帧,理论上场景更复杂的情况下帧率可以提升更多(因为被裁切掉的细节也越多)。

玩家在室内时周围房间没有加载

在窗外时加载细节,范围可自由调整

  其实上图一也可以看到一个问题,就是下方的光明显漏到了上方的房间。这是因为场景中类似的灯光可能很多,为了减少性能开销灯光并不会投射阴影。这会导致如果某一房间是关灯的,但周围房间开着灯,关灯的房间看起来也有一些光照。同样的,因为房间内放置的顶灯通常是有规律、有共性的,放置这么多点光源可能确实有些得不偿失,所以当时在考虑自定义光照模型,但其实目前来说是能够接受的,可以等后续真的有需求了再修改,这也是为什么说它是个半成品的原因。

猜你喜欢

转载自blog.csdn.net/qq_43459138/article/details/129359298
今日推荐