Unity 即时GUI模式设计“点点”游戏

目录

游戏简介

基本架构

代码部分

参数

GUI(使用OnGUI())

components

游戏视频

代码

游戏简介

这里会使用即时模式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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值