打砖块教学(初学:5)

首先制作所需要的UI界面:
在Hierarchy属性框内创建 3D Object 物体 并重命名为BackGround,调节位置使其充满摄像机的全部视角。在这里插入图片描述
Project->Assets->右键单击选择Folder创建文件夹并重命名为Material用于储存材质,邮件单击生成的文件夹,选择Material创建材质,更改材质的颜色,并且重命名为BG标识它使BackGround的材质更改它的颜色,使其处于想要的颜色
在这里插入图片描述
将材质拖拽到BackGround中
在这里插入图片描述
绘制地面:
在Hierarchy属性栏中右键->3D Object->Cube 调节位置,并重命名为Floor当作游戏的地面,如果想要更改地面的颜色,与制作背景颜色的步骤一样
在这里插入图片描述
创建一个空物体:在Hierarchy属性框中右键->creat empty,然后创建三个Cube步骤如上,调节好位置
在这里插入图片描述
将空物体重命名为Wall,三个Cube分别重命名为Up,Right,Lift(右键单击Cube选择Rename重命名物体)
在这里插入图片描述
制作砖块:创建一个空物体并重命名为AllBrick在其中创建子物体Cube,调节位置如图
在这里插入图片描述
创建一个Cube与Sphere(在Hierarchy->3D Object->Sphere),将Cube重命名为CrushBrick将Sphere重命名为Ball,并调节到如图位置
在这里插入图片描述
制作相应物体的Material(材质),个人审美不好,请自行修改颜色
在这里插入图片描述

至此,打砖块的UI界面已经基本制作好。
开始添加脚本,通过脚本内的方法来控制小球,碰撞板等,使其能够完成我们想要的功能。
实现碰撞板移动的功能:
在Project属性框里右键点击Assets创建一个空文件夹命名为Scripts用来保存所有脚本资源,右键单击Scripts创建C#脚本,重命名为CrushBrick,如下
在这里插入图片描述
在脚本中编写碰撞板的功能代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CrushBrick : MonoBehaviour {
    public float speed;//定义碰撞板的速度
    
    public float xMin;//用于限制碰撞板延x轴的最小坐标
    public float xMax;//用于限制碰撞板延x轴的最大坐标
    public static Vector3 pos;//用于获取碰撞板的位置
	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {

        float hor = Input.GetAxisRaw("Horizontal");
        if (hor != 0)
        {
            pos = transform.position;//将脚本所挂物体的当前位置给变量pos
            pos.x -= pos.x * speed * hor * Time.deltaTime;//定义碰撞板的移动速度
            pos.x = Mathf.Clamp(pos.x, xMin, xMax);//限制碰撞板延x轴的最大最小坐标
            transform.position = pos;//将修改后的碰撞板坐标功能等赋值给脚本所挂物体的坐标
        }
	}
}

这样就完成了对碰撞板左右移动的功能实现,接下来开始实现小球的功能,首先进行需求分析,我们需要小球所具有的功能如下:1.小球具有弹力的功能,即当小球触碰到墙壁,碰撞板,砖块等物体时会向某个方向反弹,当掉落到地面也就是Floor上时会死亡,也就是重新开始游戏,当游戏未开始之前,球与碰撞板是一起运动

实现弹力的过程:若想要小球具有弹力,则应该给它添加物理刚体(注:物体的弹力,静摩擦,动摩擦的设置在它所携带的刚体组件里面)具体设置如下:
在Material文件上右键选择 Creat->Physic Material,由于我们想要使弹力最大,但是不想要它有动摩擦力,或者静摩擦力所以要将动摩擦与静摩擦力设置为0,弹力设置成1(0为最小1为最大)如下
在这里插入图片描述
其中第一个选项为动摩擦力,第二个是静摩擦力,第三个是弹力
然后将这个物理组件挂到Ball上,如下
在这里插入图片描述
然后开始对球功能的实现
首先要知道,目前球只是有了弹力的这个物理属性,但是,如果不给它一个初速度,让它动起来,与其他物体发生碰撞,那么它也不是我们想要的结果,所以首先要给它一个初速度,而若想能给小球添加速度,小球则必须具有一个刚体组件,在Add Component里面输入Rigidbody添加刚体组件。在这里插入图片描述
由于不想让小球的弹射速度发生变化,所以将他的质量(Mass)设为最小,阻力(Drag)设为0,Angular Drag设为0,并且把Use Gravity取消勾选
在这里插入图片描述
在Scripts文件中新建脚本命名为Ball
脚本内容如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ball : MonoBehaviour {

    public float speed;//定义球弹出的速度
    public Rigidbody ball;//由于球的速度函数在刚体的类里面,所以要获取到球的刚体
	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {

        if (Input.GetKeyDown(KeyCode.Space))//判断,当用户摁下空格的时候执行下面的操作
        {
            Vector3 ba = new Vector3(1f, 1f, 0).normalized;//定义一个延着xoy平面的45度的方向向量并把这个方向向量单位化
            ball.velocity = ba * speed;//将速度与方向赋值给ball
        }
	}
}

别忘了给Ball添加刚体组件,步骤如上,然后将脚本挂在Ball上,将定义的变量赋上值
在这里插入图片描述
现在球实现了弹出的功能,接下来实现游戏未开始,小球跟随碰撞板一起运动的功能。
在Ball脚本中添加如下代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ball : MonoBehaviour {

    public float speed;//定义球弹出的速度
    public Rigidbody ball;//由于球的速度函数在刚体的类里面,所以要获取到球的刚体
    public CrushBrick CB;//定义一个CrushBrick类的对象,便于对其中布尔值进行判断
    public Transform ba;//获取到Ball的Transform组件,便于对其位置进行操作
	// Use this for initialization
	void Start () {
		
	}
    
    // Update is called once per frame
    void Update () {
        
        if (CrushBrick.isplaying == false)
        {
            Vector3 pos = new Vector3(0, 1, 0);
            ba.transform.position = CB.transform.position + pos;
        }
        if (Input.GetKeyDown(KeyCode.Space))//判断,当用户摁下空格的时候执行下面的操作
        {
            CrushBrick.isplaying = true;
            Vector3 ba = new Vector3(1f, 1f, 0).normalized;//定义一个延着xoy平面的45度的方向向量并把这个方向向量单位化
            ball.velocity = ba * speed;//将速度与方向赋值给ball
        }
	}
}

对CrushBrick脚本进行如下的代码添加

public static bool isplaying = false;//定义一个布尔类型的变量用于判断游戏是否已经开始

这样就完成了在游戏没开始之前小球跟随着碰撞板一起运动的功能,接下来实现小球碰到地面,游戏结束,并且让游戏直接重新开始的功能
新建脚本命名为Floor
脚本中的代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Floor : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        
		
	}
    private void OnCollisionEnter(Collision collision)
    {
        CrushBrick.isplaying = false;//将游戏判定为未开始
        SceneManager.LoadScene(0);//重新载入场景
    }
}

这样就实现了当小球落到地面上时,游戏结束,重新开始的功能
下面来实现,当小球碰撞到砖块时,砖块消除的功能
新建脚本,命名为AllBrick,代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AllBrick : MonoBehaviour {

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
    private void OnCollisionEnter(Collision collision)
    {
        Destroy(gameObject);
    }
}

然后将此脚本挂在所有砖块上,就实现了当小球触碰到砖块时砖块自我销毁的功能
接下来实现游戏生命显示的功能:
首先需要在unity中创建一个Text,系统会自动创建一个Canvas与EventSystem,这不用管,只需要知道unity中所有的UI元素都是以Canvas为父节点的,也就是说Canvas包含了所有的UI元素
如下:
在这里插入图片描述
将Text的毛点与界面的左定点对其,将Text文本框中的文字修改为Lift-Times:3,将下面字号的大小改成适当大小,显示方式改成跟随文字大小调节的模式也就是Overflow,防止字体太大不文本框中的大小装不下导致输入的字不显示。
下面进行一下需求分析,当小球掉落地面的时候,游戏的生命值应该减一,假设有增加生命的道具,游戏的生命值应该加一。
首先实现小球掉落地面游戏生命减一的功能需求,
在Floor脚本中添加的代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class Floor : MonoBehaviour {

    // Use this for initialization
    public Text LiftTimes;//获取到生命显示的那个组件
    public static int lift = 3;//定义生命数
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        
		
	}
    private void OnCollisionEnter(Collision collision)
    {
        lift--;//如果与地面发生碰撞则生命减一
        LiftTimes.text = "lift-Times:" + lift;//将生命减一之后的生命数显示出来
        CrushBrick.isplaying = false;//将游戏判定为未开始
        SceneManager.LoadScene(0);//重新载入场景
        
    }
}

这样就完成了当小球落地之后生命数减一的功能需求,但是在现实中,当生命数为0时应该显示游戏结束,所以想要添加这样的功能需要做以下处理
在Canvas中添加Text并对其进行如下操作
在这里插入图片描述
由于游戏开始的时候,我们不想让其显示,所以取消勾选,让它处于不显示的状态。
在Floor脚本中添加如下代码:

 private void OnCollisionEnter(Collision collision)
    {
        lift--;//如果与地面发生碰撞则生命减一
        LiftTimes.text = "lift-Times:" + lift;//将生命减一之后的生命数显示出来
        CrushBrick.isplaying = false;//判定此次游戏结束
        if (lift < 0)//当游戏的生命数小于零时
        {
            GameOver.SetActive(true);//显示游戏结束的那个见面
            lift = 0;//将显示的界面中游戏生命数设置为零
            LiftTimes.text = "lift-Times:" + lift;//将游戏的显示判定为设置的值
            Ball.judge = false;//判定条件设为否,用来使球不能再有速度
        }
    }

这样就实现了当生命值为零时显示游戏结束的提示画面。
并且在Ball中添加如下控制判断的代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Ball : MonoBehaviour {

    public float speed;//定义球弹出的速度
    public Rigidbody ball;//由于球的速度函数在刚体的类里面,所以要获取到球的刚体
    public CrushBrick CB;//定义一个CrushBrick类的对象,便于对其中布尔值进行判断
    public static bool judge = true;//为了判断游戏结束不能再给速度的功能
	// Use this for initialization
	void Start () {
		
	}
    
    // Update is called once per frame
    void Update () {
        if (CrushBrick.isplaying == false)//当游戏判定为未开始时
        {
            Vector3 a = new Vector3(0, 1, 0);//定义一个长度为了方便控制球的位置
            transform.position = CB.transform.position + a;//再游戏未开始之前将球的位置始终放在碰撞板的上方
        }
        if (Input.GetKeyDown(KeyCode.Space) && judge == true && CrushBrick.isplaying ==false)//判断,当用户摁下鼠标左键的并且游戏未开始时候执行下面的操作
        {
            CrushBrick.isplaying = true;//当判定条件都成立的时候,设置游戏为开始状态
            Vector3 ba = new Vector3(1f, 1f, 0).normalized;//定义一个延着xoy平面的45度的方向向量并把这个方向向量单位化
            ball.velocity = ba * speed;//将速度与方向赋值给ball 
            Debug.Log(CrushBrick.isplaying + "Ball");
        }    
	}
    
}

这样就完成了打砖块的基本功能。
接下来为游戏添加一点可玩性,在游戏开局时将可打破的砖块设置为随机颜色
在脚本CrushBrick中添加如下代码

void Start () {
        this.GetComponent<MeshRenderer>().material.color = Random.ColorHSV();//获取到脚本所挂物体的MeshRenderer组件中material的color属性,并且给其赋予随机颜色的值
        
    }

这样就实现了脚本所挂物体的随机颜色,
下面添加增加游戏生命的办法,首先需要一张图片,这张图片可以是在网上下载的也可以从别处找的,图片上最好有心形,这里提供一张图片在这里插入图片描述
新建一个Quad (右键->3DObject->Quad),命名为Heart,新建一个材质命名为Heart,,新建一个文件夹命名为Textures(存放资源)将照片拖入文件夹
在这里插入图片描述
将图片拖入材质球的Albedo中
在这里插入图片描述
将材质球拖到Heart中
在这里插入图片描述
由于材质球看着有点暗,将材质球的Shader选项选择成Unlit/Texture
在这里插入图片描述
然后将Heart制作成预制体,也就是拖入prefabs文件夹中
在这里插入图片描述
删除Heart,这样就完成了预制体的制作,然后在AllBrick脚本中添加如下代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class AllBrick : MonoBehaviour {

    // Use this for initialization
    public  GameObject LiftTool_Prefab;//为了获取生命道具的预制体
    public Text Lifttime;
    public enum Brick_Type//定义枚举类型,用于制作生命道具的功能
    {
        Normal,//正常砖块
        lift_brick//有生命道具功能的砖块
    }
    public Brick_Type CurrType;
    void Start () {
        this.GetComponent<MeshRenderer>().material.color = Random.ColorHSV();//给所挂物体随机赋予颜色
        
    }
	
	// Update is called once per frame
	void Update () {
		
	}
    private void OnCollisionEnter(Collision collision)
    {
        
        if(CurrType == Brick_Type.lift_brick)//当枚举类型的元素为Lift_brick时
        {    
            Floor.lift++;//生命值+1
            Lifttime.text = "lift-Times:" + Floor.lift;//将变化后的生命值显示出来
            Destroy(gameObject);//销毁脚本所挂的物体
            GameObject Lift = GameObject.Instantiate(LiftTool_Prefab);//实例化预制体
            Lift.transform.position = transform.position;//将预制体的位置放在销毁的砖块的位置
            
        }
        if(CurrType == Brick_Type.Normal)//如果枚举类型的元素为Normal时
        {
            Destroy(gameObject);//销毁脚本所挂的物体
        }
    }
}

将应该赋予的参数在unity外部中赋予,这样就完成了当小球碰撞到带有生命道具的砖块时,生命值加一的功能
在这里插入图片描述
在这里插入图片描述
然后开始实现,当所有的砖块都已经打完之后,提示游戏通关的功能,首先与游戏结束的界面一样,我们要创建一个Text,在其中的文字输出栏输入我们想要显示的信息,然后取消显示。
在这里插入图片描述
在AllBrick脚本中添加如下代码

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class AllBrick : MonoBehaviour {

    // Use this for initialization
    public  GameObject LiftTool_Prefab;//为了获取生命道具的预制体
    public Text Lifttime;
    public static int Lifts = 0;//定义最初消除砖块的数量为0
    public GameObject pass;//用于获取游戏通关之后的界面
    public CrushBrick CB;//定义一个CrushBrick类的对象,用于获取碰撞板的位置
    public Ball Ba;//定义一个Ball类的对象,用于获取球的位置
    public enum Brick_Type//定义枚举类型,用于制作生命道具的功能
    {
        Normal,//正常砖块
        lift_brick//有生命道具功能的砖块
    }
    public Brick_Type CurrType;
    void Start () {
        this.GetComponent<MeshRenderer>().material.color = Random.ColorHSV();//给所挂物体随机赋予颜色
        
    }
	
	// Update is called once per frame
	void Update () {
		
	}
    private void OnCollisionEnter(Collision collision)
    {
        Lifts++;
        if(CurrType == Brick_Type.lift_brick)//当枚举类型的元素为Lift_brick时
        {    
            Floor.lift++;//生命值+1
            Lifttime.text = "lift-Times:" + Floor.lift;//将变化后的生命值显示出来
            Destroy(gameObject);//销毁脚本所挂的物体
            GameObject Lift = GameObject.Instantiate(LiftTool_Prefab);//实例化预制体
            Lift.transform.position = transform.position;//将预制体的位置放在销毁的砖块的位置
            
        }
        if(CurrType == Brick_Type.Normal)//如果枚举类型的元素为Normal时
        {
            Destroy(gameObject);//销毁脚本所挂的物体
        }
        if (Lifts == 12)
        {
            pass.SetActive(true);//将通关的信息显示出来
            Vector3 b = new Vector3(0, 1, 0);
            Ba.transform.position = CB.transform.position + b;//重置球的位置
            Ball.judge = false;//将其判定为false
        }
    }
}

这样就完成了,当所有砖块都销毁之后,提示游戏通关界面的功能
接下来制作碰撞特效,碰撞声音,死亡声音的功能,首先要知道,碰撞特效是想用粒子系统来做,
首先创建一个粒子系统(右键->Effect->partical…)t调节属性如下
在这里插入图片描述
再创建一个材质球,挂到粒子系统上面,创建脚本,命名为ParticalDestory,用于控制粒子的销毁时间,其中的代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ParticleDestory : MonoBehaviour {
    public float destoryitem;
	// Use this for initialization
	void Start () {
        Destroy(gameObject, destoryitem);
	}
	
	// Update is called once per frame
	void Update () {
		
	}
}

然后在Floor与AllBrick中添加代码如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class AllBrick : MonoBehaviour {

    // Use this for initialization
    public  GameObject LiftTool_Prefab;//为了获取生命道具的预制体
    public Text Lifttime;
    public static int Lifts = 0;//定义最初消除砖块的数量为0
    public GameObject pass;//用于获取游戏通关之后的界面
    public CrushBrick CB;//定义一个CrushBrick类的对象,用于获取碰撞板的位置
    public Ball Ba;//定义一个Ball类的对象,用于获取球的位置
    public GameObject Partical_prefabs;//获取特效的预制体
    public enum Brick_Type//定义枚举类型,用于制作生命道具的功能
    {
        Normal,//正常砖块
        lift_brick//有生命道具功能的砖块
    }
    public Brick_Type CurrType;
    void Start () {
        this.GetComponent<MeshRenderer>().material.color = Random.ColorHSV();//给所挂物体随机赋予颜色
        
    }
	
	// Update is called once per frame
	void Update () {
		
	}
    private void OnCollisionEnter(Collision collision)
    {
        Lifts++;
        if(CurrType == Brick_Type.lift_brick)//当枚举类型的元素为Lift_brick时
        {
            GameObject PF = GameObject.Instantiate(Partical_prefabs);//将特效的预制体实例化

            Floor.lift++;//生命值+1
            Lifttime.text = "lift-Times:" + Floor.lift;//将变化后的生命值显示出来
            Destroy(gameObject);//销毁脚本所挂的物体
            GameObject Lift = GameObject.Instantiate(LiftTool_Prefab);//实例化预制体
            Lift.transform.position = transform.position;//将预制体的位置放在销毁的砖块的位置
            
        }
        if(CurrType == Brick_Type.Normal)//如果枚举类型的元素为Normal时
        {
            GameObject PF = GameObject.Instantiate(Partical_prefabs);//将特效的预制体实例化
            PF.transform.position = transform.position;
            Destroy(gameObject);//销毁脚本所挂的物体
        }
        if (Lifts == 12)
        {
            pass.SetActive(true);//将通关的信息显示出来
            Vector3 b = new Vector3(0, 1, 0);
            Ba.transform.position = CB.transform.position + b;//重置球的位置
            Ball.judge = false;//将其判定为false
        }
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;

public class Floor : MonoBehaviour {

    // Use this for initialization
    public  Text LiftTimes;//获取到生命显示的那个组件
    public static int lift = 3;//定义生命数
    public GameObject GameOver;//接受游戏显示的text界面
    public GameObject Partical_prefabs;//获取特效的预制体
    public Ball ba;//用于获取球的位置
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
        
		
	}
    private void OnCollisionEnter(Collision collision)
    {
        GameObject Pf = GameObject.Instantiate(Partical_prefabs);//实例化预制体
        Pf.transform.position = ba.transform.position;//将粒子系统的预制体的位置放在球所处的位置
        lift--;//如果与地面发生碰撞则生命减一
        LiftTimes.text = "lift-Times:" + lift;//将生命减一之后的生命数显示出来
        CrushBrick.isplaying = false;//判定此次游戏结束
        if (lift < 0)//当游戏的生命数小于零时
        {
            GameOver.SetActive(true);//显示游戏结束的那个见面
            lift = 0;//将显示的界面中游戏生命数设置为零
            LiftTimes.text = "lift-Times:" + lift;//将游戏的显示判定为设置的值
            Ball.judge = false;//判定条件设为否,用来使球不能再有速度
        }
    }
}

这样就完成了,当小球碰撞到地面与砖块的时候,播放粒子特效的功能
还有最后一个功能就是为游戏添加声音,我们在这里仅添加两种声音,一种时碰撞到球的声音,一种是死亡的声音,声音文件可以去网上下载,这里不予提供
将准备好的声音文件拖到Texture文件夹中
然后创建一个空物体(右键->empty object)重命名为song将两个声音文件拖拽进去,取消勾选Play On Awake(游戏开始就播放的功能),然后在AllBrick脚本与Floor脚本中填写如下代码

在Floor脚本中添加
 public AudioSource die;//用于获取死亡的声音
 。。。
 private void OnCollisionEnter(Collision collision)
    {
        die.Play();
        GameObject Pf = GameObject.Instantiate(Partical_prefabs);//实例化预制体
        Pf.transform.position = ba.transform.position;//将粒子系统的预制体的位置放在球所处的位置
        lift--;//如果与地面发生碰撞则生命减一
      。。。。。
在AllBrick脚本里面添加
 public AudioSource Brick;//用于获取碰撞的声音
 。。。
 
 private void OnCollisionEnter(Collision collision)
    {
        Brick.Play();
        Lifts++;
        if(CurrType == Brick_Type.lift_brick)//当枚举类型的元素为Lift_brick时
        {
            GameObject PF = GameObject.Instantiate(Partical_prefabs);//将特效的预制体实例化
。。。

注意添加完,不要忘记把声音文件拖到对应的地方
在这里插入图片描述
在这里插入图片描述
好了打砖块的这个游戏基本功能都已经实现了,如果想要扩展功能的话也可以再加,博主刚学unity与C#不久,如果有错的地方请多多提醒了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值