《Unity 3D游戏客户端基础框架》系统设计
引言
最近到看一个 《贪吃蛇大战开发实例》,其中 贪吃蛇大作战游戏开发实战(3):系统构架设计 提供的系统架构的设计思路我觉得还是值得学习一下的,接下来的内容是我看完视频后的一点笔记。
架构设计原则:
1.系统分层:
根据功能特性,可以大致将整个系统分为:
- 视图层(游戏输入、战斗 View、业务 UI):视图层也可以遵循
Mvc
的思路来做进一步分层; - 业务层(核心玩法、业务模块);
- 服务层(模块管理、UI 管理、用户管理、资源管理、配置管理、网络管理、支付管理、分享管理);
- UI 控件;
- 基础类库(储存管理、调试器、数学库、网络库、单例、Monobehaviour能力)。
上面的分层是根据游戏具体逻辑来划分的,这些层级之间也并非完全独立,存在依赖关系,为了服务于视图层,通常会把一些常用的 UI 试图进行控件化,也就是会多出一 UI控件层,而且整个系统也需要使用到很多基础类库,所以也就有了基础类库层。
2.单向依赖:
只要有两点要求:
- 不同层级之间的模块是单向依赖的;
- 仅允许上层模块依赖下层模块。
也就是说,上层模块可以之间访问下层模块的属性,而下层模块不能直接访问上层模块,下层模块的变化通过 消息/事件 通知上层模块,上层模块通过监听这些 消息/事件 来及时获取下层的属性变化。
3.模块解耦:
各个业务层模块之间,不直接访问彼此的代码,这样可以达到编译不依赖,实现静态解耦,那么他们要通过什么方式进行通信呢?
最常用的做法:业务层模块之间通过【事件】与【消息】的方式通讯。
具体实现方式:模块 A 需要调用模块 B 的逻辑时,会广播一条特殊的 消息/事件,而模块 B 的监听此 消息/事件,当收到 消息/事件 时执行指定的逻辑。
这里的
消息
或事件
都是不依赖于发起者的抽象类型,通常使用一个抽象消息管理类来管理,经常使用字符串常量来表示不同的消息类型。
4.全局事件:
这种方式适用的情景:
- 有些事件并非从固定模块发出(可能会有多个模块都会发出此类事件);
- 有些事件模块影响全局逻辑。
可以在多个模块中监听同一个事件,当事件在某个模块发生,则广播一个全局的事件,此时所有监听了此事件的模块都会触发相应的操作。
缺点:使用全局事件会使得代码的阅读性下降,因为当一个事件有多个触发源时,当事件触发时我们无法准确地定位事件是从何处触发的。(也可以通过日志记录来索引事件源头)
5.模块独立:
主要适用于服务层模块的设计,核心思想就是将两个服务模块必须有的公共逻辑抽象出来,放在基础类库中。
6.代码重用:
将可以重复使用的代码,在系统层级上做一些小整合,例如:
- 业务层公共逻辑 –> 服务层
- 服务层公共逻辑 –> 基础类库
- 视图层公共逻辑 –> UI 控件
6.设计模式:
善用一些设计模式,可以让代码更加高效,这里列举一些游戏开发中常用的设计模式及其适用的场合:
设计模式 | 应用场合 |
---|---|
观察者模式 | 业务层之间通讯、上层与下层通讯、客户端与服务器通讯 |
命令模式 | 业务层之间通讯 |
单例模式 | 服务层为上层提供功能 |
MVC 模式 | 视图层与业务层通讯 |
工厂模式 | 视图层实例的创建、核心玩法中角色的创建、特效的创建管理 |
《Unity 3D游戏客户端基础框架》系统设计的更多相关文章
- 《Unity 3D游戏客户端基础框架》概述
框架概述: 做了那么久的业务开发,也做了一年多的核心战斗开发,最近想着自己倒腾一套游戏框架,当然暂不涉及核心玩法类型和战斗框架,核心战斗的设计要根据具体的游戏类型而定制,这里只是一些通用的基础系统的框 ...
- 《Unity 3D游戏客户端基础框架》多线程异步 Socket 框架构建
引言: 之前写过一个 demo 案例大致讲解了 Socket 通信的过程,并和自建的服务器完成连接和简单的数据通信,详细的内容可以查看 Unity3D -- Socket通信(C#).但是在实际项目应 ...
- 《Unity 3D游戏客户端基础框架》消息系统
功能分析: 首先,我们必须先明确一个消息系统的核心功能: 一个通用的事件监听器 管理各个业务监听的事件类型(注册和解绑事件监听器) 全局广播事件 广播事件所传参数数量和数据类型都是可变的(数量可以是 ...
- Unity 3D游戏开发学习路线(方法篇)
Unity 3D本来是由德国的一些苹果粉丝开发的一款游戏引擎,一直只能用于Mac平台,所以一直不被业外人士所知晓.但是后来也推出了2.5版,同时发布了PC版本,并将其发布方向拓展到手持移动设备.Uni ...
- Unity 3D游戏开发引擎:最火的插件推荐
摘要:为了帮助使用Unity引擎的开发人员制作更完美的游戏.我们精心挑选了十款相关开发插件和工具.它们是:2D Toolkit.NGUI.Playmaker.EasyTouch & EasyJ ...
- Unity 3d游戏逆向及.NET Reflector工具使用介绍
移动平台游戏框架主要有unity 3d和cocos 2d.我们首先得识别游戏使用的框架.识别Unity游戏Android平台的apk包可以直接解压,看是否有./assets/bin/Data/Mana ...
- Unity 3D 游戏上线之后的流水总结
原地址:http://tieba.baidu.com/p/2817057297?pn=1 首先.unity 灯光烘焙 :Unity 3D FBX模型导入.选项Model 不导入资源球.Rig 不导入骨 ...
- 排名前10的H5、Js 3D游戏引擎和框架
由于很多人都在用JavaScript.HTML5和WebGL技术创建基于浏览器的3D游戏,所有JavaScript 3D游戏引擎是一个人们主题.基于浏览器的游戏最棒的地方是平台独立,它们能在iOS.A ...
- 【Unity】1.0 第1章 Unity—3D游戏开发和虚拟现实应用开发的首选
分类:Unity.C#.VS2015 创建日期:2016-03-23 一.简介 Unity是跨平台2D.3D游戏和虚拟现实高级应用程序的专业开发引擎,是由Unity Technologies公司研制的 ...
随机推荐
- 20145329 《Java程序设计》第五周学习总结
20145329 <Java程序设计>第五周学习总结 教材学习内容总结 第八章 Java异常处理是要处理Exception类及其子类(Checked Exception),RuntimeE ...
- C++DFS方法全排列
前几天看纪磊的<啊哈!算法>一书,里面讲算法讲的特别通俗细致,真的是初中生都能读得懂的算法书(我大二才读:P).这段代码很适合初学算法的同学. #include<iostream&g ...
- 混合开发的大趋势之一React Native手势行为那些事
转载请注明出处:王亟亟的大牛之路 最近项目部分模块重构,事情有点多,学习进度有所延缓,外加一直在吸毒(wow你懂的),导致好多天没发问了,其实这部分知识月头就想写了,一直没补. 话不多说先安利:htt ...
- JAVA启动参数整理[转]
java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足, ...
- Java环境搭建指南
1.1 配置Java环境 1. 下载并安装Jdk1.7或Jdk1.8 http://www.oracle.com/technetwork/java/javase/downloads/index.ht ...
- Memcached append 命令
Memcached append 命令用于向已存在 key(键) 的 value(数据值) 后面追加数据 . 语法: append 命令的基本语法格式如下: append key flags expt ...
- mac下搭建eclipse+git环境并导入项目
首先官网下载eclipse,然后安装,选择eclipse for java developer. 安装git插件:eclipse-help-install new software-add name随 ...
- mui app在线更新
一参考资料 二代码 HTML代码 CSS代码 JS代码 接口代码 一.参考资料 http://ask.dcloud.net.cn/article/182 二.代码 1. HTML代码 <div ...
- spring mvc: xml练习
xml练习,得到的结果是: <?xml version="1.0" encoding="UTF-8" standalone="yes" ...
- Linux SSH隧道技术(端口转发,socket代理)
动态转发(SOCKS5代理): 命令格式:ssh -D <local port> <SSH Server> ssh -fnND 0.0.0.0:20058 172.16.50. ...