[Unity2D]一个小游戏的实现思路
一、 游戏Screen流程
二、游戏脚本结构
游戏整体管理脚本(全局脚本添加到Camera上):
整个游戏的(级别,开始,结束)是由LevelManager管理器脚本负责控制
mainMenuScript菜单脚本负责绘制菜单,从菜单启动游戏的主Screen
ScoreTimer计算时间
backgroundMusic播放背景音乐
游戏对象脚本(添加到各自的GameObject里面):
玩家主角对象PlayerScript负责1 监控输入左右移动玩家 2 检测是否捡到能量包
子弹对象bulletScript 1 检测碰撞分离产生新的小球 2 带有尾巴的向上移动效果,碰到天花板销毁子弹
小球对象 左右小球的脚本BallMovementLeft 1 控制小球运动 2 检测碰撞,碰撞到玩家会触发游戏结束
能量包对象 powerUpScript 1控制5秒后消失
脚本重构:
将各个具体的GameObject之间的关联通信抽取出来,通过一个全局的单例脚本来进行管理。
三、实现的逻辑细节
(1)按钮菜单通过GUI和GUISkin来进行绘制。
如:
GUI.skin = mySkin; // 设置GUI的皮肤
GUI.Box(new Rect(0, 0, 700, 525), "", "MenuScreen");//加载皮肤的自定义样式
if(GUI.Button(new Rect(215 ,205, 265,60), "", "CustomFont"))
{
// 加载主游戏的Screen
Application.LoadLevel("Game");
Time.timeScale = 1;
}
(2)通过Layers来判断和区别各种不同类型的GameObject之间的碰撞检测。
如:
void OnCollisionEnter(Collision collision)
{
// 球和玩家主角发生碰撞
if(collision.gameObject.layer == 12)
{
……
}
// 碰到墙壁,反向运动
if(collision.gameObject.layer == 11)
{
xSpeed = -xSpeed;
}
}
(3)通过Tags来查找GameObject
如:
// 销毁当前的所有球
var clones = GameObject.FindGameObjectsWithTag("Ball");
foreach (GameObject clone in clones)
{
Destroy(clone);
}
// 销毁所有的能量包
var upgrades = GameObject.FindGameObjectsWithTag("PowerUp");
foreach (GameObject upgrade in upgrades)
{
Destroy(upgrade);
}
(4)不同GameObject脚本之间的交互,通过修改脚本的公共属性来实现一些互相之间通信的功能。比如,游戏主角被敌人杀死,这时候需要把levelManager的公共属性gameOver 修改为true,levelManager脚本就会触发显示游戏结束的菜单。
如在Start方法里面获取脚本对象的代码:
levelManager = FindObjectOfType(typeof(LevelManager)) as LevelManager;
GameObject.Find("Main Camera ").GetComponent< LevelManager >()。