香雨站

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 85|回复: 0

MMORPG网络游戏开发之网络通信

[复制链接]

2

主题

3

帖子

6

积分

新手上路

Rank: 1

积分
6
发表于 2022-12-8 09:38:08 | 显示全部楼层 |阅读模式
MMO游戏又称大型多人在线角色扮演类游戏,在所有的角色扮演的游戏当中,玩家都要扮演一个虚拟角色,并控制角色活动
MMO可以分为客户端和服务器两部分,玩家通过客户端连接到互联网登录服务器才能进行游戏,游戏玩家的数据资料保存在服务器上,游戏的开发商和运营商提供游戏的服务器以及管理虚拟世界,对游戏不断的做出更新以便留住老玩家以及吸引新玩家


今天就为大家介绍使用Unity3D引擎制作一款MMORPG游戏需要掌握的核心技术:网络通信技术
本篇文章涉及到的源码及素材资源,还有更多游戏开发资源,可以通过点击下方的小卡片免费获取
建立解决方案(目录规划)


  • 首先我们在VisualStudio里点击新建项目,虽然都是新建项目,但这里需要特别注意一下,因为服务器一般不会带有用户界面,所以我们建立的项目应该是一个控制台项目
  • VisualStudio有很多种控制台,比如基于.NET Framework或.NET Code的,本文使用的控制台为下图中被标记的控制台



  • 为什么选择这个控制台呢?

    • 因为上图中的第二个控制台只能运行在Windows平台上,而第一个基于.NET Code的控制台可以跨平台运行,开发的游戏服务器有很大的概率是运行在Linux服务器上面的,虽然我们开发会用Windows,但部署的时候一般都是部署在Linux服务器上

  • 选好控制台后点击下一步,然后为项目配置项目名和储存位置,因为我们的项目是由很多个小项目构成的,所以我会把这些小项目都放在同一个文件夹下面(也就是下图位置选项中的study文件夹)



  • 因为我们先建立的是服务器项目,所以项目名叫做MmoServer,配置完成后点击下一步,其他信息中的目标框架选择默认就好,然后点击创建



  • 创建好服务器项目后,我们还需要再创建一个项目,因为网络游戏除了有客户端和服务器代码外,还会存在一些客户端跟服务器共通的项目代码,所以我们一般会建立一个通用文件夹,用来存放一些既要在服务器上使用的代码,又需要在客户端上使用的代码
  • 因为这个通用文件夹是被客户端和服务器所调用的,所以它的的项目类型就不能再是控制台项目了,而是必须要把它建立成类库,类库可以被客户端和服务器所引用



  • 配置储存位置与名称



  • 下面再用与建立服务器项目一样的方法建立客户端项目,只是将项目名称改为ConClient



  • 创建完客户端项目后,第一步的目录规划就完成了,接下来我们就来实现网络通信
实现网络通信


  • 网络游戏想要实现网络通信都是需要使用一种网络协议的,目前主流的互联网网络协议是TCP/IP协议,但本文不会直接使用TCP/IP通信,因为它涉及的内容较多,难度也较高,我们会使用WS协议
  • WS是什么呢?

    • WS是一个应用层协议,这个协议比HTTP、FTTP这些协议的适用性都要广泛,因为它实际上就相当于是一个已经帮你实现好的高层网络协议,而且效率很高,它的全称叫做WebSocket

  • WebSocket协议跟HTTP这样的传统的协议有什么不一样呢?

    • HTTP主要服务于网页的传输,而WS的应用范围比较广,除了能用在Web上面,也非常适用于一般的网络游戏开发

  • 接下来我们需要为项目引入WebSocket库,刚才创建的三个项目里都要引入,这里我用为Common引入WebSocket库为例子,来为大家演示引入过程:在Common项目的依赖项上右键,点击管理NuGet程序包



  • 在弹出界面中搜索WebSocketSharp,然后选择搜索结果中的第一个进行安装,这样就成功引入WebSocket通信库了



  • 为三个项目引入WebSocket库后就可以开始撸代码了,下面是服务器项目的代码
using System;
using WebSocketSharp.Server;
using WebSocketSharp;

namespace MmoServer
{
    class Program
    {
        // 这个是我创建的用户相关的服务
        public class UserService : WebSocketBehavior
        {
            // 提供服务
            protected override void OnMessage(MessageEventArgs e)
            {
                this.Send($"From server: {e.Data}"); // 收到消息时向客户端发送消息
            }
        }

        static void Main(string[] args)
        {
            WebSocketServer svr = new WebSocketServer("ws://localhost:8888"); // 建立一个服务器,并让它监听8888端口

            svr.AddWebSocketService<UserService>("/UserService"); // 为服务器增加一个用户服务

            svr.Start(); // 启动服务器

            Console.WriteLine("Server started..."); // 在控制台输出Server started...

            Console.ReadLine(); // 等待用户敲回车

            svr.Stop(); // 停止服务器

            Console.WriteLine("Server stopped"); // 在控制台输出Server stopped...
        }
    }
}

  • 服务器代码已经写好了,接下来我们就把客户端连接到服务器上去,下面是客户端代码
using System;
using WebSocketSharp;

namespace ConClient
{
    class Program
    {
        static void Main(string args)
        {
            // 微软有一个原生的WebSocket,注意不要用到那个WebSocket了
            WebSocket ws = new WebSocket("ws://localhost:8888/UserService"); // 访问服务器的用户服务界面                                                                                                                    

            ws.OnMessage += Ws_OnMessage; // 将Ws_OnMessage添加到OnMessage事件中,收到消息时会调用OnMessage里的方法

            ws.Connect(); // 与服务器建立链接

            ws.Send("Hello, server!"); // 向服务器的用户访问界面发送Hello, server!

            Console.ReadLine(); // 等待服务器返回响应

            ws.Close(); // 关闭WebSocket链接

            Console.WriteLine("Hello World");
        }

        private static void  Ws_OnMessage(object sender, MessageEventArgs e)
        {
            Console.WriteLine(e.Data); // 打印服务器传来的消息
        }
    }
}

  • 写完这些代码后再运行服务器就能实现网络通信了,运行效果如下



  • 网络通信的实现到这里就结束了,感谢各位读者能够看到这里,如果想要学习更多MMORPG网络游戏知识可以参加我们的从零开发MMORPG 3天训练营,原价298,现在限时免费领取
课程大纲如下








学完你能够收获



连续3天,360+分钟
不仅仅能让你从零开发MMORPG,更能让你了解游戏行业求职所面临最重要的问题!
让你在入行前避过这些坑
快点击下方立刻免费参加本次训练营吧!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|香雨站

GMT+8, 2025-3-15 05:04 , Processed in 0.564604 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.. 技术支持 by 巅峰设计

快速回复 返回顶部 返回列表