HTML5技术

谈一款MOBA类游戏《码神联盟》的服务端架构设计与实现 - 千年风雅丶

字号+ 作者:H5之家 来源:H5之家 2017-07-23 10:01 我要评论( )

一、前言 《码神联盟》是一款为技术人做的开源情怀游戏,每一种编程语言都是一位英雄。客户端和服务端均使用C#开发,客户端使用Unity3D引擎,数据库使用MySQL。这个MOBA类游戏是笔者在学习时期和客户端美术策划的小伙伴一起做的游戏,笔者主要负责游戏服务端

  • 一、前言
  •   《码神联盟》是一款为技术人做的开源情怀游戏,每一种编程语言都是一位英雄。客户端和服务端均使用C#开发,客户端使用Unity3D引擎,数据库使用MySQL。这个MOBA类游戏是笔者在学习时期和客户端美术策划的小伙伴一起做的游戏,笔者主要负责游戏服务端开发,客户端也参与了一部分,同时也是这个项目的发起和负责人。这次主要分享这款游戏的服务端相关的设计与实现,从整体的架构设计,到服务器网络通信底层的搭建,通信协议、模型定制,再到游戏逻辑的分层架构实现。同时这篇博客也沉淀了笔者在游戏公司实践五个月后对游戏架构与设计的重新审视与思考。

      这款游戏自去年完成后笔者曾多次想写篇博客来分享,也曾多次停笔,只因总觉得灵感还不够积淀还不够思考还不够,现在终于可以跨过这一步和大家分享,希望可以带来的是干货与诚意满满。由于目前关于游戏服务端相关的介绍文章少之又少,而为数不多的几篇也都是站在游戏服务端发展历史和架构的角度上进行分享,很少涉及具体的实现,这篇文章我将尝试多从实现的层面上加以介绍,所附的代码均有详尽注释,篇幅较长,可以关注收藏后再看。学习时期做的项目可能无法达到工业级,单服承载大概9000人,笔者在和小伙伴做这款游戏时农药还没有现在这般火。  : ) 

  • 二、服务器架构
  •   上图为这款游戏的服务器架构和主要逻辑流程图,笔者将游戏的代码实现分为三个主要模块:Protocol通信协议、NetFrame服务器网络通信底层的搭建以及LOLServer游戏的具体逻辑分层架构实现,下面将针对每个模块进行分别介绍。

  • 三、通信协议
  •   

      先从最简单也最基本的通信协议部分说起,我们可以看到这部分代码主要分为xxxProtocol、xxxDTO和xxxModel、以及xxxData四种类型,让我们来对它们的作用一探究竟。

  • 1.Protocol协议
  •  LOLServer\Protocol\Protocol.cs

    using System; using System.Collections.Generic; using System.Text; namespace GameProtocol { public class Protocol { TYPE_LOGIN = TYPE_USER = TYPE_MATCH = TYPE_SELECT = TYPE_FIGHT = 4;//战斗模块 } }

      从上述的代码举例可以看到,在Protocol协议部分,我们主要是定义了一些常量用于模块通信,在这个部分分别定义了用户协议、登录协议、战斗匹配协议、战斗选人协议以及战斗协议。

  • 2.DTO数据传输对象
  •   DTO即数据传输对象,表现层与应用层之间是通过数据传输对象(DTO)进行交互的,需要了解的是,数据传输对象DTO本身并不是业务对象。数据传输对象是根据UI的需求进行设计的,而不是根据领域对象进行设计的。比如,User领域对象可能会包含一些诸如name, level, exp, email等信息。但如果UI上不打算显示email的信息,那么UserDTO中也无需包含这个email的数据。

      简单来说Model面向业务,我们是通过业务来定义Model的。而DTO是面向界面UI,是通过UI的需求来定义的。通过DTO我们实现了表现层与Model之间的解耦,表现层不引用Model,如果开发过程中我们的模型改变了,而界面没变,我们就只需要改Model而不需要去改表现层中的东西。

    using System; using System.Collections.Generic; using System.Text; namespace GameProtocol.dto { [Serializable] public class UserDTO { name;level;exp;winCount;loseCount;ranCount;[] heroList; UserDTO() { } public UserDTO(string name, int id, int level, int win, int lose, int ran,int[] heroList) { this.id = id; this.name = name; this.winCount = win; this.loseCount = lose; this.ranCount = ran; this.level = level; this.heroList = heroList; } } }

  • 3.Data属性配置表
  •   这部分的实现主要是为了将程序功能与属性配置分离,后面可以由策划来配置这部分内容,由导表工具自动生成配表,从而减轻程序的开发工作量,扩展游戏的功能。

    using System; using System.Collections.Generic; using System.Text; namespace GameProtocol.constans { 英雄属性配置表 HeroData { Dictionary<int, HeroDataModel> heroMap = new Dictionary<int, HeroDataModel>(); 静态构造 初次访问的时候自动调用 HeroData() { create(, 100, 20, 500, 300, 5, 2, 30, 10, 1, 0.5f, 200,200, 1, 2, 3, 4); create(, 100, 20, 500, 300, 5, 2, 30, 10, 1, 0.5f, 200, 200, 1, 2, 3, 4); create(, 100, 20, 500, 300, 5, 2, 30, 10, 1, 0.5f, 200, 200, 6, 2, 3, 4); create(, 100, 20, 500, 300, 5, 2, 30, 10, 1, 0.5f, 200, 200, 3, 2, 3, 4); } 创建模型并添加进字典 create(int code, string name, int atkBase, int defBase, int hpBase, int mpBase, int atkArr, int defArr, int hpArr, int mpArr, float speed, float aSpeed, float range, float eyeRange, params int[] skills) { HeroDataModel model = new HeroDataModel(); model.code = code; model.name = name; model.atkBase = atkBase; model.defBase = defBase; model.hpBase = hpBase; model.mpBase = mpBase; model.atkArr = atkArr; model.defArr = defArr; model.hpArr = hpArr; model.mpArr = mpArr; model.speed = speed; model.aSpeed = aSpeed; model.range = range; model.eyeRange = eyeRange; model.skills = skills; heroMap.Add(code, model); } } HeroDataModel { name;atkBase;defBase;hpBase;mpBase;atkArr;defArr;hpArr;mpArr;speed;aSpeed;range;eyeRange;[] skills;//拥有技能 } }

  • 四、服务器通信底层搭建
  •  

    1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

    相关文章
    • createjs 小游戏开发实战 - beidan

      createjs 小游戏开发实战 - beidan

      2017-07-07 08:00

    • 前端实现连连看小游戏(1) - beidan

      前端实现连连看小游戏(1) - beidan

      2017-06-22 09:03

    • 网页版扫雷游戏 - 季末的寂寞

      网页版扫雷游戏 - 季末的寂寞

      2017-04-21 13:00

    • Html5游戏框架createJS组件--EaselJS - 叶超Luka

      Html5游戏框架createJS组件--EaselJS - 叶超Luka

      2017-03-22 12:01

    网友点评