工作记录(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.csdn.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

猜你喜欢

转载自blog.csdn.net/qweewqpkn/article/details/79090779
今日推荐