先大概说一下需求:

1 每个模型上都要有名字板:人、怪、npc等等。

2 名字板上会显示:名字(文字)、血条(图片)等

3 因为是透视相机,名字板离得太近会变得超大,且主角移动,名字板的位置相对于相机来说是一直变化的,因此有Update一直在计算名字板的大小以及朝向Camera

  刚开始接到需求用的是UGUI+NGUI实现的,每个名字板占用4、5个batches(1种字体+3个图集)。但当游戏中怪物多了,10个怪就有差不多50个batches,以后会有更多同屏需求,因为需要改进。

  尝试使用SuperTextMesh(简称STM)插件优化名字板,参考了http://www.xuanyusong.com/archives/4331 雨松MOMO的介绍,以及github上其他人的相关代码,做出以下调整。

1 因为每一个控件不管是文字、图片,都是挂载SuperTextMesh.cs脚本,但每个控件都会重新New Material(),导致无法batch,此处修改为文字使用一个material,同一图集的图片使用一个material。

2 因为名字板中的图片在其他UI上也有使用,其他UI使用的是NGUI制作,但STM只支持Quad类型的图片,Quad图集需要TexturePacker软件进行制作,增加了制作成本,因此修改代码以支持UIAtlas。

3 但UIAtlas打出的图集使用的shader是NGUI的Unlit - Transparent Colored,但这里的DisableBatching是True导致无法batch,因为复制一份这个shader,将DisableBatching改为False,专为名字板用到的图集使用。

4 STM原本支持描边,换一个Shader,但有9个Pass,导致一个文字就有9个batches,并且导致与其他的名字板无法batch,因此参考NGUI中UILabel的描边写法,重新填充mesh,设置colors和verts显示描边。

  做描边的时候出现一个问题,就是描边和原文字会在移动中闪烁,咨询通知了解是z-fighting导致,因此做修改1)开启Z write, 2)修改verts的坐标z减少0.02,修改后,在文字较大时,闪烁问题解决,但当文字较小时,闪烁的情况还是存在。因此做了修改,3)将原文字放在文字和描边mesh的最后,也就是每次新加描边mesh,都将原文字的mesh相关数据后移,据说这是物理区分。两个修改后,文字的闪烁问题在文字不是特别小时得到了解决。

--------------------------------------------------------------------------------------------------------

  第一个问题:按上面的修改后,10个名字板大概有14个batches,查看FrameDebugger中,图片和文字分别按照离摄像机由远及近的顺序进行少量控件的batch。按理说应该只有字体+图集个数的batches。

  检查游戏中设置,有一些点光源导致无法合批,关掉可以减少batches。但剩余的十几个batches依然无法合批,也没有提示无法合批的原因,需要继续研究。

  因此上网查了一下无法batch的原因,以下情况都已满足,这个问题需要继续研究:

  动态批

  动态批是对那些没有标记成static batching的物体在runtime unity自动将他们批在一起,这个是可以支持运动物体的,但是限制较为严格:
  1.一个批次总顶点单元少于900
  2.批在一起的所有的模型应用同样的缩放值
  3.使用相同的材质
  4.相同的一张lightmap
  5.不能使用多pass的shader
  6.不能接收阴影

  7 shader不能开启DisableBatching(补充)
  ---------------------
  作者:leonwei
  来源:CSDN
  原文:https://blog.csdn.net/leonwei/article/details/41942157
  版权声明:本文为博主原创文章,转载请附上博文链接!

------------------------------------------------------------------------------------------------------------

  第二个问题:场景和模型等都会受到后处理的影响,名字板挂载模型上,因此也会因为后处理的变化变明变暗,这时换了个相机单独照名字板,又会导致名字板无法根据位置深度显示在模型后面,像UI一样一直在屏幕最上面。

  搜索网站看到有人通过Command Buffer实现指定物体接受后处理的方法,和我们的处理正好相反,还在研究中。https://forum.unity.com/threads/applying-image-effects-to-specific-objects.473226/

===============================================================

第一个问题,因为名字板在场景中有深度,中间穿插着模型、特效等,导致无法合批,暂时没有解决。

第二个问题,为了避免后处理,使用另一个相机渲染名字板,但会出现所有名字板都在模型上方的问题, 可通过获取场景相机渲染的深度图,与名字板相机渲染的名字深度进行比较,处理遮挡问题。这里需要设置名字板的相机的nearClipPlane比场景主相机的nearClipPlane稍微大一点点,得到的名字板的位置比它对应的模型的位置更靠近相机,进而这个名字板会显示在它的模型的前方。

================================================================

[Unity]制作游戏中名字板的过程记录的更多相关文章

  1. Unity制作游戏中的场景

    Unity制作游戏中的场景 1.2.3  场景 在Unity中,场景(Scene)就是游戏开发者制作游戏时,所使用的游戏场景.它是一个三维空间,对应的三维坐标轴分别是X轴.Y轴和Z轴本文选自Unity ...

  2. 使用Unity制作游戏关卡的教程(一)

    转自: http://gamerboom.com/archives/74131 作者:Matthias Zarzecki 我正在制作<Looking For Group – The Fork O ...

  3. 使用Unity制作游戏关卡的教程(二)

    转自:http://gamerboom.com/archives/75554 作者:by Matthias Zarzecki 本文是“使用Unity制作<The Fork Of Truth> ...

  4. 使用Unity制作游戏关卡的教程(三)

    转自:http://gamerboom.com/archives/75593 作者:Matthias Zarzecki 本文是“使用Unity制作<The Fork Of Truth>的关 ...

  5. 【CityHunter】通过Unity3D来制作游戏中AR部分的内容

    嗯,最近再考虑,CityHunter中,玩家攻略藏宝图时,为了增加可玩性,应该增强在AR部分的游戏性.最近特别火的游戏<Pokemon Go>在打开摄像头以后,可以看到小精灵,实际上,如果 ...

  6. unity 查找游戏中隐藏的物体

    在Hierarchy 有时会隐藏一些游戏物体,我们需要在游戏的时候将其激活状态变为true 我们发现通过  GameObject.Find("隐藏物体名字") 是查找不到隐藏对象的 ...

  7. 制作Aspose CHM文档的过程记录

    欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...

  8. unity 2d 游戏优化之路 遇坑记录

    情景说明:  unity 出的Android包,在目前一些主流机型跑都没有问题,但是在 小米3 这种比较老的机器上跑,报如下错误 GLSL compilation failed, no infolog ...

  9. linux中ftp的安装过程记录[运维篇]

    安装FTP的全过程记录,对于相同情况希望有所帮助.[centOS] 1.查询本机是否安装vsftpd: rpm -qa |grep vsftpd : 2.安装ftp服务 yum install vsf ...

随机推荐

  1. 通过javascript添加一行

    <html><head> <title>添加新的行</title></head><body> <div onclick=& ...

  2. Centos7(Firewall)防火墙开启常见端口命令

    Centos7默认安装了firewalld,如果没有安装的话,则需要YUM命令安装:firewalld真的用不习惯,与之前的iptable防火墙区别太大,但毕竟是未来主流讲究慢慢磨合它的设置规则: 安 ...

  3. 利用VBA宏解除Excel保护

    复制以下代码并录制宏,运行一次即可. Option Explicit Public Sub AllInternalPasswords() ' Breaks worksheet and workbook ...

  4. Innodb存储引擎的缓存命中率计算

    数据库的慢查询是我们在生产环境中必须经常检测的,如果慢查询语句过多,说明我们应该增加buffer_pool的大小了.常常检查的指标就是查看缓存命中率是否过低. mysql> show statu ...

  5. 乘风破浪:LeetCode真题_023_Merge k Sorted Lists

    乘风破浪:LeetCode真题_023_Merge k Sorted Lists 一.前言 上次我们学过了合并两个链表,这次我们要合并N个链表要怎么做呢,最先想到的就是转换成2个链表合并的问题,然后解 ...

  6. Fix_And_Hold 使用及存在问题

    RTKLIB中使用FIXANDHOLD没有对各个卫星的方差进行排序,仅仅是使用了截止高度角.而大软件中进行了排序后,使用30°的截止角作为hold条件. 1.总卫星数与hold卫星数,及ratio,全 ...

  7. 给SVN设置代理

    XP系统在C:\Documents and Settings\Administrator\Application Data\Subversion目录下 win7及以上系统在C:\Users\admin ...

  8. [笔记] 整除分块 & 异或性质

    整除分块 参考资料:整除分块_peng-ym OI生涯中的各种数论算法的证明 公式 求:\(\sum_{i=1}^{n}\lfloor\frac{n}{i}\rfloor\) 对于每个\(\lfloo ...

  9. Scala学习之路 (八)Scala的隐式转换和隐式参数

    一.概念 Scala 2.10引入了一种叫做隐式类的新特性.隐式类指的是用implicit关键字修饰的类.在对应的作用域内,带有这个关键字的类的主构造函数可用于隐式转换. 隐式转换和隐式参数是Scal ...

  10. PAT B1040 有几个PAT (25 分)

    字符串 APPAPT 中包含了两个单词 PAT,其中第一个 PAT 是第 2 位(P),第 4 位(A),第 6 位(T):第二个 PAT 是第 3 位(P),第 4 位(A),第 6 位(T). 现 ...