[Unity3D]Unity3D游戏开发之《经典打砖块》游戏项目讲解

      大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是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


 

qinyuanpei CSDN认证博客专家 .NET Python 伪·全栈攻城狮
谢谢你,在这世界的角落,找到我,一个即将进入而立之年的中年大叔,常年以 飞鸿踏雪 的花名混迹江湖。在现实生活中,我是一名 伪·全栈攻城狮,因为我觉得,什么都略懂一点,生活会更多彩一些。目前,主要关注.NET、.NET Core、Python、数据分析、微服务、Web 等技术方向。日常行为:读书、写作、电影、烹饪、洞箫等。喜欢看日剧/纪录片/科普、刷B站、刷LeetCode等。
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页