U3D开发项目总结

转载 2015年11月20日 18:22:56
从2月份到现在第一个U3D项目也基本收工,虽然项目结局不是太好,但总算也是成功卖掉并上线,总结将近10个月的时间大家从端游转到手游或从COCOS2转到U3D的整个开发过程。

1.资源
无疑这是整个项目我觉得做的最差的地方,也是前期最为忽略的地方,犹豫U3D组件式架构的原因和本身资源打包加载的一个限制,导致后期项目资源异步加载以及动态更新很难实现。
起初犹豫是项目玩法参考《印第安大冒险》,在导出它的包查看了它的结构以及部分实现的代码后,发现基本也未作任何资源管理,资源基本上一个关卡一个场景的方式组织,所以也就按他的方式,只是简单的按场景、特效、UI等进行了简单的划分。
但是随着关卡的复杂性的增加,游戏复杂性的增加,问题也随之而来。

项目问题以及方案:
(1) 场景加载慢,无法异步加载
因为没用AB管理资源,所以很难实现异步加载,但是场景已经完成到了某种程度,也很难重新设计资源加载方式,所以临时找了另一种方案。、
a.先将原始资源移动到Resources目录先,这样的原因是为了在加载场景是预加载纹理、模型等资源,随之而来的问题便是Resources下的目录中不能保留不需要的资源,否则会一起导入安装包,导致安装包庞大,最后写了一个编辑器扩展脚本在打包时候清理掉所有游戏未引用的资源。方法是找到所有场景以及与之的依赖资源并记录,找到所有资源在一处记录的资源,剩余资源统一删除。
b.扩展一个编辑器脚本生成当前场景所有依赖资源列表,生成预加载文件,在加载文件时读取并通过Resource.Load加载并保存,切换时候在释放。为了实现模拟异步加载的效果,加载时在一个新的协程中加载,加载两个返回一帧。
(2) 运行时怪物创建卡顿
同样这个也是由于这个原因造成的,解决方案相对取巧,由于怪物是有触发器创建,所有在加载场景时候会预先创建所有怪物并隐藏,知道触发后在显示出来。
(3) 特效、技能等预制资源卡顿
同样这个也是由于这个原因造成的,解决方案,这个比较传统,增加了一个预制缓存池,创建场景时候会对指定配置的特效做缓存,创建时候从缓存中取出,用完还回去就可以了。
(4) 资源更新
这个暂时只能妥协,只做了配置文件的更新

理想解决方案:
(a) 以Prefab为基本打包力度,为特效、UI节点、角色等等保存为Prefab。
(b) 将所有代码、Shader、等等公用基础资源打包到Common.ab。
(c) Push:Common.ab的基础上打包UI/Audio/Effect/Actor...等分支下的Common_*.ab。
(d) Push:Common_*.ab的基础上打包UI/Audio/Effect/Actor...下的预制到 *.ab。
(e) 加载加载Common.ab,在加载分支支援时候先加载相应的Common_*.ab后在加载特定的ab。
(f) 加载可以采用异步加载形式,场景创建时候可以先创建空节点,等异步加载完成后在创建并挂接到该节点上。
(g) 关于Level,打包时候打包基本场景以及关照贴图,加载后在动态加载响应节点数据并挂接上去

2.特效
首先这边的特效基本是有端游转过来的,而前期对特效没有做一些规范性的限制,导致一些特效复杂度相当高,以及里面包含大量Animator(这个损耗相当大)。
其次特效未作统一的管理,而仅仅是简单的做成一个Prefab。造成后期特效不是太好优化。

理想解决方案:
(a) 提供一个特效编辑器,组织特效,发布的时候检查并提示出一些必要的警告方便特效人员修改,同时未特效预制加入自动管理脚本。
(b) 或采用一些比较好的插件 FX Maker 等。

3.场景
场景最大的问题同样是没有好的规范,导致前期场景模型用了大量的多维材质,比如一个石头可能有 表面/中部/底部/边缘 等四个材质等等。

理想解决方案:
(a) 尽量只使用一中材质,当然有些工具比如Mesh Banker 可以拿来优化。
(b) 地表装饰无尽量将贴图合并到一张Atlas公用,减少批次,比较特殊的情况比如 Repeat Mode的贴图可不处理。
(c) Static Batch 虽然能够做一定的优化,但是会大大的增加Level暂用的硬盘空间,所以可以根据实际场景视角等来确定是否开启以便减少生成包的大小。

4.动作
操控相对简单,虽然Animator很强大,单可控性却不是很高,所以选择使用Animation,通过Layer进行状态融合处理。AddMixTransform 可以进行上下半身或者特殊部分动作混合。
附带:关于Animator性能,场景中Animator过多会造成CPU消耗过高,而Aniamtion有可见在更新的状态选项可以进行控制,Animator却不行,因为是统一管理,所以需要注意。

5.NGUI
NGUI确实很强大,有自己的批渲染,这类也不需要多说,其中有两个可以分享的地方
(a) 特效与NGUI层级,实际上NGUI/Panel/DrawCall会有一个RenderQuene,为了层级正确我们应带改变特效material.renderququne = DrawCall.RenderQuene + 1,这样特效就可以在正确的面板上显示与遮挡。
(b) DrawCall优化,可以利用 Panel:ShowDrawCall工具手动调整Panel中空间的order来减少DrawCall。

6.代码加密
代码加密相对麻烦,因为其实整个过程中也通过ISpy查看过不少游戏的代码,基本很少做加密的,少量做了混淆。

理想解决方案:
(a) GitHub 上下载 Unity 官方 Mono库
(b) 找到 image.c : mono_image_open_from_data_with_name 函数:
增加代码:(简单的混淆DLL)
if  (NULL != strstr(name, "Assembly-CSharp.dll"))
{
    for (; i < data_len;)
   {
        data[i] = ~data[i];
        i += k;
        k += 1;
   }
}
后编译生成 libmono.dll/so 到相应平台
(c)将Assembly-CSharp.dll反向混淆

7. 纹理压缩
用disunity导出U3D打包后的资源法线android下纹理实际上是经历过一次转换的:
  带Alpha通道贴图-> TGA 未压缩格式 / 除非设置 通常都带Mipmap
  不带Alpha通道贴图-> KTX (ETC1 android) 不带Mipmap
显然为了减少纹理对GPU芯片带宽的浪费以及对内存的浪费android下应当使用ETC1,而且ETC压缩失真不算严重,验证可接受。
那么对于带Alpha通道的贴图应该如何处理?解决方案1.提取Alpha为单独的Alpha通道贴图 2.提取Alpha为灰度图在保存为ETC1(默认会转换)。
这样有效提高程序性能同时也相应的会减少压缩后包的大小。因为TAG不然缩与ETC压缩后在ZIP压缩还是有一定的空间大小差距。

8.其他一些特效
shadow_gun 中有很多不错的 shader 可以用用 比如EnvCube可以支持带lingthingmap的Cube反射材质,做冰柱等效果非常好。
water 等可以简单的用一张nosiy贴图加Cube反射模拟,效果也可以接受。
unity / image effect/ MothionBlur 可以做Boss死亡特效 配合 Time.timeScale K帧。

等等 暂时只回想起这么多,希望对大家有帮助,有问题可以探讨。

今天项目组换老大了,希望换人后上线能顺利,毕竟也花费了不少精力,周五也得离开了,想想也挺伤感的,游戏行业真不好混。

U3D 遇到的 object reference not set to an insance 原因及解决方法

在学习Monkey老师的《飞盘射击》这个案例时,讲到游戏管理器这一课,需要制作游戏的UI界面, 首先,UI是一个空物体,这个空物体下面有三个子物体,分别是StartUI/GameUI/E...
  • LiangTonghua
  • LiangTonghua
  • 2017年08月28日 17:31
  • 1423

【U3D】进入shader编程的世界

Shader并不神秘,它只是很小的一段程序,包含着数学计算和算法模型,运行在计算机的图像管道层面,告诉计算机图像上的每一个像素应该怎样显示在屏幕上,它将一个个输入的网格绘制到屏幕之上,就能得到一个Ma...
  • wdmzjzlym
  • wdmzjzlym
  • 2016年05月05日 19:56
  • 4468

U3D 场景快速搭建教程

本教程系本人原创,欢迎转载,但务必请注明出处。U3D 开发交流群: 321301070 本篇文章我将会简单介绍下U3D RPG类游戏场景的搭建过程。   涉及到的U3D的基本知识: Gam...
  • D_A_V_I_D
  • D_A_V_I_D
  • 2016年01月12日 15:09
  • 3075

【U3d】渲染统计窗口详细介绍(Rendering Statistics Window)

Statistics窗口,全称叫做 Rendering Statistics Window,即渲染统计窗口(或渲染数据统计窗口),窗口中罗列出关于声音、图像等多种统计信息。 Batches:即Batc...
  • wdmzjzlym
  • wdmzjzlym
  • 2016年05月07日 02:39
  • 6626

【Unity3D】基础知识学习笔记

Unity3D基础知识学习笔记 1、基础知识: 标题栏 菜单栏 工具栏:变换工具、gizmos切换、播放控件、层列表、布局列表 功能窗口 2、资源及资源类型:在project里面能够create的资...
  • woaini454186694
  • woaini454186694
  • 2016年05月25日 22:53
  • 4889

u3d

题目归类区(看题目字体颜色识第几部分) ps :下面题目可能稍有点多,翻页会较麻烦,根据题目的颜色辨别是第几部分吧(超链接功能不会,也懒得做了) 第一部分 1. 请简述值类型与引用类...
  • Xingaaaxing
  • Xingaaaxing
  • 2016年06月29日 23:26
  • 618

U3D服务器端开发知识点总结

U3D服务器端开发知识点总结写在前面: 这篇文章会比较杂,针对服务器端遇到的问题或比较重要的知识点,搞清楚了之后加入自己的理解记录下来,也就是我自己的一些个知识点总结笔记。 一、 TCP/IP三...
  • woaini454186694
  • woaini454186694
  • 2016年06月19日 18:57
  • 2264

【Unity3D】常用设计模式

【Unity3D】常用设计模式 1、单例模式: 单例仅允许被实例一次,这就保证了他在各个程序模块间的唯一性。 private static ModelLocator instance;     p...
  • woaini454186694
  • woaini454186694
  • 2016年05月27日 11:56
  • 5185

U3D 控制台输出

C#语言 控制台是测试的必要操作  Debug.Log (“test”);
  • bojie5744
  • bojie5744
  • 2015年09月01日 15:51
  • 1266

Unity3D 学习笔记3——了解U3D引擎的操作面板和各种工具

Unity3D 学习笔记3——了解U3D引擎的操作面板和各种工具在完成了Unity的安装破解之后,我们接下来要做的当前是启动这个引擎,然后学会如何去使用它为我们提供的各种工具,这也是上手任何一个软件的...
  • linshuhe1
  • linshuhe1
  • 2015年10月26日 10:40
  • 2543
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:U3D开发项目总结
举报原因:
原因补充:

(最多只允许输入30个字)