翻译故事

原文:http://devmag.org.za/2012/07/12/50-tips-for-working-with-unity-best-practices/

顿时首技巧,我要好为在翻译,不过翻译到一半于CSDN上既视出小伙伴翻译了了。

因此即便直接转载啦,转载自:http://blog.csdn.net/neil3d/article/details/38534809

至于这些技术

这些技能不可能适用于每个项目。

  • 这些是根据自己的组成部分品种阅,项目组织的规模从3丁顶20总人口不等;
  • 框架结构的而重用性、清晰程度是发代价的——团队的范围和路之范畴控制你要是当这个地方付出多少;
  • 很多技巧是尝试的题目(这里所列的有着术,可能发生相同好的技巧代表方案);
  • 局部技艺可能是指向民俗的Unity开发的一个碰碰。例如,使用prefab替代对象实例并无是一个风俗的Unity风格,并且这样做的代价还特别高的(需要多之preffab)。也许这些看起有点疯狂,但是在我看来是值得的。

流程

1、避免Assets分支

怀有的Asset都该只有生一个唯一的本子。如果你真要一个分层版本的Prefab、Scene或是Mesh,那你要是制定一个颇清楚的流水线,来确定谁是没错的版本。错误的支行应该由一个特地的名字,例如双下蛋划线前缀:__MainScene_Backup。Prefab版本分支需要一个特意的流水线来保证安全(详见Prefabs一节)。

2、如果您当使用本控制以来,每个组织成员还当有一个类别之Second Copy用来测试

改之后,Second Copy和Clean
Copy都该吃更新与测试。大家还并非改动好之Clean
Copy。这对测试Asset丢失特别有因此。

3、考虑采取外部的卡子编辑工具

Unity不是一个圆的关卡编辑器。例如,我们使用TuDee来创造3D
Tile-Based的戏,这使我们可取得对Tile友好的家伙的补(网格约束,90度倍数的转动,2D视图,快速Tile选择当)。从一个XML文件来实例化Prefab也特别粗略。详见Guerrilla
Tool
Development。

4、考虑把卡保存也XML,而非scene

顿时是一模一样种植好稀奇之技能:

  • 它们可给你不用每个现象都设置同一总体;
  • 外得以加载的更快(如果大多数靶都是于场景中共享的)。
  • 它叫场景的本子合并变的简(就算是Unity的初的文本格式的Scene,也由于数量极其多,而受本合并变的不切实际)。
  • 它们可以叫在卡中保持数据更省心。

而本就可使Unity作为关卡编辑器(尽管你用不着了)。你要写有你的数的序列化和倒序列化的代码,并落实以编辑器和娱乐运行时加载关卡、在编辑器中保留关卡。你或用效法Unity的ID系统来维护对象中的援关系。

5、考虑编写通用的自定义Inspector代码

落实由定义的Inspector是殊直截了当的,但是Unity的体系发出不少的先天不足:

  • 它不支持自持续中收益;
  • 它不容许定义字段级别的Inspector组件,而只能是class类型级别。举个例子,如果没娱乐对象还起一个ScomeCoolType字段,而而想以Inspector中使不同之渲染,那么你必须也公的有着class写Inspector代码。

而可以通过自根本达再度实现Inspector系统来处理这些问题。通过有些照机制的粗技巧,他连无像看上去那么看,文章底部(日后其它发翻译)将提供更多的贯彻细节。

场面组织

6、使用命名的空Game Object来举行场景目录

仔细的团组织状况,就可方便的找到其他对象。

7、把控制目标及状况目录(空Game Objec)放在原点(0,0,0)

假使位置于这目标非重要,那么就算将他置原点。这样你便无见面赶上处理Local
Space和World Space的劳动,代码也会见重新简单。

8、尽量减少使用GUI组件的offset

习以为常应由控件的Layout父对象来控制Offset;它们不应有靠它们的爷爷节点的位置。位移不该互相抵消来齐科学显示的目的。做多要严防了下列情形的发:

父容器被内置了(100,-50),而字节点应该当(10,10),所以将他坐(90,60)[父节点的对立位置]。

这种不当通常放生在容器不可见时。

9、把世界的本地放在Y=0

这般可以更有益于的把对象放置地面上,并且以玩逻辑中,可以拿世界作为2D上空来拍卖(如果适度的话语),例如AI和物理模拟。

10、使打可从每个Scene启动

即将大大的下挫测试的时光。为了达成所有场景可运行,你得举行少件事:

首先,如果要前面场景运行有的一对数额,那么一旦效仿出它们。

说不上,生成于气象切换时不可或缺保存的靶子,可以是这般:

myObject = FindMyObjectInScene();  



if (myObjet == null)  

{  

   myObject = SpawnMyObject();  

}  

美术

11、把角色跟本地物体的核心点(Pivot)放在脚,不要放在中间

立刻可以要你方便之拿角色还是其他对象准确无误的搁地板上。如果方便的话,它吗说不定让游戏逻辑、AI、甚至是大体使用2D逻辑来展现3D。

12、统一所有的模型的面朝向(Z轴正为或者反向)

对此拥有有面朝向的对象(例如角色)都应当遵照就同一久。在联合给为为的前提下,很多算法可以简化。

13、在开始便拿Scale搞对头

求美术把装有导入的缩放系数设置为1,并且将她们之Transform的Scale设置为1,1,1。可以采用一个参阅对象(一个Unity的Cube)来做缩放比较。为你的嬉戏选一个社会风气之单位系数,然后坚持使用她。

14、为GUI组件或者手动创建的粒子制作一个点儿单照之面模型

安这个平面面朝为Z轴正向,可能简化Billboard和GUI创建。

15、制作并使测试资源

  • 也SkyBox创建带文字的方形贴图;
  • 一个网格(Grid);
  • 为Shader测试用各种颜色之面:白色,黑色,50%灰度,红,绿,蓝,紫,黄,青;
  • 为Shader测试用渐进色:黑及白,红到绿,红到蓝,绿及蓝;
  • 曲直格子;
  • 平整的还是粗糙的法线贴图;
  • 同样模仿用来很快搭建场景的光(使用Prefa);

Prefabs

16、所有东西都利用Prefab

唯有来场景中的“目录”对象不采取Prefab。甚至是那些只行使同一蹩脚的绝无仅有目标啊相应下Prefab。这样好以无采用场景的景下,轻松修改他们。(一个分外的利益是,当您以EZGUI不时,这好用来创造平安之Sprite
Atlases)

17、对于特例使用单独的Prefab,而毫不使用特别之实例对象

如若您生出三三两两种植敌人的项目,并且只是属性有分别,那么为歧之属性分别创建Prefab,然后链接他们。这足以:

  • 于与一个地方修改所有项目
  • 每当未行使场景的景况下进展改动

如您出广大冤家的门类,那么为不用在编辑器中应用非常的实例。一栽而摘的方案是程序化处理它们,或者也富有敌人用一个骨干的文书/Prefab。使用一个下拉列表来创造不同之大敌,或者因敌人的职位、玩家的速来计量。

18、在Prefab之间链接,而未使链接实例对象

当Prefab放置到场景被时常,它们的链接关系是被保护的,而实例的链接关系匪深受保障。尽可能的下Prefab之间的链接可以减小场景创建的操作,并且减少场景的改动。

19、如果可能,自动在实例对象期间发生链接关系

使您确实要在实例之间链接,那么相应以程序代码中失去创造。例如,Player对象在Start时用拿自己注册到GameManager,或者GameManager可以以Start时去寻找Player对象。

对需要丰富脚本的Prefab,不要就此Mesh作为根本节点。当您需要从Mesh创建一个Prefab时,首先创建一个拖欠的GameObject作为爸爸对象,并就此来举行到底节点。把下论放到根节点上,而毫不放Mesh节点上。使用这种艺术,当您替换Mesh时,就不见面丢所有你于Inspector中设置的价了。

动用互相链接的Prefab来促成Prefab嵌套。Unity并无支持Prefab的嵌套,在团队协作面临第三正值的贯彻方案或者是危急的,因为嵌套的Prefab之间的关系是匪显著的。

20、使用安全之流程来拍卖Prefab分支

咱为此一个称呼吧Player的Prefab来讲学这个过程。

就此底这流程来窜Player:

  1. 复制Player Prefab;
  2. 管复制出来的Prefab重命名为__Player_Backup;
  3. 修改Player Prefab;
  4. 测试一切工作正常,删除__Player_Backup;

不要管新复制的命名也Player_New,然后修改它。

聊情况可能再度扑朔迷离一些。例如,有些改或者干到一定量个人,上述过程发生或使场面无法工作,而有所人数总得下马下来当他们修改完毕。如果改动能够快完成,那么还为此点是流程虽得。如果改动要花费那个丰富日子,则足以行使下的流水线:

  • 第一私房:
    1. 复制Player Prefab;
    2. 拿它们又命名也__Player_WithNewFeature或者__Player_ForPerson2;
    3. 以复制的目标上开修改,然后交由给老二私;
  • 第二私房:
    1. 当初的Prefab上开修改;
    2. 复制Player Prefab,并取名为__Player_Backup;
    3. 把__Player_WithNewFeature拖放到场景中,创建它的实例;
    4. 拿这实例拖放到旧的Player Prefab中;
    5. 如若尽工作正常化,则只是要是删除__Player_Backup和__Player_WithNewFeature;

扩展和MonoBehaviourBase

21、扩展一个投机之Mono Behaviour基类,然后自己的装有组件都打它们派生

马上好使你方便的贯彻有通用函数,例如类型安全的Invoke,或者是有些复扑朔迷离的调用(例如random等等)。

22、为Invoke, StartCoroutine and Instantiate 定义安全调用方法

概念一个托任务(delegate
Task),用它来定义需要调用的法门,而不用使用字符串属性方法名称,例如:

public void Invoke(Task task, float time)  

{  

   Invoke(task.Method.Name, time);  

} 

23、为共享接口的零件扩展

稍微时候将收获组件、查找对象实现在一个零件的接口中会那个便利。

下面这种实现方案以了typeof,而未是泛型版本的函数。泛型函数无法在接口及干活,而typeof可以。下面这种办法把泛型方法清洁的卷入起来。

//Defined in the common base class for all mono behaviours  

public I GetInterfaceComponent<I>() where I : class  

{  

   return GetComponent(typeof(I)) as I;  

}  



public static List<I> FindObjectsOfInterface<I>() where I : class  

{  

   MonoBehaviour[] monoBehaviours = FindObjectsOfType<MonoBehaviour>();  

   List<I> list = new List<I>();  



   foreach(MonoBehaviour behaviour in monoBehaviours)  

   {  

      I component = behaviour.GetComponent(typeof(I)) as I;  



      if(component != null)  

      {  

         list.Add(component);  

      }  

   }  



   return list;  

}  

24、使用扩展来给代码书写更方便

例如:

public static class CSTransform   

{  

   public static void SetX(this Transform transform, float x)  

   {  

      Vector3 newPosition =   

         new Vector3(x, transform.position.y, transform.position.z);  



      transform.position = newPosition;  

   }  

   ...  

}   

25、使用防御性的GetComponent()

稍时候强制性组件依赖(通过RequiredComponent)会吃丁蛋疼。例如,很不便在Inspector中修改组件(即使他们产生雷同的基类)。下面是同样种植替代方案,当一个少不了的组件没有找到时,输出一长长的错误信息。

public static T GetSafeComponent<T>(this GameObject obj) where T : MonoBehaviour  

{  

   T component = obj.GetComponent<T>();  



   if(component == null)  

   {  

      Debug.LogError("Expected to find component of type "   

         + typeof(T) + " but found none", obj);  

   }  



   return component;  

}  

风格

26、避免对同件事使用不同之处理风格

在诸多气象下,某起事并无单独出一个惯用手法。在这种情景下,在项目被显选择中的一个来采取。下面是原因:

  • 局部做法并无能够杀好的平于搭档。使用一个,能强制统一规划方向,并明确指出不是别做法所指的方向;
  • 团伙成员利用统一之作风,可能有利于大家互动的知。他使整体结构及代码都更便于了解。这吗可以抽不当;

差一点组风格的例证:

  • 协程与状态机(Coroutines vs. state machines);
  • 嵌套的Prefab、互相链接的Prefab、超级Prefab(Nested prefabs vs.
    linked prefabs vs. God prefabs);
  • 数量分离的策略;
  • 于2D游乐的行使Sprite的法;
  • Prefab的结构;
  • 靶特别成政策;
  • 恒定目标的措施:使用项目、名称、层、引用关系;
  • 目标分组的方式:使用项目、名称、层、引用数组;
  • 找到同样组对象,还是给她自己来注册;
  • 支配实施顺序(使用Unity的履顺序设置,还是采用Awake/Start/Update/LateUpdate,还是用纯手动的道,或者是次无关的架构);
  • 当玩受采用鼠标选择对象/位置/目标:SelectionManager或者是目标自主管理;
  • 在情景变换时保留数据:通过PlayerPrefs,或者是在新场景加载时毫不销毁的靶子;
  • 组合卡通的方:混合、叠加、分层;

 

时间

27、维护一个和谐的Time类,可以要打暂停更易于实现

做一个“Time.DeltaTime”和””Time.TimeSinceLevelLoad”的包裹,用来兑现暂停和打速度缩放。这下起来有些发麻烦,但是当目标运行于不同之时钟速率下的上便方便多了(例如界面动画以及玩内动画)。

变迁对象

28、不要受游戏运行时变的目标将乱场景层次结构

于嬉戏运行时,为动态变化的对象设置好她的爹爹对象,可以叫您更利于的找。你可使用一个拖欠的目标,或者一个没有表现的么来简化代码中的拜会。可以吃这目标命名为“DynamicObjects”。

类设计

29、使用单件(Singleton)模式

于下是看似派生的所有类,将电动获取单件功能:

public class Singleton<T> : MonoBehaviour where T : MonoBehaviour  

{  

   protected static T instance;  



   /** 

      Returns the instance of this singleton. 

   */  

   public static T Instance  

   {  

      get  

      {  

         if(instance == null)  

         {  

            instance = (T) FindObjectOfType(typeof(T));  



            if (instance == null)  

            {  

               Debug.LogError("An instance of " + typeof(T) +   

                  " is needed in the scene, but there is none.");  

            }  

         }  



         return instance;  

      }  

   }  

}  

单个可以当作有管理器,例如ParticleManager或者AudioManager亦或者GUIManager。

  • 于那些休唯一的prefab实例使用单件管理器(例如Player)。不要为坚持即漫长规则把类的层系关系复杂化,宁愿在您的GameManager(或另合适的保管器中)中有所一个它们的援。
  • 于外部经常以的共有变量和方定义为static,这样您得这么便的书“GameManager.Player”,而未用写成“GameManager.Instance.player”。

30、在组件中永不使用public成员变量,除非她要以inspector中调剂

只有需要设计师(策划or美术)去调节的变量,特别是它们不克明了标明自己是举行什么的变量,不要声明也public。如果当这些特种状况下,无法避免,则只是应用简单只还四独下划线来表明不要打表面调节它,例如:

public float __aVariable;   

31、把界面与戏逻辑分开

立即同修本质上就是依的MVC模式。

* *

所有的输入控制器,只担负为相应的组件发送命令,让它了解控制器被调用了。推选一个控制器逻辑的例证,一个控制器根据玩家的状态来控制发送哪个命令。但是这样连不好(例如,如果您上加了大多单控制器,那以会见导致逻辑又)。相反的,玩家对象应根据目前状态(例如减速、惊恐)来设置当前底进度,并根据目前的面朝向来计算如何向前挪动。控制器只承担做他们好状态相关的作业,控制器不改动玩家的状态,因此控制前甚至足以向无明了玩家的状态。另外一个例证,切换武器。正确的计是,玩家有一个函数:“SwitchWeapon(Weapon
newWeapon)”供GUI调用。GUI不该保障有目标的Transform和她俩之间的父子关系。

具有界面相关的机件,只担负维护和处理他们好状态相关的数据。譬如,显示一个地形图,GUI可以根据玩家的各移计算地图的亮。但是,这是娱乐状态数据,它不属于GUI。GUI只是显得游戏状态数据,这些多少应当其余地方保护。地图数据吧应在外地方保护(例如GameManager)。

游戏玩法对象非应当关心GUI。发生一个两样是处理打暂停(可能是经过决定Time.timeScale,其实这并无是独好主意)。游戏玩法对象应该明了玩是否暂停。但是,这就是是一切了。另外,不要拿GUI组件挂及打玩法对象上。

诸如此类说吧,如果您拿装有的GUI类都去了,游戏应当好正确编译。

公还当上:在匪需要重新写戏逻辑的前提下,重写GUI和输入控制。

32、分离状态控制与账本变量

账本变量只是为利用起来方便或提高查找速度,并且可以依据状态控制来罩。将两头分别可以简化:

  • 封存游戏状态
  • 调剂游戏状态

贯彻方式有是为每个游戏逻辑定义一个”SaveData“类,例如:

[Serializable]  

PlayerSaveData  

{  

   public float health; //public for serialisation, not exposed in inspector  

}   



Player  

{  

   //... bookkeeping variables  



   //Don’t expose state in inspector. State is not tweakable.  

   private PlayerSaveData playerSaveData;   

}  

33、分离特殊之配备

若我们来有限只敌人,它们以及一个Mesh,但是出例外之性能设置(例如不同之力、不同的快等等)。有许多道来分别数量。下面是自我比较喜欢的同一种,特别是对此目标生成还是打存档时,会非常好用。(属性设置不是状态数据,而是安排数据,所以我们不需要存档他们。当目标加载或者转移是,属性设置会活动加载。)

  • 否每一个打逻辑类定义一个模板类。例如,对于敌人,我们来一个“EnemyTemplate”,所有的习性设置变量都保留在斯看似中。
  • 每当戏耍逻辑的好像中,定义一个上述模板类型的变量。
  • 做一个冤家的Prefab,以及个别独模板的Prefab:“WeakEnemyTemplate”和”StrongEnemyTemplate”。
  • 当加载或者变更对象是,把模版变量是的复制。

这种办法也许出接触复杂(在片状态下,可能不待这么)。

选举个例证,最好使用泛型,我们得这么定义我们的好像:

public class BaseTemplate  

{  

   ...  

}  



public class ActorTemplate : BaseTemplate  

{  

   ...  

}  



public class Entity<EntityTemplateType> where EntityTemplateType : BaseTemplate  

{  

   EntityTemplateType template;  

   ...  

}  



public class Actor : Entity <ActorTemplate>  

{  

   ...  

}  

34、除了展示用之文书,不要采用字符串

专程是毫无因此字符串作为靶子要prefab等等的ID标识。一个不行不满之不同是卡通片系统,需要动用字符串来拜会相应的卡通。

35、避免以public的数组

举例说明,不要定义一个兵器的多次组,一个子弹的屡屡组,一个粒子的累累组,这样您的代码看起如这样:

public void SelectWeapon(int index)  

{   

   currentWeaponIndex = index;  

   Player.SwitchWeapon(weapons[currentWeapon]);  

}  



public void Shoot()  

{  

   Fire(bullets[currentWeapon]);  

   FireParticles(particles[currentWeapon]);     

}  

当即在代码中尚不是啊特别题目,但是以Inspector中安他们之价值的下,就坏麻烦休发错了。

咱得以定义一个近似,来封装这三只变量,然后采用一个其的实例数组:

[Serializable]  

public class Weapon  

{  

   public GameObject prefab;  

   public ParticleSystem particles;  

   public Bullet bullet;  

}   

如此这般代码看起颇卫生,但是还着重的是,在Inspector中安时即便不易于犯错了。

36、在组织面临避免使数组

选举个例证,一个玩家可以出三种攻击形式,每种使用时底刀兵,并发出不同之子弹、产生不同的行。

汝可以把三只子弹作为一个屡次组,并像下这样组织逻辑:

public void FireAttack()  

{  

   /// behaviour  

   Fire(bullets[0]);  

}  



public void IceAttack()  

{  

   /// behaviour  

   Fire(bullets[1]);  

}  



public void WindAttack()  

{  

   /// behaviour  

   Fire(bullets[2]);  

}   

使枚举值可以吃代码看起重好一点:

public void WindAttack()  

{  

   /// behaviour  

   Fire(bullets[WeaponType.Wind]);  

}  

而就对Inspector一点吗坏。

最为好以单独的变量,并且于一个吓的变量名,能够代表他们的情的意思。使用下这个看似会再度干净。

[Serializable]  

public class Bullets  

{  

   public Bullet FireBullet;  

   public Bullet IceBullet;  

   public Bullet WindBullet;  

} 

此而没有其他的Fire、Ice、Wind的数据。

37、把数据组织到可序列化的类似吃,可以被inspector更干净

有些对象来同大堆可调试的变量,这种景象下于Inspector中找到有变量简直就是成了噩梦。为了简化这种状态,可以以一下底步骤:

  • 管这些变量分组定义及不同之切近吃,并被她声明也public和serializable;
  • 于一个着重的类吃,把上述类似的实例定义为public成员变量;
  • 匪用在Awake或者Start中初始化这些变量,因为Unity会处理好她;
  • 乃可定义其的默认值;

即足以管变量分组到Inspector的分组页签中,方便管理。

[Serializable]  

public class MovementProperties //Not a MonoBehaviour!  

{  

   public float movementSpeed;  

   public float turnSpeed = 1; //default provided  

}  



public class HealthProperties //Not a MonoBehaviour!  

{  

   public float maxHealth;  

   public float regenerationRate;  

}  



public class Player : MonoBehaviour  

{  

   public MovementProperties movementProeprties;  

   public HealthPorperties healthProeprties;  

}  

文本

38、如果您生出广大的剧情文本,那么将她们放开一个文书之中。

不用管他们放到Inspector的字段中错过编辑。这些需要好不打开Unity,也非用保存Scene就可好之修改。

39、如果您计划落实本地化,那么把你的字符串分离及一个联结的职位。

发出老多种方法来促成即时点。例如,定义一个文本Class,为每个字符串定义一个public的字符串字段,并将他们的默认值设为英文。其他的语言定义为子类,然后又初始化这些字段为相应的语言的价值。

除此以外一种植更好的技巧(适用于文本很怪或支持之言语数量过剩),可以读取几单独立的表单,然后提供部分逻辑,根据所选的言语来摘取正确的字符串。

测试与调节

40、实现一个图形化的Log用来调节物理、动画与AI。

旋即可判的增速调试工作。详见这里。

41、实现一个HTML的Log。

每当诸多情景下,日志是老大管用的。拥有一个便于分析的Log(颜色编码、有差不多个视图、记录屏幕截图等)可以要基于Log的调节变动愉悦。详见这里。

42、实现一个若协调的帧速率计算器。

不曾人清楚Unity的FPS计算器在举行呀,但是毫无疑问不是测算帧速率。实现一个君协调的,让数字符合直觉并可视化。

43、实现一个截屏的快捷键。

不少BUG是图形化的,如果你生一个截图,就大轻报告其。一个可以的系,应该于PlayerPrefes中保存一个计数,并因是计数,使得所有成功保存的截屏文件都非叫覆盖掉。截屏文件应当保留于工程文件夹之外,这好防范人们切莫小心将其交给到版本库中。

44、实现一个打印玩下坐标的快捷键。

当下可以以上报位置相关的BUG时肯定其有在世界面临的哟岗位,这可给Debug容易一些。

45、实现有Debug选项,用来好测试。

有些例证:

  • 解锁所有道具;
  • 关门所有敌人;
  • 关闭GUI;
  • 吃游玩下无敌;
  • 闭馆所有戏逻辑;

46、为各级一个足小的团组织,创建一个抱他们的Debug选项的Prefab。

安一个用户标识文件,单并非交至本库,在打运行时读取它。下面是故:

  • 团组织的成员不见面因始料不及之交了好的Debug设置而影响到其他人。
  • 修改Debug设置不需改场景。

47、维护一个富含有戏元素的景象。

比如说,一个气象,包括拥有的敌人,所有可以互相的目标等等。这样好免用游戏坏悠久,而展开全面的效益测试。

48、定义有Debug快捷键常量,并将她们保存于统一的地方。

Debug键通常(方便起见)在一个地方来拍卖,就像另的游乐输入一样。为了避免快捷键冲突,在一个主干岗位定义有常量。一种植替代方案是,在一个地方处理所有按键输入,不管他是否是Debug键。(负面作用是,这个看似或需要引用更多之另对象)

文档

49、为而的装建立文档。

代码应该有所极其多之文档,但是有些代码之外的东西吗必须树立文档。让设计师们通过代码去押而展开安装是浪费时间。把装写副文档,可以提高效率(如果文档的本会立即更新的口舌)。

从而文档记录下这些:

  • Layer的运用(碰撞、检测、射线检测——本质上说,什么东西应该当谁Layer里);
  • Tag的使用;
  • GUI的depth层级(说啊应该显示在啊之上);
  • 惯用的处理方式;
  • Prefab结构;
  • 动画Layer。

取名规则和目录结构

50、遵从一个命名规范及目录结构,并成立文档

命名和目录结构的一致性,可以好寻找,并明确指出什么东西在乌。

您非常有或用创造自己的命名规则和目录结构,下面的例证只是供参考。

泛的命名规则
  1. 名应该代表其是什么,例如鸟就应有叫Bird
  2. 选可以发音、方便记忆之名。如果你当制作一个玛雅文化有关的游乐,不要把卡命名也QuetzalcoatisReturn
  3. 保唯一性。如果您选择了一个名字,就坚持用她。
  4. 应用Pascal风格的深浅写,例如ComplicatedVerySpecificObject
    决不使空格,下划线,或者连字符,除了一个例外(详见也平事物的两样地方命名一节)。
  5. 无须以本数字,或者标示他们快的名词(WIP、final)。
  6. 毫不采取缩写:DVamp@W有道是写成DarkVampire@Walk
  7. 应用规划文档中的术语:如果文档中称呼一个卡通也Die,那么下DarkVampire@Die,而并非就此DarkVampire@Death
  8. 保障细节修饰词在左:DarkVampire,而不是VampireDarkPauseButton,而不是ButtonPaused。举例说明,在Inspector中觅PauseButton,比有按钮都以Button开头方便。(很多丁支持于相反的主次,认为那样名字可以自之分组。然而,名字不是用来分组的,目录才是。名字是用来当同一类对象吃可长足识别的。)
  9. 否一个队列使用及一个名,并以这些名字中以数字。例如PathNode0,
    PathNode1
    。永远从0开始,而不是1。
  10. 对此未是班的情形,不要使用数字。例如 Bird0, Bird1,
    Bird2
    ,本应有是Flamingo, Eagle, Swallow
  11. 也临时对象上加双生划线前缀,例如__Player_Backup
否平事物的不同地方命名

在中心名称后加加下划线,后面的有些代表谁地方。例如

  • GUI中的按钮状态:EnterButton_Active、EnterButton_Inactive
  • 贴图: DarkVampire_Diffuse, DarkVampire_Normalmap
  • 天空盒:JungleSky_Top, JungleSky_North
  • LOD分组:DarkVampire_LOD0, DarkVampire_LOD1
结构

状况组织、工程目录、脚本目录应当利用相似的模式。

目结构

Materials  

GUI  

Effects  

Meshes  

   Actors  

      DarkVampire  

      LightVampire  

      ...  

   Structures  

      Buildings  

      ...  

   Props  

      Plants  

      ...  

   ...  

Plugins  

Prefabs  

   Actors  

   Items  

   ...  

Resources  

   Actors  

   Items  

   ...  

Scenes  

   GUI  

   Levels  

   TestScenes  

Scripts  

Textures  

GUI  

Effects  

...  

观布局

Cameras  

Dynamic Objects  

Gameplay  

   Actors  

   Items  

   ...  

GUI  

   HUD  

   PauseMenu  

   ...  

Management  

Lights  

World  

   Ground  

   Props  

   Structure  

   ...  
剧本目录结构
ThirdParty  

   ...  

MyGenericScripts  

   Debug  

   Extensions  

   Framework  

   Graphics  

   IO  

   Math  

   ...  

MyGameScripts  

   Debug  

   Gameplay  

      Actors  

      Items  

      ...  

   Framework  

   Graphics  

   GUI  

   ...  

相关文章

网站地图xml地图