文档介绍:用 Unity3D 的 17 个技巧: Unity3D 最佳实践扩展和 MonoBehaviourBase 21 、扩展一个自己的 Mono Behaviour 基类,然后自己的所有组件都从它派生这可以使你方便的实现一些通用函数,例如类型安全的 Invoke ,或者是一些更复杂的调用(例如 random 等等)。 22 、为 Invoke, StartCoroutine and Instantiate 定义安全调用方法定义一个委托任务( delegate Task ),用它来定义需要调用的方法,而不要使用字符串属性方法名称,例如: 资源来自于狗刨网 public void Invoke(Task task, float time) { Invoke(, time); } 23 、为共享接口的组件扩展有些时候把获得组件、查找对象实现在一个组件的接口中会很方便。下面这种实现方案使用了 typeof ,而不是泛型版本的函数。泛型函数无法在接口上工作,而 typeof 可以。下面这种方法把泛型方法整洁的包装起来。//Defined in mon base class for all mono behaviours public I ponent<I>() where I: class { return ponent(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) {ponent = (typeof(I)) as I; ponent != null) { ); }} return list; } 24 、使用扩展来让代码书写更便捷例如: public static class CSTransform { public static void SetX(this Transform transform, float x) { Vector3 newPosition = new Vector3(x, , ); = newPosition; } ...} 25 、使用防御性的 ponent() 有些时候强制性组件依赖(通过 ponent )会让人蛋疼。例如,很难在 Inspector 中修改组件(即使他们有同样的基类)。下面是一种替代方案,当一个必要的组件没有找到时,输出一条错误信息。 public static T ponent<T>(this GameObject obj) where T: MonoBehaviour {ponent = <T>(); ponent == null) { ("Expected to ponent of type "+ typeof(T) +" but found none", obj); } ponent; } 风格 26 、避免对同一件事使用不同的处理风格在很多情况下,某件事并不只有一个惯用手法。在这种情况下,在项目中明确选择其中的一个来使用。下面是原因: ?一些做法并不能很好的一起协作。使用一个,能强制统一设计方向,并明确指出不是其他做法所指的方向; ?团队成员使用统一的风格,可能方便大家互相的理解。他使得整体结构和代码都更容易理解。这也可以减少错误; 几组风格的例子: ?协程与状态机( Coroutines vs. state machines ); ?嵌套的 Prefab 、互相链接的 Prefab 、超级 Prefab ( Nested prefabs vs. linked prefabs vs. God prefabs ); ?数据分离的策略; ?在 2D 游戏的使用 Sprite 的方法; ? Prefab 的结构; ?对象生成策略; ?定位对象的方法:使用类型、名称、层、引用关系; ?对象分组的方法:使用类型、名称、层、引用数组; ?找到一组对象,还是让它们自己来注册; ?控制执行次序(使用 Unity 的执行次序设置,还是使用 Awake/Start/Update/LateUpdate ,还是使用纯手动的方法,或者是次序无关