一、前言
本文将介绍如何使用 Unity 实现经典的打飞碟游戏,本项目采用通过 MVC 架构并且实现了动作分离,使代码结构清晰、功能模块化。本文将详细阐述游戏的背景与规则、项目模块结构,以及各模块中类和接口的主要功能和交互。
项目演示和源代码URL如下:
视频演示:Unity小游戏HitUFO演示视频_哔哩哔哩bilibili_演示
https://www.bilibili.com/video/BV1feUCYJEos
源代码:22331077/3D游戏编程与设计 - Gitee.com
https://gitee.com/sysu-os-22331077/3d-game-programming-and-design/tree/master/lab8-HitUFO
二、游戏介绍
游戏规则:
- 游戏有 n 个 round,每个 round 都包括10 次 trial。
- 每个 trial 的飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。它们由该 round 的 ruler 控制。
- 每个 trial 的飞碟有随机性,总体难度随 round 上升。
- 鼠标点中得分,得分规则按色彩、大小、速度不同计算
三、UML图
四、项目架构
本游戏项目架构与牧师与魔鬼类似,下面仅介绍新的功能。
1.CCAction模块
1.1飞碟抛物线运动(运动学(CCActionManager)/物理(PhysisActionManager)模式)
运动学模式根据重力影响计算各个时刻的速度矢量 (currentVelocity
) ,从而实现了飞碟的抛物线运动。飞碟的旋转方向与其运动轨迹一致,同时通过边界检测功能实现对飞碟状态的管理。
物理模式通过启用物理引擎,将飞碟的运动逻辑交由 Unity 的刚体系统控制,从而实现了飞碟的抛物线运动。
2.Controllers模块
2.1.飞碟获取规则结构体(Ruler)
Ruler
结构体定义了飞碟的各项属性,包括飞碟的大小、初速度、颜色、飞行方向和初始位置。同时提供了GetRandomRuler函数用于生成随机的Ruler。飞碟工厂将根据Ruler
设置飞碟。
2.2.飞碟工厂(DiskFactory)
飞碟工厂(DiskFactory)是一个简单的对象池管理器,用于高效管理飞碟对象的创建和回收,避免频繁地销毁和重新实例化飞碟对象,提升游戏性能。
主要功能:
-
飞碟的获取 (
GetDisk
)- 根据给定的规则 (
Ruler
) 提供一个飞碟对象。 - 如果对象池中存在空闲飞碟,从空闲队列中取出。
- 如果对象池中没有空闲飞碟,则实例化一个新的飞碟对象。
- 根据
Ruler
设置飞碟的属性,包括速度、颜色、大小和初始位置。 - 将飞碟对象设置为可见,并加入正在使用的队列。
- 根据给定的规则 (
-
飞碟的回收 (
FreeDisk
)- 将不再使用的飞碟从“正在使用”队列中移除,并放入“空闲”队列。
- 将飞碟对象设置为不可见 (
SetActive(false)
),以节省系统资源。
2.3.记分员类(ScoreRecorder)
计分员类(ScoreRecorder)负责记录和计算游戏中的得分,根据飞碟的大小、颜色和速度确定分数。它提供了一个Record
方法,用于对每个击中的飞碟进行计分。
必要性:
- 集中管理得分逻辑: 通过封装计分逻辑,使得得分计算清晰且易于维护。
- 灵活性和扩展性: 如果以后需要调整计分规则,只需修改该类而无需改变其他部分代码。
通过分离计分功能,实现了代码的职责分离,提升了整体设计的可维护性和复用性。
2.4.回合管理器(RoundController)
回合管理器类负责飞碟射击游戏的整体流程控制,其核心为管理回合数据并按规则发射飞碟。
此外,回合管理器类还是游戏核心逻辑的实现者,它协调各模块(如工厂、记分器、动作管理器等),确保游戏按预定规则顺利运行,同时与主场景控制器协作以更新界面和状态,是整个飞碟射击游戏的核心调度器。
2.5.主场景控制器(FirstController)
主场景控制器负责协调游戏的各个部分,包括回合控制、视图更新和游戏状态管理。它通过与 RoundController
和 View
组件的交互,控制游戏的回合数、得分和界面显示。该类提供了管理游戏状态的功能,如启动、暂停、游戏结束等,并根据状态更新相应的用户界面。此外,主场景控制器还负责处理玩家射击操作,检测鼠标点击是否命中飞碟。
3.models模块
3.1Disk
Disk用于存储飞碟的基本信息,包括大小、颜色、初速度。上述信息将用于计分员的计分过程。
4.View模块
4.1游戏视图(Views)
该游戏包含三个主要界面:
主页(游戏开始前):该界面可选择运动模式,以及点击开始游戏。
游戏界面(游戏进行中):该界面左上角显示当前游戏信息,包括得分、轮次、本轮当前测试次数。点击右上角的返回按钮可返回主页。在该界面可点击鼠标左键射击飞碟.
重开界面(游戏结束后):该界面比游戏界面增加了一个重开按钮,点击重开按钮可重新开始游戏(初始化数据后直接跳转到游戏界面)。