熟悉各类游戏设计模式的用途与限制,如 factory、strategy、mvc、object pool 等
良好的系统分析与设计能力要求开发者熟悉并正确运用各种设计模式来解决特定问题。设计模式是一种针对特定问题的通用解决方案,可提高代码的可复用性、可维护性和可扩展性。以下是对一些常见游戏设计模式的详细分析,包括其用途、限制和代码示例。
一、工厂模式(Factory)
1. 概述
工厂模式用于封装对象的创建逻辑,避免直接使用 new 创建对象,方便后续扩展和维护。
2. 用途
- 简化对象创建过程。
- 解耦对象的创建与使用。
- 动态创建不同类型的对象。
3. 限制
- 如果种类较多,可能导致工厂类逻辑复杂。
- 不适用于变化很少的对象类型。
4. 代码示例
简单工厂
public interface IEnemy
{void Attack();
}public class Orc : IEnemy
{public void Attack() => Debug.Log("Orc attacks!");
}public class Goblin : IEnemy
{public void Attack() => Debug.Log("Goblin attacks!");
}public static class EnemyFactory
{public static IEnemy CreateEnemy(string type){return type switch{"Orc" => new Orc(),"Goblin" => new Goblin(),_ => throw new ArgumentException("Invalid enemy type")};}
}// 使用
IEnemy orc = EnemyFactory.CreateEnemy("Orc");
orc.Attack();
二、策略模式(Strategy)
1. 概述
策略模式定义了一系列算法,将它们封装起来,使它们可以互相替换而不影响客户端。
2. 用途
- 动态选择算法或行为。
- 实现具有多种行为的游戏角色或 AI。
3. 限制
- 增加了策略类的数量。
- 客户端需要了解所有策略类。
4. 代码示例
public interface IAttackStrategy
{void Execute();
}public class MeleeAttack : IAttackStrategy
{public void Execute() => Debug.Log("Melee Attack!");
}public class RangedAttack : IAttackStrategy
{public void Execute() => Debug.Log("Ranged Attack!");
}public class Character
{private IAttackStrategy _attackStrategy;public void SetAttackStrategy(IAttackStrategy strategy){_attackStrategy = strategy;}public void Attack(){_attackStrategy?.Execute();}
}// 使用
Character character = new Character();
character.SetAttackStrategy(new MeleeAttack());
character.Attack();character.SetAttackStrategy(new RangedAttack());
character.Attack();
三、模型-视图-控制器(MVC)
1. 概述
MVC 模式将应用程序分为三部分:
- Model:处理数据和逻辑。
- View:显示数据和用户界面。
- Controller:处理用户输入并更新 Model 和 View。
2. 用途
- 解耦业务逻辑和界面。
- 便于团队分工(逻辑与界面开发可同时进行)。
3. 限制
- 增加代码复杂度。
- 小型项目可能不需要严格遵循。
4. 代码示例
// Model
public class PlayerModel
{public int Health { get; set; } = 100;
}// View
public class PlayerView : MonoBehaviour
{public void UpdateHealth(int health){Debug.Log($"Player Health: {health}");}
}// Controller
public class PlayerController
{private readonly PlayerModel _model;private readonly PlayerView _view;public PlayerController(PlayerModel model, PlayerView view){_model = model;_view = view;}public void TakeDamage(int damage){_model.Health -= damage;_view.UpdateHealth(_model.Health);}
}// 使用
PlayerModel model = new PlayerModel();
PlayerView view = new PlayerView();
PlayerController controller = new PlayerController(model, view);controller.TakeDamage(10);
四、对象池模式(Object Pool)
1. 概述
对象池模式通过重复使用对象而非频繁创建和销毁对象,提高性能。
2. 用途
- 需要频繁创建和销毁的对象(如子弹、敌人等)。
- 性能敏感的场景。
3. 限制
- 池大小管理不当可能浪费内存或影响性能。
- 不适合生命周期复杂的对象。
4. 代码示例
using System.Collections.Generic;
using UnityEngine;public class ObjectPool<T> where T : new()
{private readonly Stack<T> _pool = new Stack<T>();public T Get(){return _pool.Count > 0 ? _pool.Pop() : new T();}public void Release(T obj){_pool.Push(obj);}
}// 示例:子弹管理
public class Bullet : MonoBehaviour
{public void Shoot(){Debug.Log("Bullet fired!");}
}public class BulletManager : MonoBehaviour
{private readonly ObjectPool<Bullet> _bulletPool = new ObjectPool<Bullet>();public Bullet GetBullet(){return _bulletPool.Get();}public void ReleaseBullet(Bullet bullet){_bulletPool.Release(bullet);}
}// 使用
BulletManager manager = new BulletManager();
Bullet bullet = manager.GetBullet();
bullet.Shoot();
manager.ReleaseBullet(bullet);
总结
| 设计模式 | 用途 | 优点 | 缺点 |
|---|---|---|---|
| Factory | 动态创建不同类型的对象。 | 简化对象创建,便于扩展。 | 增加了工厂类的复杂性。 |
| Strategy | 动态替换算法或行为。 | 易于扩展,降低耦合。 | 策略类数量较多。 |
| MVC | 分离逻辑与界面,适合大型项目。 | 提高代码清晰度,便于团队协作。 | 小型项目显得过于复杂。 |
| Object Pool | 提高对象复用性,减少创建和销毁的性能开销。 | 提高性能,减少内存分配频率。 | 池大小管理需要优化,不适合生命周期复杂的对象。 |
通过掌握这些设计模式,可以更高效地开发和维护游戏项目,满足不同的需求场景,同时为后期的扩展和优化打下良好的基础。
相关文章:
熟悉各类游戏设计模式的用途与限制,如 factory、strategy、mvc、object pool 等
良好的系统分析与设计能力要求开发者熟悉并正确运用各种设计模式来解决特定问题。设计模式是一种针对特定问题的通用解决方案,可提高代码的可复用性、可维护性和可扩展性。以下是对一些常见游戏设计模式的详细分析,包括其用途、限制和代码示例。 一、工厂…...
【RabbitMQ高级篇】消息可靠性问题(1)
目录 1.消息可靠性 1.1.生产者消息确认 1.1.1.修改配置 1.1.2.定义Return回调 1.1.3.定义ConfirmCallback 1.2.消息持久化 1.2.1.交换机持久化 1.2.2.队列持久化 1.2.3.消息持久化 1.3.消费者消息确认 1.3.1.演示none模式 1.3.2.演示auto模式 1.4.消费失败重试机制…...
ASP.NET |日常开发中常见问题归纳讲解
ASP.NET |日常开发中常见问题归纳讲解 前言一、性能问题1.1 数据库访问性能1.2 视图状态(在ASP.NET Web Forms 中) 二、安全问题2.1 SQL 注入2.2 跨站脚本攻击(XSS) 三、状态管理问题3.1 会话状态(Session …...
【【深入浅出TinyRisc-v】】
深入浅出TinyRisc-v 本代码参考于 https://gitee.com/liangkangnan/tinyriscv 自己理解之后又重新写了一遍 tinyriscv.v // 涓嬮潰鏄鏁翠釜top妯″潡鐨勪功鍐? module tinyriscv(input clk ,input rst_n …...
常见的限流算法
常见的限流算法 限流的定义固定窗口算法滑动窗口算法漏桶算法(推荐)令牌桶算法(推荐)限流粒度本地限流(单机限流)分布式限流(多机限流)分布式限流的实现 限流的定义 限流,也称流量控制。是指系统…...
【Leetcode 每日一题】3159. 查询数组中元素的出现位置
问题背景 给你一个整数数组 n u m s nums nums,一个整数数组 q u e r i e s queries queries 和一个整数 x x x。 对于每个查询 q u e r i e s [ i ] queries[i] queries[i],你需要找到 n u m s nums nums 中第 q u e r i e s [ i ] queries[i] q…...
xadmin后台首页增加一个导入数据按钮
xadmin后台首页增加一个导入数据按钮 效果 流程 1、在添加小组件中添加一个html页面 2、写入html代码 3、在urls.py添加导入数据路由 4、在views.py中添加响应函数html代码 <!DOCTYPE html> <html lang...
行为树详解(5)——事件驱动
【分析】 如果行为树的节点很多,那么会存在要经过很多节点才会走到动作节点的情况。显然,性能上不如状态机。 每帧都需要重新遍历一系列节点才会走到动作节点,而实际上很多条件节点在数帧内不会有变化,这是造成性能问题的重要原…...
3.若依前端项目拉取、部署、访问
因为默认RuoYi-Vue是使用的Vue2,所以需要另外去下载vue3来部署。 拉取代码 git clone https://gitee.com/ys-gitee/RuoYi-Vue3.git 安装node才能执行npm相关的命令 执行命令npm install 如果npm install比较慢的话,需要添加上国内镜像 npm install --registrhttp…...
Debian操作系统相对于Ubuntu有什么优势吗?
更高的稳定性:Debian 以其出色的稳定性闻名,得益于严格的软件包测试和发布流程。其稳定版经过长时间测试与验证,确保了系统的高度稳定,更适合对稳定性要求极高的长期运行服务器环境。而 Ubuntu 虽有稳定版本,但更新周期…...
【漏洞复现】CVE-2015-3337 Arbitrary File Reading
漏洞信息 NVD - CVE-2015-3337 Directory traversal vulnerability in Elasticsearch before 1.4.5 and 1.5.x before 1.5.2, when a site plugin is enabled, allows remote attackers to read arbitrary files via unspecified vectors. 在安装了具有“site”功能的插件以…...
win10、win11-鼠标右键还原、暂停更新
系统优化 win 10jihuo win 11jihuo鼠标右键还原暂停更新 update 2024.12.28win 10 jihuo winx,打开powershell管理员,输入以下命令,选择1并等待 irm https://get.activated.win | iex参考:https://www.bilibili.com/video/BV1TN411M72J/?sp…...
FFmpeg来从HTTP拉取流并实时推流到RTMP服务器
当使用FFmpeg来从HTTP拉取流并实时推流到RTMP服务器时,你可以使用以下命令: ffmpeg -i http://输入流地址 -c:v copy -c:a copy -f flv rtmp://RTMP服务器地址/应用名称/流名称 这是一个基本的命令示例,其中: - -i http://输入流地…...
Quo Vadis, Anomaly Detection? LLMs and VLMs in the Spotlight 论文阅读
文章信息: 原文链接:https://arxiv.org/abs/2412.18298 Abstract 视频异常检测(VAD)通过整合大语言模型(LLMs)和视觉语言模型(VLMs)取得了显著进展,解决了动态开放世界…...
Rust : tokio中select!
关于tokio的select宏,有不少的用途。包括超时和竞态选择等。 关于select宏需要关注,相关的异步条件,会同时执行,只是当有一个最早完成时,会执行“抛弃”和“对应”策略。 说明:对本文以下素材的来源表示感…...
【hackmyvm】hacked靶机wp
tags: HMVrootkitDiamorphine Type: wp 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集2.1. 端口扫描2.2. 目录扫描2.3. 获取参数 3. 提权 靶机链接 https://hackmyvm.eu/machines/machine.php?vmHacked 作者 sml 难度 ⭐️⭐️⭐️⭐️️ 2. 信息收集 2.1. 端口扫描…...
MaixBit k210学习记录
开发背景:Window系统主机,在主机上安装了虚拟机(VirtualBoxUbuntu23.04) 目标实现:在虚拟机(Ubuntu)中,实现对Maix bit(k210)开发板的开发 虚拟机的安装参考…...
Wordperss漏洞 DeDeCMS漏洞
Wordperss漏洞 环境搭建 #执⾏命令 cd /vulhub/wordpress/pwnscriptum docker-compose up -d #靶场地址 http://8.155.7.173:8080/wp-admin/ 注册账号 登录 漏洞一:后台修改模板拿WebShell 步骤一:思路是修改其WP的模板写入⼀句话木马后门并访问其文件…...
如何构建有效的AI Agents:从复杂到简约——深度解读Claude实践总结《Building effective agents》(上)
在人工智能技术日新月异的今天,大语言模型(LLM)已经成为技术创新的热点。 然而,在追逐技术前沿的热潮中,我们是否忽视了工程设计的本质? 作为全球人工智能领域的领军企业之一,Anthropic以其在AI安全和伦理方面的深入…...
git status 耗时
某个git库每次status一下就是半小时起步,gc后还是没有效果,后来排查记录发现某笔记录提交几百G的冗余文件,虽然revert了,但是还是存在库中,遂如下清理: # 查找大文件 git verify-pack -v .git/objects/pac…...
BYD Battery Emulator:让电动汽车电池成为家庭储能的智能桥梁
BYD Battery Emulator:让电动汽车电池成为家庭储能的智能桥梁 【免费下载链接】BYD-Battery-Emulator-For-Gen24 This software enables EV battery packs to be used for stationary storage in combination with solar inverters. 项目地址: https://gitcode.co…...
终极指南:如何在4K显示器上完美运行VPet虚拟桌宠模拟器
终极指南:如何在4K显示器上完美运行VPet虚拟桌宠模拟器 【免费下载链接】VPet 虚拟桌宠模拟器 一个开源的桌宠软件, 可以内置到任何WPF应用程序 项目地址: https://gitcode.com/GitHub_Trending/vp/VPet 你是否在4K显示器上运行虚拟桌宠时遇到过模糊、卡顿或…...
ReactPy服务端渲染终极指南:如何在Python中构建现代Web应用
ReactPy服务端渲染终极指南:如何在Python中构建现代Web应用 【免费下载链接】reactpy Its React, but in Python 项目地址: https://gitcode.com/gh_mirrors/re/reactpy ReactPy是Python中构建用户界面的革命性库,让你无需JavaScript就能创建现代…...
保姆级教程:在Ubuntu 22.04上搭建PXE服务器,自动化安装麒麟桌面系统(含NFS/TFTP/DHCP配置)
从零构建PXE自动化部署平台:Ubuntu 22.04环境下的麒麟系统无人值守安装实战 在中小型技术团队或开发者个人的工作场景中,频繁部署测试环境往往成为效率瓶颈。传统的光盘或U盘安装方式不仅耗时费力,更难以保证多台设备配置的一致性。本文将带您…...
s2-pro效果展示:高语速新闻播报(220字/分钟)清晰度实测
s2-pro效果展示:高语速新闻播报(220字/分钟)清晰度实测 1. 专业语音合成新标杆 s2-pro作为Fish Audio开源的专业级语音合成模型镜像,正在重新定义文本转语音的技术标准。不同于常见的聊天式语音工具,s2-pro专注于提供…...
离散裂隙注浆与COMSOL的应用
离散裂隙注浆 comsol裂隙注浆模拟这件事,搞过岩土工程的都懂——看着像往裂缝里灌水泥,实际操作起来比煮一锅意大利面还容易翻车。COMSOL在这块儿的优势就像给工程师开了透视挂,尤其是处理随机分布的离散裂隙时,能直接把三维地质结…...
ComfyUI-WanVideoWrapper:让AI视频生成变得像搭积木一样简单
ComfyUI-WanVideoWrapper:让AI视频生成变得像搭积木一样简单 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 你是否曾经想过,如果能把AI视频生成的复杂过程拆解成一个个简…...
如何用OpenRocket实现专业火箭仿真?从设计到发射的全流程指南
如何用OpenRocket实现专业火箭仿真?从设计到发射的全流程指南 【免费下载链接】openrocket Model-rocketry aerodynamics and trajectory simulation software 项目地址: https://gitcode.com/GitHub_Trending/op/openrocket 在航空航天工程领域,…...
Python实战:从零掌握标准正态分布及其可视化
1. 什么是标准正态分布? 我第一次接触标准正态分布是在大学统计课上,当时教授画了一个完美的钟形曲线,说这是自然界最常见的分布。后来做数据分析才发现,这个看似简单的曲线真的无处不在——从人的身高体重到考试分数,…...
极简纯净音乐体验:铜钟音乐平台的高效使用指南
极简纯净音乐体验:铜钟音乐平台的高效使用指南 【免费下载链接】tonzhon-music 铜钟 (Tonzhon.com): 免费听歌; 没有直播, 社交, 广告, 干扰; 简洁纯粹, 资源丰富, 体验独特!(密码重置功能已回归) 项目地址: https://gitcode.com/GitHub_Trending/to/t…...
