Unity 3D学习(三)——打砖块
本讲进行Unity的第二个案例练习,预计10个小时,会同时更新博客。熟悉Unity的一些简单操作。1 搭建环境1.1 设计地面首先,创建20x20一个平面,平面Plane默认是10x10的,所以平面Scale的x和z轴的值设为2接着,为地面添加材料和颜色1.2 设计墙体和砖块设计的墙体和砖块如上图所示。砖块采用预制体设计(Ctrl+D可以复制物体),Ctrl+鼠标左键可以控制物体进行步移(Edit
·
本讲进行Unity的第二个案例练习,预计10个小时,会同时更新博客。熟悉Unity的一些简单操作。
1 搭建环境
1.1 设计地面

首先,创建20x20一个平面,平面Plane默认是10x10的,所以平面Scale的x和z轴的值设为2
接着,为地面添加材料和颜色
1.2 设计墙体和砖块

设计的墙体和砖块如上图所示。砖块采用预制体设计(Ctrl+D可以复制物体),Ctrl+鼠标左键可以控制物体进行步移(Edit ->Grid and Snap Settings可以设置步移距离)
砖块可以建立一个空物体作为父物体,方便管理
2 相机移动(第一人称视角移动)
相机应该能够根据方向键的按下进行移动。
2.1 初始化位置
相机的初始位置应该正对砖块墙
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设计
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知识
更多推荐


所有评论(0)