Netcode for GameObjectsとは?
multiplayer networking. ネットワーク対戦ゲームを作ることができます!
LAN内のローカル対戦 と Unity Relayを利用したインターネット対戦ができるようです。
早速チュートリアルを見てみます。
Hello World チュートリアル
unity HUB で 3D プロジェクトをNetcode Helloという名前で作りました。
![](https://grtlab.com/wp-content/uploads//2022/01/ss-2022-01-30-0.57.13-1024x601.png)
Install Netcode for GameObjects
2020.3.x では
Window > Package Manager.
+ Add package from git URL…を選択
com.unity.netcode.gameobjectsを入力して Add
![](https://grtlab.com/wp-content/uploads//2022/01/ss-2022-01-30-1.09.30.png)
1.0.0-pre.5が入りました。
![](https://grtlab.com/wp-content/uploads//2022/01/ss-2022-01-30-1.12.38-1024x522.png)
プロジェクトに Preview Packages in Use と表示されています。
NetworkManagerを設置
プロジェクト画面に戻って
Create Empty して 名前を NetworkManager に
Add componentで NetworkManagerを追加
![](https://grtlab.com/wp-content/uploads//2022/01/ss-2022-01-30-1.16.50-525x1024.png)
Network Transportに UNetTransportを選択
![](https://grtlab.com/wp-content/uploads//2022/01/ss-2022-01-30-1.19.38.png)
Player Prefabを作成
3D Capsule を作成して Player と名づけて Assets/Prefabs に移動
Add componentで NetworkObjectを追加
![](https://grtlab.com/wp-content/uploads//2022/01/ss-2022-01-30-1.25.16-1024x924.png)
Network Manager の NetworkPrefabsに Playerを設置
Player Prefab と NetworkPrefabsの両方に設置されている状態
![](https://grtlab.com/wp-content/uploads//2022/01/ss-2022-01-30-1.35.17-1024x520.png)
3D Object > Planeを追加してシーンを保存
実行
Playで実行します。
NetworkManagerを選択して
![](https://grtlab.com/wp-content/uploads//2022/01/ss-2022-01-30-1.33.19.png)
Start Hostをクリックすると
![](https://grtlab.com/wp-content/uploads//2022/01/ss-2022-01-30-1.33.27-1024x232.png)
![](https://grtlab.com/wp-content/uploads//2022/01/ss-2022-01-30-1.38.13-1024x627.png)
Player(Clone)が生成されました。
HOSTが立ち上がりPlayer prefabができたということでしょうか
Building on Hello World
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サイズを設定
![](https://grtlab.com/wp-content/uploads//2022/01/ss-2022-01-30-2.22.42-1024x304.png)
Buildして実行してみる
プロジェクト側のGameを [HOST]
BuildしたPlayer側を [Client] を選択すると Player オブジェクトが二つ出ます。
![](https://grtlab.com/wp-content/uploads//2022/01/ss-2022-01-30-2.26.29-1024x541.png)
macで複数実行するには
open -n hello.app
で新規起動すると
![](https://grtlab.com/wp-content/uploads//2022/01/ss-2022-01-30-2.35.54-1024x444.png)
とりあえず HOSTとCLIENTで同期できているようです。
コメント