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-1新建Unity 3D项目

2)点击“Create project”创建项目进入Unity 3D界面,右上角“Layout”可修改布局,Unity 3D有多种布局,读者可以根据自己的习惯选择,下图为“Layout”|“Tall”布局,本实验截图均为Tall布局,如图2-2所示。
图2-2 Unity 3D中Tall布局

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的各个菜单栏以及它们所包含的下拉菜单及其译名

主菜单 包含的子菜单
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

### Unity Code Example for Ball Collecting Coins Game Mechanic In developing a game mechanic where a ball collects coins within the Unity engine, creating scalable and maintainable code is essential[^1]. Below demonstrates how this can be achieved through C# scripting. #### Coin Collection Script Implementation The following script should be attached to each coin object: ```csharp using UnityEngine; public class Coin : MonoBehaviour { private void OnTriggerEnter(Collider other) { // Check if the trigger comes from an object tagged as "Player" if (other.CompareTag("Player")) { // Add score logic here or call method on player to increase points // Destroy the coin after it has been collected Destroy(gameObject); } } } ``` For ensuring that the collection mechanism scales well with different levels or changes in gameplay mechanics, consider implementing methods that allow easy adjustment of values such as point increments per coin without needing deep modifications elsewhere in the project structure. Additionally, attaching a Rigidbody component along with setting up appropriate colliders ensures proper interaction between objects during runtime while maintaining performance efficiency. To handle scoring functionality efficiently across multiple scenes or instances, one might opt for Singleton pattern implementation or static classes holding global variables accessible throughout all scripts involved in managing scores dynamically based upon interactions like collecting coins. --related questions-- 1. How does using tags improve collision detection accuracy? 2. What are some best practices when designing collectible item systems in games? 3. Can you explain more about optimizing physics calculations involving many small objects like coins? 4. In what ways could the Singleton design pattern enhance management of game-wide data structures?
评论 42
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

周周的Unity小屋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值