我是从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场景中的摄像机用的
顺便贴一下源代码
public class CExample1 : MonoBehaviour
{
bool initialized = false; // initialization notifier
bool scrolling = false; // scrolling notifier
// This method will resize the a FilledSprite ( provided by name )
// to match the current view (resolution).
void Resize(string spriteName)
{
// Lookup the FilledSprite using its name.
OTObject sprite = OT.ObjectByName(spriteName);
if (sprite != null)
{
// We found the sprite so lets size it to match the screen's resolution
// We will assume the OTView.zoom factor is set to zero (no zooming)
sprite.size = new Vector2(Screen.width, Screen.height);
}
}
// application initialization.
// This method is called from the Update() function so we can be sure that
// all Orthello objects have been started.
void Initialize()
{
// resize filled sprites to match screen size
Resize("filled 1");
Resize("filled 2");
Resize("filled 3");
Resize("filled 4");
// set initialized notifier to true so we only initialize once.
initialized = true;
}
// Set scroll speed for a specific FilledSprite providing its name
void SetScroll(string spriteName, Vector2 scrollSpeed)
{
// lookup sprite
OTObject sprite = OT.ObjectByName(spriteName);
// set scroll speed
if (sprite != null)
(sprite as OTFilledSprite).scrollSpeed = scrollSpeed;
}
// Update is called once per frame
void Update () {
// Only go on if Orthello is valid.
if (!OT.isValid) return;
// check if we have to initialize
if (!initialized)
Initialize();
// only scroll when left mouse button pressed
if (Input.GetMouseButton(0))
{
// get delta position relative to screen center
Vector2 delta = (Input.mousePosition - new Vector3(Screen.width / 2, Screen.height / 2, 0));
delta = new Vector2(delta.x / Screen.width, delta.y / Screen.height);
// set scroll speed of layers - the more backwards the less scroll
SetScroll("filled 1", delta * 60);
SetScroll("filled 2", delta * 50);
SetScroll("filled 3", delta * 40);
SetScroll("filled 4", delta * 30);
scrolling = true;
}
else
{
// check if we are scrolling
if (scrolling)
{
// stop scrolling
SetScroll("filled 1", Vector2.zero);
SetScroll("filled 2", Vector2.zero);
SetScroll("filled 3", Vector2.zero);
SetScroll("filled 4", Vector2.zero);
scrolling = false;
}
}
}
}
首先理解一下OT的初始化方式,它并不是通过放在start中进行初始化的,而是放在update中,通过一个bool来判断是否已经初始化,如果你放到了start中肯定会导致物体找不到OT的-,- ,ok ,那么在此之前还要判断一下
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中物体比较好摆放,不好的地方就是从触摸坐标系到实际面坐标系要进行转化,