问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

Unity入门:简易版打地鼠小游戏

创作时间:
作者:
@小白创作中心

Unity入门:简易版打地鼠小游戏

引用
CSDN
1.
https://m.blog.csdn.net/wzy200430/article/details/142954173

本文将通过一个简易的打地鼠小游戏,带你深入了解MVC设计模式在Unity游戏开发中的应用。从模型、视图到控制器,每个部分的功能和实现细节都将被详细解析,让你在实践中掌握这一重要的软件设计模式。

MVC模式

本次任务要求我们在实践中认识游戏设计中的MVC模式。所谓MVC模式,就是Model-View-Controller模式。

  • Model(模型):模型代表一个存取数据的对象。
  • View(视图):视图可以将模型包含的数据可视化。视图确保了呈现的数据具有一定的格式和结构。
  • Controller(控制器):控制器控制模型的变化。是模型和视图之间的协调者。

MVC模式的优点:

  1. 关注点分离:MVC 模式将数据(模型)、用户界面(视图)和控制逻辑(控制器)分离,使得开发者可以专注于单个方面,而不需要担心其他部分的实现。
  2. 代码可维护性:由于代码被组织得更加模块化,因此更容易理解和维护。当需要修改游戏的某个部分时,开发者可以更有针对性地进行修改,而不会影响到其他部分。
  3. 可重用性:模型和视图可以独立于控制器进行重用。如果游戏需要在不同的平台或设备上运行,可能只需要更改控制器部分,而模型和视图可以保持不变。

接下来我们就利用MVC模式的特点,用Unity制作一款简单的入门打地鼠小游戏。

打地鼠小游戏

游戏介绍:这是一款测试反应能力的小游戏。玩家需要在规定时间内尽可能多地点击屏幕上出现的笑脸。

演示视频:

unity制作的简易打地鼠小游戏

游戏制作:

首先新建一个Unity项目。在Assets文件夹下新建一个C#项目。开始编辑脚本。这里我将其命名为test。

脚本可以分为三个部分:

Model

private static int score;
private int x, y;
private int[,] board = new int[3, 3];
private bool gameActive;
private static float beginTime, usedTime;
private float moleDisplayTime = 1.0f; // 显示时间
private bool isFlashing = false; // 是否正在闪烁
private float countdownTime = 30f; // 倒计时时间,单位秒
// System Handlers
void Start()
{
    Init();
}

View

// View
void OnGUI()
{
    Event e = Event.current; // 获取当前事件
    GUI.Box(new Rect(210, 25, 300, 300), "");
    if (GUI.Button(new Rect(310, 270, 100, 30), "Restart"))
        Init();
    if (gameActive)
    {
        GUI.Label(new Rect(210, 25, 300, 50), "Time Left: " + (countdownTime - (Time.time - beginTime)).ToString("0")); // 显示倒计时
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                if (board[i, j] == 1)
                {
                    // 绘制笑脸
                    Rect faceRect = new Rect(255 + j * 70, 50 + i * 70, 70, 70);
                    DrawFace(faceRect);
                    if (e.type == EventType.MouseDown && faceRect.Contains(e.mousePosition))
                    {
                        HitMole(); // 点击笑脸时调用HitMole
                    }
                }
            }
        }
    }
    else
    {
        GUI.Box(new Rect(260, 50, 200, 200), "\n\n\n\nYour Score is:\n" + score);
        GUI.Label(new Rect(320, 150, 300, 50), "Game Over!");
    }
}

Controller

// Controller
void Init()
{
    score = 0;
    beginTime = Time.time;
    usedTime = 0.0f;
    gameActive = true;
    isFlashing = false;
    countdownTime = 30f; // 重置倒计时时间
    StartCoroutine(MoleCycle());
}
IEnumerator MoleCycle()
{
    while (gameActive)
    {
        if (!isFlashing) // 只有在没有正在进行的闪烁时才生成新的笑脸
        {
            GenerateMole();
            yield return new WaitForSeconds(moleDisplayTime);
        }
        yield return null; // 等待下一帧
    }
}
void GenerateMole()
{
    x = Random.Range(0, 3);
    y = Random.Range(0, 3);
    boardInit();
    board[x, y] = 1;
}
void HideMole()
{
    boardInit();
}
void boardInit()
{
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
            board[i, j] = 0;
    }
}
void HitMole()
{
    score++;
    isFlashing = true; // 标记开始闪烁
    StartCoroutine(FlashAndHide()); // 启动闪烁协程
}
IEnumerator FlashAndHide()
{
    for (int i = 0; i < 3; i++) // 闪烁3次
    {
        board[x, y] = 1; 
        yield return new WaitForSeconds(0.1f);
        board[x, y] = 0; 
        yield return new WaitForSeconds(0.1f);
    }
    board[x, y] = 0; 
    isFlashing = false; // 闪烁结束
}
void Update()
{
    if (gameActive && (Time.time - beginTime) >= countdownTime)
    {
        gameActive = false;
    }
}
void MissMole()
{
    usedTime = Time.time - beginTime;
    gameActive = false;
}
// 绘制笑脸
void DrawFace(Rect faceRect)
{
    GUI.color = Color.yellow;
    GUI.DrawTexture(faceRect, Texture2D.whiteTexture);
    GUI.color = Color.black;
    GUI.DrawTexture(new Rect(faceRect.x + 15, faceRect.y + 15, 10, 10), Texture2D.whiteTexture);
    GUI.DrawTexture(new Rect(faceRect.x + 45, faceRect.y + 15, 10, 10), Texture2D.whiteTexture);
    GUI.color = Color.black;
    GUI.DrawTexture(new Rect(faceRect.x + 25, faceRect.y + 40, 20, 10), Texture2D.whiteTexture);
}

编辑好脚本后将其添加到Main Camera上面:

点击运行游戏即可开始。

总结

这次实验尝试使用MVC模式编写了一款简单的打地鼠类小游戏,旨在理解MVC模式的构成和作用,以及熟悉Unity的用法。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号