Unity 3D 网络游戏架构设计

本课程详细介绍了如何使用 Unity 3D 构建一个商业游戏的网络架构,涵盖 UI 架构、技能系统、服务器和网络同步等多个方面。通过学习,读者将能够独立搭建网络游戏框架,理解模块化设计思想,掌握游戏资源管理、事件系统、对象池和服务器部署等关键技术。课程内容包括游戏资源管理、自定义消息分发、游戏对象池设计、UI 架构和角色系统设计,以及使用 Photon Server 进行 MMO 游戏同步的实现。
摘要由CSDN通过智能技术生成
课程简介

本课程是 Unity 3D 系列教程,目标是带领读者搭建一个商业游戏的网络架构设计,该架构设计是游戏的核心技术,将采用 Unity 2017.2 最新版本作为开发工具。内容分为 UI 架构、技能架构、服务器和网络同步四大部分,共 13 篇文章。

认真读完本系列文章之后,将会深入理解架构的设计,具备独立搭建网络游戏框架的能力,并在此基础上可以独立开发一款网络游戏。

作者介绍

姜雪伟,从事 IT 行业15年,现担任创业公司技术合伙人。著作有:《手把手教你架构 3D 游戏引擎》、《Unity 3D 实战核心技术详解》,《Cocos2d-x 3.x 图形学渲染技术讲解》等,参与或主导过十多款网络游戏研发。

课程内容
导读:网络游戏架构设计综述

随着 Stream、TapTap 等游戏平台的崛起,越来越多的网络游戏在此平台投放,而且很多新发布的游戏收入都颇丰,这些发布的游戏很多都是几个人开发完成的,而且开发周期都比较短,如何才能快速开发网络游戏?一个比较好的游戏框架是非常必要的。另外,这些平台的崛起,对于独立游戏开发者来说,也是一个非常好的机会,换句话说独立开发者的春天又来了,当然对于那些想从事游戏开发或者说已经在这个行业从事游戏开发的人也是一个机会。

现在游戏不只限于抄袭了,更强调创新,只要有好的创意,再加上一个比较好的游戏框架,几个志道同合的小伙伴就可以开发一款网络游戏。在国外有很多这方面的案例,几个人在不同的地方,一起开发一款游戏。而在国内很多普通程序员在游戏公司估计只是从事某项单一的逻辑功能编写,对整体架构设计并不是很了解,即使自己有好的想法局限于自己的能力估计也是很难做出一款游戏,在游戏公司很少有人会教你架构设计,而且对于开发者来说,要么只会客户端,要么只会服务器,非常少的人同时精通二者,这也困扰着那些想自己做游戏的开发者。本课程正是基于解决这些困扰程序员的问题,提出了一种基于网络服务器的架构设计,让程序员一个人可以同时进行客户端和服务器的网络游戏的开发,这样再加上美术和策划就可以搞定一款网络游戏。

搭建游戏框架首先要搞清楚什么是框架?其实搭建框架的主要目的是便于游戏逻辑的编写,这样非常有利于开发者快速的开发游戏,框架的核心思想是模块之间的耦合性要降低。那我们先搞清楚游戏框架中主要包括哪些技术点,从大的方面说,每款游戏都有自己的 UI 系统、角色系统、技能系统、网络系统等等,往小的方面说就是编码的细节——每个类的编写。下面就把游戏中的几个核心系统的架构设计思想逐步介绍给读者,架构设计没有好坏之分,用着方便就可以,在这里就当是抛砖引玉,读者也可以在此基础上去扩展,去重新编写架构。这样本篇教程的目的就达到了。

先介绍 UI 系统,这个是老生常谈的,UI 架构常用的设计模式是 MVC。读者应该对 MVC 都比较了解,原理就不介绍了,可以去网上查阅。下面讲下 MVC 模式如何在 UI 系统中使用?先看下面这幅架构图:

UI框架设计

我们就围绕着这幅图给读者介绍模块设计。

在设计 UI 框架时首要考虑的事情

首先,要做到 UI 资源和代码逻辑的分离,因为 UI 资源是经常更换的,如果二者不分离,很容易在更换资源时出现各种各样的脚本丢失以及资源和代码逻辑对应不上问题,这个对于程序来说必须要避免的,程序员不应该把时间都浪费在这些事情上面。

其次,逻辑代码之间的耦合性要降低,降低耦合性的方法通过事件的方式进行处理,很多程序使用 SendMessage 这种 Unity 自带的消息发送机制,其实它是非常消耗 CPU 的,为了优化这些,我们会自己封装事件机制。

以上两点是指导我们做架构的指导纲领,不论怎么设计最好围绕二者进行。

接下来介绍 UI 架构搭建的各个逻辑模块,上图中显示的窗体模块并不全面,游戏中的窗体是非常多的,在此以登录窗体和英雄窗体为例进行说明:Loginwindow 和 HeroWindow 它们是负责显示的,也就是说,它对应具体的窗体逻辑,它对应的 MVC 模式中的 V,相当于 View 显示,该模块是不继承 Mono 的,也就是不挂接任何 UI 对象。LoginCtrl、HeroCtrl 模块相当于 MVC 中的 C,Control 控制,用于操作 LoginWindow,HeroWindow 所对应的 UI 窗体,比如用于控制不同窗体的显示、隐藏、删除等等操作,在图中没有列出 MVC 中的 Model 模块,这个模块主要是用于网络消息数据的接收,也可以通过文本文件直接赋值的,它可以使用列表进行存储,相对来说用处并不是不可替代的。

游戏中存在的窗体是非常多的,这么多窗体,如果不同的开发者写逻辑,会搞的很多,不利于统一管理。由此需要一个类 WindowManager 管理类进行统一注册管理各个窗体类模块,这种处理方式也就我们经常说的工厂模式。

另外,窗体之间是经常会进行不同的切换,这些切换也可以对它们进行流程管理,因为窗体之间的切换是一种固定的流程。既然经常转换,我们不免会想到状态机用于处理这种流程。在此,引入了状态机进行统一管理不同窗体状态的变换。各个模块之间的耦合性也是要重点考虑的问题,在此采用了自己封装的事件机制进行解耦合。

具体实现逻辑如下,每个窗体对应自己的类,以登录 UI 为例进行说明,每个 UI 都是一个 Window 窗体对象,它对应着 Loginwindow 类、LoginCtrl 类、LoginState 类。其他的窗体类似,而这些类都不继承 Mono 也就是说不挂接到任何 UI 窗体对象上,这样,彻底实现了资源和代码的分离,UI 系统思想设计完成,接下来再介绍技能模块和角色系统的架构设计。

技能模块设计思想

技能模块在游戏中的表现非常重要,也是常见的,在实现之前先把技能设计架构给读者展示,如下图所示:

enter image description here

关于技能的设计,首先要考虑的是这个技能是谁释放的,也就是说的游戏实体类,实体类的设计在此分了三层:IEntity、IPlayer 和 Player,这三个模块同样不继承 Mono,也就是说不挂接到任何对象上,具体的实现会在后面的章节中结合代码详细介绍,技能释放者找到了,接下来设计技能了。

游戏中的技能分好多种:正常释放的技能、被动技能、远程技能等等,这些不同的技能我们也将其进行模块化设计,其实它们的内容是类似的,可以考虑使用脚本自动生成代码。当然对于游戏中众多特效的使用,我们也需要写一个特效管理类,用于创建不同的特效,特效采用的就是模块化管理,特效实现了后,就要考虑特效是根据游戏实体对象的不同动作进行释放的,不同的动作对应着不同的技能,这当然就是不同动作之间的切换,在这里使用了 FSM 有限状态机进行统一调度。

再介绍一个重要的模块——对象池,因为我们的特效会频繁的创建、销毁,还有游戏中的怪物 NPC 也是一样的。当然,其他的游戏管理类在游戏中都比较常见,其他的一些系统比如背包系统、任务系统,这些可以根据消息或者配置文件进行加载读取,这里就不一一说明了。

接下来介绍比较重要的网络游戏服务器,我们的服务器使用的是 Photon Server,用户直接搭建非常方便,在本教程也会把服务器的搭建过程介绍给读者,我们的网络架构采用的是房间模式,同房间的人可以在场景中实时同步,包括技能、动作等等。而该实时同步的实现方式采用的是状态同步,接下来介绍一下 Photon 服务器的体系结构:

enter image description here

为什么选择 Photon Server 作为服务器,因为该服务器提供了负载均衡,以及做大型网络游戏 MMO 等技术实现,用户无需太关心。它的核心使用的是 C++ 编写的,效率无需使用者关心,同时该服务器支持 UDP、TCP、HTTP 和 Web 套接字,它的应用层使用的是 C# 编写的,对于用户编写逻辑非常方便,而且它也支持数据库和非数据库模式,比如 MySQL、SQL Server 等数据库,以及 MongoDB、Redis 等非数据库。

再介绍一下关于服务器的基本工作流程,从客户端角度来看,工作流程也非常简单,非常适合新手学习,客户端连接到主服务器,可以加入大厅,并检索打开游戏列表。当他们在 Master 主服务器上 CreateGame 操作时,游戏实际上并不创建游戏服务器,而是确定人数比较少的游戏服务器,将 IP 地址返回给客户端。当客户端在主服务器上调用 JoinGame 或 JoinRandomGame 操作时,主服务器查找运行游戏的游戏服务器,并将其 IP 返回给客户端。流程图如下所示:

enter image description here

如果客户端与主服务器断开连接,使用刚收到的 IP 连接到游戏服务器,再次调用 CreateGame 或 JoinGame 操作,断线重连都没有任何问题。下面介绍游戏中比较重要的部分,MMO 游戏同步思想。

关于使用 Photon Server 做 MMO 游戏同步实现的思想

客户端中的地图,同样也会在服务器中虚拟一个跟客户端大小完全一样的地图,角色就是在这些虚拟空间中同步,角色同步是在一定的区域内进行同步的,也就是在一定的区域内是互相“看见”的,这种看见与客户端的相机裁剪是完全不同的。效果如下图所示:

enter image description here

计算哪些对象在某些区域会频繁移动,这些对象可能会非常耗费 CPU 资源。加速这一计算的一个简单的方法是将虚拟空间划分为固定区域,然后计算哪些区域重叠。客户应该接收这些重叠区域中的项目的所有事件。最简单的算法使用方形的网格,有时我们也称为九宫格算法,如下所示:

enter image description here

物体通过当前的区域推送事件,一旦特定的区域重叠,它自动订阅区域的事件通道,并开始接收包括物品推送的区域事件。为了避免在区域边界频繁地订阅和取消订阅改变,引入了另外的更大的兴趣区域半径:跨越此外半径的订阅区域被取消订阅,客户端停止接收区域事件。用通俗的语言讲就是在服务器虚拟的场景中,会通过不同的玩家生成各自的九宫格区域,其他 NPC 或者玩家在对方的九宫格区域里面,物体都会显示,离开自己的九宫格区域就剪掉,这样也会是考虑到效率问题,因为如果整个场景实时同步计算,这对于客户端和服务器压力都是很大的。九宫格区域如果重合那就把重合的部分都显示出来。如下图所示:

enter image description here

本教程实现的网络游戏架构设计,最终实现的效果图如下所示:

enter image description here

该图是简单的创建房间以及加入房间进行网络同步界面,进入游戏后实现的游戏中的效果如下图所示:

enter image description here

用户创建房间,其他用户加入房间,多人场景在同一房间中同步的效果如下所示:

enter image description here

通过此网络游戏框架可以快速的把网络游戏实现出来,本课程的最后会把服务器和客户端代码都奉献给读者,希望对开发者有所帮助。从下章开始,本教程进行详细介绍架构设计实现。

第01课:游戏资源管理实现

游戏中的资源量是必须要考虑的问题,游戏品质的好坏都是通过资源表现的,这些资源的管理,作为开发者必须要处理的。对于游戏资源管理,通常的做法是简单的封装几个接口用于资源的加载,如果只是做个 Demo,这样做是没问题的,但是如果做产品,对于资源的需求量是非常大的,而且各个资源的加载也会由于使用不当,出现各种问题,而且游戏讲究的是团队协作,不同的人会有不同的需求,简单的封装几个接口很难满足需求,如果没有一个统一的资源架构管理,代码会出现各种接口版本,最后会出现大量的冗余代码,这样对游戏产品运行效率会产生影响。

另外,还要考虑游戏资源的动态加载更新,主要是为了减少游戏包体的大小,Unity3D 虽然为用户提供了 AssetBundle 资源打包,方便用户将资源打包上传到资源服务器,在游戏启动时会通过本地存放资源的 MD5 文本文件与服务器的保存资源最新的 MD5 码的文本文件作对比,根据其资源对应的 MD5 码不同,将新的资源下载到本地使用,同时将资源文件代替本地的资源文件。我们在封装资源管理类时,也是从产品的角度考虑资源管理问题。

下面开始讲解如何进行资源管理的代码封装,我们对资源管理的封装做了一个比较完善的思考,代码模块如下图所示:

enter image description here

下面来告诉读者为什么这么设计。我们在游戏开发时,对于 Unity 资源,每个资源都是一个 GameObject,只是单独的 GameObject 显然不能满足需求,因为资源既可以是 Scene,也可以是 Prefab,同时也可以是 Asset 文件。这就会涉及到不同的资源类型,如何表示这些资源类型,比如我测试的时候可以使用 prefab,而在正式发布时采用 asset,如果不做分类,在游戏发布时还要修改接口,非常麻烦。但如果设计一个通用的接口,对于资源类型可以使用枚举进行表示,有了这些想法后,开始逐步去实施我们的思想。

首先需要设计一个 ResourceUnit 模块,它是资源的基本单位,也是程序自己封装的资源基本单位,ResourceUnit 类的代码如下所示:

public enum ResourceType{    ASSET,    PREFAB,    LEVELASSET,    LEVEL,}

上面就是我们定义的资源枚举,每一个加载的资源都是一个 ResourceUnit,它可以是 assetbundle,可以是 prefab 实例化,当然也可以是 scene。下面继续完善 ResourceUnit 类,它的实现代码如下所示:

 public class ResourceUnit : IDisposable{    private string mPath;    private Object mAsset;    private ResourceType mResourceType;    private List<ResourceUnit> mNextLevelAssets;    private AssetBundle mAssetBundle;    private int mReferenceCount;    internal ResourceUnit(AssetBundle assetBundle, int assetBundleSize, Object asset, string path, ResourceType resourceType)    {        mPath = path;        mAsset = asset;        mResourceType = resourceType;        mNextLevelAssets = new List<ResourceUnit>();        mAssetBundle = assetBundle;        mAssetBundleSize = assetBundleSize;        mReferenceCount = 0;    }    public List<ResourceUnit> NextLevelAssets    {        get        {            return mNextLevelAssets;        }        internal set        {            foreach (ResourceUnit asset in value)            {                mNextLevelAssets.Add(asset);            }        }    }    public int ReferenceCount    {        get        {            return mReferenceCount;        }    }    //增加引用计数    public void addReferenceCount()    {        ++mReferenceCount;        foreach (ResourceUnit asset in mNextLevelAssets)        {            asset.addReferenceCount();        }    }    //减少引用计数    public void reduceReferenceCount()    {        --mReferenceCount;        foreach (ResourceUnit asset in mNextLevelAssets)        {            asset.reduceReferenceCount();        }        if (isCanDestory())        {            D
### 回答1: 《Unity3D网络游戏实战PDF》是一本非常重要的Unity3D开发书籍,它着重介绍了Unity3D游戏开发的网络部分。本书包含了网络游戏的核心概念、原理及实现方法,深入剖析了网络游戏架构设计模式、游戏性能优化、安全防护等方面内容,并提供了实际的案例分析和设计思路,是网络游戏开发者的必备指南。 本书主要包括了以下内容:网络游戏的基础知识,如网络通信、协议、数据传输、数据整合等;Unity3D网络游戏的基本架构设计,如服务器端和客户端的架构设计、消息通信机制等;Unity3D游戏性能优化技巧,如消息压缩、消息缓存、负载均衡等;网络游戏的安全防护策略,如加密算法、防作弊、账号安全等;最后,作者还介绍了如何进行网络游戏的调试及问题排除。 《Unity3D网络游戏实战PDF》书籍内容深入浅出,适合初学者和中级开发者阅读。它提供了实用的方法和工具,帮助读者掌握网络游戏开发的技能,提高游戏开发的效率和质量。无论你是想开发网络游戏,还是想学习Unity3D游戏开发,本书都是不容错过的开发指南。 ### 回答2: unity3d网络游戏实战pdf是一本讲解使用Unity3D引擎开发网络游戏的实战教程,内容涵盖了Unity3D的基础知识、网络编程与多人联机游戏设计。本书从基础开始,逐步讲解如何使用Unity3D引擎搭建网络游戏,包括如何进行多人联机游戏设计、实现网络通信,以及如何利用Unity3D引擎的特性实现游戏的界面设计和多人对战功能。本书不仅具有理论知识,更有大量实例和案例,可以帮助读者深刻了解Unity3D引擎的应用,提高网络游戏开发的技能和水平。这本书适合想要学习和掌握Unity3D引擎开发网络游戏的初、中级程序员、游戏开发者和爱好者阅读使用,可以帮助他们快速地了解并掌握开发网络游戏的流程和技巧。总之,如果你正在寻找一本全面且系统的Unity3D网络游戏开发教程,那么这本《unity3d网络游戏实战pdf》将是你的不二选择。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值