2.サンプルプログラム
以下に、Netcode for GameObjects を使用して、RPC(リモートプロシージャコール)、NetworkVariable、および NetworkObject を組み合わせたサンプルプログラムを示します。
このプログラムでは、ホストがカウントを管理し、クライアントはその値を受け取ることができます。また、クライアントがリモートプロシージャコールでカウントを増加させることも可能です。
サンプルプログラムの概要
NetworkVariable<int> count:ホストによって管理され、すべてのクライアントに同期されるカウンター。IncrementCountServerRpc():クライアントがホストにリクエストして、カウントを増加させるためのRPCメソッド。PrintCountClientRpc():ホストからクライアントへカウント値を表示するためのRPCメソッド。
スクリプトの実装例
CountManager.cs
このスクリプトを NetworkObject を持つゲームオブジェクトにアタッチします。
using UnityEngine;
using Unity.Netcode;
public class CountManager : NetworkBehaviour
{
// NetworkVariableでカウント変数を定義し、全クライアントと同期させる
private NetworkVariable<int> count = new NetworkVariable<int>(0);
void Start()
{
// サーバーまたはホストのみカウントを定期的に増加させる
if (IsServer)
{
InvokeRepeating(nameof(IncreaseCount), 1.0f, 1.0f);
}
}
void Update()
{
// カウントの値を画面に表示(ホストとクライアント両方)
if (IsClient)
{
Debug.Log($"Count Value (Synced): {count.Value}");
}
}
// サーバー側で定期的にカウントを増やす
private void IncreaseCount()
{
if (IsServer)
{
count.Value += 1;
PrintCountClientRpc(count.Value); // クライアントに現在のカウントを送信
}
}
// クライアントから呼び出せるRPCでカウントを増やす
[ServerRpc(RequireOwnership = false)]
public void IncrementCountServerRpc()
{
if (IsServer)
{
count.Value += 1;
PrintCountClientRpc(count.Value); // クライアントに最新のカウントを送信
}
}
// クライアント側でカウント値を表示するためのRPC
[ClientRpc]
private void PrintCountClientRpc(int newCountValue)
{
Debug.Log($"Updated Count Value from Server: {newCountValue}");
}
}