游戏开发中的设计模式——2.外观模式

本文介绍了在游戏开发中如何运用外观模式简化战斗场景的管理。通过创建一个外观类GameFaced来协调复杂的子系统,如兵营、关卡和角色管理,避免了战斗场景类(FightState)的混乱。通过UML类图和代码示例,阐述了外观模式如何工作,以实现战斗场景的高效组织。完整项目代码可在GitHub上找到。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇博文主要讲解了使用状态模式进行游戏场景的切换。这篇文章就开始讲解外观模式在游戏开发中的简单应用。 接着上一篇,我们此时到了战斗场景哈(开始场景和菜单场景什么的在这个项目中就起到一个大概界面跳转应用,在游戏中战斗场景最为核心),接下来我们就使用外观模式作为战斗场景的主要管理模式,为啥是外观模式呢?因为,在战斗场景中,设计到模块很多很杂,比如有什么兵营系统,关卡系统,角色管理系统,成就系统等等,假如我们把这些系统全都写在一个战斗场景的FightState类中,那样FightState类会很乱很臃肿。所以此时我们就需要一个外观类来管理这些杂乱的系统,而在战斗场景FightState类中只需要持有一个外观类的引用,然后管理外观类即可。可能你还会不理解,那我就先从大概的最基础的外观模式讲起:
外观模式学习原文连接:http://blog.csdn.net/lovelion/article/details/8258121
这里写图片描述
这里写图片描述

好了,我默认你理解了外观模式哈,接着给出在该游戏中的UML类图(可对比上面的UML类图理解):
这里写图片描述
其中的?符号部分是以后等待完善的各个由外观模式管理的子系统,如上文提及到的兵营系统,关卡系统等,GameFaced类就是这里的外观类,用来管理子系统的,而BattleState就是上一篇博客说的战斗场景FightState类。总的理解起来就是战斗场景FightState类管理GameFaced外观类,然后由外观类去管理各个子系统,这样就避免了战斗场景直接管理子系统造成战斗场景杂乱臃肿。
说到这里我想你应该理解了,那我就给出代码哈(如果还不理解,请评论不理解的地方,我会做出答复):

1.GameFaced游戏中的外观类:

using UnityEngine;
using System.Collections;

/// <summary>
/// 游戏上的外观模式类
/// </summary>
public class GameFaced{

    private bool isGameOver = false;//游戏是否结束

    public bool IsGameOver
    {
        get{ return isGameOver; }
    }

    /// <summary>
    /// 初始化函数,初始化需要管理的各个子系统(具体状态内容还待开发。。。)
    /// </summary>
    public void Init() { }

    /// <summary>
    /// 子系统状态更新方法
    /// </summary>
    public void Update() { }

    /// <summary>
    /// 更换子系统状态时释放资源方法
    /// </summary>
    public void Release() { }
}

2.更改完善上一篇博客中的战斗场景(FightState类),持有一个外观模式的引用,用于管理外观类。

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

/// <summary>
/// 第三状态(战斗场景)
/// </summary>
public class FightState : ISceneState
{
    /// <summary>
    /// 开始界面(状态)构造方法
    /// </summary>
    /// <param name="sceneName">场景名</param>
    /// <param name="sceneController">场景控制器</param>
    public FightState(string sceneName, SceneStateController sceneController) : base(sceneName, sceneController){}

    private GameFaced gameFaced;//持有一个外观模式的引用

    public override void StateStart()
    {
        gameFaced.Init();
    }
    public override void StateEnd()
    {
        gameFaced.Release();
    }
    public override void StateUpDate()
    {
        if (gameFaced.IsGameOver == true)//如果游戏结束就换到主菜单界面
        {
            sceneController.SetState(new MainMenuState("MainMenu", sceneController));
        }
        gameFaced.Update();
    }
}

注:整个Demo项目我会放在Github上,可自行下载学习:https://github.com/MrZhiFu/Design-Patterns-In-the-game;建议下载压缩文件形式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值