英雄联盟的视野实现方式



之前发过一篇使用Navmesh和A*关于动态障碍的实现方式,因为做过一次MOBA游戏,于是想续写一个MOBA游戏系列,这个系列均是原创,这算是第二篇,下一篇应该会写LOL的技能设计。
     需求分析
     在LOL里视野有几种表现方式----
    1.是草丛视野: 如果草丛没有眼,则英雄A进入草丛后,敌方英雄无法看到A,友方英雄可以获得A的视野。
    2.是不在草丛时,如果有眼位,则友方英雄可以看到该视野,敌方英雄无法看到该视野。 如果有英雄存在,则友方英雄可以看到该视野,敌方英雄无法看到该视野。有友方防御塔存在,则
则友方英雄可以看到该视野。
    3.遭遇致盲性技能,比如男枪的W、永恒梦魇的R,则所有视野均不可见,只能看到自身的特定小范围视野。

     并且有一些限制条件-----
    1.隐身的英雄可以被弹道技能击中(由于飞行速度等,有可能是代码实现,有可能是物理碰撞实现)。
    2.表现方式上,没有视野的敌方比较阴暗,有视野的敌方则高亮。静态物,即使没有视野,也可以看到,比如火堆等。

     实现思路
     首先,隐藏一个物体,但是在物理上又能检测到碰撞,那么我们可以选择两种方式,第一种是取消render组件的实现,第二种呢,我们可以给每一个物体分配一个层级,当camera的视野层级包括该层级,则camera渲染它,否则不渲染它。
     两种方式暂时不去比较优劣性,根据项目需求使用吧。
     实现了物体隐藏,再看如何在限制条件上实现表现方式。
     我们把地图上的所有的动态物体都编码,简单起见,从1开始一直递增。
     剩下的工作,就是计算每个单位的视野范围内,存在的其他物体了,如果是网络游戏,则这个计算要放在服务端。

     服务端:使用一个单独线程,可以循环判断,也可以每当物体移动判断。对所有动态物体循环,处于该动态物体的视野距离X以内的所有其他动态物体,根据敌方友方或者其他技能信息,决定是否显示该物体,显示则返回为1,不显示则返回0,循环完毕后,服务端发送显示列表到客户端。其中,该动态物体循环函数,需要有一个bool值,bool值为true才执行,比如男枪的W、永恒梦魇的R时,该函数不执行,只执行该技能的特有视野函数。
     客户端:根据服务端的显示列表显示和隐藏物体。整个地图,给予低暗度的环境光,对于动态物体的视野范围,给予相同范围X的点光源。
     这样即可完美还原LOL的视野效果。


    性能优化部分
    对于PC版的moba游戏,先合并共有视野范围,然后再打灯光,可以减少灯光数量。
    对于手机版本,则不使用局部灯光,采用迷雾贴图,来达到使地图阴暗的渲染效果。
    对于视野判断,可以直接使用距离判断,最为精确,如果地图本身采用了A*算法,地图已经划分了格子,则可以采用格子判断方式,计算性能较高,但精度依赖格子大小。
    

原文链接:http://www.manew.com/thread-47007-1-1.html

你可能感兴趣的:(Unity)