unity小球吃方块开发过程
你将学会用unity开发小游戏的基础知识
通过创建对象、添加脚本、控制相机跟随、旋转对象、碰撞检测、显示文本和发布程序七个实验来对Unity 3D游戏开发过程中的场景、Plane、Sphere、Cube对象、脚本、碰撞检测、UI以及程序发布等问题进行学习和练习。在博客文末最后列出了Unity 3D的各个菜单栏以及它们所包含的下拉菜单及其译名。
吃方块游戏超详细全教程,保姆式教学包你学会
一、创建对象
知识点:
1.掌握在Unity 3D中创建项目、场景、Plane和Sphere等。
2.掌握在Unity 3D中材质的应用。
学会在Unity 3D中创建项目、场景、Plane和Sphere,学会材质的应用。
实验内容
创建PlayBall小球吃金币游戏项目,创建地面和小球。
操作步骤:
1)新建项目,依次输入项目名称,选择项目存储路径,如图2-1所示。
2)点击“Create project”创建项目进入Unity 3D界面,右上角“Layout”可修改布局,Unity 3D有多种布局,读者可以根据自己的习惯选择,下图为“Layout”|“Tall”布局,本实验截图均为Tall布局,如图2-2所示。
3)在“Project”窗口中新建文件夹Scenes,存储游戏场景,按“Ctrl+S”存储当前游戏场景main,如图2-3所示。
4)在“Hierarchy”窗口中创建游戏地面,右键选择“3DObject”|“Plane”,因为其为游戏地面,将其命名为Ground,如图2-4所示。
5)选中Ground对象,在“Inspector”窗口的“Transform”右侧的齿轮选择“Reset”,将地面对象放置在坐标系原点,
6)若想修改该地面对象表面颜色,需要为其添加材质。在“Project”窗口中新建文件夹名为Materials,存储材质,在Materials文件夹中新建“Material”材质文件,
7)将“Material”命名为Ground,选中Ground材质,在“Inspector”窗口中修改“Albedo”颜色为淡蓝色,
8)将该材质与Plane进行关联,将Ground材质用鼠标左键拖动到“Hierarchy”窗口中的Ground对象上
9)在“Hierarchy”窗口创建游戏主角小球对象,右键选择“3D Object”|“Sphere”,并将其命名为Player,
10)将小球对象放置在坐标系原点,选中小球Player对象,在“Inspector”窗口的“Transform”右侧的齿轮选择“Reset”
11)选择移动按钮,,向上拖动“y”轴绿色箭头,将小球拖到地面上方
12)点击播放按钮查看游戏运行效果,
13)为小球添加重力。在“Hierarchy”窗口选择小球Player对象,在“Inspector”窗口点击最小面的“Add component”添加组件按钮,添加“Rigidbody”刚体组件,
14)点击播放按钮查看与没加刚体组件时的区别
二、添加脚本
实验目的
1.掌握在Unity 3D中创建脚本的方法。
2.掌握在Unity 3D中修改对象的属性。
实验要求
学会在Unity 3D中创建脚本以及修改对象的属性。
实验内容
创建脚本使小球动起来,并用键盘控制小球的运动。
操作步骤:
1)为使小球运动起来,要为小球对象添加脚本文件。在“Project”窗口中新建文件夹Scripts,存储脚本文件,在“Hierarchy”窗口选择小球Player对象,在“Inspector”窗口点击最下面的“Add component”添加组件按钮,输入Player,选择“New Script”,Language选择默认的“C Shape”,点击“Creat and Add”创建脚本文件
2)将Player脚本文件拖入到Scripts文件夹中,
3)双击player脚本文件,进入编辑器,本例进入的是Microsoft Visual Studio编辑器,
4)为使小球运动起来,需要先得到小球刚体,并对刚体施加一个方向的力,具体代码如下:
using UnityEngine;
using System.Collections;
public class player : MonoBehaviour {
private Rigidbody rd; //定义刚体对象
// Use this for initialization
void Start () {
rd = GetComponent<Rigidbody>(); //取得小球的刚体
}
// Update is called once per frame
void Update () {
rd.AddForce(new Vector3(1, 0, 0)); //对小球刚体施加一个单位X轴正向的力
}}
5)点击播放,查看小球运动状态,如图所示。
6)将上例中的Vector3(1, 0, 0)修改为Vector3(-1, 0, 0)播放查看运动效果,或者修改为Vector3(0, 0, 1)和Vector3(0, 0, -1)分别查看效果。
7)用键盘控制小球的移动,需要先取得输入,再通过输入控制小球的移动,修改Update代码:
Void Update () {
float h = Input.GetAxis("Horizontal");//取得键盘的水平输入
rd.AddForce(new Vector3(h, 0, 0));
}
8)点击播放,试着按键盘的左右方向或者“A”“D”键控制小球的水平方向移动,修改Update代码,实现控制小球四个方向的移动
void Update () {
float h = Input.GetAxis("Horizontal"); //取得键盘的水平输入
float v = Input.GetAxis("Vertical"); //取得键盘的垂直输入
rd.AddForce(new Vector3(h, 0, v) * 5);
}
9)至此可以用键盘实现对小球的方向控制,若果想使小球运动的更快,可以对施加的力乘上系数,代码如下:
rd.AddForce(new Vector3(h, 0, v) * 10); //对施加的力乘以系数
10)也可将力的系数设为公共变量,这样随时可以在Unity 3D页面修改系数的值,代码如下:
using UnityEngine;
using System.Collections;
public class Player : MonoBehaviour {
private Rigidbody rd;
public int force = 5; //定义公共变量force,为施加力的系数
// Use this for initialization
void Start () {
rd = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update () {
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
rd.AddForce(new Vector3(h, 0, v) * force); //对施加的力乘以系数
}
}
11)设置公共变量之后,在Player对象的“Inspector”窗口可以看到,player脚本中多了Force值,这样随时可以在Unity 3D页面修改力的系数值,
12)增大游戏地面面积。在“Hierarchy”窗口选择Ground对象,在“Inspector”窗口的“Transform”中修改“Scale”值,将X、Z都修改为2,
三、控制相机跟随
实验目的
1.掌握在Unity 3D中移动和选择对象等操作。
2.了解在Unity 3D中控制相机跟随的方法。
实验要求
学会在Unity 3D中移动和选择对象等操作及了解控制相机跟随的方法。
实验内容
控制相机跟随小球移动。
操作步骤:
1)点击移动按钮,选择相机对象,向上拖动“Y”轴,将其拖动到稍高一点的位置,每次调整相机时,在右下角会出现相机预览图,以便观察其视野,
2)点击旋转按钮,旋转相机角度,使其面向小球
3)若想相机跟随小球运动,需要为相机添加脚本。在“Hierarchy”窗口选择“Main Camera”对象,在“Inspector”窗口点击最小面的“Add component”添加组件按钮,输入follow,选择“New Script”,选择默认的“C Shape”语言,点击“Creat and Add”创建脚本文件,
4)将follow脚本拖入到Scripts文件夹中。若想相机跟随小球运动,需要相机与小球的距离保持不变。首先,在follow脚本中要取得小球的位置信息。代码如下:
using UnityEngine;
using System.Collections;
public class follow : MonoBehaviour {
public Transform playerTransform; //定义公共变量记录小球的位置信息
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
5)公共变量定义好后,在“Main Camera”对象的“Inspector”窗口可以看到,follow脚本中多了playerTransform,将“Hierarchy”窗口中的小球Player对象拖到playerTransform上,使playerTransform绑定小球的位置信息
6)取得小球的位置信息后,添加代码实现相机跟随小球移动,代码如下:
using UnityEngine;
using System.Collections;
public class follow : MonoBehaviour {
public Transform playerTransform; //定义公共变量记录小球的位置信息
private Vector3 offset; //定义相机和小球之前的距离
// Use this for initialization
void Start () {
offset = transform.position - playerTransform.position; //计算相机和小球之间距离
}
// Update is called once per frame
void Update () {
transform.position = playerTransform.position + offset; //保持距离
}
}
四、旋转对象
实验目的
1.掌握在Unity 3D中创建cube对象。
2.了解在Unity 3D中旋转对象的方法。
实验要求
学会在Unity 3D中创建cube对象并了解旋转对象的方法。
实验内容
控制小球移动范围并加入可旋转的金币。
操作步骤:
1)创建地面边界墙,在“Hierarchy”窗口创建cube对象,右键选择“3D Object”|“Cube”,选中cube对象,在“Inspector”窗口的“Transform”中修改“Position”的X、Y、Z为0,0,10,“Scale”的X、Y、Z为20,2,1,如图2-25所示。
2)在“Hierarchy”窗口选中cube对象,按“Ctrl+D”复制cube对象,分别创建其他三面墙体,三面墙体的“Transform”参数分别为(PositionX、Y、Z为0,0,-10,ScaleX、Y、Z为20,2,1)、(PositionX、Y、Z为10,0,0,ScaleX、Y、Z为1,2,20)、(PositionX、Y、Z为-10,0,0,ScaleX、Y、Z为1,2,20),
3)在“Hierarchy”窗口中,将创建好的四个cube墙体对象拖动到Ground对象上,形成父子关系
4)创建可收集的金币。在“Hierarchy”窗口新建cube对象,命名为Pickup,选中cube对象,在“Inspector”窗口的“Transform”中修改“Rotation”的X、Y、Z为45,45,45,“Scale”的X、Y、Z为0.5,0.5,0.5,
5)点击Local按钮,切换成全局坐标系,调整该cube对象的高度,使其立在地面上
6)在Materials文件夹中新建Material,将Material命名为Pickup,选中Pickup材质,在“Inspector”窗口中修改“Albedo”颜色为金色,并将该材质与Pickup对象关联
7)因为还要创建很多个Pickup对象,所以把Pickup对象做成预制体,在“Project”窗口中新建文件夹Prefabs,存储预制体,将“Hierarchy”窗口中的Pickup对象用鼠标左键拖动到该文件夹内
8)将Prefabs文件夹中的Pickup对象拖入到左侧的舞台上,调整高度,使其立于地面上,选中Pickup对象,并按“Ctrl+D”复制多个,调整位置,如图2-32所示。
9)在“Hierarchy”窗口中,创建空的游戏物体“Create Empty”,并将该游戏物体放到原点,将所有的Pickup放到该物体上
10)为了使所有的Pickup都旋转,选择“Project”窗口下Prefabs文件夹中的Pickup,在“Inspector”窗口点击最小面的“Add component”添加组件按钮,输入pickup,选择“New Script”,选择默认的“C Shape”语言,点击“Creat and Add”创建脚本文件,并将该脚本放在Scripts文件夹下
11)双击进入该脚本,添加如下代码,使金币旋转起来。
using UnityEngine;
using System.Collections;
public class pickup : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
transform.Rotate(new Vector3(0, 1, 0)); //使对象绕y轴旋转
}
}
12)点击播放,游戏运行如图下图所示。
五、碰撞检测
实验目的
1.掌握在Unity 3D中为对象设置标签。
2.了解在Unity 3D中碰撞检测的方法。
实验要求
学会在Unity 3D中为对象设置标签以及了解碰撞检测的方法。
实验内容
实现小球吃掉金币效果。
操作步骤:
1)为了检测小球碰撞到金币还是墙体,为金币Pickup对象设置标签,选择“Project”窗口下Prefabs文件夹中的Pickup,在“Inspector”窗口“tag”下拉菜单中选择“Add Tag”
2)进入如图界面。
图2-37 Add Tag界面
3)点击“+”,添加标签Pickup
4)再次选择“Project”窗口下Prefabs文件夹中的Pickup,在“Inspector”窗口“tag”下拉菜单中选择Pickup
5)为了实现小球碰撞金币使金币消失,打开Player脚本,修改代码如下:
using UnityEngine;
using System.Collections;
public class player : MonoBehaviour {
private Rigidbody rd;
public int force = 5;
// Use this for initialization
void Start () {
rd = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update () {
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
rd.AddForce(new Vector3(h, 0, v) * force);
}
void OnCollisionEnter(Collision collision) {//碰撞检测函数
if(collision.collider.tag == "Pickup") {//判断小球是否碰到金币
Destroy(collision.collider.gameObject); //使金币消失
}
}
}
6)运行游戏效果如图下图所示。
7)游戏运行后发现,在碰撞金币使金币消失时,会有撞到物体的反弹效果,如果不想要这种效果,首先选择“Project”窗口下Prefabs文件夹中的Pickup,在“Inspector”窗口“Box Collider”中,勾选“Is Trigger”
8)修改Player脚本如下:
using UnityEngine;
using System.Collections;
public class player : MonoBehaviour {
private Rigidbody rd;
public int force = 5;
// Use this for initialization
void Start () {
rd = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update () {
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
rd.AddForce(new Vector3(h, 0, v) * force);
}
void OnTriggerEnter(Collider collider) //检测接触
{
if(collider.tag == "Pickup")
{
Destroy(collider.gameObject);
}
}
}
六、显示文本
实验目的
1.了解在Unity 3D中UI的使用方法。
实验要求
了解在Unity 3D中UI中Text控件的使用方法。
实验内容
在小球吃掉金币时显示分数以及吃光所有金币后显示胜利。
操作步骤:
1)如果想在小球吃掉金币时加分,并实时显示分数,修改Player代码如下:
using UnityEngine;
using System.Collections;
public classplayer : MonoBehaviour {
private Rigidbody rd;
public int force = 5;
private int score = 0; //定义分数变量
// Use this for initialization
void Start () {
rd = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update () {
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
rd.AddForce(new Vector3(h, 0, v) * force);
}
void OnTriggerEnter(Collider collider)
{
if(collider.tag == "Pickup")
{
score++; //每次接触金币对分数加1
Destroy(collider.gameObject);
}
}
}
2)若想在游戏时显示分数,需要加入UI,在“Hierarchy”窗口中,右键“UI”|“Text”,切换到2D显示
3)选择Text对象,在“Inspector”窗口“Rect Transform”中,点击左侧方框,按住“Alt”键,选择左上角的方框
4)调整Text位置,将其向右下稍微调整,游戏运行,效果如图所示。
5)为了在Text对象中显示分数,需要将Text对象与Player脚本关联,修改Player脚本代码如下:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class player : MonoBehaviour {
private Rigidbody rd;
public int force = 5;
public Text text; //定义Text公共变量,准备关联Text对象
private int score = 0;
// Use this for initialization
void Start () {
rd = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update () {
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
rd.AddForce(new Vector3(h, 0, v) * force);
}
void OnTriggerEnter(Collider collider)
{
if(collider.tag == "Pickup")
{
score++;
Destroy(collider.gameObject);
}
}
}
6)在Player对象的脚本中会出现Text,将Text对象拖入到Text后面的框中
7)通过拖动已经在Player中取得了Text对象,然后将分数传递给Text,修改Player代码如下:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class player : MonoBehaviour {
private Rigidbody rd;
public int force = 5;
public Text text;
private int score = 0;
// Use this for initialization
void Start () {
rd = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update () {
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
rd.AddForce(new Vector3(h, 0, v) * force);
}
void OnTriggerEnter(Collider collider)
{
if(collider.tag == "Pickup")
{
score++;
text.text = score.ToString(); //将分数赋值给Text
Destroy(collider.gameObject);
}
}
}
8)运行游戏,效果如图2所示。
9)当把所有金币都吃掉后,显示游戏胜利。在“Hierarchy”窗口中,在“Canvas”上右键“UI”|“Text”,再创建一个Text用来显示胜利信息
10)选择调整按钮
调整Text(1)对象的大小,在Text(Script)中修改Text(1)的一些属性
11)在“Inspector”窗口中取消Text(1)前面的对号,使其在游戏刚开始运行时不显示,
图2-49 在Inspector中取消Text(1)前面的对号
12)用同样的方法关联Player和Text(1)对象,并修改Player脚本的代码如下:
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class player : MonoBehaviour {
private Rigidbody rd;
public int force = 5;
public Text text;
private int score = 0;
public GameObject winText; //定义存放胜利消息的Text
// Use this for initialization
void Start () {
rd = GetComponent<Rigidbody>();
}
// Update is called once per frame
void Update () {
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
rd.AddForce(newVector3(h, 0, v) * force);
}
void OnTriggerEnter(Collider collider)
{
if(collider.tag == "Pickup")
{
score++;
text.text = score.ToString();
if(score == 12)
{
winText.SetActive(true); //如果全部金币(本例为12个)全部吃完,显示胜利消息
}
Destroy(collider.gameObject);
}}}
13)在Player对象的脚本窗口中会出现winText,将Text(1)对象拖入到winText后面的框中,
图2-50 Player对象的脚本窗口
14)运行游戏,当吃光所有金币后效果如图所示。
七、发布程序
实验目的
1.掌握在Unity 3D中发布程序的方法。
实验要求
掌握在Unity 3D中发布程序的方法以及运行发布后的程序。
实验内容
发布PlayBall的Windows程序并运行该程序。
操作步骤:
1)发布windows平台的exe游戏,点击“File”|“Build Setting”
2)选择“PC,Mac&Linux…”,选择“TargetPlatform”|“Windows”,“Architecture”中x86为32位操作系统应用程序,x64为64位应用程序,根据实际情况选择即可,点击“Build”即可发布程序。
3)运行exe文件运行游戏
图2-53 游戏运行开始界面
4)勾选Windows,点击“Play”运行游戏
八、Unity 3D的各个菜单栏以及它们所包含的下拉菜单及其译名
主菜单 包含的子菜单