经典游戏讲解

 一、游戏界面

     首先我们创建如下的游戏场景,这个游戏场景中我们使用一个Plane作为我们的游戏背景,我们将PlaneRotation属性设置为90,180,0,使其与主摄像机垂直,我们将Plane命名为Background。接下来我们将主摄像机的投影方式改为正交投影,然后调整摄像机的视野范围,使我们的Background能够完全显示在游戏窗口中。

 

     接下来,我们创建一个Cube并调整其大小,它将作为我们的游戏体,玩家需要控制它来接住小球。我们将它命名为PlayBoard。同样地,我们创建一个小球,将其命名为PlayBall。我们需要将PlayBoardPlayBallz坐标设置为相同的值,即保证它们是在一个平面上。为了让小球具备弹性,我们可以导入官方提供的物理材质资源包,这里我们选择Bouncy材质。

 

       好了,到目前为止,我们的界面就已经完成了。下面我们来一起编写脚本实现脚本控制吧!

      二、脚本控制

      我们首先需要产生一组砖块。这里我们采用动态生成的方法,即先制作砖块的预设,然后根据预设克隆出新的砖块。预设在Unity3D中就是可复用的游戏体,使用预设可以减少内存资源的消耗。代码如下:

[csharp] view plaincopyCODE上查看代码片派生到我的代码片

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预设,这样画面的色彩不会显得单调,主要这里要加上刚体和碰撞器,我们设置其TagUnitCube

      接下来,我们为白色横条编写脚本,在这段脚本中,横条只能在游戏界面内水平移动。代码如下:

[csharp] view plaincopyCODE上查看代码片派生到我的代码片

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分。当小球的位置低于横条的位置时,游戏结束。代码如下:

[csharp] view plaincopyCODE上查看代码片派生到我的代码片

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脚本绑定到横条上,我们就可以运行游戏了 。

 

     运行游戏的过程中,我们会发现一个问题就是当小球移动到游戏界面的边缘时会消失。理论上在这个位置小球应该会反弹回来,怎么办呢?我们继续回到游戏界面,在界面的顶部、左侧、右侧分别创建一个和PlayBallPlayBoard共面的Cube。我们同样为这个Cube设置一个弹性材质.

 

     到目前为止,这个游戏的核心部分已经全部讲解完毕。最后,我们做一个简单的游戏管理器GameManager来实现对玩家得分和游戏状态的更新:

[csharp] view plaincopyCODE上查看代码片派生到我的代码片

using UnityEngine;  

using System.Collections;  

  

public class GameManager : MonoBehaviour {  

      

    private GUIText mGrade;  

    public GameObject Target;  

      

    void Start ()   

    {  

       mGrade=transform.GetComponent();  

    }  

      

    void Update ()   

    {  

       if(!Target.GetComponent().IsDroped)  

      {  

         mGrade.text="得分:"+Target.GetComponent().Grade.ToString();  

      }else  

      {  

         mGrade.text="游戏结束,您的得分为:"+Target.GetComponent().Grade.ToString();    

      }  

    }  

}  

  

 


你可能感兴趣的:(经典游戏讲解)