Unity Netcode for GameObjects を使ってみる!

Unity

Netcode for GameObjectsとは?

Unity Multiplayer Networking | Unity Multiplayer Networking
This site provides Unity Multiplayer documentation, references, and sample code tutorials.

multiplayer networking. ネットワーク対戦ゲームを作ることができます!

LAN内のローカル対戦 と Unity Relayを利用したインターネット対戦ができるようです。

早速チュートリアルを見てみます。

Hello World チュートリアル

Page Not Found | Unity Multiplayer Networking

unity HUB で 3D プロジェクトをNetcode Helloという名前で作りました。

Install Netcode for GameObjects

Page Not Found | Unity Multiplayer Networking

2020.3.x では

Window > Package Manager.

+ Add package from git URL…を選択

com.unity.netcode.gameobjectsを入力して Add

1.0.0-pre.5が入りました。

プロジェクトに Preview Packages in Use と表示されています。

NetworkManagerを設置

プロジェクト画面に戻って
Create Empty して 名前を NetworkManager に

Add componentで NetworkManagerを追加

Network TransportUNetTransportを選択

Player Prefabを作成

3D Capsule を作成して Player と名づけて Assets/Prefabs に移動

Add componentで NetworkObjectを追加

Network Manager の NetworkPrefabsに Playerを設置

Player Prefab と NetworkPrefabsの両方に設置されている状態

3D Object > Planeを追加してシーンを保存

実行

Playで実行します。

NetworkManagerを選択して

Start Hostをクリックすると

Player(Clone)が生成されました。

HOSTが立ち上がりPlayer prefabができたということでしょうか

Building on Hello World

Page Not Found | Unity Multiplayer Networking

Hello Worldスクリプト追加

Assets > Scripts に HelloWorldPlayer.cs を追加

using UnityEngine;
using Unity.Netcode;

namespace HelloWorld
{
    public class HelloWorldPlayer : NetworkBehaviour
    {
        public NetworkVariable<Vector3> Position = new NetworkVariable<Vector3>();

        public override void OnNetworkSpawn()
        {
            if (IsOwner)
            {
                Move();
            }
        }

        public void Move()
        {
            if (NetworkManager.Singleton.IsServer)
            {
                var randomPosition = GetRandomPositionOnPlane();
                transform.position = randomPosition;
                Position.Value = randomPosition;
            }
            else
            {
                SubmitPositionRequestServerRpc();
            }
        }

        [ServerRpc]
        void SubmitPositionRequestServerRpc(ServerRpcParams rpcParams = default)
        {
            Position.Value = GetRandomPositionOnPlane();
        }

        static Vector3 GetRandomPositionOnPlane()
        {
            return new Vector3(Random.Range(-3f, 3f), 1f, Random.Range(-3f, 3f));
        }

        void Update()
        {
            transform.position = Position.Value;
        }
    }
}

サンプル通り

HelloWorldManager.csを追加

Create Emptyで HelloWorldManagerオブジェクトを作成して 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();
                }
            }
        }
    }
}

Player objectに基本動作を追加

Player prefabに HelloWorldPlayer.csを追加

コードの説明はサイトを

テスト実行

Player Settingでwindowサイズを設定

Buildして実行してみる

プロジェクト側のGameを [HOST]
BuildしたPlayer側を [Client] を選択すると Player オブジェクトが二つ出ます。

macで複数実行するには

open -n hello.app

で新規起動すると

とりあえず HOSTとCLIENTで同期できているようです。

お気軽にコメントください!

スパム対応のためコメント認証に数日かかることがありますが、お気軽にコメントいただけると嬉しいです^^

コメント

タイトルとURLをコピーしました