Unity が PUN 2 ルームにマルチプレイヤー チャットを追加

このチュートリアルでは、RPC (リモート プロシージャ コール) を使用して PUN 2 にルーム チャットを追加する方法を説明します。

それでは始めましょう!

パート 1: PUN 2 とマルチプレイヤーの例のセットアップ

PUN 2 を使用してマルチプレイヤーの例をセットアップする方法に関するチュートリアルがすでにあります。以下のリンクを確認してください。

PUN 2 を使用して Unity 3D でマルチプレイヤー ゲームを作成する

マルチプレイヤー プロジェクトのセットアップが完了したら、戻ってください。続行できるようになります。

あるいは、ソース プロジェクト を直接ダウンロードすることもできます。

パート 2: マルチプレイヤー チャットの追加

  • という新しいスクリプトを作成し、PUN2_Chat という名前を付けて、その中に以下のコードを貼り付けます。

PUN2_チャット.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;

public class PUN2_Chat : MonoBehaviourPun
{
    bool isChatting = false;
    string chatInput = "";

    [System.Serializable]
    public class ChatMessage
    {
        public string sender = "";
        public string message = "";
        public float timer = 0;
    }

    List<ChatMessage> chatMessages = new List<ChatMessage>();

    // Start is called before the first frame update
    void Start()
    {
        //Initialize Photon View
        if(gameObject.GetComponent<PhotonView>() == null)
        {
            PhotonView photonView = gameObject.AddComponent<PhotonView>();
            photonView.ViewID = 1;
        }
        else
        {
            photonView.ViewID = 1;
        }
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyUp(KeyCode.T) && !isChatting)
        {
            isChatting = true;
            chatInput = "";
        }

        //Hide messages after timer is expired
        for (int i = 0; i < chatMessages.Count; i++)
        {
            if (chatMessages[i].timer > 0)
            {
                chatMessages[i].timer -= Time.deltaTime;
            }
        }
    }

    void OnGUI()
    {
        if (!isChatting)
        {
            GUI.Label(new Rect(5, Screen.height - 25, 200, 25), "Press 'T' to chat");
        }
        else
        {
            if (Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Return)
            {
                isChatting = false;
                if(chatInput.Replace(" ", "") != "")
                {
                    //Send message
                    photonView.RPC("SendChat", RpcTarget.All, PhotonNetwork.LocalPlayer, chatInput);
                }
                chatInput = "";
            }

            GUI.SetNextControlName("ChatField");
            GUI.Label(new Rect(5, Screen.height - 25, 200, 25), "Say:");
            GUIStyle inputStyle = GUI.skin.GetStyle("box");
            inputStyle.alignment = TextAnchor.MiddleLeft;
            chatInput = GUI.TextField(new Rect(10 + 25, Screen.height - 27, 400, 22), chatInput, 60, inputStyle);

            GUI.FocusControl("ChatField");
        }
        
        //Show messages
        for(int i = 0; i < chatMessages.Count; i++)
        {
            if(chatMessages[i].timer > 0 || isChatting)
            {
                GUI.Label(new Rect(5, Screen.height - 50 - 25 * i, 500, 25), chatMessages[i].sender + ": " + chatMessages[i].message);
            }
        } 
    }

    [PunRPC]
    void SendChat(Player sender, string message)
    {
        ChatMessage m = new ChatMessage();
        m.sender = sender.NickName;
        m.message = message;
        m.timer = 15.0f;

        chatMessages.Insert(0, m);
        if(chatMessages.Count > 8)
        {
            chatMessages.RemoveAt(chatMessages.Count - 1);
        }
    }
}

PUN 2 チュートリアルに従った場合は、2 つのシーン "GameLobby" と "GameLevel"

  • "GameLevel" シーンを開き、PUN2_Chat を _RoomController オブジェクトにアタッチして、シーンを保存します。
  • "GameLobby" シーンを開き、新しいルームを作成します。これで、 を押してチャットできるようになります。 "T"

おすすめの記事
PUN 2 を使用して Unity でマルチプレイヤー ゲームを作成する
PUN 2 を使用してマルチプレイヤー車ゲームを作成する
PUN 2 を使用してネットワーク上でリジッドボディを同期する
PUN 2 ラグ補正
Unity でマルチプレイヤー ネットワーク ゲームを構築する
マルチプレイヤーのデータ圧縮とビット操作
Unity オンライン リーダーボードのチュートリアル