大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei。
今天呢,我们来一起做一个怀旧版的经典游戏打砖块。相信每一个和博主同龄的人对于这个游戏都有着一种独特的情感吧。这个游戏是博主小时候掌上游戏机里面比较好玩的一个游戏,玩家需要通过控制屏幕下方的横条,通过一个小方块来消灭屏幕上方的砖块,玩家每消灭一个砖块,就能够得到一定的分数,当消灭完整个屏幕上的方块后,即可进入下一关,而且屏幕下方的横条长度会增长。那么,关于这个游戏就暂且介绍到这里,我们下面开始今天的内容。
一、游戏界面
首先我们创建如下的游戏场景,这个游戏场景中我们使用一个Plane作为我们的游戏背景,我们将Plane的Rotation属性设置为90,180,0,使其与主摄像机垂直,我们将Plane命名为Background。接下来我们将主摄像机的投影方式改为正交投影,然后调整摄像机的视野范围,使我们的Background能够完全显示在游戏窗口中。
接下来,我们创建一个Cube并调整其大小,它将作为我们的游戏体,玩家需要控制它来接住小球。我们将它命名为PlayBoard。同样地,我们创建一个小球,将其命名为PlayBall。我们需要将PlayBoard和PlayBall的z坐标设置为相同的值,即保证它们是在一个平面上。为了让小球具备弹性,我们可以导入官方提供的物理材质资源包,这里我们选择Bouncy材质。
好了,到目前为止,我们的界面就已经完成了。下面我们来一起编写脚本实现脚本控制吧!
二、脚本控制
我们首先需要产生一组砖块。这里我们采用动态生成的方法,即先制作砖块的预设,然后根据预设克隆出新的砖块。预设在Unity3D中就是可复用的游戏体,使用预设可以减少内存资源的消耗。代码如下:
using UnityEngine;
using System.Collections;
public class CubeManager : MonoBehaviour {
//定义第一个砖块的位置
private float StartX=-6.20F;
private float StartY=4.625F;
//定义砖块单元
public GameObject[] Units;
void Start ()
{
//随机产生21x5个砖块
for(int i=0;i<21;i++)
{
for(int j=0;j<5;j++)
{
//根据i*j的奇偶性产生不同的砖块对象
GameObject UnitObject=null;
if(i*j % 2==0)
{
UnitObject=Units[0];
}else
{
UnitObject=Units[1];
}
//克隆砖块
Instantiate(UnitObject,new Vector3(StartX+i*0.625F,StartY-j*0.625F,-2),
Quaternion.Euler(new Vector3(90,180,0)));
}
}
}
}
其中砖块对象是一个Plane的预设,我们这里准备了黑白两种颜色的Plane预设,这样画面的色彩不会显得单调,主要这里要加上刚体和碰撞器,我们设置其Tag为UnitCube。
接下来,我们为白色横条编写脚本,在这段脚本中,横条只能在游戏界面内水平移动。代码如下:
using UnityEngine;
using System.Collections;
public class Operator : MonoBehaviour {
//球板的移动速度
public float MoveSpeed=3.0F;
//移动球板
void Update ()
{
if(Input.GetKey(KeyCode.A))
{
//当球拍未超过屏幕左侧时移动球拍,否则球拍不能再移动
if(transform.position.x>-5)
{
transform.Translate(Vector3.left*Time.deltaTime*MoveSpeed);
}else
{
transform.position=new Vector3(-5,transform.position.y,transform.position.z);
}
}
if(Input.GetKey(KeyCode.D))
{
if(transform.position.x<5)
{
transform.Translate(Vector3.left*Time.deltaTime* (-MoveSpeed));
}else
{
transform.position=new Vector3(5,transform.position.y,transform.position.z);
}
}
}
}
既然已经实现了对于横条的控制,那么我们接下来来实现小球的脚本,小球在游戏开始时会受到一个45度方向的力,这样小球就有了一个初速度,小球的反弹通过Unity的物理引擎来实现。当小球碰到砖块时,砖块将被销毁,玩家得到1分。当小球的位置低于横条的位置时,游戏结束。代码如下:
using UnityEngine;
using System.Collections;
public class Ball : MonoBehaviour {
[HideInInspector]
//定义玩家得分
public int Grade=0;
//任务是否失败
public bool IsDroped=false;
void Start ()
{
//将球旋转45度并向上发射
transform.Rotate(new Vector3(0,1,0) * 45);
transform.forward=new Vector3(0,1,0) * 45;
transform.rigidbody.AddForce(transform.forward*12F,ForceMode.Impulse);
}
void Update ()
{
//始终保证球与砖块在同一平面上
transform.position=new Vector3(transform.position.x,transform.position.y,-2);
//小球位置检测,低于球板位置时游戏结束
if(transform.position.y<=-4)
{
//这里添加游戏结束的逻辑
IsDroped=true;
}
}
void OnCollisionEnter(Collision mCollision)
{
//当碰到砖块时,销毁砖块
if(mCollision.gameObject.tag=="UnitCube")
{
Destroy(mCollision.gameObject);
Grade+=1;
}
}
}
好了,现在我们只需要把CubeManager脚本绑定在Background上,把Ball脚本绑定到小球上,把Operator脚本绑定到横条上,我们就可以运行游戏了 。
运行游戏的过程中,我们会发现一个问题就是当小球移动到游戏界面的边缘时会消失。理论上在这个位置小球应该会反弹回来,怎么办呢?我们继续回到游戏界面,在界面的顶部、左侧、右侧分别创建一个和PlayBall、PlayBoard共面的Cube。我们同样为这个Cube设置一个弹性材质.
到目前为止,这个游戏的核心部分已经全部讲解完毕。最后,我们做一个简单的游戏管理器GameManager来实现对玩家得分和游戏状态的更新:
using UnityEngine;
using System.Collections;
public class GameManager : MonoBehaviour {
private GUIText mGrade;
public GameObject Target;
void Start ()
{
mGrade=transform.GetComponent<GUIText>();
}
void Update ()
{
if(!Target.GetComponent<Ball>().IsDroped)
{
mGrade.text="得分:"+Target.GetComponent<Ball>().Grade.ToString();
}else
{
mGrade.text="游戏结束,您的得分为:"+Target.GetComponent<Ball>().Grade.ToString();
}
}
}
其中,关于玩家的得分和游戏状态都在Ball脚本中定义,大家可以自己去查阅。好了,这就是今天的博客了,希望对大家有用、希望大家喜欢。
每日箴言:不管是出于意愿还是无知,我们的成功和失败都不是别人招致的,而是自己决定的。——加思·斯坦
喜欢我的博客请记住我的名字:秦元培,我的博客地址是blog.csdn.net/qinyuanpei。
转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/24719939