为无头服务器创建单独的 Unity 项目
Create separate Unity project for headless server
我想创建一个无头服务器来处理我的多人游戏。这将更像是一个概念验证项目,但基本上我只想让多个玩家(比如 3 个)来移动一个盒子。所以每个玩家都可以同时移动盒子(想象一个足球被多个玩家移动)。
现在我想知道我应该如何构建我的代码。我想为服务器创建一个单独的项目,我可以在 linux 服务器上 运行 无头,并为游戏本身创建另一个项目。服务器所做的只是传递有关盒子当前位置和移动者的消息。
我是 Unity 的新手,所以不确定这是否明智。或者我应该把服务器作为一个单独的场景放在同一个项目中?或者完全不同的方法?
注意,2020 年代的 Unity mmp“MLAPI”:
最近 Unity(又一次)完全改变了他们的实时多人游戏方法,“MLAPI”系统现在已经使用了几年,直到他们再次彻底改变它。
https://docs-multiplayer.unity3d.com
这篇很老的文章只涉及“三种方式”的抽象概念server/clients,所以,这是旧文章:
你提出了一个很好的问题。
以下是三种可能性:
(A) 有些人更喜欢在 一个脚本 中有 双方 。 (IE,只有一个项目。实际上每个 script 字面意思是“做两件事”。)
(B) 有些人更喜欢两个脚本,但在一个项目 中。因此应用程序启动,然后应用程序 决定 它是服务器还是客户端。
(C) 有些人更喜欢两个完全独立的项目。所以,一个项目是客户端,一个是服务器。
所以你必须在这三种方法之间做出选择。
关于“A”:
不幸的是,从 Unity 的早期开始,网络上的大多数古老代码示例都是“A”形式。其中一些样本非常糟糕。
我发现方法“A”令人困惑且毫无意义。我看不出 任何 将这两个概念合二为一的目的。
关于“B”:
这可能是中型项目的方法。但是,该应用程序必须从根本上知道如何将自己“拆分”为两个不同的应用程序。
B 对于 部署 应用程序的人来说比 C 更容易。他们只是启动应用程序。该应用程序计算出如何表现。但是,B 对开发人员来说更难。
关于“C”:
如果系统与安全或交易有关,您将需要 C。一切都是 KISS,混淆的可能性较小。如果系统的两个部分自然就比较不同,C就有意义了。
如果项目非常大,C 更容易,因为项目更分散。它会让你更自然地将两者之间的通信协议正式化等等。
C“永远正确”。 B 可用于“部署方便”。当然,如果你只是做一个“hello world”测试,你可以做“A”,但这非常令人困惑。
要就这个难题获得进一步的意见,必须清楚地展示部署案例;即它是一款应用商店游戏,它是一次性信息亭安装、工厂范围的软件,还是其他任何情况。干杯
按照@Fattie 的回答,我在选择第三个选项时确实遇到了问题。即,为服务器和客户端创建单独的项目。
主要是,RPC 调用 可能不会工作,因为 rpc 方法签名在新项目中会有所不同,因为不同的程序集名称(如 compatibility documentation 中所述)。
解决方法是复制您当前的项目以保持所有程序集名称不变,然后修改您的项目以满足您的需要。
我想创建一个无头服务器来处理我的多人游戏。这将更像是一个概念验证项目,但基本上我只想让多个玩家(比如 3 个)来移动一个盒子。所以每个玩家都可以同时移动盒子(想象一个足球被多个玩家移动)。
现在我想知道我应该如何构建我的代码。我想为服务器创建一个单独的项目,我可以在 linux 服务器上 运行 无头,并为游戏本身创建另一个项目。服务器所做的只是传递有关盒子当前位置和移动者的消息。
我是 Unity 的新手,所以不确定这是否明智。或者我应该把服务器作为一个单独的场景放在同一个项目中?或者完全不同的方法?
注意,2020 年代的 Unity mmp“MLAPI”:
最近 Unity(又一次)完全改变了他们的实时多人游戏方法,“MLAPI”系统现在已经使用了几年,直到他们再次彻底改变它。
https://docs-multiplayer.unity3d.com
这篇很老的文章只涉及“三种方式”的抽象概念server/clients,所以,这是旧文章:
你提出了一个很好的问题。
以下是三种可能性:
(A) 有些人更喜欢在 一个脚本 中有 双方 。 (IE,只有一个项目。实际上每个 script 字面意思是“做两件事”。)
(B) 有些人更喜欢两个脚本,但在一个项目 中。因此应用程序启动,然后应用程序 决定 它是服务器还是客户端。
(C) 有些人更喜欢两个完全独立的项目。所以,一个项目是客户端,一个是服务器。
所以你必须在这三种方法之间做出选择。
关于“A”:
不幸的是,从 Unity 的早期开始,网络上的大多数古老代码示例都是“A”形式。其中一些样本非常糟糕。
我发现方法“A”令人困惑且毫无意义。我看不出 任何 将这两个概念合二为一的目的。
关于“B”:
这可能是中型项目的方法。但是,该应用程序必须从根本上知道如何将自己“拆分”为两个不同的应用程序。
B 对于 部署 应用程序的人来说比 C 更容易。他们只是启动应用程序。该应用程序计算出如何表现。但是,B 对开发人员来说更难。
关于“C”:
如果系统与安全或交易有关,您将需要 C。一切都是 KISS,混淆的可能性较小。如果系统的两个部分自然就比较不同,C就有意义了。
如果项目非常大,C 更容易,因为项目更分散。它会让你更自然地将两者之间的通信协议正式化等等。
C“永远正确”。 B 可用于“部署方便”。当然,如果你只是做一个“hello world”测试,你可以做“A”,但这非常令人困惑。
要就这个难题获得进一步的意见,必须清楚地展示部署案例;即它是一款应用商店游戏,它是一次性信息亭安装、工厂范围的软件,还是其他任何情况。干杯
按照@Fattie 的回答,我在选择第三个选项时确实遇到了问题。即,为服务器和客户端创建单独的项目。
主要是,RPC 调用 可能不会工作,因为 rpc 方法签名在新项目中会有所不同,因为不同的程序集名称(如 compatibility documentation 中所述)。
解决方法是复制您当前的项目以保持所有程序集名称不变,然后修改您的项目以满足您的需要。