目录
游戏简介
这里会使用即时模式GUI(即IMGUI)写一个显示“点”然后要求玩家点击“点”来得分的规定时间的点击游戏,具体点说,有以下几个特点:
1.GUI为一个九宫格、一个分数显示和一个“重新开始”按钮
2.九宫格上同一时间只有一个格子有点,点击这个格子后,将立刻随机一个格子(可重复)出现点
3.正确得一分,错误扣一分
4.时长为30秒,结束后提示得分
基本架构
unity 项目 下的 dot.cs 文件中为游戏代码,实际运行前将该文件拖到Main Camera即可。
代码部分(mvc分离)
模型 /model
如下图红色框内,
其中,score记录分数,time记录每局游戏中玩的时长,Gameover判断游戏是否结束,dots代表和记录九宫格上点与没点的数组,img 则是图片变量,具体指向什么图片需要在项目界面中选中dot.cs文件来设置它的component。
GUI(使用OnGUI())/view
OnGUI()是会自动地一遍遍运行的,上图中,
1:标题为“点点”的大框和显示分数的标签
2:设置一个“RESTART”按钮,如果它被点击,执行Init()函数
3:游戏还没结束时,time自增,且扫描一遍dots数组,扫描过程中设置九宫格的格子,并且被点击的格子如果是有点的,执行NextDot(),产生下个点;如果是没点的,则执行wrongDot(),进行扣分。没被点击的格子中有点就显示图像,没有就不显示文字或图像。
!!!注意,在将dot.cs文件拖到Main Camera后,选中Main Camera,就可以在右侧的inspector中设置img指的图像。如下图
4:游戏结束的话,显示一个框,提示游戏结束
5:time>30000时(即经过30秒后),Gameover标记游戏结束,dots数组清零
Components /controls
三个方法:
Init():初始化,包括初始化dots数组、score、time、Gameover,并随机出第一个点的位置(1到9)。
NextDot():随机得到下一个点,在这之前将原来的点对应的数组值设为0,并加一分
wrongDot():选错格子时,扣一分。
注意:Start()中加入Init()
游戏视频
dots
代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class dot : MonoBehaviour
{
// Entities and their states / Model
private int score = 0;
private int time = 0;
private bool Gameover = false;
private int[] dots = new int[10];
public Texture2D img;
// System Handlers
void Start()
{
Init();
}
// View to render entities / models
// Here! you cannot modify model directly, use components/controls to do it
private void OnGUI()
{
GUI.Box(new Rect(200, 50, 300, 300), "点点");
GUI.Label(new Rect(210, 100, 70, 30), "分数:" + score);
if(GUI.Button(new Rect(300, 300, 80, 20), "RESTART"))Init();
if (!Gameover)
{
for(int i = 1; i < 10; i++)
{
if (dots[i] == 1 && GUI.Button(new Rect(300 + (i - 1) % 3 * 50, 100 + (i - 1) / 3 * 50, 50, 50), img)) NextDot(i);
else if (dots[i] == 0 && GUI.Button(new Rect(300 + (i - 1) % 3 * 50, 100 + (i - 1) / 3 * 50, 50, 50), "")) wrongDot();
else if (dots[i] == 0) GUI.Button(new Rect(300 + (i - 1) % 3 * 50, 100 + (i - 1) / 3 * 50, 50, 50), "");
else if (dots[i] == 1) GUI.Button(new Rect(300 + (i - 1) % 3 * 50, 100 + (i - 1) / 3 * 50, 50, 50), img);
}
time++;
}
else GUI.Box(new Rect(200, 100, 300, 300), "\n\n\n\n\nGAME OVER!\nYour score is "+score);
if (time > 30000)
{
Gameover = true;
for(int i = 1;i < 10; i++)
dots[i] = 0;
}
}
// Components /controls
private void Init()
{
for (int i = 1; i < 10; i++) dots[i] = 0;
int j = Random.Range(1, 10);
dots[j] = 1;
score = 0;
time = 0;
Gameover = false;
}
private void NextDot(int i)
{
dots[i] = 0;
score += 1;
// next dot
int j = Random.Range(1, 10);
dots[j] = 1;
}
private void wrongDot()
{
score -= 1;
}
}