一、简易的打地鼠小游戏(非井字棋)
1.依赖技术和平台
该小游戏是依靠Unity Hub所制作出的一款简单的打地鼠小游戏,主要用到了第三周学到的基本知识以及自学的IMGUI知识。
1)下载并安装unity hub
如果你还没有安装过unity hub,那么请跟着接下来的步骤进行安装。
首先,进入unity官方网站:Unity实时内容开发平台 -实时3D引擎、2D、VR&AR可视化数据 | Unity中国官网
点击下载unity hub,选择自己合适的版本进行下载,
2)安装编辑器并配置
然后他会要求你登录,你可以选择创建unity id登录,也可以使用微信扫码登录,下载完成后进行安装,然后登录网站,获取个人版许可证
进入之后你需要安装相应的编辑器和ide(如果你已经安装过vs或者vs code的话就不需要安装ide了),勾选一个编辑器版本进行安装,注意安装路径不可以包含中文等特殊字符。
安装好编辑器后,我们新建一个项目,
进入项目后,选择我们的ide配置,
这样我们以后编写c#代码就可以使用vs code了。
至此,unity平台配置完毕!
2.相关知识学习
我们要先熟悉一下待会需要用到的相关知识。(转自老师提供的课件)
1)了解unity 3d 基本界面
2)游戏对象入门
3)c#script编写
4)自学IMGUI和井字棋游戏代码实例
Unity - Manual: Immediate Mode GUI (IMGUI) (unity3d.com)https://docs.unity3d.com/Manual/GUIScriptingGuide.html请前往官方API文档自学学习;然后自行阅读井字棋示例代码。
3.制作思路简述
现在我们已经具备了基本的知识,我们开始在井字棋代码的基础上制作一个打地鼠小游戏。
1)创建游戏对象
右键层次视图创建一个空对象,并取名为“Whack-a-mole”
然后在Assets中右键创建一个c#script,
然后我们把这个对象拖动到层次视图中的同名对象中进行绑定,
接下来我们的主要任务就是编写c#代码了。
2)编写代码
点击c#文件使用ide编写代码,
初始化游戏界面
我们首先要做的就是编写start()初始化函数(或者说事件),
这个函数在游戏项目开始时被调用,因此他的任务至少是需要初始化游戏界面,我们将初始化游戏界面的功能交给了一个自定义函数init(),因为初始化游戏界面不只是游戏刚开始时需要,如果你赢得了一场游戏之后想要继续重新开始游戏并初始化游戏界面时,你就可以调用init()函数而不至于重启游戏项目。而init()函数要想初始化游戏界面,就必须通过初始化某些数据来间接实现(为什么不直接在init()函数里直接实现呢?如果你认真阅读过IMGUI文档的话,你就会知道IMGUI只能在ONGUI()函数中使用)
代码如下:
count和num是自定义的int类型变量,前者记录打地鼠分数,后者记录当前界面中有几只地鼠冒出,显然,游戏开始前二者都要为0,然后我们用一个3*3数组field作为地鼠的活动区域,元素值为0时表示地鼠没冒出,1则为冒出。
ONGUI绘制界面
这是我们绘制界面的核心代码,我们需要使用GUI控件来实现我们的小游戏的视觉展示。ONGUI()函数和update()函数一样,每一帧执行一次。
首先我们用BOX控件确定我们的游戏区域,然后用常用的if语句加button控件,根据我们是否按下“重新开始”按钮来决定是否调用init()函数。
然后我们根据场上地鼠的数量判断是否继续生成新的地鼠,如果需要生成,则用Random.Range()函数生成随机数,然后改变field'的元素的值,并用GUI显示。
接着我们要处理打地鼠这个动作,当我们用鼠标点击地鼠时,我们调用Whack()函数“打掉地鼠”,然后判断是否获胜,如果获胜(我在此设置为打地鼠总数达到10),我们就显示“赢咯”文本,如果没有获胜,就继续判断、更新界面。
其他辅助函数
Gameover()函数:判断是否达到获胜条件,达到返回true否则返回false;
Whack()函数:打地鼠,修改相关变量的值。
地鼠图片的显示
如果想要载入地鼠图片并运用到游戏中,则需要以下操作:
1.添加Texture2D对象ICON;
2.修改start()函数,使用FileStream 读取图片文件(需要添加using System.IO;),然后用字节接受图片数据,然后实例化icon,icon载入字节数据生成图片(LoadImage);
3.修改ONGUI()函数,将button中的内容改为icon,完成显示。
4.游戏代码展示
游戏代码如下(仅使用IMGUI绘制界面):
using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;
public class LoadBeh : MonoBehaviour
{
private static int count;
private static int num;
public Texture2D icon;
private int[,] field = new int[3, 3];
void Start () {
Init();
FileStream fs = new System.IO.FileStream("C:/Users/feng/3d/My project (1)/Screenshot 2023-09-25 133128.png", System.IO.FileMode.Open, System.IO.FileAccess.Read);
byte[] thebytes = new byte[fs.Length];
fs.Read(thebytes, 0, (int)fs.Length);
//实例化一个Texture2D,宽和高设置可以是任意的,因为当使用LoadImage方法会对Texture2D的宽和高会做相应的调整
icon = new Texture2D(1,1);
icon.LoadImage(thebytes);
}
void OnGUI() {
GUI.Box(new Rect(210, 25, 300, 300), "");
if (GUI.Button(new Rect(310, 270, 100, 30), "重新开始")) Init();
if(num<3){
int a,b;
a=Random.Range(0,3);
b=Random.Range(0,3);
field[a,b]=1;
num++;
GUI.Button(new Rect(255 + a * 70, 50 + b * 70, 70, 70), icon);
}
if (!GameOver()) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (field[i, j] == 1 && GUI.Button(new Rect(255 + i * 70, 50 + j* 70, 70, 70), icon))
Whack(i,j);
}
}
}
else
GUI.Box(new Rect(260, 50, 200, 200), "\n\n\n\n\n\n赢咯!");
}
void Init() {
count = 0;
num=0;
for(int i = 0; i < 3; i++)
for(int j = 0; j < 3; j++)
field[i, j] = 0;
}
void Whack(int i,int j) {
count++;
num--;
field[i,j]=0;
}
bool GameOver() {
if(count<=10)
return false;
return true;
}
void Update()
{
}
}
5.游戏视频演示
6.总结
通过这次作业,我学会了:
unity 3d的界面和基本操作;
Gameobject的基本属性和相关操作;
预制、动态对象等;
IMGUI绘制界面;
Random生成随机数;
Texture2D载入图片;
.......