Unity多人游戏开发-使用Netcode for GameObject-官方文档中文翻译

文章目录

  • 官方文档
  • 文章版本
  • 关于Netcode for GameObject
    • 开始入门
    • 开始项目
    • 教程和示例
    • 核心概念
    • 调试
    • 术语和常见问题解答
    • 开始之前
  • 发行说明
    • Netcode for GameObjects
      • Netcode for GameObjects的更新日志
    • Boss Room(首领房间)
      • Boss Room更新日志
  • Bitesize
    • 多人Bitesize示例
    • API参考
  • 开始使用
    • 安装Netcode for GameObjects
      • 前提条件
      • 兼容性
      • 支持的平台
      • 使用包管理器安装NGO
      • 适用于Unity编辑器版本2020.3 LTS或更早版本
      • 下一步
    • 开始使用NGO
      • 前提条件
      • 安装Netcode for GameObjects
      • 添加基本组件
        • 创建NetworkManager组件
        • 为每个连接的玩家创建一个要生成的对象
        • 将场景添加到build中
      • 添加RPCs
        • 测试RPCs
      • 使用脚本扩展功能
        • HelloWorldManager.cs脚本
  • 持续更新中……

官方文档

首先亮出文档,可以直接去看官方文档。
官方文档
翻译水平有限,如有错误,欢迎在评论区指正。
部分教程链接如下:
教程

文章版本

本文章基于Netcode for GameObject 1.5.2进行翻译。

关于Netcode for GameObject

Netcode for GameObjects(NGO)是一个为Unity构建的高级网络库,用于抽象化网络逻辑。它使你能够将游戏对象和世界数据通过网络会话发送给多个玩家。通过使用NGO,你可以专注于构建游戏,而不必关注低级协议和网络框架。

要了解更多关于Netcode for GameObjects的功能和能力,请查看下面的内容:

开始入门

安装Unity Netcode
从UNet迁移到Netcode
升级到Unity Netcode Package

开始项目

开始使用Netcode

教程和示例

Boss Room(首领房间)
Bite Size Samples(小示例)
Dilmer’s Tutorials(Dilmer的教程)

核心概念

网络
组件
对象
消息系统
序列化
场景

调试

日志记录
故障排除
错误消息

术语和常见问题解答

高级术语
多人游戏架构
常见问题解答

别忘了查看发行说明和API文档!

开始之前

Netcode支持以下版本:

  • Unity 2021.3及更高版本
  • Mono和IL2CPP脚本后端

Netcode支持以下平台:

  • Windows、macOS和Linux
  • iOS和Android
  • 运行在Windows、Android和iOS操作系统上的XR平台
  • 大多数封闭平台,如游戏主机。关于特定封闭平台的更多信息,请联系我们。这些内容通常受到保密协议的保护。
    • 当在游戏主机(如PlayStation、Xbox或任天堂Switch)上运行时,你在测试和正式发布游戏前应了解特定的Netcode政策。请参考游戏主机的内部文档以获取更多信息。此类内容通常受到保密协议的保护。

最后更新日期:2023年8月2日

发行说明

Netcode for GameObjects

Netcode for GameObjects的更新日志

以下内容跟踪了下一个版本的Unity Netcode的功能、更新、错误修复和重构。因为Netcode for GameObjects是开源的,你可以在com.unity.netcode.gameobjects的GitHub存储库中访问完整的发行说明和变更日志。

发布 |日期 | 更新日志
1.5.2 2023-07-24 1.5.2
1.5.1 2023-06-09 1.5.1
1.4.0 2023-04-10 1.4.0
1.3.1 2023-03-27 1.3.1
1.2.0 2022-11-21 1.2.0
1.1.0 2022-10-18 1.1.0
1.0.2 2022-09-08 1.0.2
1.0.1 2022-08-23 1.0.1
1.0.0 2022-06-27 1.0.0

最后更新日期:2023年8月14日

Boss Room(首领房间)

Boss Room更新日志

以下内容跟踪了Boss Room示例项目的下一个版本的功能、更新、错误修复和重构。由于Boss Room是开源的,你可以在com.unity.multiplayer.samples.coop的GitHub存储库中访问完整的发行说明和变更日志。
发布 | 日期 | 更新日志
2.1.0 2023-04-27 2.1.0
2.0.4 2022-12-14 2.0.4
2.0.3 2022-12-09 2.0.3
全部内容在此,我就不一个一个复制了,太累了

最后更新日期:2023年6月13日

Bitesize

多人Bitesize示例

以下内容跟踪了多人Bitesize示例项目的下一个版本的功能、更新、错误修复和重构。由于多人Bitesize是开源的,你可以在com.unity.multiplayer.samples.bitesize的GitHub存储库中访问完整的发行说明和变更日志。
发布 | 日期 | 更新日志
1.1.0 2022-12-13 1.1.0

最后更新日期:2023年8月14日

API参考

API参考

开始使用

安装Netcode for GameObjects

你可以使用本指南来帮助你在Unity项目中设置Netcode for GameObjects (NGO)。

前提条件

在开始安装Netcode之前,请确保你具备以下条件:

  • 一个有效的Unity账户和许可证。
  • 支持的Unity版本。请查看Netcode的要求以获取具体的Unity版本详情。
  • 现有的Unity项目。如果你对Unity还不熟悉,可以参考Get started with NGO部分以获得指南。

兼容性

  • Unity编辑器版本2021.3或更高
  • Mono和IL2CPP脚本后端

支持的平台

  • Windows、MacOS和Linux
  • iOS和Android
  • Windows、Android和iOS上的XR平台
  • 大多数封闭平台,例如游戏主机。关于特定封闭平台的更多信息,请联系NGO开发团队。
  • WebGL(需要NGO 1.2.0+和UTP 2.0.0+)

注意
当运行在游戏主机等封闭平台(PlayStation、Xbox、Nintendo Switch)上时,可能会存在特定的政策和注意事项。请参考你所用游戏主机的文档以获取更多信息。

使用包管理器安装NGO

  1. Unity编辑器中选择“Window”>“Package Manager”。
  2. 在包管理器中,点击“+”Add符号>“Add package by name…”。
  3. 将com.unity.netcode.gameobjects输入到包名称字段中,然后选择“Add”。

适用于Unity编辑器版本2020.3 LTS或更早版本

  1. 从Unity编辑器中选择“Window”>“Package Manager”。
  2. 在包管理器中,点击“+”Add符号>“Add package by git URL…”
  3. 在git URL字段中输入或粘贴https://github.com/Unity-Technologies/com.unity.netcode.gameobjects,然后选择“Add”。

下一步

在安装了Netcode for GameObjects (NGO)之后,请参阅以下内容以继续你的旅程:

  • 使用Get started with NGO教程创建项目,测试你的Netcode安装,并了解如何使用Netcode for GameObjects的基本功能。
  • 查看教学样例以进一步探索Netcode及其能力:
    • Boss Room
    • 2D Spaceshooter Bitesize 示例
    • Invaders Bitesize 示例
    • Client-Driven Bitesize 示例

最后更新时间:2023年8月14日

——————————————————————————————————

开始使用NGO


使用本指南学习如何创建你的第一个NGO项目。它将指导你创建一个简单的Hello World项目,实现Netcode for GameObjects (NGO)的基本功能。
参考"Testing the command line helper",学习如何使用命令行辅助工具测试你的构建结果。

前提条件

在开始之前,请确保你具备以下条件:

  • 具有有效许可证的活跃 Unity 账户。
  • Unity Hub。
  • 支持 NGO 的 Unity 编辑器版本。请参考 NGO 要求。

在继续之前,请使用 Unity 编辑器版本 2021.3 或更高版本创建一个新项目。

小贴士

  1. 如果你还没有一个 Assets/Scripts/ 文件夹,现在创建一个:
  2. 在项目选项卡中,右键单击Assets文件夹,然后选择Create> Folder。 将新文件夹命名为Scripts。

这将是你保存所有脚本的位置。

安装Netcode for GameObjects

参考安装Netcode for GameObjects的说明。

添加基本组件

本节将指导你添加网络游戏的基本组件:

  • 一个NetworkManager组件
  • 一个玩家对象
  • 一个场景

创建NetworkManager组件

本节将指导你创建一个NetworkManager组件。
首先,创建NetworkManager组件:

  1. 在Hierarchy选项卡中右键单击,然后选择Create Empty来创建一个空的GameObject。
    Unity多人游戏开发-使用Netcode for GameObject-官方文档中文翻译_第1张图片
  2. 将空的GameObject重命名为NetworkManager。
    Unity多人游戏开发-使用Netcode for GameObject-官方文档中文翻译_第2张图片
  3. 选择NetworkManager,然后在Inspector选项卡中选择Add Component。
    Unity多人游戏开发-使用Netcode for GameObject-官方文档中文翻译_第3张图片
  4. 从组件列表中选择Netcode > NetworkManager。
    Unity多人游戏开发-使用Netcode for GameObject-官方文档中文翻译_第4张图片
  5. 在Inspector选项卡中,找到Unity Transport部分,然后选择UnityTransport作为协议类型(Protocol type)Unity多人游戏开发-使用Netcode for GameObject-官方文档中文翻译_第5张图片
    Unity多人游戏开发-使用Netcode for GameObject-官方文档中文翻译_第6张图片
  6. 通过按下Ctrl/Cmd + S(或选择File > Save)保存场景。

为每个连接的玩家创建一个要生成的对象

信息
当你将预制体放入PlayerPrefab槽时,你是在告诉库当客户端连接到游戏时,自动将此预制体生成为连接客户端的角色。如果你没有将任何预制体设置为PlayerPrefab,NGO将不会生成玩家对象。参考Player Objects。

这部分将指导你创建一个为每个连接的玩家生成对象的过程。

  1. 在Unity编辑器中,在Hierarchy选项卡中右键单击,然后选择3D Object > Capsule
  2. 将Capsule对象命名为Player
  3. 选中Player,然后在Inspector选项卡中通过选择Add Component > Netcode > NetworkObject添加一个NetworkObject组件。
  4. 在Project选项卡下,右键单击Assets文件夹,然后选择Create > Folder
  5. 将文件夹命名为Prefabs
  6. 通过将它从Hierarchy选项卡拖放到Prefabs文件夹中,将之前创建的Player对象制作成预制体。

Unity多人游戏开发-使用Netcode for GameObject-官方文档中文翻译_第7张图片
7. 通过在Scene选项卡中选择Player胶囊体,然后按下删除键(或macOS按下Cmd + Delete)来删除场景中的Player。

提示
你可以从场景中移除Player GameObject,因为你将这个网络预制体分配给NetworkManager组件中的Player prefab属性。该库不支持将玩家对象定义为场景中放置的NetworkObject。

  1. 选择NetworkManager。
  2. 选中NetworkManager后,在Inspector选项卡中找到PlayerPrefab字段。
    Unity多人游戏开发-使用Netcode for GameObject-官方文档中文翻译_第8张图片
  3. 将Player预制体从Project选项卡拖放到你在Inspector选项卡中创建的PlayerPrefab槽中。
    Unity多人游戏开发-使用Netcode for GameObject-官方文档中文翻译_第9张图片
  4. 通过在Hierarchy选项卡中右键单击,然后选择3D Object > Plane,在场景中添加一个3D平面(居中于0,0,0)。

注意
添加平面是为了提供一个可视化参考点来显示Player预制体的位置,但这并不是必需的。

Unity多人游戏开发-使用Netcode for GameObject-官方文档中文翻译_第10张图片
12. 按下Ctrl/Cmd + S(选择File > Save)保存场景。

将场景添加到build中

这部分将指导你将场景添加到build中。

网络管理器(NetworkManager)的启用场景管理(Enable Scene Management)设置允许服务器控制客户端加载的场景。但是,你必须将当前场景添加到构建中才能进入游戏模式。

注意
网络管理器(NetworkManager)的启用场景管理选项默认已启用。

  1. 通过选择File > Build Settings打开Build Settings窗口。
  2. 选择Add Open Scenes。

Scenes/SampleScene 在Scenes In Build下列出。你可以关闭Build Settings窗口。

添加RPCs

这部分将指导你向项目添加基本的RPCs。

提示
如果你还没有Assets/Scripts/文件夹,现在创建一个:

  1. 在项目选项卡中,右键单击Assets文件夹,然后选择Create > Folder新建文件夹。
  2. 将新文件夹命名为Scripts。

这将是你保存所有脚本的位置。

创建一个名为RpcTest.cs的脚本:

  1. 在Project 选项卡中,选择Assets > Scripts。
  2. 在Scripts文件夹中,右键单击并选择Create > C# Script。
  3. 将脚本命名为RpcTest。

将RpcTest.cs脚本添加到Player预制体上:

  1. 在Assets > Prefabs中选择Player预制体。
  2. 在Inspector选项卡中(选中Player预制体),选择Add Component。
    选择Scripts > Rpc Test。

编辑RpcTest.cs脚本:

  1. 在Project 选项卡中,选择Assets > Scripts > RpcTest。
  2. 在Inspector选项卡中(选中脚本),选择Open。这将在默认的本地文本编辑器中打开脚本。
  3. 将RpcTest.cs脚本改为以下内容:
using Unity.Netcode;
using UnityEngine;

public class RpcTest : NetworkBehaviour
{
    public override void OnNetworkSpawn()
    {
        if (!IsServer && IsOwner) //Only send an RPC to the server on the client that owns the NetworkObject that owns this NetworkBehaviour instance
        {
            TestServerRpc(0, NetworkObjectId);
        }
    }

    [ClientRpc]
    void TestClientRpc(int value, ulong sourceNetworkObjectId)
    {
        Debug.Log($"Client Received the RPC #{value} on NetworkObject #{sourceNetworkObjectId}");
        if (IsOwner) //Only send an RPC to the server on the client that owns the NetworkObject that owns this NetworkBehaviour instance
        {
            TestServerRpc(value + 1, sourceNetworkObjectId);
        }
    }

    [ServerRpc]
    void TestServerRpc(int value, ulong sourceNetworkObjectId)
    {
        Debug.Log($"Server Received the RPC #{value} on NetworkObject #{sourceNetworkObjectId}");
        TestClientRpc(value, sourceNetworkObjectId);
    }
}
  1. 按下Ctrl/Cmd + S保存场景(或选择File > Save)。

测试RPCs

这部分将引导你测试之前添加的RPCs。

  1. 选择File > Build And Run。
  2. 关闭游戏。
  3. 在终端中同时启动客户端和服务器,如Testing the command line helper中所示。

提示
除了使用命令行助手脚本外,你还可以使用多人游戏模式(MPPM)包,它允许你运行多个Unity编辑器实例来测试多人游戏功能。有关更多信息,请参阅Multiplayer Play Mode。
注意:MPPM仅在Unity编辑器2023.1版本及更高版本中受支持。

在客户端和服务器生成之后,日志将显示在客户端和服务器的控制台中,显示它们相互发送RPC消息的情况。

客户端在其OnNetworkSpawn调用中首次启动交换,计数器的值为0。然后,它使用下一个值调用服务器的RPC。服务器接收到这个消息后会调用客户端。在控制台中分别显示服务器和客户端的以下内容。

Server Received the RPC #0 on NetworkObject #1
Server Received the RPC #1 on NetworkObject #1
Server Received the RPC #2 on NetworkObject #1
Server Received the RPC #3 on NetworkObject #1
...
Client Received the RPC #0 on NetworkObject #1
Client Received the RPC #1 on NetworkObject #1
Client Received the RPC #2 on NetworkObject #1
Client Received the RPC #3 on NetworkObject #1
...

只有在服务器上拥有RpcTest脚本的NetworkObject的客户端才会发送RPC,但它们都将从服务器接收RPC。这意味着,如果你使用多个客户端进行测试,在服务器和所有客户端上,控制台将在每个迭代中记录每个NetworkObject接收到的RPC一次。如果使用主机和客户端进行测试,你将在主机的控制台中看到以下内容。这是因为作为服务器,它将接收到其他客户端的服务器RPC,并且作为客户端,它也将接收到自己的客户端RPC。

Server Received the RPC #0 on NetworkObject #2
Client Received the RPC #0 on NetworkObject #2
Server Received the RPC #1 on NetworkObject #2
Client Received the RPC #1 on NetworkObject #2
Server Received the RPC #2 on NetworkObject #2
Client Received the RPC #2 on NetworkObject #2
Server Received the RPC #3 on NetworkObject #2
Client Received the RPC #3 on NetworkObject #2
...

注意
这里的NetworkObjectId是2,因为主机也具有一个拥有RpcTest脚本生成的NetworkObject,但它不会发送启动链的初始RPC,因为它是服务器。

使用脚本扩展功能

本节展示如何使用两个脚本扩展Hello World项目的功能:HelloWorldPlayer.cs和HelloWorldManager.cs。

HelloWorldManager.cs脚本

  1. 在Scripts文件夹中创建一个名为HelloWorldManager.cs的新脚本。
  2. 在场景中创建一个新的空对象,命名为HelloWorldManager,并将该脚本作为组件附加到该对象上。
  3. 将以下代码复制到HelloWorldManager.cs脚本中:
using Unity.Netcode;
using UnityEngine;

namespace HelloWorld
{
    public class HelloWorldManager : MonoBehaviour
    {
        void OnGUI()
        {
            GUILayout.BeginArea(new Rect(10, 10, 300, 300));
            if (!NetworkManager.Singleton.IsClient && !NetworkManager.Singleton.IsServer)
            {
                StartButtons();
            }
            else
            {
                StatusLabels();

                SubmitNewPosition();
            }

            GUILayout.EndArea();
        }

        static void StartButtons()
        {
            if (GUILayout.Button("Host")) NetworkManager.Singleton.StartHost();
            if (GUILayout.Button("Client")) NetworkManager.Singleton.StartClient();
            if (GUILayout.Button("Server")) NetworkManager.Singleton.StartServer();
        }

        static void StatusLabels()
        {
            var mode = NetworkManager.Singleton.IsHost ?
                "Host" : NetworkManager.Singleton.IsServer ? "Server" : "Client";

            GUILayout.Label("Transport: " +
                NetworkManager.Singleton.NetworkConfig.NetworkTransport.GetType().Name);
            GUILayout.Label("Mode: " + mode);
        }

        static void SubmitNewPosition()
        {
            if (GUILayout.Button(NetworkManager.Singleton.IsServer ? "Move" : "Request Position Change"))
            {
                if (NetworkManager.Singleton.IsServer && !NetworkManager.Singleton.IsClient )
                {
                    foreach (ulong uid in NetworkManager.Singleton.ConnectedClientsIds)
                        NetworkManager.Singleton.SpawnManager.GetPlayerNetworkObject(uid).GetComponent<HelloWorldPlayer>().Move();
                }
                else
                {
                    var playerObject = NetworkManager.Singleton.SpawnManager.GetLocalPlayerObject();
                    var player = playerObject.GetComponent<HelloWorldPlayer>();
                    player.Move();
                }
            }
        }
    }
}
  1. 继续阅读以了解示例代码的含义:
    在之前的Hello World项目中,通过添加预先创建的NetworkManager组件,你创建了一个NetworkManager。通过检查该组件,你可以在Play模式下启动主机、客户端或服务器。HelloWorldManager.cs脚本在进入Play模式时会创建一个屏幕上的UI按钮菜单,从而稍微简化了这个过程。

持续更新中……

你可能感兴趣的:(Unity,翻译,unity,NGO)