Netcode for GameObjectsとは?
multiplayer networking. ネットワーク対戦ゲームを作ることができます!
LAN内のローカル対戦 と Unity Relayを利用したインターネット対戦ができるようです。
早速チュートリアルを見てみます。
Hello World チュートリアル
unity HUB で 3D プロジェクトをNetcode Helloという名前で作りました。
Install Netcode for GameObjects
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 Transportに UNetTransportを選択
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
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で同期できているようです。
コメント