unity的一些tips
主要是我知乎上回答的一个关于unity的tip,备忘。
1 尽量不要在Awake(), start()等函数内加入业务逻辑的初始化代码。首先无法简便的直接启动调试查看。逻辑代码依赖太多,很多时候你只是希望检查界面编辑效果,在你不加入逻辑代码直接启动的话,基本会出来一大堆错误。另外,各个脚本start等函数的调用顺序很难控制,不要说可以调整脚本优先级,这个功能大致用用可以,不要依赖它。更何况很多人甚至不知道这个功能。初始化必须要显式调用,除非你知道自己在干什么(比如一些单纯的效果类脚本)。
2 不要public太多的变量到编辑器中,特别是逻辑变量。尽量减少脚本外部引用特别是对GameObject的引用。这对维护来说真的是一个梦魇,死的很难看。
3 一个Level内,要控制它的tree层级。你能想象一个MainMenu的level,直接包含了所有的UI,他们直接的脚本相互之间引用Level内GameObject。你能想象一个主脚本内有几十个引用到外部GameObject的变量吗? 单是要在编辑器内找到这些变量对应的GameObject眼睛都要瞎掉。有时在缺少信息的情况下只能靠猜的。应该把每个功能独立开来做成预制件,每个功能有管理自己的独自脚本组,然后再添加到主level内。这是基本的模块化而已,不能因为unity太好用就可以乱来。
4 有人似乎意识到了自己public出来的变量太多了,或者纯粹是懒得加了,于是当他确实需要引用某个外部GameObject时,通常都用someobject.getchild(i)来取得引用。 这绝对是值得捅一刀的行为,你的项目如果有人这么用,不要我说了吧。除非父节点之下是一个节点链表(如滑动框集合),否则谁知道getchild(i)得到什么意外?我就发现往某个节点增加了一张图片,然后整个模块的逻辑全乱掉了,这简直是谋杀未遂啊。
5 管理规划好你的NGUI的depth。2.7版本以下不要随意移动z轴和depth来达到显示效果,永远要有一个基本depth参照值。设计好atlas的划分,如果你不想遇到增加或减 少一张图片就会遇到奇怪的遮盖或消失问题。特别是你的level很庞大时,我发现无解。强烈建议升级到NGUI3.x,痛苦但值得。
6 coroutine是个好东西,但别滥用。实现一个状态机是有必要的。别的不说,至少不会在所有模块的各个角落里都添加上新手指引的代码了吧?建议仿照boost的statechart写一个简化版本,爽死你。
7 善用uigrid,uitable。当你写一个背包UI时,还要手动写每个格子的长宽,padding逻辑这是折磨自己,坑死别人,何苦。
8 规划好你的object的结构,这通常比你所写的脚本更重要。更一般的说,数据结构简单易懂,直接反映问题,这样你的逻辑代码才会清晰简洁。
9 设计不要超越或强迫程序。比如,要求一部分UI背景处在3D背景之后,其他UI的在3D背景之前,而这个3D场景是游戏主场景,忘了说你还要照顾在这之间穿插的粒子效果呢。我无法理解这种给自己下绊的尴尬决定是如何诞生的。可能2个原因吧,一是之前程序使用NGUI2.7,整个3d场景的layer被设成跟UI一致(无法想象),然后程序通过z轴和depth来达到这些效果。看到这我已经很凌乱了,而且居然无法说服他们这是不对的...
10 资源命名有待规范,目前资源包括预制件的命名混乱随意。这个是整个项目人员素质问题,或者说缺少个规划。
11 atlas的资源分布好好好规划。美术风格上尽量使用通用的控件,通用的控件使用的atlas限制一张之内。不要鬼扯什么设计不美观的问题,一张2048x2048的atlas大小,都容不下你惊人的设计能力?特殊的图片按照level或加载状态分好atlas。尽量做到动态创建销毁。不要包含过多的大图片,能从设计上避免就避免。
12 我真的不建议把UI直接跟level做在一起。如果是轻UI类型的项目可以。做uiniy要时常考虑一点就是,level,prefab,atlas等等都是个二进制文件,svn下不可比对,意味着你修改某个东西时,在这个level下的所有东西都要被锁定了,其他人只能等你。
13 SDK接入时,养成代码里就做好平台区分的习惯,用宏加上状态机。因为SDK是个巨坑,先保证己方代码不出错,才能自求多福啊。平台区分代码(宏),尽量都放在相同的代码段中。
14 c#的话,模板可能会是个问题。我会告诉你相同的模板代码,在andriod下build通过,在wp8和ios就不行呢。写的朴实点了。
15 资源方面,请试着封装一个resource manager。加载资源,prefab,level等时想着bundle。到处resource.load是不行的。这是个蛮头痛的问题,我还没真正开始做,异步加载估计有很多问题等着。
16 NGUIDebugTool里的接口有点用。
17 建议你的UI弹出子菜单能做到即时创建即时摧毁,多数情况下其实无须考虑加载时间,如果要可以尝试协程分步缓一缓。
18 NGUI的编辑器相关的代码可以借鉴下,反正我自定义的显示在inspector内的变量都是参考NGUI的,能显示的漂亮整洁些。
在可编辑性和代码控制间权衡好是使用unity的很重要的问题。
unity是个编辑器,意思是不只是程序员用它。请所有相关的开发人员熟悉基本的工作流程与概念。
unity的一些tips的更多相关文章
- Unity性能优化(3)-官方教程Optimizing garbage collection in Unity games翻译
本文是Unity官方教程,性能优化系列的第三篇<Optimizing garbage collection in Unity games>的翻译. 相关文章: Unity性能优化(1)-官 ...
- Unity优化方向——优化Unity游戏中的垃圾回收(译)
介绍 当我们的游戏运行时,它使用内存来存储数据.当不再需要该数据时,存储该数据的内存将被释放,以便可以重用.垃圾是用来存储数据但不再使用的内存的术语.垃圾回收是该内存再次可用以进行重用的进程的名称. ...
- Unity官网教程之Tips
前言 翻译整理unity官网教程的tips部分,原文:http://unity3d.com/cn/learn/tutorials/topics/tips Snap 按住Ctrl键,并用鼠标拖动Game ...
- [转]50 Tips for Working with Unity (Best Practices)
About these tips These tips are not all applicable to every project. They are based on my experience ...
- unity tips
1.在unity 的mecanim中,如果一个动画指向两个或两个以上的动画,那么在inspector中,transitions中可以看到所有的过渡路径,这些路径是有先后顺序的.
- 【Unity Tips】备忘录(扫盲篇)
写在前面 Unity3D虽然是个非常方便的游戏引擎,但还是有一些地方会产生一些让人莫名其妙的问题,而且debug半天也不知道到底哪里错了.往往在经过了大量的log之后,也许我们才顿悟,原来Unity内 ...
- Unity性能优化(2)-官方教程Diagnosing performance problems using the Profiler window翻译
本文是Unity官方教程,性能优化系列的第二篇<Diagnosing performance problems using the Profiler window>的简单翻译. 相关文章: ...
- 转 unity 优化
最近研究U3D开发,个人认为,精通一种新的技术,最快最好的方法就是看它的document,而且个人习惯不喜欢看中文的资料,原汁原味的东西是最正确的,一翻译过来很多东西就都不那么准确了.于是通读了uni ...
- Unity开发-你必须知道的优化建议
转自:http://blog.csdn.net/leonwei/article/details/18042603 最近研究U3D开发,个人认为,精通一种新的技术,最快最好的方法就是看它的documen ...
随机推荐
- SQLLITE HELPER
using System;using System.Data.SQLite; namespace SQLiteSamples{ class Program { //数据库连接 ...
- springboot应用无故停止运行killed解决方法
最近使用springboot开发了一个ip代理的程序,今天放到阿里云服务器上运行,多次出现应用运行突然停止的问题. 使用free -h 查看内存使用完全正常.重新运行监视CPU使用也正常.没有出现堆内 ...
- Codeforces Beta Round #94 (Div. 1 Only)B. String sam
题意:给你一个字符串,找第k大的子字符串.(考虑相同的字符串) 题解:建sam,先预处理出每个节点的出现次数,然后处理出每个节点下面的出现次数,然后在dfs时判断一下往哪边走即可,注意一下num会爆i ...
- Redis for linux安装配置之—-源码安装
一‘redis单实例安装配置1.下载redis源码压缩包,并将其上传至服务器/usr/local2.解压redis源码压缩包 # tar -xzvf redis-3.2.12.tar.gz3.进入r ...
- python avro 数据格式使用demo
{"name": "UEProcedures", "type": "record", "fields" ...
- Electron "jQuery/$ is not defined" 解决方法
参考问题:https://stackoverflow.com/questions/32621988/electron-jquery-is-not-defined <!-- Insert this ...
- Java toBinaryString()函数探究及Math.abs(-2147483648)=-2147483648原理探究
toBinaryString()函数 public class Customer { public static void main(String[] args) { int m=-8; System ...
- Python *Mix_w8
文件操作的函数 文件可迭代 open(文件名(路径), mode="?", encoding="字符集") f = open("../Python/是 ...
- Java库中的集合
集合类型 描述 ArrayList 一种可以动态增长和缩减的索引序列 LinkedList 一种可以在任何位置进行高效的插入和删除操作的有序序列 ArrayDeque 一种用循环数组实现的双端队列 H ...
- python基础——字典
字典内置函数&方法 Python字典包含了以下内置函数: 序号 函数及描述 1 cmp(dict1, dict2)比较两个字典元素. 2 len(dict)计算字典元素个数,即键的总数. 3 ...