避开Unity的坑

1.制作抽象的prefab来做关卡编辑

尽可能制作抽象的prefab来做关卡编辑,该prefab应该足够抽象简单(只有一个GameObject,然后通过Gizmo来绘制是个不错的手段),否则以后变化的时候(常见的就是改美术资源),所有关卡都lost prefab,那么对策划来说是一场灾难。可以考虑通过数据表+编辑器的方式来提供策划操作同时也不再需要担心lost prefab的问题。prefab越简单抽象越不容易丢失,prefab之间嵌套的正确方式是通过链接而不是挂在节点下面。

2.尽可能避免修改Scene,方法有几种:

  • 使用xml之类的数据组织场景
  • 尽量多让scene由prefab组成,这样变动都在prefab上
  • 使用工具做场景Merge

3.不要过度依赖Component特性来开发,考虑数据驱动。

4.逻辑容易散落在编辑器各处,可以做一个中心管理。

利用Unity的特性

  • 组织好hierarchy,不管是编辑的时候还是运行的时候,编辑的时候可以通过工具来简化组织层级的工作。
  • 让每个场景自己能跑。
  • 利用基于组件的架构,尽可能少的使用继承(用C#的话),多通过组合来完成开发。遇到需要数据访问的通用接口,我们可以通过组合的方式来完成,而不是提供一个公共基类接口来继承,只要大家都认识这个公共组件就可以取到数据了。遇到通用的事件派发,我们可以用字符串拼接的方式派发到指定的对象或者更参数组合派发事件到对象身上。
  • 框架采用星型架构+事件机制,由于Unity3D没有一个所谓的入口函数,不利于代码跟踪,这样的基础架构能带来很多便利。
  • unity界面扩展能力很强,而且借助CLR(commom language runtime)的反射能力,C#里面开发界面非常容易。
  • 做好tag、layer规划,要考虑业务中哪类物体之间需要交互。
  • 在代码里面get某个prefab或者GameObject,可以考虑利用界面拖目标过来,这样更加直观,而且也能对抗变化,比如目标名字变了也不怕,而且还能节省代码量。

代码

这里针对C#,静态强类型面向对象本身就是一个坑,继承带着两个职责,一个是复用代码,一个是接口继承。虽然性能比lua高那么一丢丢,因为性能瓶颈不在业务本身,设计上的问题要严重得多。我认为像lua这种动态语言的元编程才能够贯彻单点真理,通过元编程把真理推导到系统的每一处。让代码始终保持语义,而我认为写业务代码最重要的是保持语义。保持语义的简单有效评判方法就是看这个类中的某个函数,单独看它能否看懂;多个接口能否组成完备的解决方案。静态强类型面向对象语言比较适合需求稳定的严谨的系统开发,而不是游戏开发。容易经过多次的策划需求冲刷,语义很容易扭曲,各种抽象泄露、各种hack。好吧,跑题了。

  • Unity3D容易被破解,因为发布版本的IL是非常容易被反编译的,要做好混淆的考虑。在Unity3D中混淆要考虑对编辑器的影响。
  • 复杂类型尽量使用引用类型,值类型反射麻烦,不方便序列化以及做成编辑器。值类型要小心赋值对象是否只是临时对象。
  • 引用类型释放之后,引用它的指针会置为null,可以放心使用。
  • foreach、linq、协程慎用,反射只在编辑器中使用。
  • 考虑封装Time,方便做暂停。
  • 考虑使用调度器来完成功能,而不是在Update自己维护状态,这样做暂停也很容易,代码更清晰,功能更内聚。
  • 增量更新要一开始就想清楚。

美术

  • Unity3D可以通过扩展编辑器让非技术人员编辑界面来工作,组织好美术资源规格、路径,并且自动生成prefab。游戏场景物件也要规划好逻辑节点,这个也应该通过编辑器扩展好。复杂功能也应该通过编辑器开发给策划微调,特别是可视化比较重要的模块,比如动作调整。
  • 制作原型美术,让开发提升开发效率。
  • 有统一的约定,比如模型总是中心对齐,角色总是脚部对齐,统一的缩放、统一的动画骨骼命名,资源有统一的路径。
  • 支持换装(avatar)要一开始就想清楚。
  • 资源加载和优化尽可能早地给出雏形(只是雏形,帮助你对需求的把握,因为这时候你还不知道热点在哪),因为一旦没有规划好异步和资源释放,那么阻塞卡顿和内存飙升那是意料之内的。因为有雏形,那么代码会间接一点,也为改变提供了空间。
时间: 2024-10-19 11:35:44

避开Unity的坑的相关文章

开展一次高效、高质的需求调研必须避开的那些坑

一.背景介绍 笔者在一个千万级的项目中,由于牵涉到后3年网络.硬件.系统等方面的规划,客户要求我们对其本级及其下属的15家单位开展一次调研,调研的内容主要包括(下面的内容是我们梳理过的,客户一般不会提这么细): 1.已建.即将要建设或者想建的系统: 2.当前的网络.硬件情况,包含网络运营商.带宽.硬件(服务器.交换机等)所有的设备: 3.当前的业务痛点(系统哪里用得不好,哪里还想改进什么的).需求想法什么的. 二.必须要避开的那些坑(1)天坑1:没有上层领导主抓的调研之路,必定是比西天取经还难走

高薪程序员都避开了那些坑【安晓辉】

程序员的薪水有高有低,有的人一个月可以拿30k.50k,有的人可能只有2k.3k.同样有五年工作经验的程序员,可能一个人每月拿20k,一个仅拿5k.是什么因素导致了这种差异?我特意总结了导致薪水低的九大行为表现,避开这些坑,你就离高薪不远了. 1. 习惯即可回报 他不懂得只有春天播种,秋天才会有收获.刚刚付出一点点,甚至还没有付出,就想要得到回报.技术刚刚掌握,能一遍百度一边干活了,就觉得该拿多少多少钱了.找工作先想着多少多少钱,入职了没干几个月就想着要加多少多少钱,干了没几个月,薪水要是没涨,

月薪3万的程序员都避开了哪些坑?

程序员薪水有高有低,有的人一个月可能拿30K.50K,有的人可能只有2K.3K.同样有五年工作经验的程序员,可能一个人每月拿20K,一个拿5K.是什么因素导致了这种差异?我特意总结了容易导致薪水低的九大行为表现,避开这些大坑,你就离高薪不远了. 习惯即刻回报 他不懂得只有春天播种,秋天才会有收获.刚刚付出一点点,甚至还没有付出,就想要得到回报.技术刚刚掌握,能一边百度一边干活了就觉得该拿到多少多少钱了.找工作先想着多少多少钱,入职了没干几个月就想着要加多少多少钱,干了没几个月,薪水要是没涨,就放

月薪3万的程序员都避开了哪些坑

程序员薪水有高有低,有的人一个月可能拿30K.50K,有的人可能只有2K.3K.同样有五年工作经验的程序员,可能一个人每月拿20K,一个拿5K.是什么因素导致了这种差异?我特意总结了容易导致薪水低的九大行为表现,避开这些大坑,你就离高薪不远了. 习惯即刻回报 他不懂得只有春天播种,秋天才会有收获.刚刚付出一点点,甚至还没有付出,就想要得到回报.技术刚刚掌握,能一边百度一边干活了就觉得该拿到多少多少钱了.找工作先想着多少多少钱,入职了没干几个月就想着要加多少多少钱,干了没几个月,薪水要是没涨,就放

Unity的坑

---恢复内容开始--- Unity篇 Unity5.2版本:不能在协程中开启协程: Unity5.3版本:特效不能循环播放: Unity5编辑器下,切换场景时,内存(Texture,Prefab)内存不回收,真机上没有问题: NGUI篇 多个循环播放特效同时存在时,点击一个特效的播放,别的播放停止: [解决方案]:继承UIWidget后改变sharedMaterial的renderQueue,原理尚未搞明白 界面Enable设置为True时马上进行位移等操作,界面网格移动了,但渲染没有刷新,导

转:月薪3万的程序员都避开了哪些坑?

程序员薪水有高有低,有的人一个月可能拿30K.50K,有的人可能只有2K.3K.同样有五年工作经验的程序员,可能一个人每月拿20K,一个拿5K.是什么因素导致了这种差异?我特意总结了容易导致薪水低的九大行为表现,避开这些大坑,你就离高薪不远了. 习惯即刻回报 他不懂得只有春天播种,秋天才会有收获.刚刚付出一点点,甚至还没有付出,就想要得到回报.技术刚刚掌握,能一边百度一边干活了就觉得该拿到多少多少钱了.找工作先想着多少多少钱,入职了没干几个月就想着要加多少多少钱,干了没几个月,薪水要是没涨,就放

Unity踩坑 : 接入原生QQ登录的时候,自己的QQ可以登录,其他用户QQ无法登录.

在接入QQ登录的时候,所有的信息都已经获取到..打包到Unity中,用自己的QQ账号进行登录,发现一切正常 所有的信息都可以正常获取.. 但是,切换QQ之后...发现无论如何也登录不了,也没有相关报错,特别棘手...在网上查了所有的资料,实在没辙...去找相关客服帮助解决.. 客服给的解决方法是这样的: 1.appid肯定是正确的; 我的签名是通过签名工具直接生成的,检查了一下..没有问题..但是这是重点...因为生成的签名我是手打上去的,所以难免出现什么意外..于是乎,重新生成了一下签名..

教你 Shiro 整合 SpringBoot,避开各种坑

最近搞了下 Shiro 安全框架,找了一些网上的博客文章,但是一到自己实现的时候就遇到了各种坑,需要各种查资料看源码以及各种测试. 那么这篇文章就教大家如何将 Shiro 整合到 SpringBoot 中,并避开一些小坑,这次实现了基本的登陆以及角色权限,往后的文章也讲解了其他的功能,如 <教你 Shiro + SpringBoot 整合 JWT> 附上源码:https://github.com/HowieYuan/shiro 依赖包 <dependency> <groupI

memset()函数中的坑

一 写在开头1.1 本节内容内存填充函数memset()中的坑. 二 函数原型 1 /* 来自man memset */ 2 #include <string.h> 3 void * memset(void * s, int c, size_t n); 功能描述:memset()函数用常量c的值填充由指针s所指向的内存地址空间的前n个字节的内存空间. DESCRIPTION : The memset() function fills the first n bytes of the memor