Unity《ATD》塔防RPG类3D游戏架构设计(二)
前篇:Unity《ATD》塔防RPG类3D游戏架构设计(一) - KillerAery - 博客园
《ATD》 游戏模型
《ATD》策划案部分摘取:



分析了策划案后,显而易见里面划分了这4种游戏模型:
英雄,怪物,陷阱,塔
最初想到的是使用继承的方式来实现这些游戏模型(如图):

然而考虑到现在的英雄/怪物/陷阱/塔类型已经足够太多了,而且以后还可能会扩展更多。
若用继承的方式,其派生类数量将到达一个小团队难以维护的地步。
再想到Unity的GameObject-Component机制,于是最后我采用组合组件的方式来设计这几个游戏模型。
至于之前设计Skill机制的时候,为什么反而采用继承的方式,原因如下:
- 策划案里,Skill的种类只有8种,所以需要编写的派生类比较少,而英雄/怪物/陷阱/塔所有种类总共加起来有二十多种。
- Skill不是GameObject,没有Unity提供的GameObject-Component机制,不太方便接纳组件(除非自己再实现一套组件模式)。
- 实际上,还有个设计Skill的思路就是把Skill设计成一个行为树,通过组合节点来生成一个Skill。然而这个想法在当时被我二选一时舍弃了。
首先为了统一术语,避免游戏模型和Unity的GameObject弄混淆,我们定义了一个称之为 个体(Individual) 的名词,来表示一个游戏模型单位。
那么如何表示一个个体游戏对象呢?
首先我们需要编写一些个体游戏对象必要的组件脚本类。
对于一个个体游戏对象,它可能由如下图构成:

一般来说行为和输入都应该放在一起统称为控制器,然而实际上在游戏里,输入来源可能是玩家,也可能是AI,因此把个体对象行为和输入分离是个好的选择。
也就是说它得有属性,行为,操控行为的输入,还得可以容纳Buff机制,Skill机制和装备机制(实际被砍了)。
根据这些需求分化出来不少组件类:

然后为了解耦各组件的依赖关系,特别是跨游戏对象的组件依赖,于是还额外引入了一个 消息系统组件 ,实际上就是用于实现观察者模式。
每个个体对象都必须带一个消息系统组件,且其他编写的组件类基本上都依赖这个消息系统组件。
例如,A个体用指向性技能对B个体进行释放,则由A个体的 技能系统组件 发送消息给B个体的 消息系统组件 ,然后消息再转发给B个体的 Buff系统组件,从而让B个体受到该Buff影响。
最终个体游戏对象的组件依赖关系图:

然后通过一个GameObject然后添加好模型,然后放置一些组件从而组合出来一个个体游戏对象。
一个怪物个体游戏对象示例:

《ATD》 游戏逻辑
先说明一下,全局游戏逻辑的全局并不是指变量的全局暴露,而是说负责游戏世界的整体逻辑。
全局游戏逻辑设计的话相对轻松一点:
- 首先为了更好管理个体游戏对象,引入了 对象工厂 来控制个体有对象的生命周期。
- 金钱管理器 负责玩家的金钱数据管理,例如击杀奖励,关卡结算奖励。
- 塔管理器 负责用规则限制塔的逻辑,例如建造一个塔的位置限制,建造塔的金钱消耗。
- 关卡管理器 负责生成每波怪物。
为了辅助这些逻辑,还额外引入了消息系统组件,路径管理器,怪物生成器三个脚本。
构造如下:

《ATD》游戏对象目录设置:


引入消息系统是为了让游戏逻辑可以监听个体对象之间的交互消息,从而做出一些符合游戏逻辑的行为。
例如,监听到基地个体对象死亡的消息,应判断游戏失败。
游戏逻辑比较多脚本都需要读入配置文件数据的功能,方便动态更新游戏。
此外,脚本应在Inspector面板应提供一些可调的逻辑参数,方便调试全局逻辑(例如金钱数调99999999)。
《ATD》 UI/HUD/特效/音乐
应为UI/HUD/特效/BGM各自编写一个 UI管理器/HUD管理器/特效管理器/音乐管理器 :
一是方便管理显示,二是更好的与游戏逻辑/游戏模型来交互。
然后也要为这些管理器引入 消息系统组件 用于辅助,从而接受一些重要的消息来改变显示效果。
举个例子,Buff特效管理器,通过监听游戏模型的Buff消息,来给对应的游戏模型生成Buff特效对象。
此时,项目整体架构关系如图:

是不是感觉有点像MVC视图?(笑
结语
至此,《ATD》的总体程序结构已经十分明朗了,下一篇应该是最后一篇,已经懒得再写多点了。
大概内容时将更详细介绍其中一些具体实现时出现的问题以及解决方案(包含一些trick),还有一些工具。
暂时就先写到这。
Unity《ATD》塔防RPG类3D游戏架构设计(二)的更多相关文章
- Unity《ATD》塔防RPG类3D游戏架构设计(一)
目录 <ATD> 游戏简介 <ATD> 整体结构 <ATD> 游戏机制 Buff机制 Skill机制(技能机制) 仇恨机制 <ATD> 游戏模型 策划案 ...
- 使用Unity创建塔防游戏(Part3)—— 项目总结
之前我们完成了使用Unity创建塔防游戏这个小项目,在这篇文章里,我们对项目中学习到的知识进行一次总结. Part1的地址:http://www.cnblogs.com/lcxBlog/p/60759 ...
- 使用Unity创建塔防游戏(Part2)
How to Create a Tower Defense Game in Unity – Part 2 原文地址:https://www.raywenderlich.com/107529/unity ...
- 3D游戏引擎设计 实时计算机图形学的应用方法 第2版 pdf 带索引书签目录
3D游戏引擎设计 实时计算机图形学的应用方法 第2版 目录 第1章 概述1.1 图形硬件和游戏发展史1.2 本书版本与软件发展史1.3 章节导读 第2章 图形系统2.1 基础知识2.1.1 坐标系 ...
- 使用Unity创建塔防游戏(Part1)
How to Create a Tower Defense Game in Unity - Part1 原文作者:Barbara Reichart 文章原译:http://www.cnblogs.co ...
- 使用unity创建塔防游戏(原译)(part1)
塔防游戏非常地受欢迎,木有什么能比看着自己的防御毁灭邪恶的入侵者更爽的事了. 在这个包含两部分的教程中,你将使用Unity创建一个塔防游戏. 你将会学到如何: 创建一波一波的敌人 使敌人随着路标移动 ...
- 解构C#游戏框架uFrame兼谈游戏架构设计
1.概览 uFrame是提供给Unity3D开发者使用的一个框架插件,它本身模仿了MVVM这种架构模式(事实上并不包含Model部分,且多出了Controller部分).因为用于Unity3D,所以它 ...
- 游戏引擎架构,3d游戏引擎设计、Unreal引擎技术等五本PDF推荐
扫码时备注或说明中留下邮箱 付款后如未回复请至https://shop135452397.taobao.com/ 联系店主
- Elixir游戏服设计二
搞一个例子,而没有实际的目标,做起来真是烦人.几次三番都想放弃. 后来想想,即使最后完成不了完整的服务器,把需要的知识点搞搞,摸熟悉也是好的. 这里没有完整的项目目录,主要是对需要的指点进行整理.要完 ...
随机推荐
- 两种加载dll的方式
通过链接lib文件加载dll的话,使用过程中没法动态切换 通过loadlibrary函数动态加载的话,可以动态切换
- WebAPI增加Area以支持无限层级同名Controller
原文:WebAPI增加Area以支持无限层级同名Controller 微软的WebAPI默认实现逻辑 默认实现中不支持同名Controller,否则在访问时会报HttpError,在网上找到了各种路由 ...
- uwp之拍照(使用后置摄像头)
参考:wp8.1之拍照(获取焦点,使用后置摄像头) uwp开启摄像头要借助CaptureElement呈现来自捕获设备(如照相机或网络摄像机)的流.今天讲讲如何打开摄像头,获取焦点,以及拍照.废话不多 ...
- GzipStream的简单使用压缩和解压
压缩和解压都需要用到三个流实例,分别是文件读取流.文件写入流.压缩流. 读取流和写入流有多种形式,压缩流就一种GzipStream. 不同的是对于压缩,是需要用文件写入流作为创建压缩流实例的参数, 压 ...
- 把握每次机会,麒麟芯片5年成就高端(SoC包括AP、基带、ISP等,华为确实牛)
从2016年11月华为Mate 9 /Mate 9 Pro发布,到2017年2月荣耀V9和华为P10 /P10 Plus 相继发布,这几款都是华为和荣耀的高端旗舰机型,且搭载的都是华为最新旗舰芯片-- ...
- ASP.NET MVC控制器Controller中参数
前述文章参见:ASP.NET MVC控制器Controller 绪论 之前的控制器返回的均为常量字符串,接下来展示如何获取请求传来的参数,而返回"动态"的字符串. 可以在操作方法B ...
- 轻量级 Material Design 前端框架 MDUI (纯html,css,与css框架跟react vue不冲突)
MDUI 是一个轻量级的 Material Design 前端框架,对照着 Material Design 文档进行开发,争取 1:1 实现 Material Design 中的组件. 多主题支持 M ...
- 当程序调用dll时获取dll路径,DLL中获取自身的句柄
当程序调用dll时,获取dll路径的方法: HMODULE hMod = GetModuleHandle(_T("axload.dll")); if (hMod != NULL) ...
- 核心思想:想清楚自己创业的目的(如果你没有自信提供一种更好的产品或服务,那就别做了,比如IM 电商 搜索)
这个时代对于学 IT 的人来说是幸运的.一个普通的程序员可以相对轻易地找到工作,可以轻易拿到比其他行业高得多的工资,甚至自己创建世界级的企业亦非空想.马云.马化腾等企业家的成功,似乎时刻提醒人们:即便 ...
- 一步步教你怎么用python写贪吃蛇游戏
目录 0 引言 1 环境 2 需求分析 3 代码实现 4 后记 0 引言 前几天,星球有人提到贪吃蛇,一下子就勾起了我的兴趣,毕竟在那个Nokia称霸的年代,这款游戏可是经典中的经典啊!而用Pytho ...