[Unity]制作游戏中名字板的过程记录(未完成)

  先大概说一下需求:

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)修改verts的坐标z减少0.02,修改后,在文字较大时,闪烁问题解决,但当文字较小时,闪烁的情况还是存在。因此做了修改2)将原文字放在文字和描边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一样一直在屏幕最上面。

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

原文地址:https://www.cnblogs.com/p0e0o0p0l0e0/p/10123886.html

时间: 2024-11-06 07:13:08

[Unity]制作游戏中名字板的过程记录(未完成)的相关文章

Unity制作游戏中的场景

Unity制作游戏中的场景 1.2.3  场景 在Unity中,场景(Scene)就是游戏开发者制作游戏时,所使用的游戏场景.它是一个三维空间,对应的三维坐标轴分别是X轴.Y轴和Z轴本文选自Unity 2D游戏开发从入门到精通清华大学出版社. 要创建一个新的场景,只需单击File|New Scene命令,或者按下快键键Ctrl+N,如图1-16所示. 图1-16  创建程序的命令,以及场景 默认情况下,新创建游戏项目的同时,也新创建了游戏的场景,只不过还没有保存罢了.使用快捷键Ctrl+S即可保

【Unity】游戏中的单例

游戏中需要一些 GameObject(例如网络管理器) 在游戏的整个生命周期都存在,而且是以单例的形式存在. XGame 中实现这种单例的方式是,单例脚本都从 MonoSingle 类继承,MonoSingleton 的实现方法是在 Awake() 中调用DontDestroyOnLoad(gameObject);来保证单例. MonoSingleton类的实现代码: 1 /// <summary> 2 /// Generic Mono singleton. 3 /// </summar

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

嗯,最近再考虑,CityHunter中,玩家攻略藏宝图时,为了增加可玩性,应该增强在AR部分的游戏性.最近特别火的游戏<Pokemon Go>在打开摄像头以后,可以看到小精灵,实际上,如果这款游戏没有这个功能,那整个游戏还真没有什么游戏的感觉(就是动画.图像之类的元素特别少).本人比较懒,没有去弄这款游戏,于是跟远在澳大利亚的高中老兄弟咨询了一下这款游戏的情况. 事实上,<Pokemon Go>的AR元素,实现还是比较简单的.可以理解为,只不过是单纯的打开了摄像头,把背景替换了一下

Unity跑酷游戏中的路点生成算法

最近做了一个小的跑酷游戏,今天就我前几天写的 游戏玩家跟随在跑道上的路点行走的简单逻辑进行一下梳理,希望大家和我自己都能够有一定的进步. 下面我先说一下该款游戏的一些有必要知道的前提.跑道是动态生成的,而路点又是作为跑道子对象waypoints的子对象(简单而言,就是孙子对象)存在.所以,路点也就是动态创建,动态销毁了.我的思路是在游戏刚刚加载时,由RacetrackGenerator脚本类在初始化时先动态生成两个跑道,而每个跑道都有一个自己的WaypointsManager(路点管理器脚本),

负责制作游戏中角色和武器的建模、贴图、渲染。

http://www.acfun.tv/a/aa4311226 http://www.acfun.tv/a/aa4311469 http://www.acfun.tv/a/aa4313698 http://www.acfun.tv/a/aa4313910 http://www.acfun.tv/a/aa4311229 http://www.acfun.tv/a/aa4313598 http://www.acfun.tv/a/aa4313824 http://www.acfun.tv/a/aa43

负责制作游戏中场景和非武器类道具的建模、贴图、渲染。

http://www.acfun.tv/a/aa4304304 http://www.acfun.tv/a/aa4304443 http://www.acfun.tv/a/aa4304594 http://www.acfun.tv/a/aa4304743 http://www.acfun.tv/a/aa4304878 http://www.acfun.tv/a/aa4305035 http://www.acfun.tv/a/aa4305230 http://www.acfun.tv/a/aa43

Unity实现游戏中摄像机视角控制

using UnityEngine; using System.Collections; public class NewCamera : MonoBehaviour { public GameObject cameraFather; public Transform target; public float rotatespeed; public float scalespeed; public float min; public float max; public Transform obj

linux中ftp的安装过程记录

安装FTP的全过程记录,对于相同情况希望有所帮助.[centOS] 1.查询本机是否安装vsftpd: rpm -qa |grep vsftpd : 2.安装ftp服务 yum install vsftpd; 3.开启ftp服务 chkconfig vsftpd on,开机启动: 4.手动操作ftp服务,service vsftpd start [restart, stop]: 5.嫌麻烦的,直接关闭防火墙,chkconfig iptables off : 设置ftp用户权限: vi  /etc

Unity中制作游戏的快照游戏支持玩家拍快照

Unity中制作游戏的快照游戏支持玩家拍快照 有些游戏支持玩家"拍快照",也就是将游戏的精彩瞬间以图片的形式记录下来的功能.这个功能比较有趣,而且以后的用途也会很广,为此本节打算介绍:截取矩形区域内游戏视图,并将其显示在视图其它区域的方法.具体的操作步骤如下本文选自Unity游戏开发技巧集锦: (1)在Project视图里,创建一个C#脚本文件,并命名为ScreenTexture.在此脚本中编写如下的代码: 01     using UnityEngine; 02     using