这个系列贴存在的意义是什么?

网上FAQ很多,不过大多数更新不够及时,部分答案甚至可能是误导。我会尽可能收集整理项目中发现的问题以及解决方法,及时更新供参考。

Unity在商业公司内能使用Personal免费版么?Unity现在还能XX么?

请联系团队负责人和IT申请公司的正版授权。在公司内用免费版,大概率会被封号(官方有IP监控)。不推荐XX,自用可以买个Plus版,虽然每年都涨价。早买早享受,或者等双11折扣季。

如果因为特殊情况真的需要XX,请翻墙下载官网版本XX。 国内IP下载的版本是加壳的无法XX。Unity2019开始需要连同UnityHub一起XX。

2021年了,新项目/版本更新应该选哪个Unity版本?

  • 老项目:2017以下的所有版本请更新到2017.4LTS版本。
  • 老项目更新:如果对SRP管线没有太多需求,2018.4LTS还是值得信赖。由于2018.3开始很多机制做了大量修改,如果不放心可以只更新到2018.2。
  • 新项目:直接2020最新版本起步,并随时更新到即将推出的2020.3LTS。

Unity可以使用C#新语法(7.3+)么?

可以,2018.2以及以下需要配置mcs.rsp和csc.rsp,以及用脚本自动修改一下csproj工程文件。建议直接使用2018.3及之后版本。

Unity自带的Mono运行库听说问题很多,比如内存堆无法归还系统/垃圾回收低效/foreach内存泄漏等?

老黄历了!推荐选用2018以上版本Unity,开启.Net4.x/.NetStandard2支持,运行库已经基本解决以上问题。可喜的是,在2019.2之后可以开启渐进式GC,传统的瞬间GC卡顿的问题大大缓解。

il2cpp容易出一些莫名其妙的问题?

是的,所以用第三方库特别是涉及到反射/序列化等要注意,动态代码生成/emit一概都是不支持的。protobuf/litjson之类常用的库没问题。另,2018之后安卓也正式支持il2cpp,推荐使用。

代码热更新应该怎么选?

目前这个问题只限于iOS平台(Android可以随便更)

  • InjectFix:用c#开发,补丁开发也是用c#(推荐)
  • xlua:用c#开发,只用xlua打紧急补丁,补丁开发使用lua。
  • ILRuntime:只需要c#一种语言就搞定问题了,调试也方便。
  • 其他用各种lua绑定写逻辑代码,不推荐。除非有老项目积累,lua党请出门左转不送。
  • puerts:xlua作者新作,用typescript编写Unity/Unreal代码 (潜力)

2021年还需要兼顾一些老手机么?

  • iOS:建议放弃iPhone6之前的不支持64位指令的老手机,只编译arm64架构即可。
  • Android:建议放弃安卓4.3之前不支持OpenGLES3的老型号手机(采用PBR流程线性空间渲染则是强制要求)。此外,x86架构除了兼容一些老模拟器,基本可以放弃。

贴图格式对品质的影响,特别是UI贴图品质问题

  • iOS:推荐直接放弃iPhone6之前的型号,直接用ASTC格式。老项目建议分离alpha通道用两张PVRTC。
  • Android:推荐直接放弃老手机型号,直接选用ETC2格式。老项目可以分离alpha通道用两张ETC。

UI库应该如何选择?

新项目推荐使用FairyGUI,好用好用好用,说三遍。

有项目经验或积累的可以沿用UGUI。NGUI党请出门左转不送。

项目需要分多个Unity工程么?

甜党、咸党之争。

个人推荐分多个工程,客户端一个Unity工程,美术1-2个工程,公共的部分可以做git submodule来共享。美术工程直接输出assetbundle到资源目录,客户端直接加载assetbundle,避免使用Resource.Load等API。

手游开发也需要做PC版么?

要,很有必要。

如果都用Unity编辑器来运行测试,就得开放几乎所有代码和资源给所有人。如果都直接打手机包来测试,不仅繁琐、速度慢、周期长,还容易造成资源不一致。所以一定要坚持编译最新PC版客户端和资源包,方便多人/多开测试。

另,如果是程序员用mac开发,也请一起发布windows/mac版,给用windows的同事使用。

Unity3D项目应该用git还是svn做版本控制?

用git和svn差不多,现在主流项目开发都用git了。git需要管理员细心地做一些初始配置:

  • 使用.gitignore 过滤一些文件类型和临时目录,推荐用 https://www.gitignore.io/ 输入unity 就可以自动帮你生成一份unity工程的忽略模板
  • 使用.gitattributes 配置不同文件类型的换行处理以及二进制文件类型识别
  • 启用git-lfs 对大的二进制文件配置lfs支持,提高git pull/push执行效率(可选)

听说Unity新的DOTS架构(ECS)很不错,如何尝试?

官方的Entities包一直都处于preview状态(2020甚至都只能手动添加),新项目可以尝鲜。由于ECS架构打破了很多原来面向对象的传统思路和编码习惯,对程序员/设计思路转换要求比较高。同时,对渲染/UI等各个其他环节,ECS的支持并不成熟,需要比较长期的混合代码。

目前ECS最佳实践还是用在战斗逻辑中,特别是帧同步的战斗逻辑/数据。此外,如果是尝鲜还可以试试第三方的Entitas,以及我们魔改过的Entitas-Lite。