Unity3D项目实战笔记(11):Unity 2D会用到的知识点小结

     全职编程Unity 2D手游已8个月了,已经上线了1款,还有1款正在研发中,预计1月中旬上线,这里小结2015年做的2D手游棋牌项目部分2D知识点。

(考虑到我是研发,故这里仅列出了用到的知识点,不会涉及公司研发的细节–毕竟签署过保密协议的,呵呵.)

image

 

注:服务器用的是商业化比较不错的SmartFoxServer、JAVA、MySql搞的,稳定性非常不错。

 

  • UI: 一般考虑UI布局,可使用TK2D、NGUI或者UGUI的解决方案,经验是不要混合使用。 这3种UI方案,均提供UI auto layout的; 另外,字体也是UI的重点考虑要素,有ttf动态字体方案和bmfont图片字方案,不考虑特色特色方案情况下,ttf一般不用过多考虑—用Unity做的手游,输入文字、输入数字是很蛋疼的事情,故动态字体绝对是鸡肋功能,使用概率非常非常低。
  • 物理: Unity从4.6开始加大了对原生2D的支持,故提供了2D特有的组件,主要是物理组件。如Collider 2D,Rigibody 2D, Joint 2D等。
  • 动画: 2D下的动画主要是用多张图片做帧动画,例如牌型动画。 也有一些特殊需求是骨骼动画–例如人物动画。 TK2D和UGUI提供的帧动画,非常简洁。
  • Sprite: 中文翻译为精灵,也就是图片;这个是2D中除了UI外最重要的界面元素了,一般有九宫格的切图需求,还有就是可采用TexturePackager进行图集打包压缩。
  • Advance: 项目进行过程中,对于有项目实战经验而言,有些事情要提前考虑和布局了,如AssetBundle的应用–涉及到服务器设计架构,以及粒子和shader的应用。 另外在项目的中期要考虑手游的优化–以k为文件大小的优化apk包大小。这里吐槽一个事情,Unity5.*开始,Android下默认支持X86和Arm架构,导致空包有18M大小,但是国内很少有Android的X86设备–据说小米平板是,故为了减少包大小,方便运营推广裁剪了X86版本,缩小了8MAndroid apk文件大小。
  • 公共规范:和具体编程关系不大,但是决定了团队合作的默契度。 项目的组织,规范好文件和文件夹是非常重要的事情,能提高沟通效率。另外在和美术团队沟通的时候,定好约束,如960*640 2D横板的美术标准。因为2D上,Unity已经很强大了,这里也引入了一些第三方插件—DOTween、VP_Timer、PoolManager。

      学习Unity2D知识,都知道和能够上线一款产品,差距还有有的,要不,一般公司招聘会特别标明–成功上线一款手游的实际开发经验呢。

 

手游推广:  扫描二维码,下载《坑王争霸》手机版(Android、IOS):

http://www.pgyer.com/wakeng

image image

谢谢大家下载支持,指教的和报bug的,请QQ联系我:21372550。

Unity3D左右出击:Unity 2D新功能发布会、Unity VR大师课程

   做为Unity3D技术的从业者, 非常关注一举一动—Unity3D大中华区. 如自从11月中到12月中,短短的1个月时间,对于Unity3D大中华区, 发生3件大事, 可以说算是三把火:

 

11.23日 唐嘉隆任Unity大中华区总经理

       这种重大的人士变迁,对外企大公司而言,应该是内部有了一些“地震”了,要不中国这边的boss都换了。据说国内手游、VR市场火热,2015年Unity已经有2名内部骨干出去创业,或者加入创业公司了。 全球450万Unity程序员,中国占了40%,热火程度可见一斑。

       新的干部队伍应该会有较大的作为的。目前看已经稳住阵脚了,以方便我等广大的Unity程序员们的心里:减少内耗、服务好开发者先。

 

12.15日  Unity VR大师课程

         从资本、技术角度看,VR、AR是未来5年的战略制高点,这一点Unity非常清楚,自从5.2开始,Unity已经支持了全球4个重要的VR硬件头盔–原生支持;这次举行VR聚会,将会进一步增强Unity在VR行业的领头羊角色。 目前全球跨平台开发VR的IDE工具,Unity占了约70%,另外的对手主要是虚幻引擎,这次Unity在北京开会,有主动求战的意味,毕竟牛B的虚幻在国内行事低调的多。

          看好Unity在VR、AR领域的领头羊角色:跨平台、免费、Android、PC、IOS多平台快速demo原型。

 

12.17日 Unity 2D新功能发布会

          尽管Unity以3D著名–其Unity3D.com网站为公司官网的。但是在手游时代—包括2015年,主要的手游还是以2D为主,据说手机上3D手游开始看起来很酷,但是巨大的耗电量\发热\玩时间长了晕等硬伤, 只能是手游的一个宣传噱头,很多公司是2D\2.5D为主的—我了解的.  而在2D上,Unity在4.*前无原生的2D支撑,一般依赖第三方插件,如TK2D

           2D手游,Unity的劲敌为触控科技的 cocos2d x。  本次高调举行Unity2D新功能发布会,属于和cocos2d x 主动求战PK,以弥补2D的先天不足。

 

  • 做2D手游,首选 cocos2d x, 然后是Unity 2D
  • 做3D手游,首选Unity3D,然后是虚幻引擎
  • 做VR技术,首选Unity3D,然后是虚幻引擎

故,如此对比,cocos2d x必然要逊色不少,而Unity3D固然问题很多,但是却是2D、3D、VR技术全栈也,有利于一个靠谱程序员的更长的生命周期—不用频繁更换技术架构和技术知识储备了。

 

 

小结一下,我的Unity技术栈,如图所示:

image

  1. Unity3D技术: 2013.6月份开始了业余了解Unity,做demo,翻译了14篇Unity技术文章
  2. Unity2D技术: 2015.6月份开始了全职Unity程序员,做的是2D棋牌手游。
  3. Unity VR技术: 计划2016年业余玩玩,前几天采购的暴风魔镜4 预计春节前能到货。

C#程序员整理的Unity 3D笔记(二十):2D Toolkit之官方教程《Whack a Mole》

在上篇博客中,简单整理了一下Unity Native 2D功能:《C#程序员整理的Unity 3D笔记(十九):Unity 3D的Native 2D》. 本文开始学习2D商用比较广泛的2D Toolkit插件.

2D Toolkit插件在2D中的地位,犹如UI中NGUI对Unity GUI一样:虽然官方原生的2D还不错,但这是最近1年新版本才有的功能,2年前Unity 2D的王道还是得用插件的,故《2D Toolkit》就成了目前商业不错的选择。

在上周刚开始看的时候,就给自己提了3个问题 (1周后,自己给自己尝试做了回答):

  1. 2D Toolkit是类似NGUI的东西吗?

    答:是的,类似NGUI;2D toolkit是第三方插件,广泛用于2D的游戏开发;其还包括了UI,可不用NGUI就能进行不错的UI开发。

  2. 对比Unity Native 2D,2D Toolkit是否优势已经丧失;或者是类似UGUI和NGUI关系?

    答:这个目前不得知。 粗浅的看,Unity Native 2D比较简单,开发起来便捷,毕竟和Unity无缝集成的,且原生,另外还省钱;但是2D Toolkit都演变到2.5.2版本了,商用应该比较成熟,如其tk2dCamera简直无敌了–能自适应各种屏幕、大大节约了编码。

  3. 2D Toolkit能够和Unity Native 2D同存否?

答:目前不知道。应该可以吧,2D toolkit已经于2015.5.24 发布2.5.2版本,声明支持Unity 5了。

 

2D ToolKit简历

2D ToolKit是第三方2D插件,能处理图集打包(Atlas Package)、精灵渲染(Sprite)、2D动画(Sprite Animator)、2D UI,目前中文资料少得可怜。

2D Toolkit简称为TK2D,其功能据说是2D下最强大的,assetstore的下载点评竟然超过1200个,这个数据非常惊人,要知道售价价格要75美金呢。其插件提供了C#代码,源码之内,了无秘密。

TK2D的厂家是Unikron Software Ltd,官方网站为http://unikronsoftware.com

TK2D在assetstore的”编辑器扩充/2D与图片管理”分类下,排名第一

image

我摘录了部分官方官网assetStore点评:

low draw calls

pixel perfect camera:Unity 4.6 pro sprite package

get a response with 24 hours

manages multiple resolutions of sprite images (1x, 2x, 4x)

Very nice package

greatly sped up my animating process.

really streamlined my workflow.

organise all your sprites how you like in collections.

It’s fast at updating and rendering too.– opitimization

The best support、comunity

other:spline、NGUI

其点评大多集中在以下几个方便

  • 降低了DC
  • 正版的售后服务好
  • 图集打包很爽
  • 2D下效率高

正文开始–本文就官方教程《Whack a Mole》进行小结:

注:因为官方问答截图、文字描写清楚,我这里为节约大家时间,不会写的很细,请先预览一下官方教程。

官方提供的Whack a Mole 材质下载地址

 

步骤1:了解官方文档对TK2D做的系统概括:

  1. Tk2D在编辑期间生成脚本–Assets目录
  2. Tk2D运行脚本生成对象–场景

image

      上面这张图包含了TK2D的7个知识点 (术语) 的6个(除了Tilemaps外)
    • Sprite Collections: 精灵(2D下的图片)集合,用于组织图片,一般同z轴值的放在一起,效率高。
    • Sprites:精灵,任何需要在Scene显示的均需要精灵组件,目前包含4种Sprite

    image

    • Static Sprite Batcher:静态化精灵–不参与碰撞的,可明显减少DC
    • Sprite Animations:动画精灵
    • Fonts:字体
    • Text Meshes:显示文本
    • Tilemaps

          步骤2:tk2d camera 自动布局的摄像机

          删除新建Unity 2D工程的Main Camera,添加tk2dCamera,并设置tag为“Main Camera”。

        image

            修改tk2dCamera参数如下:

          image

        1. Native Resolution :1024*768
        2. Projection:Orthographic
        3. Type:Pixels Per Meter
        4. Pixels Per Meter:1
        5. Origin:Bottom Left
            例如:

          pixel per meter – so 100×100 world units = 100×100 pixels from the bottom left

              tk2dCamera实际上是对Unity的Camera进行了扩展,这里有详细的对比说明和tip技巧。

                步骤3:精灵集合(Sprite Collections)、精灵(Sprite )、静态精灵批处理(Static Sprite Batcher)

              要使用图片,则需要首先添加Sprite Collections,它有3个作用:

              1 把图片组织管理起来–如果你有上百个图片就会发现它的价值。

              2 同z轴的组织起来,方便Unity引擎优化降低DC

              3 自动进行图集打包–减少图片占用空间
                为什么要用Sprite Collection? 我认为比Unity Native 2D的默认能生成精灵而言,多了2个步骤。

              img/spritecollection.png

                  要添加精灵,需要先Check out–如我这里使用Perforce源码管理。

                image

                    添加精灵很简单,选择、拖放即可:

                  img/spritecollection_drag.png

                      针对当前Sprite Collection,进行Settings,然后一定要记得Commit:

                    image

                        注意:这里的Size和Pixels Per Meter,需要和上面的tk2DCamera保障一致。
                          Settings最下面有Platforms的设置,这个我没有看明白:

                        image

                            网上搜了一段代码,好像是为了适应不同屏幕的全局设置:

                          image

                              点击Commit后,就生成1了文件夹,包含3个文件:*.prefab 、*.png、*.mat。

                            image

                                使用Sprite就简单多了,添加Tk2D Sprite对象或者添加TK2D Sprite组件,选择Collection和Sprite即可:

                              image

                                  如果有n个Sprite,需要组织管理起来,默认会想到空的对象(EGO), 如果不参与碰撞等动态监测,可使用Static Sprite Batcher。 选择需要静态化的Sprite,拖放为Batcher的子物体,在Inspator视图点击Commit,即可完成处理。
                                    有2点神奇之处:

                                    1 原来n个Sprite变为1个了,即仅仅是Static Sprite Batcher可见,其子物体消失了(点击Edit即可编辑)

                                    2 明显的减少了DC。

                                  imageimage

                                  步骤4: 代码实现 Clipped Sprite

                                      Clipped Sprite是Sprite的一种,可动态实现隐藏、可见。
                                      image

                                          通过动态设置Clipped Sprite的ClipRect的y值(y值范围0.0~1.0f之间)
                                          同时调整其localPostion的y轴,可模拟图片的隐藏、显示效果。
                                        另外,这个思想也挺有趣的,使用n个return null代替waitforSecond.

                                      private IEnumerator WaitForHit()
                                              {
                                                  float time = 0.0f;

                                                  while (!whacked && time < timeLimit)
                                                  {
                                                      time += Time.deltaTime;
                                                      yield return null;
                                                  }
                                              }

                                        步骤5:精灵动画(Sprite Animation)

                                      Sprite Animation也是基于Sprite Collection的。

                                    img/clip_settings.png

                                   

                                  显示动画,需要用Sprite With Animator组件,下面这张图一览无余:

                                  img/animated_sprite_inspector.png

                                   

                                  本文的整理到这里就结束了,完整的请参阅官方教程–《Whack a Mole

                                   

                                  注,本文使用的开发环境:

                                  • Unity 4.6.3
                                  • 2D toolkit 2.4.0

                                  C#程序员整理的Unity 3D笔记(十九):Unity 3D的Native 2D

                                  最早接触Unity是从4.1版本开始,故那个时候只知道Unity 3D,无Unity 2D。近一段时间,通过学习,了解到Unity 2D也是蛮火的。如在最新的Unity 5版本中,新建项目可以选择2D、3D的,且该选项较以往版本更加醒目:仿佛告诉世人Unity不仅仅是3D的,Unity Native 2D也是不错的选择。

                                  image

                                  下面就使用过程中,Unity Native 2D一些特有的features整理出来:

                                  1 Unity 2D新建工程不一样

                                  看了一下官方的说明,发现实际上新建项目选择2D、3D不是决定项目的唯一,因为2D、3D还可以工程创建完成后,在Editor下也可以重新选择的。

                                  新建2D项目,和3D项目大约有下面几个区别:

                                  区别1:摄像机投影默认为Orthographic(正交)

                                  image

                                  区别2:场景视图,默认为2D方式

                                  image

                                  区别3:Edit—Project Settings—Editor 中默认Mode为2D

                                  image

                                  区别4:导入(添加)图片资源时,2D的Texture Type为Sprite(2D and UI)

                                  image

                                  新建工程时候选择2D、3D模式,目前就找到就这4种区别。

                                   

                                  2 Unity 2D特有组件

                                  Unity 2D自从4.3—>4.6—>5.0,增加很多2D组件: 我们发现Unity 5集中提供了15中Physics 2D组件,说明2D、3D的一个重要的区别就是在Physics上。

                                  image

                                  其中,Polygon Collider 2D组件非常棒,它提供了集成可视化调节碰撞盒子,按住Shift键可以添加碰撞点、按住Ctrl键可以删除碰撞点–对不规则Sprite尤为有用

                                  image

                                   

                                  另外,有一个重要的2D组件是Sprite Render,这个是2D下非常重要的组件。

                                  image

                                  Sprite Render是用来对Sprite(精灵)进行渲染的组件,它有2个重要属性:

                                  • Sorting Layer:由小到大排序进行渲染和呈现,大的会遮住小的。
                                  • Order In Layer:同层中渲染的优先级,数字越大渲染优先级越高。

                                  注意,在Unity 2D中,一般不使用Z轴坐标,默认为0.

                                  同样的功能,也可以在3D中使用Z轴由大到小来实现Order–但是相比,没有2D下的Sorting Layer直观。 在Sorting Layer下,你可以预定Soring Layer,这样便于team 协作:

                                  image

                                   

                                  3 Unity 2D 其他

                                  2D的射线检测,3D检测是空间检测,2D则简单一些。

                                  image

                                  Physics2D.LinecastAll

                                  public static RaycastHit2D[] LinecastAll(Vector2 start, Vector2 end, int layerMask = DefaultRaycastLayers, float minDepth = -Mathf.Infinity, float maxDepth = Mathf.Infinity);

                                  Physics.Linecast

                                  public static bool Linecast(Vector3 start, Vector3 end, int layerMask = DefaultRaycastLayers);

                                  Physics2D.OverlapPointAll

                                  public static Collider2D[] OverlapPointAll(Vector2 point, int layerMask = DefaultRaycastLayers, float minDepth = -Mathf.Infinity, float maxDepth = Mathf.Infinity);

                                   

                                  Sprite.pixelsPerUnit = 100:1(默认100像素=1单位)

                                  image

                                   

                                  4 Unity 2D动画–Animator动画状态机,Animation动画编辑器

                                  image

                                  通过拖动多个Sprite即可自动生成Animation帧动画,在动态调节Sample率后,可观察到动画实时效果,非常简单。

                                   

                                  参考文献: