2013年9月12日 星期四

unity下2d和3d混合使用教程,插件为OrtHello (一)

http://blog.csdn.net/djy2130/article/details/7030166


我是从cocos2d 转移阵营过来的 unity下开发2d游戏真是不习惯。。。特别是2d中有许多特性是非常必要的,但是unity本身又支持得非常烂的...所以这时候就要用过第3方插件,我试过EZGUI, sm2,gm2,还有一个忘了名字的2d插件,但是都不符合我的要求,在我百无聊赖中终于看见了它——OrtHello ——>_<我要一个能很好的结合itweens(动作引擎),又能和3d场景混合,还要和cocos2d有那么丁点相像,最后还能利用一些cocos2d项目中的资源(其实OrtHello 要用的话要把plist转成xml,这本身也是蛋碎的事情)

好吧,我搜了一遍几乎没有OrtHello 的中文教材,连英文的教材也十分稀有,我甚至怀疑没有人用过它来做游戏——但是这并不妨碍它成为一个游戏的引擎
因为我要做一个类似东方的弹幕游戏,所以可能不会研究除了弹幕游戏之外的一些特性,于是写下几篇我的心得作为抛砖引玉之用=>

http://www.wyrmtale.com/products/unity3d-components/orthello
官方网站,本体是免费的,还有一个收费版的,但是我看了一下对我貌似没啥用所以就忽略了,如果是独立游戏开发者的话买之可能还是有必要的。
下完之后导入,可看到Orthello目录下有三个文件夹Examples,Objects 和 Standard Assets  
如果你的项目非常依赖这个引擎的话建议把 Standard Assets 放到根目录的unity最先编译的三个目录中-,-这你都不懂别问我了,我是建议和iTweens一起到Plugins中
Examples是例子可以删去的...Objects 是预设Prefabs物体,是十分重要的。


先打开第一个例子
运行后可以看到效果是一个填充的图片填满了整个屏幕,有明显层次感,然后鼠标点哪就去哪


首先我们理解一个orthello的运行方式,它必须要在场景中有一个OT的东西,我们还可以看到OT下有4个子节点,分别是Animations,Containers,Prototypes,View
Animations 是对Containers中的spritesheet (- -姑且让我这么叫,其实应该是Texture)进行动作管理,就是定义从哪一帧到哪一帧是什么动作
Containers 是放置Texture的地方,其实你不用对材质有过多要求的话,transparent这个材质应该已经够你用了
Prototypes  是设定的预设的OT物体而使用的
View 是控制2d场景中的摄像机用的
顺便贴一下源代码
[csharp] view plaincopy
  1. public class CExample1 : MonoBehaviour  
  2. {  
  3.   
  4.     bool initialized = false;           // initialization notifier  
  5.     bool scrolling = false;             // scrolling notifier  
  6.   
  7.     // This method will resize the a FilledSprite ( provided by name )  
  8.     // to match the current view (resolution).  
  9.     void Resize(string spriteName)  
  10.     {  
  11.         // Lookup the FilledSprite using its name.  
  12.         OTObject sprite = OT.ObjectByName(spriteName);  
  13.         if (sprite != null)  
  14.         {  
  15.             // We found the sprite so lets size it to match the screen's resolution  
  16.             // We will assume the OTView.zoom factor is set to zero (no zooming)  
  17.             sprite.size = new Vector2(Screen.width, Screen.height);  
  18.         }  
  19.     }  
  20.   
  21.     // application initialization.  
  22.     // This method is called from the Update() function so we can be sure that  
  23.     // all Orthello objects have been started.  
  24.     void Initialize()  
  25.     {  
  26.         // resize filled sprites to match screen size  
  27.         Resize("filled 1");  
  28.         Resize("filled 2");  
  29.         Resize("filled 3");  
  30.         Resize("filled 4");  
  31.         // set initialized notifier to true so we only initialize once.  
  32.         initialized = true;  
  33.     }  
  34.   
  35.     // Set scroll speed for a specific FilledSprite providing its name  
  36.     void SetScroll(string spriteName, Vector2 scrollSpeed)  
  37.     {  
  38.         // lookup sprite  
  39.         OTObject sprite = OT.ObjectByName(spriteName);  
  40.         // set scroll speed  
  41.         if (sprite != null)  
  42.             (sprite as OTFilledSprite).scrollSpeed = scrollSpeed;  
  43.     }  
  44.       
  45.     // Update is called once per frame  
  46.     void Update () {  
  47.         // Only go on if Orthello is valid.  
  48.         if (!OT.isValid) return;  
  49.   
  50.         // check if we have to initialize  
  51.         if (!initialized)  
  52.             Initialize();  
  53.   
  54.         // only scroll when left mouse button pressed  
  55.         if (Input.GetMouseButton(0))  
  56.         {  
  57.             // get delta position relative to screen center  
  58.             Vector2 delta = (Input.mousePosition - new Vector3(Screen.width / 2, Screen.height / 2, 0));  
  59.             delta = new Vector2(delta.x / Screen.width, delta.y / Screen.height);  
  60.             // set scroll speed of layers - the more backwards the less scroll  
  61.             SetScroll("filled 1", delta * 60);  
  62.             SetScroll("filled 2", delta * 50);  
  63.             SetScroll("filled 3", delta * 40);  
  64.             SetScroll("filled 4", delta * 30);  
  65.             scrolling = true;  
  66.         }  
  67.         else  
  68.         {  
  69.             // check if we are scrolling  
  70.             if (scrolling)  
  71.             {  
  72.                 // stop scrolling  
  73.                 SetScroll("filled 1", Vector2.zero);  
  74.                 SetScroll("filled 2", Vector2.zero);  
  75.                 SetScroll("filled 3", Vector2.zero);  
  76.                 SetScroll("filled 4", Vector2.zero);  
  77.                 scrolling = false;  
  78.             }  
  79.         }  
  80.     }  
  81. }  


首先理解一下OT的初始化方式,它并不是通过放在start中进行初始化的,而是放在update中,通过一个bool来判断是否已经初始化,如果你放到了start中肯定会导致物体找不到OT的-,- ,ok ,那么在此之前还要判断一下
[csharp] view plaincopy
  1. OT.isValid  
如果要寻找一个ot  object请使用ot。objectbyname的方式,这样会搜索得更快
----------------------------------------------------------------------------我是传说中的分割线------------------------------------------------------------
说完了上半节该说下半节了,首先推荐大家不要用Unity自带的GUI,因为那不仅不好用而且容易造成各种排列错误orz
推荐大家还是用投影摄像机,照一个面,最后将2d摄像机和3d摄像机的合成
2DLayer->放置2D物体,是main carema,并且受到OT的view的影响。<-投影摄像机
3DLayer->放置3D物体,可以自己控制,可用来做场景的背景什么的 <- 3d摄像机


通常来说如果不需要3d和2d混搭,那么只需OT的view控制就可以了<-它会自动找到场景的main carema,然后进行一些设置,这些设置基本上已经定死了没什么要改的,
唯一可以改的地方就是找到OTView
然后找到piexl prefect resolution
将x和y设置成你想要的大小,然后去掉勾ALways piexl  prefect   这样子在任何尺寸下都会进行缩放的比例适应屏幕,
如果勾上ALways piexl  prefect  则是按照真实的像素投影到屏幕上,并且中心点是屏幕的正中心(0,0)
上面那个我的例子就是这样做的,我打算放到iphone4中,所以屏幕分辨率大小为-320~~320,竖着是-480~~480,中心点是0,0,这样在3d中物体比较好摆放,不好的地方就是从触摸坐标系到实际面坐标系要进行转化,