项目结果演示##
要达到的功能简介:
1、无尽模式。。。。玩家只要不能满足游戏规则。就可以一直玩下去。
2、可以实现闯关积分。
3、地形管道的随机生成。
4、游戏主角的碰撞检测。
5、背景及相关音乐的播放。
6、整个游戏结束后的相关处理,当前分数,最好分数的处理,及从新开始。
一、相关素材的准备工作##
导入素材结果
图片的格式为true color保持图片的原始状态。不失帧。
相机的选择:有2种透视视角和正交视角。这里选择的是正交视角。整个游戏在3D环境中开发。
游戏的载体:Quad这是一个面片。只会显示一面。
二、游戏背景搭建##
1、材质球的选择:在这里选择如下图所示。这里扩充对Shader的学习了解。这里加大了Quad的Scale便于开发。
2、地面back的创建:与背景一样只是图片不一样。从新创建了一个Quad 面片。在这里要了解。父物体与子物体之间的大小,相对位置之间的关系。
3、pipe的创建:需要成对出现。我们要考虑上下管道的距离,在创建一个Quad,里面是pipe图片。
pipe不可以过大,不然会把整个给覆盖掉。
一个面片上出现几对管道。这个不是我们考虑,需要有人对着个进行策划。
还要注意pipe在z轴上的关系,避免出错。就是管道在bg前面,在back后面。
4、一个简单的面片创建好了,我们可以通过脚本进行整个游戏地图的移动,从而实现无尽模式。
下面进行主角,我们小鸟的创建了。
首先是创建一个Quad面片,把小鸟的Aphal通道图片贴到材质球上。但是有三个小鸟,那我们要进行处理。
通过控制Tiling和Offset属性显示为一张图片。并通过脚本控制小鸟运行时的上下摆动。
5、管道的随机生成。注意在整个back上的上下距离(需要有人专门做测试)。
6、给小鸟主角添加钢体组件,并且水平有一个移动速度。可以实现小鸟的一直飞行效果。
7、给小鸟,地面,管道添加碰撞器。对小鸟的旋转只能在z轴上旋转,只能在x上移动。
碰撞器的大小选着合理。
8、背景的移动,第一个背景过完之后,把第一个背景生成到最后一个。这样就可实现无尽模式了。
实现处理,找一个合适的触发器,在摄像机看不到当前背景时。实现此功能。
触发器的添加。。。添加到哪里才合适。。。要考虑。。。
单列模式的运用(游戏管理器)
9、小鸟的水平移动控制。做好场景之后我们需要控制主角的行走了。主角在水平的速度需要特定的(有人策划)。
但我们按下鼠标左键的时候小鸟需要一个向上的速度。
10、摄像机跟随小鸟(主角)。这里用的是第一人称视角。
11、分数控制。对分数进行控制。当小鸟闯过一堆管道的时候,我们就需要显示分数加一分。
我们需要在一对管道的中间增加一个触发器。用来判断小鸟有没有通过这个管道。
12、游戏状态控制:游戏开始状态,游戏进行状态,游戏结束状态。
游戏开始状态,不能让小鸟播放动画,不能跳跃。游戏进行时,这些状态可以实施。
13、游戏结束状态控制。游戏在碰到地面,碰到管道的时候,游戏就要结束了。
(只有游戏处于进行状态的时候,才会有游戏动画效果,和鼠标左键按下的时候施加一个向上的力)
对小鸟进行一个碰撞检测就行,如果碰撞的是管道或者地面就把游戏状态设置为游戏结束状态。
还有个问题,我们游戏运行时让摄像机的照射范围处在场景中。需要对那个摄像机的y轴进行限制。
三、声音的添加,游戏记录的显示###
1、没有声音的游戏算游戏吗?从这句话我们可以看出声音的重要性。我们要学会控制在哪里进行声音的播发。声音的植入。
2、游戏记录面板的设定:在这些逻辑可以实施后,我们要对游戏进行一个后处理。玩家结束游戏之后。
我们需要显示出一个面板用来控制当前的分数,及最好的历史记录。
用UGUI做一个控制显示分数的面板.
通过代码对分数的实施控制.
首先明确,这个面板必须在游戏状态结束的时候才会显示出来,当游戏状态处于结束状态时,我们必须把玩家获取的分数穿过来显示在UI面板上.
控制分数的单列模式的运用(单列模式很重要).
UI与代码控制的相联系.
public static GameMenu _instance;
public Text nowScore;
public Text highScore;
public Image starting;
void Awake()
{
_instance = this;
gameObject.SetActive(false);
}
public void UpdateScore(float nowScore)
{
float highScore=PlayerPrefs.GetFloat("score",0);
if (nowScore > highScore)
{
highScore = nowScore;
}
PlayerPrefs.SetFloat("score",highScore);
print("123");
this.nowScore.text = nowScore+"";
this.highScore.text=highScore+"";
// if (Input.GetMouseButtonDown(0) && GameManager._intance.GameState == GameManager.GAMESTATE_END)
// {
// Rect rect=
// }
}
按钮事件的重新开始.游戏结束的时候我们通过从新开始按钮发生点击的时候.
把游戏重新加载这个场景.用到SceneManager.LoadScene方法加载场景.
public void AgainGame()
{
SceneManager.LoadScene(0);
//Application.LoadLevel(0);
}
项目总结###
在这里Flapppy Birds项目就告一段落了.想想我们在这个项目里面有哪些比较重要的东西.
1.明确Shader这一方面的重要性.现在我们只是用到了其中的一个反面.还有那么多方面我们要去认真研究Shaer.
2.明确帧与Time类中的东西的关系.这样写代码的时候才不会不找边际.
3.摄像机跟随Bird用了第三人称视角.那我们要了解第一人称视角与第三人称视角.
4.PlayerPrefs用来的用法.相当于一个仓库.把我们需要的东西承储好,用的时候在拿过来用.
5.在以后的多场景游戏当中我们要通过SceneManager.LoadScene来加载场景.
6.在这个小游戏当中,我们就多次用到了单列模式,明确单列模式的用法,意义.(一个静态构造函数,在本类中可以通过,类名.(成员)获取信息,在非本类中通过类名.单列.成员名获取.保证了信息的一份性,不可new()多分.单列的意义)