Unity3D小游戏之Flappy Birdヾ(๑╹◡╹)ノ"
emmmmm,今天介绍的小游戏是Flappy Bird,话不多说,我们开始今天的主题。(。・ω・。)
要完成这个小游戏,依然首先得分析出它的核心功能,拆分成一个个小功能并一一实现。对于Flappy Bird这个小游戏,我们可以分成小鸟的跳跃与移动,水管的随机生成,碰撞的死亡检测和水管的得分检测。
游戏中我们感觉到的是小鸟在跳跃是同时也在向前移动,这当然是可以的,但是我们又要写摄像机跟随的脚本,比较麻烦,那么我们有没有比较简单的方法呢?答案是有的,由于运动是相对的,我们在水管上挂载一个向左移动的脚本,就可以达到视觉上小鸟在向右移动的效果,这样我们控制小鸟的脚本只需要实现移动就行了,为了后面的碰撞检测的方便,我选择了rigidbody中AddForce方法来实现小鸟的跳跃,这里我们使用添加力的方式,可以让小鸟有一个加速度,这样也更加符合实际。
if(Input.GetButtonDown("Fire1"))
gameObject.GetComponent<Rigidbody2D>().AddForce(Vector3.up * upforce);//upforce的数值需要自己具体去测试多少合适
这样第一个功能就完成了,接下来我们要实现第二个功能了(~ ̄▽ ̄)~
首先制作出水管的预制体,(上面一个水管,下面一个水管,中间留出空隙,然后将两个水管拖至一个空物体下成为子物体)等等就可以直接Instantiate出来了,那么要实现高低不平,随机生成怎么实现呢。我们只需要new vector3(0,random,0)这样一个向量添加到默认的生成点就行了。(每隔几秒生成一个水管,也就是cd,前面的文章我介绍过所以这里就不介绍了)
if(time>start&&GameManager.isactive)
{
start += cd;
Vector3 pos = new Vector3(0,Random.Range(-2.5f, 1f), 0) + m_gameobject.transform.position;
Instantiate(m_gameobject, pos, Quaternion.identity) ;
}
这样就实现了水管的随机生成,然后就是水管移动
if(GameManager.isactive)
transform.Translate(Vector3.left * speed * Time.deltaTime);
接下来要实现的是一系列碰撞触发了ヾ(o・ω・)ノ
由于要检测碰撞,肯定是需要collider的,将小鸟和水管分别添加collider(水管的collider是将上下两个水管添加collider,然后中间的空隙也添加并且勾选Is Trigger选项),接下来检测碰撞。
void OnCollisionEnter2D(Collision2D coll)
{
if (coll.gameObject.tag == "Player")
{
GameManager.isactive = false; //死亡的碰撞检测,挂载在水管中的上水管和下水管上
}
}
void OnTriggerExit2D(Collider2D other)
{
if (other.tag == "Player")
{
m_gamemanager.score++; //得分的碰撞检测,挂载在水管的父物体上
}
}
(对了,还有设置一个地面和上界,防止飞到屏幕外但是无法得分也无法死亡的情况。我一开始就犯了这个错误)
至此核心功能基本上实现了,UI界面之类的由于有多种方法,实现也较为繁琐,我自己也有许多没有弄清楚,所以各位可以自己下去研究(`・ω・´)
另外我们为了丰富游戏,也可以在小鸟跳跃时发出音效,然后可以添加背景音乐,嫌天空盒背景单调了可以添加一个背景,这里强调一下,要让背景在水管或者小鸟的下面,我们必须要设置Layer的层级(层数越下面优先级越高?记不清了,可以自行测试),或者把Z坐标根据需求调整?这个方法还没有尝试过,不知道可不可行。然后死亡后重新开始游戏我目前只知道有两种方法,一个是写一个重置脚本,将所有生成的水管删除,小鸟回到开始的位置,得分归零等等一系列操作,这个较为复杂,我尝试了好几次都没有成功,然后我用了第二种方法,就是使用Scene.Manager中的Load方法来重载当前的场景,这个方法非常简单,只有短短几句,对于我这种菜鸡肯定是越简单越好啊(*/ω\*)(目前不知道有什么缺点,先实现了功能再说)
拙作链接:http://pan.baidu.com/s/1kVmlZJD 密码:z4o3
溜了溜了

浙公网安备 33010602011771号