
一、游戏介绍
1、游戏目标
玩家使用鼠标点击飞过的飞碟(UFO),每个击中的飞碟都会根据其颜色、大小和速度获得相应分数。
2、游戏设置
游戏共分为3个round,每个round包含10次trial。
每个trial中,飞碟的颜色、大小、发射位置、速度、角度以及同时出现的个数由round的ruler控制。
随着round的进行,飞碟的难度(速度、数量)逐渐增加。
3、得分规则
飞碟分为三轮三个难度,难度和得分依次递增。
1、游戏有 3 个 round,每个 round 都包括10 次 trial;
2、每个 round 的飞碟的色彩、大小、发射位置、速度、角度、同时出现的个数都可能不同。它们由该 round 的 ruler 控制,round1出现粉紫色飞碟,round2在粉色飞碟的基础上添加蓝色飞碟,round3在round2的基础上再添加黄色飞碟,三种颜色的飞碟尺寸依次减小;
3、trial1-trial3同时发射对应颜色的一只飞碟,trial4-6同时发射2只飞碟,trail7-10同时发射三只飞碟,三轮round的trial叠加,例如round2的trial1是同时发射一只粉色飞碟和一只蓝色飞碟,round3的trial5同时发射2粉2蓝2黄;
4、鼠标点中得分,粉色飞碟每个1分,蓝色飞碟每个2分,黄色飞碟每个3分。
5.游戏初始生命值为10,每漏掉一个飞碟未击中,扣掉一个生命值,生命值为零时结束游戏,记录分数,并显示最高分。
二、设计思路
1、 设计要求
必须使用对象池管理飞碟对象。
建议使用 ScriptableObject 配置不同的飞碟
建议使用物理引擎管理飞碟飞行路径。
按 adapter模式 设计图修改飞碟游戏
使它同时支持物理运动与运动学(变换)运动
2、 UML图
?
3、 具体实现
设计一个飞碟工厂,用于管理和生产不同类型的飞碟。
创建飞碟的数据结构,包括飞碟的属性和行为。
实现飞碟的生成、使用和回收机制。
设计飞碟的运动逻辑,使其能够进行斜抛运动。
实现游戏的全局控制,包括游戏开始、结束、分数记录和关卡升级。
通过GUI接收玩家输入,实现击落飞碟的功能。
三、代码介绍
1、飞碟工厂模块(DiskFactory):负责生产新的飞碟和回收使用完毕的飞碟。 伪代码:
class DiskFactory {
???List
usedDisks;
???List freeDisks;
?
???GameObject GetDisk(int round) {
???????// 根据回合选择飞碟类型
???????// 如果有空闲飞碟,则复用
???????// 否则,实例化新的飞碟
???????// 返回飞碟对象
???}
?
???void FreeDisk(GameObject disk) {
???????// 将使用完毕的飞碟回收至空闲列表
???}
}
2、飞碟数据模块(DiskData):存储飞碟的属性,如类型、颜色、大小等。 伪代码:
class DiskData {
???string name;
???Color color;
???Vector3 scale;
???Vector3 direction;
?
???// 飞碟的属性和方法
}
3、飞碟运动模块(UFOFlyAction):实现飞碟的斜抛运动逻辑。 伪代码:
class UFOFlyAction {
???Vector3 startVector;
???Vector3 gravityVector;
???float time;
?
???void Update() {
???????// 更新飞碟的位置
???????// 计算重力影响
???????// 检查飞碟是否飞出屏幕
???}
}
4、全局控制器模块(GameController):管理游戏的整体流程,包括开始、结束、分数记录和关卡升级。 伪代码:
class GameController {
???int round;
???bool gameStart;
???bool gameOver;
???float speed;
?
???void Start() {
???????// 初始化游戏参数
???????// 设置单例
???????// 实例化相关类
???}
?
???void Update() {
???????// 根据游戏状态更新游戏
???????// 发送飞碟
???????// 检查并升级关卡
???}
?
???void LoadResources() {
???????// 加载飞碟资源
???}
?
???void SendDisk() {
???????// 发送飞碟到场景中
???????// 处理飞碟飞出屏幕的逻辑
???}
}
5、GUI模块(UserGUI):接收玩家输入,显示游戏界面和状态。 伪代码:
class UserGUI {
???void OnMouseDown() {
???????// 当鼠标点击时,调用击中逻辑
???}
?
???void ReduceBlood() {
???????// 减少玩家血量
???}
?
???// 其他GUI相关的方法
}
6、记分员模块(ScoreRecorder):记录玩家的分数和状态。 伪代码:
class ScoreRecorder {
???int score;
?
???void Record(GameObject disk) {
???????// 记录击中飞碟的分数
???}
}
四、游戏技术
1、 物理引擎:物理引擎是一套用于模拟和计算物理现象(如重力、碰撞、刚体动力学等)的软件库。在游戏开发中,物理引擎可以让游戏世界中的物体按照现实世界的物理规律进行运动,从而增强游戏的真实感和互动性。
碰撞检测:当飞碟被玩家击中时,物理引擎会检测到飞碟与玩家发射的物体(如子弹)之间的碰撞,并触发相应的动作,比如飞碟爆炸。
运动模拟:飞碟在空中的运动(斜抛运动)通过物理引擎来模拟,包括速度、加速度、重力等因素的影响。
2、 对象池:?对象池是一种性能优化技术,用于管理游戏中的可重用对象。在游戏中,频繁地创建和销毁对象会导致性能下降,因为对象的创建和销毁是非常耗费资源的操作。对象池通过重用对象来减少这种性能开销。
初始化:在游戏开始时,对象池会预先创建一定数量的飞碟对象,并将它们存储在一个列表中。
获取对象:当需要一个新的飞碟时,不是创建一个新的实例,而是从对象池中取出一个已经存在的、当前未被使用的飞碟对象,然后将其配置为所需的属性(如位置、速度等)。
回收对象:当飞碟不再需要时(比如飞出屏幕外),不是销毁它,而是将其重置并放回对象池中,以便下次可以再次使用。
3、 飞碟使用了刚体部件
刚体组件使得飞碟能够与其他具有刚体组件的物体(如子弹、地面等)进行物理交互。这种交互包括碰撞检测和响应,是游戏物理效果的基础。刚体能模拟现实世界中的动力学行为,如重力、碰撞反弹、摩擦力等。在飞碟游戏中,使用刚体可以让飞碟在受到外力(如发射时的推力)后,按照物理规律进行运动,从而产生更真实的飞行轨迹。
通过使用刚体,不需要手动编写复杂的物理运动方程来计算飞碟的位置和速度。物理引擎会自动处理这些计算,大大简化了编程工作。
刚体组件可以自动处理碰撞事件,包括碰撞检测和碰撞后的物理反应。这允许开发者通过事件回调(如OnCollisionEnter)来响应碰撞,例如,当飞碟被击中时触发爆炸效果。
4、 飞碟能做弧线运动
飞碟具有刚体组件,并且受到了重力或其他力的作用,它将能够执行弧线运动。这通常是通过给飞碟一个初始速度和角度来实现的
public static UFOFlyAction GetSSAction(Vector3 direction, float angle, float power){
???UFOFlyAction action = CreateInstance();
???if (direction.x == -1) action.start_vector = Quaternion.Euler(new Vector3(0, 0, -angle)) * Vector3.left * power;
???else action.start_vector = Quaternion.Euler(new Vector3(0, 0, angle)) * Vector3.right * power;
???return action;
}
?
public override void Update(){
???time += Time.fixedDeltaTime;
???gravity_vector.y = gravity * time ;
?
???transform.position += (start_vector/45 + gravity_vector/45) * Time.fixedDeltaTime;
???current_angle.z = Mathf.Atan((start_vector.y + gravity_vector.y) / start_vector.x) * Mathf.Rad2Deg;
???transform.eulerAngles = current_angle;
?
???//如果物体y坐标小于-10,结束
???if (this.transform.position.y < -10){
???????this.destroy = true;
???????this.callback.SSActionEvent(this);?????
???}
}
5、 添加了计分员类
class ScoreRecorder {
???private int score;
?
???public void AddScore(int points) {
???????score += points;
???????// 更新UI显示分数
???}
?
???public int GetScore() {
???????return score;
???}
}
6、 设计了飞碟仓库(缓冲池技术),用于管理飞碟的生成与回收。这个对象池可以被视为飞碟仓库或缓冲池。DiskFactory 类充当了飞碟仓库的角色,它通过 GetDisk 和 ReleaseDisk 方法来管理飞碟的获取和回收。这实现了缓冲池技术,提高了资源利用率并减少了性能开销。
class DiskFactory {
???private List freeDisks; // 空闲的飞碟列表
?
???public DiskFactory(int initialSize) {
???????freeDisks = new List(initialSize);
???????for (int i = 0; i < initialSize; i++) {
???????????freeDisks.Add(CreateNewDisk());
???????}
???}
?
???public GameObject GetDisk() {
???????if (freeDisks.Count > 0) {
???????????GameObject disk = freeDisks[0];
???????????freeDisks.RemoveAt(0);
???????????disk.SetActive(true);
???????????return disk;
???????} else {
???????????// 如果没有空闲飞碟,可以创建一个新的
???????????return CreateNewDisk();
???????}
???}
?
???public void ReleaseDisk(GameObject disk) {
???????disk.SetActive(false);
???????freeDisks.Add(disk);
???}
?
???private GameObject CreateNewDisk() {
???????// 创建并返回一个新的飞碟对象
???}
-
声明:本文由随服攻略网独家原创,未经允许,严禁转载!如有侵权请邮箱联系352082832@qq.com