工作记录(ljs)
2018.1.16
今天主要做了要对字体进行勾边的效果,要能控制描边的宽度,看了UGUI自带的outline的实现方式,它本质是将原文本多渲染了4次,这4次的文本的顶点位置都相对原来文本在上下左右进行了一定的偏移,这样产生的描边效果。这种方式效率不高,不过也可以用的。我后来按照网上的方法让它横竖都渲染更多次,来达到描边宽度控制的效果,但是效率特别低,当像背包物品出现这种描边文字的时候,每个文本都要渲染N次。后来找到了一个插件,叫Text Mesh Pro ,功能超级强大,他的描边使用shader来做的,GPU渲染速度刚刚的,效率很不错。后来查了一下,这个插件已经被招安了,Unity 2018.1 版本将是原声组件,所以项目也就准备使用这个插件了。
参考的博文:
1.https://www.cnblogs.com/zsb517/p/6565446.html
2.https://github.com/n-yoda/unity-vertex-effects
2018.1.17
今天主要做了unity残影的效果, 思路大概是:人物移动的时候, 每隔特定时间记录下当前人物所播放的动画和该动画播放的时间,然后克隆一个原人物,设置他的动画为刚才记录的动画名字和时间,并且让它暂停到那个时间点,然后替换掉它的shader为我们写的残影shader, 这个shader使用透明混合, 在脚本中根据残影存在的最大时间,对alpha值进行线性插值,动态改变alpha,这样残影会渐隐消失,然后alpha为0时,删除人物即可。测试了效率,掉帧不大,因为残影使用的shader很简单,颜色也是单一的。
后来,美术要根据动画播放的时间点来控制创建残影的时机,所以又在anmition的中的动画文件上创建了事件(unity自带功能),然后调用我们的创建残影的函数。
2018.1.18
今天把昨天的残影效果整理了一下给美术进行使用。 然后了解了一下.meta的作用,因为出现了一个情况,我这边弄的好prefab我上传到svn然后美术更新下来后发现在prefab上的动画丢失了Miss, 后来查到原来是那个动画的.meta文件没有上传,导致美术那边自己生成了一个.meta文件,然后prefab就找不到这个动画了。
为什么会出现这个问题呢? 网上查了一下,unity会为工程下的每个资源都生成一个.meta文件,其中每个.meta文件记录了这个资源的GUID。 于是,当我们创建了一个prefab上面引用了某个脚本或者动画的时候,其实在这个prefab的.meta文件中记录了引用资源的GUID,所以当我们忘记上传被引用资源的.meta文件后(也就是上面的说的动画),其他人更新资源后,会为自己生成一个.meta文件,但是其中的GUID就和我们的不一样了,所以prefab 中记录的GUID和其他人自己生成的GUID就对应不上,导致引用失败。 所以,一定要记住上传.meta文件!!!!
2018.1.22
今天完成了一个场景的动画效果,效果是:战斗完成,弹出一个宝箱动画,然后将物品暴落一地,展示物品的个体动画,然后被主角吸走。很简单的功能拉。
2018.1.24
(1)今天美术使用了Text Mesh Pro打字体资源的工具,有个需求就是由于包含的中文很多,如果都打到一张图上,那么这个图就会有2048 x 2048的大小,太大了。所以希望能拆分成多个小图。 幸运的是Text Mesh Pro是支持的,在打出来的字体文件的面板中,可以添加一个查找列表,如果该字体资源中没有找到,就从会一次从列表中去找,完美解决。
如图:
参考连接:点击打开链接
(2)要实现场景中物体点击监听的功能,自然而然就有一个问题就是点击穿透,所谓点击穿透就是:当UI和场景中的物体重合的时候,并且他们都监听的点击事件,怎么办呢? 可以参考另一篇文章:
参考连接:
2018.2.1
这几天遇到的问题有:
(1) 使用了animtion,播放了一个动画,判断该动画是否播放完成。让动画暂停在特定帧。
参考我的另一篇文章:点击打开链接
(2) 人物要实时投射阴影,不过其中有很多值的注意的细节。
参考另一篇文章:
2018.2.2
(1) 场景的雾效问题。游戏场景的雾效是通过脚本在不同场景动态开启的(使用类:RenderSettings.fog控制),在PC的editor上是没有问题的,打包出来的pc版本和release版本都看不到雾效。 查找了一下原因,发现需要在GraphicsSettings中的Shader Stripping下的Fog Modes 选项修改为Custom(默认是:Automatic). 官方说明是:
Shader stripping - Lightmap modes and Fog modes
Lower your build data size and improve loading times by stripping out certain shaders involved with lighting and fog.
Setting: | Description: |
---|---|
Automatic (Default value) | Unity looks at your scenes and lightmapping settings to figure out which fog and lightmapping modes are not in use, and skips corresponding shader variants. |
Manual | Specify which modes to use yourself. Select this if you are building asset bundles or changing fog modes from a script at runtime, to ensure that the modes you want to use are included. |
2018.3.12
好久没记录了,之前过年了啊。这段时间处理了几个东西
1.动态保存lightmap信息到prefab,然后动态加载lightmap信息,然后场景上的物体的shader要进行动画变换
2.高度雾, 主要修改场景的shader, 深度雾效的shader基础上,再加上高度雾
3.换脸, 主要就是美术做了很多脸部效果,我只用控制go显隐就可以了,不过还有更深入的研究,看看avtar系统。
4.手机上的阴影,手机上是跑不起实时阴影的,unity使用的是shadowMap来实现。我们有替代方案,对于场景的静态物体可以使用lightmap, 对于动态物体,比如像角色,可以直接在人物的底部挂一个黑色面片,但是不真实。 还有一种方法就是使用RenderTexture来实现,在人物底部放一个面片,然后他的纹理来源是一张rendertexture,这个rendertexture,的内容是由照射人物侧面的一个camera渲染得到。这样也能达到目的,不过对于凹凸不平,或者楼梯处会穿帮。
5.碎屏, 在进入战斗的时候,可以截取当前的一帧图像,然后我们把这个图像赋予一个对象,然后让美术做出固定的碎裂动画,比如屏幕裂开,然后掉落下来。 不好的地方就是碎屏每次都是固定的,不能随机碎裂。 如果要随机碎裂,那么就需要动态生成很多mesh对象,然后记录碎裂处的uv范围,跟对应的mesh匹配上。 难度在:如何可以随机碎裂,并产生对应的mesh. 可以参考一个游戏,叫:水果忍着,他就是可以随意切割一个对象,然后动态生成新的mesh,切割面贴上新的纹理。
6.研究了加载AB的方法,www, LoadFromFile, unitywebrequest LoadFromMemory 其中内存的占用和实现的细节。
7.DXT,ETC, PVRTC, 这三种都是texture的压缩方式,分别用于pc,android,ios. 都是硬件可以支持直接快速解编码的。这样做的目的是为了减少内存的使用。其中ETC1不支持alpha,不过unity可以支持设置选项分离。 ETC2可以支持alpha
8.shader的 Offset -1, -1的作用,就是两个参数,要来动态的偏移最终像素片段的深度值。
2018.3.25
1.做了好友系统
2.做了受击闪白,就是在人物最终的颜色输出上叠加了一层颜色,默认颜色是黑色,这样相当于没有叠加效果,受击的时候将颜色修改为白色就可以了
3.Timeline的使用
可以参考文章:https://forum.unity.com/threads/timeline-available-in-unity-2017-1.455265/
4.遇到了项目里渲染顺序的问题。 具体看文章:https://blog.****.net/qweewqpkn/article/details/79656263
2018.4.2
1.做了项目的启动到登录的整个流程。几个问题:
(1) 启动的时候要加载本地的配置文件,可以考虑使用多线程进行加载,加快速度
(2) android上启动游戏的时候,会黑屏一段时间才进入unity的splash界面,所以要考虑写android 插件,然后自己显示一个splash避免黑屏,还可以做一些预加载后,才关闭自定义的splash
(3) android上播放开场cg。 电脑上可以使用VideoPlayer, 官方doc. 我们在手机上使用VideoPlayer的时候遇到了卡顿问题,所以在android上使用了Handheld这个类,官方doc.
(4)登录界面现在流行使用陀螺仪,所以项目也使用了。参见文章:点我
2.图片镜像。 大概意思就是:一些背景图是对称的,所以我们只需要完整图片的一半,另外一半由程序写代码做对称,就行了。好处就是:可以减小图片的大小,加载更快,使用内存更少。参考文章:点击打开链接
2018.4.11
1. 做了性能测试,发现了几个问题:(手机是:红米note1)
(1)
这几个选项是默认开启的,要关闭,否则会产生后处理效果,影响性能
(2)bloom效果开启后,导致帧率下降了10帧左右,非常慢啊。
(3)战斗场景下有4个camera,一个照射场景,一个照射角色,一个照射ui,一个是ui适配照射的图片,这种情况下会导致很高的culling耗时,即使我们使用不同layer来区分不同摄像机照射的对象,camera视景体内的物体还是要进行剔除的。所以最好减少camera的数量
(4)SkinnedMeshRenderer 这个组件耗时很高
2.做了角色溶解的shader效果,具体参见另外一篇文章:待写。
3.我们角色使用的是卡通渲染,今天看性能的时候发现,渲染一个模型的时候,面片数量居然是初始模型的4倍。这会使用frame debug 分析了一下,由于角色是有阴影的,所以有这4次:1. 本身模型渲染的pass一次 2.描边的pass一次 3.渲染模型深度到深度图是一次 4.shadow map是一次(摄像机在光源处时场景中物体深度)
总结:可以看出阴影其实是挺耗时的,还会增加模型的面数,还有draw call的次数
4. 一个模型多材质
解释:当一个模型多材质的时候,这时有多少个材质就会把模型渲染几次,跟多pass的效果是一样的。渲染出来的颜色是叠加在一起的。模型先使用第一个材质进行渲染,并写入颜色缓冲。然后继续使用第二个材质渲染,然后写入颜色缓冲。
2018.5.19
1.字体问题。我们游戏中使用了mysh的字体库,在pc上使用text的style属性的normal和bold都没有问题,但是在android上normal显示正确,bold显示却异常,如图:
这个像是Arial字体的bold版本,查阅了一些资料,知道应该是android上没有找到msyh的bold类型对应的字库, 所以我们导入了msyh的bold版本字库到游戏中(等待时间很漫长,生成texture很慢),然后一切就好了。
注意:
(1).msyh是normal版本,myshbd是bold版本。他们的font names都是Microsoft YaHei
(2).Font Names: 是一个字体名列表(不是字体文件名,而是字体真实的名字),用,分割开名字,当unity中找不到字符的时候,会依次在这个列表中的字库去寻找对应的字符。
(3)References to other fonts in projrect : 当我们输入了font names后,他会自动在当前工程寻找对应的名字的字库,找到了就会显示在下面,表示引用了该库。(注意:这个自动引用有时候不好用,自动引用不上,所以我们要手动在Font Names那项的名字后面加个空格随便加几个数字,然后再删除掉,这样让他侦测到改变,我们再点击apply就行了)
(4)Incl. font data: 表示是否要将这个库安装到对应的手机上。
(5)Character: 使用Dynamic,表示不会生成这个字库中字符的所有的对应的图元,而是在真正需要的时候动态生成图元,这样可以减少字库图集的大小。
(6)官方DOC
2.做了unity的音乐系统。
2018.5.31
(1)QualitySettings.antiAliasing 设置为4的时候,在vivo的一台手机上导致黑屏了,设置为2却一切ok
(2) Screen.SetResolution接口设置了分辨率后会导致,Screen.width, Screen.height的值也跟着对应改变。我们使用SetResolution可以优化那种屏幕很大的安卓机器。
2018.6.30
(1)战斗中,IOS上设置QualitySettings.antiAliasing的时候百分百会黑屏,大概环境是有3个摄像机的时候,底部是一个solid color的clear flag, 上面是一个是depth的clear flag , 上面还有一个depth 的 clear flag, 然后设置抗锯齿后黑屏,最后查到只要把最顶部的那个camera的 MSAA 关闭后就不会黑屏了。 我单独使用测试场景测试的时候,并不能重现这个bug.
(2)IOS上使用timeline时,不会播放内容(Android和pc没问题),这是一个unity的bug, 后来我们将timeline整体改为使用animtion实现,就好了.
2018.7.12
(1)今天开启抗锯齿后,我们进入战斗中,拉开幕布的时候会黑屏一下,然后一切正常,查找到黑屏原因是,由于我们做了一个碎屏的动画,然后是用一个单独的摄像机来看,并且它的层级是1000,所以是最顶部,由于它开启了msaa,所以会导致黑屏,关闭msaa选项后就好了。
(2)我们游戏分了几个设置等级,其中调用了两个函数Screen.SetResolution 和 QualitySettings.antiAliasing. 一个是设置分辨率一个是设置抗锯齿。
A.Screen.SetResolution
在改变分辨率的时候,在IOS会卡顿个3秒左右,如果快速切换,会导致闪退,所以后来我们IOS就不准改变分辨率,主要考虑到IOS的性能还可以
B.QualitySettings.antiAliasing.(取值0,2,4,8)
在IOS,当从0变换到2,4,8 或者 从2,4,8,变换到0的时候,也会卡顿个几秒钟,导致苹果6,9.3的系统画面卡死, 还有5s,8.1的系统直接闪退。但是如果在2,4,8之间互相切换非常流畅,所以猜想Unity会底层会重新构建device设备,所以非常耗时,并且我们在IOS10以上的系统开关抗锯齿的时候,虽然也会卡顿几秒,但是能恢复回来不会卡死。最后我们去除了低档关闭抗锯齿的选项,让抗锯齿默认开启,然后在2,4之间进行切换,一切都ok
2018.8.23
(1)美术用animation做了一个过场动画,就是播放动画片一样,今天发现如果在这之前加速(修改time.timescale值),然后加载该ab后,time.timescale重置为1。此时播放的过程中,就有很多动画点慢了或者快了,很奇怪。后来将time.timescale重置为1的代码放到ab加载之前,就都好了。
(2)最近还遇到一个问题,由于我们之前用的unity的2017.1的版本,然后烘培过光照图。后来升级为2017.4的版本,大部分机器光照图也没啥问题。但是有部分pc上光照图显示异常,查了好久,知道是显示异常的pc上他们都有删除过library这个文件夹,然后重新生成过library这个文件。library缓存了机器上的资源信息,我们烘培光照图使用的是2017.1的版本,升级后如果不删除library是没有问题的,如果删除了,那么重新生成的library,此时出现问题。所以我们又把没出现问题的机器的library拷贝到有问题的机器上,一切就好了
2018.8.30
(1)今天遇到,主界面的AB被卸载了,但是主界面的AB实例却没有销毁,此时这个实例引用的资源就都没有了,比如贴图,还有材质等,因为这些资源都在AB里面啊。