Unity 3D学习(三)——打砖块

本讲进行Unity的第二个案例练习,预计10个小时,会同时更新博客。熟悉Unity的一些简单操作。

1 搭建环境

1.1 设计地面

Unity 3D学习(三)——打砖块_第1张图片

首先,创建20x20一个平面,平面Plane默认是10x10的,所以平面Scale的x和z轴的值设为2
Unity 3D学习(三)——打砖块_第2张图片
接着,为地面添加材料和颜色
Unity 3D学习(三)——打砖块_第3张图片

1.2 设计墙体和砖块

Unity 3D学习(三)——打砖块_第4张图片
设计的墙体和砖块如上图所示。砖块采用预制体设计(Ctrl+D可以复制物体),Ctrl+鼠标左键可以控制物体进行步移(Edit ->Grid and Snap Settings可以设置步移距离)
Unity 3D学习(三)——打砖块_第5张图片
砖块可以建立一个空物体作为父物体,方便管理
Unity 3D学习(三)——打砖块_第6张图片

2 相机移动(第一人称视角移动)

相机应该能够根据方向键的按下进行移动。

2.1 初始化位置

相机的初始位置应该正对砖块墙
Unity 3D学习(三)——打砖块_第7张图片

2.2 位置更新策略

相机的水平移动(Horizontal)沿 x 轴方向,垂直移动(Vertical)沿 y 轴方向

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

public class Movement : MonoBehaviour
{
    //设置相机的移动速度
    public int speed = 1;
    // Update is called once per frame
    void Update()//每一帧执行一次,每一帧执行时间与硬件有关
    {
        //接收水平方向(x轴)的输入,输入量为浮点型数据,大小为[-1,1]
        float h = Input.GetAxis("Horizontal");//左右移动[-1,1]
        float v = Input.GetAxis("Vertical");//上下移动[-1,1]
        //相机位置更新
        //Debug.Log(Time.deltaTime);//每一帧的时间
        //Debug.Log(1 / Time.deltaTime);//FPS 帧率 frame per second
        //位置变换
        transform.Translate(new Vector3(h, v, 0)*speed*Time.deltaTime);//v=1m/s
    }
    private void FixedUpdate()//每秒执行次数是固定的,也就是说帧率固定,默认为50 FPS,可以进行修改
    {
        Debug.Log("FPS:"+1 / Time.deltaTime);
    }
}

3 创建子弹(小球)

我们希望创建的小球初始位置与相机位置重合,并且沿 z 轴方向以一定的初始速度射出
子弹的创建采用预制体实例化的方式,子弹预制体采用红色Sphere设计
Unity 3D学习(三)——打砖块_第8张图片

4 游戏程序设计

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

public class Shoot : MonoBehaviour
{
    public GameObject bulletPrefab;//定义一个游戏物体,与子弹预制体相联系
    public int speed = 30;
    public Text countText;//定义一个计数文字
    public Text winText;//定义游戏胜利文字
    private int count=0;//定义一个整数型变量,用来记录射出子弹的数量
    private bool isGameOver = false;//定义一个bool类型变量,判断游戏是否胜利
    GameObject[] bricks = new GameObject[66];//初始化一个游戏物体数组,用来存放找到的砖块
    Transform[] Ts = new Transform[66];//初始化一个Transform数组,用来存放砖块的Transform属性数组
    // Start is called before the first frame update
    void Start()
    {
        bricks = GameObject.FindGameObjectsWithTag("Brick");//通过标签查找所有的砖块物体
        for (int i = 0; i < 66; i++)
        {
            Ts[i]=bricks[i].GetComponent<Transform>();//存储砖块的Transform属性
        }
    }

    // Update is called once per frame
    void Update()
    {
        //通过鼠标左键,创建子弹(小球),并发射
        //Input.GetMouseButtonDown(0);//返回一个bool类型的值,0代表鼠标左键,1代表鼠标右键
        if (Input.GetMouseButtonDown(0))
        {
            //根据Prefab创建实例 = 实例化Prefab = 克隆
            //创建子弹,位置和方向与相机保持一致
            //GameObject.Instantiate(bulletPrefab,transform.position,transform.rotation);
            GameObject bullet=GameObject.Instantiate(bulletPrefab, transform.position, transform.rotation);
            Rigidbody rd = bullet.GetComponent<Rigidbody>();//得到子弹的刚体属性
            //施加力
            //rd.AddForce(Vector3.forward*10000);
            //施加速度
            rd.velocity = Vector3.forward*speed;//为子弹施加一个向前的速度(沿 z 轴方向)
            count++;//记录射出的子弹的数量
            countText.text = "消耗子弹数:" + count;//显示射出的子弹数量
        }
        int brickCount = 0;//记录还停留在平面上的砖块的数量
        for (int i = 0; i < 66; i++)
        {
            if (Ts[i].position.y > -6)
            {
                brickCount++;
            }
        }
        if (brickCount == 0)//如果平面上没有砖块存在,游戏胜利
            isGameOver = true;
        if(isGameOver == true)
        {
            winText.text = "Win the Game!\nYour score is:" + count;//游戏胜利后,输出游戏胜利UI文字
        }   
    }
}

5 游戏整体展示


本次的打砖块游戏主要涉及到预制体设计、步移移动、键盘控制、鼠标左键点击控制、位置变化、标签搜索、文字UI设计等相关的Unity知识

你可能感兴趣的:(Unity,unity,3d,游戏引擎)