当前位置: 首页 > news >正文

【行为型之模板方法模式】游戏开发实战——Unity标准化流程与可扩展架构的核心实现

文章目录

      • 🧩 模板方法模式(Template Method Pattern)深度解析
        • 一、模式本质与核心价值
        • 二、经典UML结构
        • 三、Unity实战代码(关卡流程系统)
          • 1. 定义抽象模板类
          • 2. 实现具体子类
          • 3. 客户端使用
        • 四、模式进阶技巧
          • 1. 钩子方法(Hook)
          • 2. 阶段状态控制
          • 3. 异步加载优化
        • 五、游戏开发典型应用场景
        • 六、性能优化策略
        • 七、模式对比与选择
        • 八、最佳实践原则
        • 九、常见问题解决方案

🧩 模板方法模式(Template Method Pattern)深度解析

——以Unity实现标准化游戏流程灵活AI行为框架为核心案例


一、模式本质与核心价值

核心目标
定义算法骨架,将某些步骤延迟到子类实现
复用算法结构,确保流程一致性
避免代码冗余,通过继承实现差异化

关键术语

  • AbstractClass(抽象类):定义模板方法和抽象操作
  • ConcreteClass(具体子类):实现抽象操作的具体逻辑
  • Template Method(模板方法):定义算法的步骤序列

数学表达
设算法流程为:A → B → C → D
模板方法确保所有子类遵循此流程,但允许自定义B和C的实现


二、经典UML结构
«abstract»
GameLevel
+LoadLevel()
+Initialize()
+StartLevel()
+EndLevel()
+PlayLevel()
BossLevel
+Initialize()
+StartLevel()
+EndLevel()
PuzzleLevel
+Initialize()
+StartLevel()
+EndLevel()

三、Unity实战代码(关卡流程系统)
1. 定义抽象模板类
public abstract class GameLevel : MonoBehaviour {// 模板方法(不可重写)public sealed override IEnumerator PlayLevel() {LoadLevelAssets();yield return InitializeLevel();yield return StartLevelCore();yield return EndLevelProcess();Cleanup();}// 具体步骤(部分有默认实现)protected virtual void LoadLevelAssets() {Debug.Log("加载基础资源...");// 加载公共资源逻辑}protected abstract IEnumerator InitializeLevel();protected abstract IEnumerator StartLevelCore();protected virtual IEnumerator EndLevelProcess() {Debug.Log("执行默认结算流程...");yield return new WaitForSeconds(1);}protected virtual void Cleanup() {Debug.Log("清理临时资源...");}
}
2. 实现具体子类
// BOSS关卡
public class BossLevel : GameLevel {[SerializeField] private GameObject _bossPrefab;protected override IEnumerator InitializeLevel() {Debug.Log("生成BOSS...");Instantiate(_bossPrefab);yield return new WaitForSeconds(2);}protected override IEnumerator StartLevelCore() {Debug.Log("开始BOSS战!");// BOSS战斗逻辑yield return new WaitUntil(() => !IsBossAlive());}private bool IsBossAlive() {// 检测BOSS存活状态return true;}
}// 解谜关卡
public class PuzzleLevel : GameLevel {[SerializeField] private PuzzleSystem _puzzle;protected override IEnumerator InitializeLevel() {Debug.Log("初始化谜题组件...");_puzzle.ResetPuzzle();yield return null;}protected override IEnumerator StartLevelCore() {Debug.Log("启动谜题...");yield return new WaitUntil(() => _puzzle.IsSolved);}protected override IEnumerator EndLevelProcess() {yield return base.EndLevelProcess();Debug.Log("展示解谜奖励...");yield return new WaitForSeconds(2);}
}
3. 客户端使用
public class LevelManager : MonoBehaviour {[SerializeField] private GameLevel _currentLevel;void Start() {StartCoroutine(PlayCurrentLevel());}private IEnumerator PlayCurrentLevel() {yield return _currentLevel.PlayLevel();Debug.Log("关卡流程结束!");}public void SwitchLevel(GameLevel newLevel) {_currentLevel = newLevel;StartCoroutine(PlayCurrentLevel());}
}

四、模式进阶技巧
1. 钩子方法(Hook)
protected virtual bool ShouldSkipIntro() => false;public sealed override IEnumerator PlayLevel() {if(!ShouldSkipIntro()) {yield return PlayIntroAnimation();}// 后续流程...
}
2. 阶段状态控制
public abstract class GameLevel : MonoBehaviour {private enum LevelState { Loading, Initializing, Running, Ending }private LevelState _currentState;protected void SetState(LevelState newState) {_currentState = newState;OnStateChanged?.Invoke(newState);}public event Action<LevelState> OnStateChanged;
}
3. 异步加载优化
protected virtual async Task LoadLevelAssetsAsync() {var loadOp = Addressables.LoadAssetsAsync<GameObject>("LevelBaseAssets");await loadOp.Task;Debug.Log($"已加载 {loadOp.Result.Count} 个基础资源");
}

五、游戏开发典型应用场景
  1. 角色行为模板

    public abstract class CharacterBehavior {public void ExecuteDailyRoutine() {WakeUp();Eat();Work();Sleep();}protected abstract void Work();// 其他步骤可有默认实现...
    }
    
  2. 技能释放流程

    public abstract class SkillBase {public void Cast() {PlayCastAnimation();ApplyPreEffects();ExecuteCoreLogic();ApplyPostEffects();}protected abstract void ExecuteCoreLogic();
    }
    
  3. UI面板通用流程

    public abstract class UIPanel : MonoBehaviour {public IEnumerator Show() {PreShowSetup();yield return PlayShowAnimation();PostShowInitialize();}protected virtual void PreShowSetup() { /* 默认空实现 */ }protected abstract IEnumerator PlayShowAnimation();
    }
    
  4. 敌人生成系统

    public abstract class EnemySpawner {public void SpawnWave() {PreSpawnCheck();CalculateSpawnPoints();SpawnEnemies();PostSpawnActions();}protected abstract void SpawnEnemies();
    }
    

六、性能优化策略
策略实现方式适用场景
预编译模板使用泛型模板类高频实例化场景
步骤缓存缓存重复计算结果复杂初始化流程
分帧执行使用协程分步骤执行长耗时流程
资源预加载提前加载共用资源资源密集型关卡

七、模式对比与选择
维度模板方法模式策略模式
代码复用方式继承组合
灵活性修改需要继承运行时动态切换
适用场景固定流程算法可替换算法模块
扩展方向垂直扩展(子类化)水平扩展(新增策略)

八、最佳实践原则
  1. 模板方法密封:防止子类修改算法骨架
    public sealed override void ExecuteProcess() { /* ... */ }
    
  2. 合理使用虚方法:提供默认实现而非强制重写
  3. 控制继承层级:建议不超过3层继承
  4. 文档注释:明确说明各步骤职责
    /// <summary>
    /// 初始化关卡核心元素,必须由子类实现
    /// </summary>
    protected abstract void InitializeCore();
    

九、常见问题解决方案

Q1:如何避免过度继承?
→ 使用组合+模板方法混合模式

public class LevelProcessor {private ILevelInitializer _initializer;private ILevelFinalizer _finalizer;public void ExecuteProcess() {LoadCommonAssets();_initializer.Initialize();RunCoreLogic();_finalizer.Finalize();}
}

Q2:如何处理跨步骤状态共享?
→ 使用上下文对象传递数据

public class LevelContext {public int Score;public float TimeSpent;public List<Enemy> AliveEnemies = new();
}protected abstract void ExecuteCore(LevelContext context);

Q3:如何调试多层级模板?
→ 实现步骤追踪器

public abstract class DebuggableTemplate : MonoBehaviour {private void LogStep(string message) {Debug.Log($"[{Time.time:F2}] {GetType().Name} - {message}");}protected sealed override void LoadResources() {LogStep("开始加载资源");base.LoadResources();LogStep("资源加载完成");}
}

上一篇 【行为型之策略模式】游戏开发实战——Unity灵活算法架构的核心实现策略
下一篇 【行为型之访问者模式】游戏开发实战——Unity灵活数据操作与跨系统交互的架构秘诀

相关文章:

  • Prometheus 的介绍与部署(入门)
  • 第二章 变量和运算符
  • git push 报错:send-pack: unexpected disconnect while reading sideband packet
  • c#队列及其操作
  • vscode调试c/c++
  • 在linux中,如何使用malloc()函数向操作系统申请堆内存,使用free()函数释放内存。
  • python打包exe报错:处理文件时错误:Excel xlsx file; not supported
  • Python常见问题
  • 深入理解 Dijkstra 算法:原理、实现与优化
  • openfeign与dubbo调用下载excel实践
  • 如何获得sqoop-1.4.6.2.3.99.0-195.jar
  • 保持视频二维码不变,更新视频的内容
  • GMT之Bash语言使用
  • 濒危仙草的重生叙事:九仙尊米斛花节如何以雅集重构中医药文化IP
  • Qt原型模式实现与应用
  • (4)python开发经验
  • BRPickerView
  • ansible进阶02
  • 鸿蒙OSUniApp 制作动态加载的瀑布流布局#三方框架 #Uniapp
  • 【ios越狱包安装失败?uniapp导出ipa文件如何安装到苹果手机】苹果IOS直接安装IPA文件
  • 山东:小伙为救同学耽误考试属实,启用副题安排考试
  • 国台办:民进党当局刻意刁难大陆配偶,这是不折不扣的政治迫害
  • 董军同法国国防部长举行会谈
  • 马上评丨75万采购300元设备,仅仅终止采购还不够
  • 中美经贸高层会谈在日内瓦结束,中国代表团将举行发布会
  • 韩国总统大选候选人登记结束,共7人参选