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で同期できているようです。



コメント