草庐IT

UE4/5 C++网络服务器编程纪录【零】--准备篇

blind_mokey 2023-04-12 原文

前言

之前利用业余时间重新复习UE4/5的C++开发,闲来无事做了个基于独立服务器的多人在线(目前限定客户数量是20人以内)DEMO,核心功能在我之前发的B站视频里面有,战斗、动作、交互以及场景演示都有了,有朋友看了视频之后要求我写文档复现,我也顺便纪录一下需要做的工作。方便以后自己遇到相关业务场景进行回顾知识点,顺便分享给各位朋友。

视频指路1-整点小活儿: 整点小活儿

视频指路2-研发中天气场景切换: 研发中天气场景切换

视频指路3-简单的敌人AI功能: 简单的敌人AI功能

准备工作:

游戏服务器:UE5游戏服务器应用 UE5.1

数据库服务器:mysql-8.0.32

服务器操作系统:Linux Ubuntu18.0LTS

WEB服务器:利用UE5进行集成,处理工作在游戏服务器内部完成

客户端:UE5开发完成的客户端

框架设计:

基于UE5的独立服务器功能开发的C/S框架,基本原理就是客户端只负责发起功能请求和渲染展示,游戏服务器负责进行运算数据同步、坐标信息同步、加密保护等功能。数据库服务器用于存储客户数据,客户行为模型,客户标签等功能。WEB服务器处理一部分WEB请求,并提供一切WEB能处理的功能。

重点!!!!

所有的操作和运算都在游戏服务器完成,不允许在客户端进行数值运算和用户数据更新!客户端只能渲染画面和进行数据同步。

服务器开发基础入门参考文档:UE5设置专用服务器

mysql数据库服务器开发基础安装参考文档:mysql官方安装包

一、下载UE5源码

GITHUB源码包:虚幻引擎官方GITHUB

小技巧:在下载完成的安装包Setup.bat里面修改如下配置,能够发动多线程下载,提升某些不可描述原因引起的1兆不到的网速。

set PROMPT_ARGUMENT=set PROMPT_ARGUMENT=--prompt --threads=30 --exclude=VS2012 --exclude=VS2013 --exclude=VS2017 --exclude=HTML5

然后再在hosts里添加unreal的CDN代理

13.226.17.97 cdn.unrealengine.com

通过一系列操作,可以提升在SetUp.bat完整拉取虚幻引擎的速度,但是因为某些不可描述的原因不会提升很高,总比28kb/s好

安装完成后利用VisualStudio打开UE5.sln看到如下图所示

二、安装MySql

基本需要的引擎已经安装好了,需要安装数据库服务器,我这里使用的是Mysql-8.0.32

安装步骤参考另一位大神的文档:MySQL安装配置教程(超级详细、保姆级)

这个过程中因为Windows10的部分管理员权限问题,导致mysqld初始化安装失败。

我们需要在C:\Windows\System32里面用管理员身份打开cmd命令行,然后使用如下命令进入mysql安装包,不能用简单的cd命令操作,要加上/d

cd /d H:\mysql-8.0.32-winx64\bin

最后结果如图

其他的参考大神的mysql安装步骤解决就行了。

三、安装DBeaver

开启了mysql服务之后,不习惯命令行操作的朋友可以利用DBeaver进行数据库内容管理操作,和同事讨论了用轻量级的navicat,总感觉差点意思,毕竟现在是做大数据的,要集成很多jdbc功能,用DBeaver更合适我,所以就安装了。

DBeaver下载地址:DBeaver官方下载链接

安装完成之后直接链接本地Mysql服务,如图所示

前期的准备工作就已经完成了,我们编译一下UE5的源码,弄个基于官方第三人称模板开发的DEMO,包含登录功能、登录服务器关卡等功能的DEMO看一下。

四、准备工作完成进行简单的DEMO

(1)设置UE5引擎编辑器为启动项目

选择engine->UE5,设为启动项目

选择debug editor,点击生成。根据机器配置不同,生成新的项目时间为几个小时到几天不等(实在太大了,狂吃我机器性能)

(2)生成项目的同时不能闲着,创建用户信息数据库,并进行数据插入

create database game_users;
create table if not exists game_users.user_base_info(
`id` INT  NOT NULL AUTO_INCREMENT COMMENT '主键',
`user_name` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '用户名',
`pass_word` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '用户密码',
`user_state` int  NOT NULL DEFAULT 0 COMMENT '用户状态,0:不可用,1:可用',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '记录创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录更新时间',
PRIMARY KEY (`id`)
)ENGINE = INNODB charset = utf8mb4 COMMENT '用户信息表';

建表完成插入测试语句,如图所示

insert into game_users.user_base_info (user_name,pass_word,user_state) values ('demo1','demo1',1);

到此为止,基础的测试数据执行完成,数据准备工作就绪。

有关UE4/5 C++网络服务器编程纪录【零】--准备篇的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  4. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  5. ruby - 寻找通过阅读代码确定编程语言的ruby gem? - 2

    几个月前,我读了一篇关于ruby​​gem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:

  6. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  7. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  8. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  9. 网络编程套接字 - 2

    网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识

  10. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

随机推荐