为Unity构建一个简单的在线游戏服务器

2024-01-01

我正在尝试为我的坦克游戏 2D(Unity)构建一个在线游戏服务器。在我的游戏中会有2-4名玩家控制他们的坦克并互相战斗。

  • 我尝试过使用 Unity 网络,它不太适合我的游戏,因为我们必须选择房间中的 1 名玩家作为“服务器”,这对于我未来的开发来说不太灵活(例如,当“服务器”退出,我必须做很多工作才能保持其他玩家之间的连接)。

  • 然后我尝试使用 Nodejs là socket.io 构建自己的服务器以进行服务器客户端通信。这非常简单:从一个接收数据并将其广播给其他人。在物理部分出现之前,它似乎工作得很好:当客户端说有东西被击中或爆炸时,服务器必须信任客户端,然后将其广播给其他客户端。更不用说作弊客户端了,随着网络延迟的变化,客户端的物理模拟也会有所不同。例如,一辆坦克可能被一个客户端击中,但它在另一个客户端的墙后找到掩护并保持活力,但由于延迟,它后面的坦克接住了子弹并爆炸。在这些情况下,服务器不知道要听哪一个。

Update

  • 正如@Catwood 下面提到的,Photon PUN 对我来说是另一个选择。我 之前曾遵循过他们的教程之一。 Photon 不需要像 Unity 网络那样由播放器充当“服务器”。但是如何在服务器上实现我的游戏逻辑呢? (用于权威服务器目的)
  • 显然 Smartfoxserver 是另一个不错的(而且昂贵的)选择。我还没有深入研究他们的 API 文档。我不知道我是否可以在此实现我的游戏逻辑和规则(为了简单起见,他们的教程跳过了这部分)。

总之,我需要对我的游戏服务器提出建议:

  • 是权威服务器
  • 可以处理游戏规则并决定会发生什么(也许它应该有自己的物理引擎)
  • 与 Unity2D 配合良好
  • Javascript、C#、Java优先!

我的方向是否正确,因为似乎某些游戏服务器服务(例如 Photon、Unity 网络)并不关心如何在服务器上实现游戏逻辑?这是否使它们不再是权威服务器?

我对这个领域很陌生,任何事情都会受到赞赏!


我建议像使用 NodeJS 一样为您的游戏创建自己的服务器。我所知道的大多数解决方案都很难使用,并且无法完成您想做的所有事情。

例如,暴雪游戏的《炉石传说》的客户端是基于Unity的,并且有一个定制的服务器端。

以下是有关如何创建游戏服务器的一些建议。

在物理部分出现之前,它似乎工作得很好:当客户端说有东西被击中或爆炸时,服务器必须信任客户端,然后将其广播给其他客户端。

创建服务器时,您必须在服务器端而不是客户端做出每个重要决策。 聚会是由服务器发起的,所以服务器必须有以下信息

  • 地图大小
  • 玩家人数
  • 每个玩家的数据(生命值、位置、体型、攻击速度......)
  • 做出决定所需的任何其他信息

现在,客户端应该始终向服务器发送非常小的信号,如下所示

  • 向左移动
  • 加入派对
  • Shoot
  • 右旋
  • etc...

基于用户的操作和用户的数据,服务器可以运行游戏的“模拟”。

  • 检查该操作是否被允许
  • 如果允许的话,模拟这个动作。如果不是,则将其放入队列中
  • 向用户发送有关正在发生的事情的信息(玩家一击中,玩家二死亡,玩家四左移动等......)

这样,服务器就知道什么时候发生了事情并决定发生什么。您不依赖客户端信息,您只收到玩家想要的操作。

但是,正如您所说,由于延迟和其他网络因素,您的客户端不能过于依赖服务器。在现代游戏中,客户端拥有与服务器相同的玩家数据,并且并不总是依赖服务器在屏幕上显示正在发生的事情。

如果您玩过一些在线游戏,您可能已经注意到,当与服务器的连接丢失时,您有一小段时间可以继续玩(移动、射击等),但除了您之外,没有任何东西会移动。 这是因为即使没有服务器信息,客户端也会根据您的操作继续“运行”游戏。

然而,为了避免客户端向玩家显示的内容与服务器模拟中发生的内容之间存在巨大差异,客户端和服务器会定期“同步”。

例如,如果您决定向左移动,客户端知道您的移动速度,因此可以在不依赖服务器的情况下显示移动情况。

当同步发生时,服务器向客户端发送关键信息,并且客户端用服务器发送的内容更改任何当前显示的信息。

以左移动为例,如果您在服务器和客户端上的移动速度不同,当客户端收到同步命令时,您会注意到您的玩家将从显示的位置“传送”到另一个位置。如果某些数据包丢失或由于高延迟,也可能会发生这种情况。

在服务器和客户端创建在线游戏时,处理延迟是一个巨大的挑战,这不是本问题的主题。

总而言之,您的服务器应该

  • 自制的
  • 只接收来自客户端的操作
  • 模拟游戏
  • 向客户发送有关正在发生的事情的信息
  • 定期与客户端同步

希望这有帮助=)


Here are some explanation on how to add logic inside your server. Small disclaimer before, I've never used NodeJS so I don't know if this is achievable using NodeJS, I usually use C++.

现在,对于您的游戏,我假设玩家只能使用“移动”动作。

当用户连接到您的服务器时,您可以启动游戏。 因为你的用户可以移动,这意味着有一个 2D 地图,你的用户有一个大小、一个初始位置和一个速度。 所以你的服务器应该启动一个新的“GameParty”并初始化上述数据。 对于示例,我们假设设置了以下默认值。

map_width = 512;
map_height = 512;
user_width = 2;
user_height = 2;
user_speed = 1;
user_posx = 20;  
user_posy = 20;

当客户端想要移动时,他会向服务器发送一个数据包,表示他想要移动。您可以使用任何您想要的客户端 服务器通信协议,我使用二进制协议,但假设您使用 Json

{action: move; value: left};

这样,您的服务器就会知道用户想要向左移动。 所以,你只需要减少user_posx按价值user_speed在服务器端拥有您的新职位。如果这个位置在地图的边缘,你有两种选择,让用户出现在地图的另一边缘,禁止该动作。

您的服务器会定期向客户端发送玩家的当前位置。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为Unity构建一个简单的在线游戏服务器 的相关文章

  • 为什么 Resources.Load 返回 null?

    我的项目有多个精灵 位于 Assets Sprites 中 我想使用 C 脚本加载它们 我已经测试过这个 Sprite myFruit Resources Load
  • float.Parse 不再在 Unity 中工作 (C#)

    我有一个包含以下代码行的工作项目 public InputField mass float val float Parse mass text 非常简单 用户输入一定量的质量 然后将其从文本解析为浮动 几天前这工作得很好 我什至能够多次导出
  • 使用 GitHub 时防止将大文本文件添加到提交

    我们想要防止 非常大的文本文件 每个文件 gt 50MB 被提交到git代替git lfs 因为它们夸大了 git 历史 问题是 其中 99 大小差异的原因 这些是 YAML 文件 它们支持通过 Base64 编码进行二进制序列化 我们无法
  • Hololens-无法连接到设备

    我意识到这个问题在其他地方被问过 但答案似乎直接针对 Hololens 和 PC 之间的配对过程 这是我的问题的一部分 我在 Unity 中制作了一个应用程序并导出到 Visual Studio 当我尝试在 Hololens 上运行它时 出
  • 如何在 Three.js 场景中包含 OVRManager?

    我创建了几个 Three js Javascript 演示应用程序 正在我的新 Oculus Go 中进行试验 我正在尝试让 Go 控制器在我的应用程序中执行某些操作 根据 Oculus 开发人员中心的说法 最好的办法是将 OVRManag
  • 关闭 Godot 中的游戏

    我正在使用 Godot 创建网页游戏 为了关闭游戏 我尝试使用 get tree quit 如果我在 IDE 上使用它 它就可以工作 当我在我的服务器上尝试它时 导出项目后 它不起作用 我确信导出设置没问题 我怎样才能关闭游戏 并且 如何添
  • Unity - 在生成时获取随机颜色

    我有一个小问题 我想在我的场景中生成四边形 它们都应该有红色或绿色作为材质 但 Random Range 函数只能是 int 我该如何解决它 void SpawningSquadsRnd rndColor 0 Color red rndCo
  • 无法使用 Unity 函数在 Visual Studio Code 中获得完整的 Intellisense

    好吧 我知道这个问题已经被问过并回答过很多次了 但我花了大约 3 天的时间试图解决这个问题 但到目前为止我所做的一切都没有奏效 我基本上在 Visual Studio Code 中有部分智能感知 也就是说 它似乎只识别 Unity 类和变量
  • Unity手游触摸动作不扎实

    我的代码中有一种 错误 我只是找不到它发生的原因以及如何修复它 我是统一的初学者 甚至是统一的手机游戏的初学者 我使用触摸让玩家从一侧移动到另一侧 但问题是我希望玩家在手指从一侧滑动到另一侧时能够平滑移动 但我的代码还会将玩家移动到您点击的
  • 不明确的 OpenGL 默认相机位置

    在我的Opengl程序中 在我应用透视投影矩阵之前 每当我绘制一些对象时 我都会在世界坐标系的原点处绘制它 但是几乎所有Opengl教程都指出相机 我的投影视图 位于原点朝向正 z 轴 这取决于您稍后如何处理投影矩阵中的 z 值 但是如果这
  • 从脚本启用/禁用 GameObject 组件 [Unity3D]

    我需要获取一个脚本中设置的布尔值 放入名为 bouclier 的变量 以启用或禁用游戏对象 该变量位于游戏对象 Player 中 此处右下角 我需要启用或禁用这个游戏对象 Bouclier01 为此 我将脚本附加到游戏对象 Bouclier
  • Unity 中图像的 onClick 事件

    是否可以在 Unity 中将 onClick 功能添加到图像 画布的组件 var obj new GameObject Image NewImage obj AddComponent
  • 在 Unity 中构建 apk 应用程序时包含文件

    在unity中构建apk文件时如何将文件和文件夹添加到apk文件中 我需要的是在Android上安装应用程序后 在应用程序的父目录 android data com company product files 中存在一些文件和文件夹 这是我
  • Unity 对象不围绕枢轴点旋转

    突然 由于某种原因 统一编辑器中的对象开始围绕其重心旋转 至少我认为是这样 而不是其枢轴点 我尝试将对象放置在一个空对象内 该对象将像往常一样用作新的枢轴点 但这并没有改变任何东西 这是一些设置还是一些更新的功能 我怎样才能阻止它 检查编辑
  • 统一的阿拉伯语输入字段

    有没有办法将输入字段的语言统一更改为阿拉伯语 我尝试了ArabicSupport 它正确显示了阿拉伯语 但将其与输入字段一起使用却不起作用 因为 GameObject Find input field GetComponent
  • 将物体放置在相机前面

    这应该是一项简单的任务 我已经用谷歌搜索过了 但我不明白为什么这些例子对我有用 基本上 我想在我的第一人称游戏中将瓷砖放在地上 我希望我想要放置在地面上的物体 漂浮 在半空中 同时为其选择完美的位置 我可以实例化该对象 使其成为玩家相机的子
  • 自定义窗口上的 Unity 自定义检查器

    我有一个显示对象列表的自定义窗口 每个对象都有一个自定义检查器编辑器 是否可以在自定义窗口内显示自定义检查器 你不能强迫Unity3D将自定义检查器绘制在检查器窗口之外的其他位置 顺便说一句 您可以手动实例化Editor using 编辑器
  • Unity遥控器5不工作

    我尝试运行 Unity Remote 但是当我在 Unity 编辑器中按下播放时 我的手机上没有任何反应 我认为我需要做的不仅仅是将手机与电脑连接 将编辑器设置为任何 Android 设备并按开始键 但这些是它所说的唯一内容 它根本不起作用
  • 在原生 Android 应用程序中集成多个 Unity 游戏

    我有一个原生 Android 应用程序 我想在其中嵌入多个 Unity 游戏 我跟着link https medium com davidbeloosesky embedded unity within android app 7061f4
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou

随机推荐

  • 哪些 GCC 优化标志和技术在 CPU 上是安全的?

    当编译 链接适用于 ISA 例如 x86 64 的所有实现的 C C 库或程序时 从正确性和运行时性能的角度来看 哪些优化标志是安全的 我希望优化能够产生正确的结果 并且不会对特定 CPU 的性能造成损害 例如 我希望避免优化标志 这些优化
  • SpannableStringBuilder 用正则表达式替换内容

    我有以下代码 我将在其中标记大括号之间的内容SpannableString并删除花括号 但它给出了错误的结果 String text the quic k brown fox jumps over the lazy dog A Quick
  • 嵌套参数无法编译

    我正在尝试将我的代码编译成 Python 3 模块 当我在 IDLE 中选择 运行模块 时它运行良好 但当我尝试创建发行版时收到以下语法错误 File usr local lib python3 2 dist packages simple
  • 生成 CrypoAPI (CAPI) 私钥

    我正在尝试使用静态加密IXml加密器 https learn microsoft com en us aspnet core security data protection extensibility key management vie
  • php 中未定义的函数 mysql_connect()

    我安装了 mysql installer web community 5 6 25 0 apache 2 4 2 x86 no ssl 和 php 5 4 42 Win32 VC9 x86 php 可以与 apache 服务器配合使用 但不
  • 如何增加 MDCTextInputControllerOutlinedTextArea 的高度

    I have assigned a class named MDCMultilineTextField for Uiview from the storyboard This class is used for Multiline Text
  • 生产者消费者 - ExecutorService 和 ArrayBlockingQueue

    我想知道我对使用 ExecutorService 和 ArrayBlockingQueue 的生产者消费者设计的理解是否正确 我知道有不同的方法来实现这个设计 但我想 最终 这取决于问题本身 我必须面对的问题是 我有一个制作人 他从一个大文
  • jQuery 的 crossdomain.xml?

    我有一个托管在 Tumblr 上的博客 我有一个单独的主机 我在其中存储我制作的主题的所有图像 js css 等 不过 我也在使用查询加载器2 http www gayadesign com diy queryloader2 preload
  • 将变量注入 webpack

    我试图将一个变量注入到 webpack 包中的每个模块中 以便获得每个文件的 JS 错误的调试信息 我已启用 node filename true webpack 中的当前文件路径 https stackoverflow com quest
  • 为什么 form.submit() 不会触发“提交”事件?

    我正在使用 JavaScript submit 函数提交表单 form submit 但是当我使用 addEventListener 捕获我的提交事件时 它不起作用 form addEventListener submit function
  • 如何避免散点图/ggplot 中相同数据点的标签重叠?

    是否有任何函数等可以避免散点图中相同数据点的数据标签重叠 我已经检查了对 textxy direct label 和 geom text 的各种问题 答复 但没有成功 也许这根本不可能 以下是相关数据的示例 structure list c
  • 每次我登录游戏时,Unity Facebook SDK 都会不断要求我确认登录

    我正在使用 Unity3D 2018 2 6f1 和 Facebook SDK 这是用户单击登录按钮后我用来登录 Facebook 的代码 FB Init gt FB LogInWithReadPermissions new List
  • 在 SICP 中推广素数对

    我花了一些时间来研究 素数对 的生成SICP 第 2 2 3 节 作为常规接口的序列 例如 1 3 不 因为总和 4 1 4 是的 因为 sum 5 素数 这是我从头开始得到的 有效的 lang sicp RANGE helper func
  • Android DatePicker 在使用最小/最大限制时显示不可用月份

    我在 StackOverflow 上只发现了这个问题的另外 1 个实例 但尚未得到答复 去年 所以我想我应该再试一次 Android DatePicker Dialog 使用最小 最大日期显示不正确的月份 秒 https stackover
  • 在 React 中使用 requestAnimationFrame

    我是原生反应新手 我正在尝试优化性能 我的触摸事件非常慢 我正在经历RN 性能文档 https facebook github io react native docs performance my touchablex view isn
  • 如何在rails3中使用amistad gem?

    我需要有关如何在 Rails3 应用程序中实现 AMISTAD gem 的帮助 请建议一些教程或观点 我看到了 github amistad 链接 但我想要对这颗宝石进行全面报道 请帮我 gem 创建者请给我发送一个如何使用 GEM 的示例
  • 是否可以在 android 中使用 Actionbar sherlock 在操作菜单项中实现切换按钮

    我有一个应用程序 它在操作菜单项中有切换按钮 尽管我使用的是 Actionbar Sherlock 但我不知道如何将切换按钮放置在操作菜单项中 我不想将其作为自定义布局放置在操作栏中 但我想将其放置为菜单项 如果有人找到解决方案 请帮助我
  • Google Analytics(分析)不会跟踪 iOS 上的视图?

    我已将最新的 Google Analytics SDK 添加到我的 iOS 应用程序中 版本 2 0 beta 4 我按照指南所述进行了相同的操作 并将以下代码添加到应用程序委托中 Optional automatically send u
  • 如何从现有的 github 项目添加 helm 存储库?

    我有一个现有的 github 项目 我想创建 添加一个helm文件夹到项目中以存储 helm yaml 文件 我想引用这个 github 项目 文件夹来充当我的本地 开发环境中的 helm 存储库 我知道我可以将图表添加到我的本地 默认 h
  • 为Unity构建一个简单的在线游戏服务器

    我正在尝试为我的坦克游戏 2D Unity 构建一个在线游戏服务器 在我的游戏中会有2 4名玩家控制他们的坦克并互相战斗 我尝试过使用 Unity 网络 它不太适合我的游戏 因为我们必须选择房间中的 1 名玩家作为 服务器 这对于我未来的开