Unity 模板方法模式(实例详解)

文章目录

    • 简介
      • 示例1:游戏关卡流程
      • 示例2:测试试卷类
      • 示例3:游戏场景构建流程
      • 示例4:游戏动画序列
      • 示例5:游戏对象初始化过程

简介

Unity中的模板方法模式是一种行为设计模式,它在父类中定义了一个算法的框架,并允许子类重写某些步骤来实现特定逻辑。以下五个代码示例详细说明了Unity中如何使用模板方法模式:

示例1:游戏关卡流程

// 抽象关卡类
public abstract class AbstractLevel
{
    public void PlayLevel()
    {
        Initialize();
        StartGameplay();
        while (!IsGameOver())
        {
            PerformPlayerTurn();
            PerformEnemyTurn();
        }
        EndGameplay();
        ShowResults();
    }

    protected abstract void Initialize();
    protected abstract bool IsGameOver();
    protected abstract void PerformPlayerTurn();
    protected abstract void PerformEnemyTurn();
    protected abstract void EndGameplay();
    protected abstract void ShowResults();
}

// 具体关卡A
public class ConcreteLevelA : AbstractLevel
{
    // 实现每个抽象方法
    protected override void Initialize() { /* 初始化关卡A的具体内容 */ }
    protected override bool IsGameOver() { /* 检查关卡A是否结束 */ }
    protected override void PerformPlayerTurn() { /* 玩家A的行为 */ }
    protected override void PerformEnemyTurn() { /* 敌人A的行为 */ }
    protected override void EndGameplay() { /* 结束关卡A的具体操作 */ }
    protected override void ShowResults() { /* 显示关卡A的结果 */ }
}

// 其他具体关卡B、C、D等同样遵循AbstractLevel进行实现

示例2:测试试卷类

根据您之前提供的信息,这里是TestPaperTemplateClass的一个实例扩展为多个问题:

using UnityEngine;
public abstract class TestPaperTemplateClass
{
    public void ConductTest()
    {
        Introduction();
        foreach (var question in Questions)
        {
            PresentQuestion(question);
            GetAnswer(question);
            ValidateAnswer(question);
        }
        Conclusion();
    }

    protected virtual void Introduction() { Debug.Log("欢迎参加本次测试!"); }
    protected abstract void PresentQuestion(Question question);
    protected abstract string GetAnswer(Question question);
    protected abstract void ValidateAnswer(Question question);
    protected virtual void Conclusion() { Debug.Log("测试结束,谢谢参与!"); }

    private List<Question> Questions = new List<Question>(); // 假设已填充问题列表
}

public class MathTestPaper : TestPaperTemplateClass
{
    // 重写与数学题目相关的部分
    protected override void PresentQuestion(Question question)
    {
        Debug.Log(question.Content + " 答案选项:" + question.Options.ToString());
    }
    
    protected override string GetAnswer(Question question)
    {
        return InputFieldComponent.GetText(); // 假设从UI获取用户输入的答案
    }

    protected override void ValidateAnswer(Question question)
    {
        if (question.CorrectAnswer == GetAnswer(question))
        {
            Debug.Log("答案正确!");
        }
        else
        {
            Debug.Log("答案错误,正确答案是:" + question.CorrectAnswer);
        }
    }
}

示例3:游戏场景构建流程

public abstract class SceneBuilder
{
    public void BuildScene()
    {
        CreateSkybox();
        PlacePlayerStart();
        AddEnemies();
        SetInitialResources();
        ConfigureUI();
        HookUpEvents();
    }

    protected abstract void CreateSkybox();
    protected abstract void PlacePlayerStart();
    protected abstract void AddEnemies();
    protected abstract void SetInitialResources();
    protected abstract void ConfigureUI();
    protected abstract void HookUpEvents();
}

public class AdventureSceneBuilder : SceneBuilder
{
    // 实现冒险场景的具体构建方法
    protected override void CreateSkybox() { /* 创建冒险场景的天空盒 */ }
    protected override void PlacePlayerStart() { /* 设置玩家初始位置 */ }
    protected override void AddEnemies() { /* 添加冒险场景特有的敌人 */ }
    // ...其他方法的实现...
}

public class BattleArenaSceneBuilder : SceneBuilder
{
    // 实现战斗竞技场场景的具体构建方法
    protected override void CreateSkybox() { /* 创建战斗竞技场的天空盒 */ }
    // ...其他方法的实现...
}

示例4:游戏动画序列

public abstract class AnimationSequence
{
    public void Play()
    {
        Begin();
        AnimateCharacter();
        ExecuteSpecialEffects();
        WaitForInput();
        End();
    }

    protected abstract void Begin();
    protected abstract void AnimateCharacter();
    protected abstract void ExecuteSpecialEffects();
    protected abstract bool WaitForInput();
    protected abstract void End();
}

public class VictoryDanceSequence : AnimationSequence
{
    // 实现胜利舞蹈动画的各个步骤
    protected override void Begin() { /* 角色开始动作前的准备 */ }
    protected override void AnimateCharacter() { /* 执行角色的胜利舞蹈动画 */ }
    protected override void ExecuteSpecialEffects() { /* 加入烟火或其他特效 */ }
    protected override bool WaitForInput() { return Input.GetKeyDown(KeyCode.Space); } // 等待玩家按键触发结束
    protected override void End() { /* 动画结束后的处理 */ }
}

public class DefeatAnimationSequence : AnimationSequence
{
    // 实现失败动画的各个步骤
    // ...
}

示例5:游戏对象初始化过程

public abstract class GameObjectInitializer
{
    public void Initialize(GameObject obj)
    {
        AttachComponents(obj);
        ConfigureTransform(obj.transform);
        SetInitialProperties(obj);
        SubscribeToEvents(obj);
    }

    protected abstract void AttachComponents(GameObject obj);
    protected abstract void ConfigureTransform(Transform transform);
    protected abstract void SetInitialProperties(GameObject obj);
    protected abstract void SubscribeToEvents(GameObject obj);
}

public class PlayerInitializer : GameObjectInitializer
{
    protected override void AttachComponents(GameObject player) { /* 添加玩家所需组件 */ }
    protected override void ConfigureTransform(Transform t) { t.position = new Vector3(0, 0, 0); }
    protected override void SetInitialProperties(GameObject player) { /* 设置玩家初始属性 */ }
    protected override void SubscribeToEvents(GameObject player) { /* 订阅玩家相关的游戏事件 */ }
}

public class EnemyInitializer : GameObjectInitializer
{
    // 实现敌人的初始化逻辑
    // ...
}

以上每个示例都展示了在Unity中模板方法模式的应用,通过抽象类定义一个基本流程或算法结构,而将具体的实现留给子类完成。

python推荐学习汇总连接:
50个开发必备的Python经典脚本(1-10)

50个开发必备的Python经典脚本(11-20)

50个开发必备的Python经典脚本(21-30)

50个开发必备的Python经典脚本(31-40)

50个开发必备的Python经典脚本(41-50)
————————————————

​最后我们放松一下眼睛
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/363546.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微软新的内部开发部门发现了第一个 Windows 12 版本

Windows 11 被证明让很多人有点失望&#xff0c;很多 Windows 10 用户认为没有理由升级。 这意味着有大量用户渴望一些大而令人印象深刻的东西——而这正是 Windows 12 所希望的。 无论您是 Windows 10 的忠实拥趸&#xff0c;还是渴望更新、更闪亮的 Windows 11 采用者&#x…

笔记本电脑Win11重装系统教程

在笔记本电脑Win11操作过程中&#xff0c;用户如果遇到很严重的系统问题&#xff0c;就可以重新正常的Win11系统&#xff0c;快速解决Win11系统问题。但是&#xff0c;部分新手用户不知道不知道如何操作才能给Win11笔记本电脑重装系统&#xff1f;以下小编分享笔记本电脑Win11重…

分布式事务(五)——基于本地消息和可靠消息的解决方案

系列目录&#xff1a; 《分布式事务&#xff08;一&#xff09;—— 事务的基本概念》 《分布式事务&#xff08;二&#xff09;—— CAP和Base理论》 《分布式事务&#xff08;三&#xff09;—— 两阶段提交解决方案&#xff08;2PC&#xff09;》 《分布式事务&#xff0…

安卓滚动视图ScrollView

<?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:orientatio…

mybatisplus-多数据源配置

1. 流程 pom文件yml配置多数据源具体服务添加注解DS(“***”) 1.pom文件 <!--mybatis plus 起步依赖--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</vers…

《苍穹外卖》电商实战项目实操笔记系列(P123~P184)【下】

史上最完整的《苍穹外卖》项目实操笔记系列【下篇】&#xff0c;跟视频的每一P对应&#xff0c;全系列10万字&#xff0c;涵盖详细步骤与问题的解决方案。如果你操作到某一步卡壳&#xff0c;参考这篇&#xff0c;相信会带给你极大启发。 上篇&#xff1a;P1~P65《苍穹外卖》项…

JavaWeb前端——HTML/CSS

HTML/CSS概述 HTML&#xff1a;学习标签&#xff0c;CSS&#xff1a;学习样式 HTML 1. 不区分大小写。 2. 属性可以使用单引号/双引号 3. 在记事本/编辑器中编写html语言&#xff0c;通过浏览器解析渲染语言 4. 语法结构松散&#xff08;编写时要尽量严谨&#xff09; VSc…

Vulnhub-RIPPER: 1渗透

文章目录 一、前言1、靶机ip配置2、渗透目标3、渗透概括 开始实战一、信息获取二、rips的使用三、获取密码文件四、日志审查五、提权 一、前言 由于在做靶机的时候&#xff0c;涉及到的渗透思路是非常的广泛&#xff0c;所以在写文章的时候都是挑重点来写&#xff0c;尽量的不饶…

Ant Design Mini - 支付宝小程序官方推出的免费开源 UI 组件库,新增支持微信小程序,实用性大大增加

支付宝小程序官方的 UI 组件库开始支持运行在微信小程序上了&#xff0c;如果要开发这两家小程序平台&#xff0c;这套组件很合适。 Ant Design Mini 也简称 antd-mini &#xff0c;是一套运行在支付宝小程序的 UI 组件库&#xff0c;UI 设计遵循 Ant Design 规范&#xff0c;…

前端Vue select 下拉框详解以及监听事件

目录 简介 使用详解 演示示例 :key"option.value" :value"option.value" 区别 监听事件 简介 在 Vue 中&#xff0c;下拉框通常通过 <select> 元素与一系列的 <option> 元素来创建。Vue 的数据绑定和指令&#xff08;如 v-model 和 v-for…

color - 让你的输出带点颜色

color color 是一个可以让你输出带颜色文本的库。 安装 go get github.com/fatih/color示例 输出到控制台 // 这会直接输出到控制台 color.Cyan("Prints text in cyan.")// 每个调用末尾会自动加上换行 color.Blue("Prints %s in blue.", "text&…

composer常用命令

查看全局配置信息 composer config -gl 设置镜全局像地址 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 去掉-g&#xff0c;即表示只有当前项目使用该镜像 批量安装composer项目依赖 composer install 执行该命令后&#xff0c;会读取当…

1295584-83-6,NOTA 马来酰亚胺,可通过与铁离子结合增强MRI信号

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;1295584-83-6&#xff0c;NOTA Maleimide&#xff0c;NOTA Mal&#xff0c;NOTA马来酰亚胺 一、基本信息 产品简介&#xff1a;NOTA Maleimide has good water solubility and stability, which enables it to main…

不移其志,踏浪前行 | 北京智和信通召开2023年度工作总结大会

岁聿云暮&#xff0c;新元肇启&#xff0c;2024年1月24日&#xff0c;北京智和信通技术有限公司&#xff08;以下简称“北京智和信通”&#xff09;召开2023年度年终总结大会。会上&#xff0c;各部门负责人全面分析公司业务发展态势&#xff0c;各部门员工依次汇报主要工作情况…

Javaweb实现的学生宿舍管理系统

Javaweb实现的学生宿舍管理系统 文章目录 Javaweb实现的学生宿舍管理系统系统介绍技术选型成果展示源码获取账号地址及其他说明 系统介绍 Javaweb实现的学生宿舍管理系统采用jspservlet技术实现了如下功能模块&#xff0c;分别是宿舍管理员管理、学生管理、宿舍楼管理、缺勤记…

Solidworks 与 MATLAB 联合仿真

本文主要讲解了“MATLAB与SolidWorks的联合仿真怎么实现”&#xff0c;文中的讲解内容简单清晰&#xff0c;易于学习与理解&#xff0c;下面请大家跟着小编的思路慢慢深入&#xff0c;一起来研究和学习“MATLAB与SolidWorks的联合仿真怎么实现”吧&#xff01; 下载插件。 1、…

基于 LLM+LlamaIndex+NebulaGraph,构建大模型知识图谱的检索(RAG)方法

最近&#xff0c;围绕着利用 LLM&#xff08;Language Model&#xff09;和知识图谱&#xff08;KG&#xff0c;Knowledge Graphs&#xff09;构建RAG&#xff08;Retrieval Augmented Generation&#xff09;流程引起了很多关注。 在本文中&#xff0c;让我们通过利用 LlamaI…

leetcode189.轮转数组|超简单易于理解方法

题目 https://leetcode.cn/problems/rotate-array/description/https://leetcode.cn/problems/rotate-array/description/ 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输…

【模型微调】| 各类微调模型总结 P-Tuning,Prefix,P-tuning v2,LoRA

文章目录 1 微调背景1.1 Full fine-tuning 全参数微调&#xff08;FFT&#xff09;1.2 parameter-Efficient-fine-tuning 部分参数微调&#xff08;PEFT&#xff09; 2 提示词调整训练法2.1 P-Tuning2.2 Prefix2.3 P-Tuning v2 3 结构调整训练法3.1 Adapter tuning3.2 LoRA 微调…

永久删除 Elasticsearch 中的主节点

Elasticsearch 是一个开源分布式搜索和分析引擎&#xff0c;用于各种任务&#xff0c;例如全文搜索、日志分析和实时数据分析。 Elasticsearch 集群由一个或多个节点组成&#xff0c;每个节点可以具有多种角色&#xff0c;包括主节点&#xff08;master node&#xff09;、数据…