ボイスチャットプログラムを作成する

目次

  概要
  追加したスクリプトの編集
  MUNサーバに接続する
  ルームを作成、あるいはルームに入室する
  ルーム内でボイスチャット用オブジェクトを動的生成する
  ここまでのVoiceChatScriptの内容
  プログラムを保存する


概要

ボイスチャットを利用するための「サーバ接続後にルームに入室し、ボイスチャットを開始する」プログラムを作成する

  先に作成した VoiceChatScript.cs に対し、「サーバ接続→ルーム入室→ボイスチャット開始」を促すためのプログラムを作成します。


追加したスクリプトの編集

using ディレクティブを登録する

  開いた VoiceChatScript.cs の 4 行目付近(using 〇〇〇〇; が羅列している直後)に、以下の一文を追加してください。
using MonobitEngine;
  スクリプト上で MUN 用のコードを自由に記述できるよう、 MonobitEngine の using ディレクティブを入れておきます。

MonobitEngine.MonoBehaviour を継承する

  続けて、VoiceChatScript.cs の 6 行目付近にある、「MonoBehaviour」と記述されている箇所について、
  「MonobitEngine.MonoBehaviour」に変更しましょう。
public class VoiceChatScript : MonobitEngine.MonoBehaviour {
  MonobitEngine.MonoBehaviour は UnityEngine.MonoBehaviour を継承していますので、
  本来の UnityEngine.MonoBehaviour と同じ感覚で使用することができます。
  加えて、MUNが提供する様々な機能を使用することもできます。


MUNサーバに接続する

MonobitNetwork.ConnectServer() メソッドで、MUNサーバに接続する

  まずVoiceChatScript の 9 行目付近に記載されている Start() メソッドに、以下の処理を記述します。
    void Start () {
        // MUNサーバに接続する
        MonobitNetwork.autoJoinLobby = true;
        MonobitNetwork.ConnectServer("VoiceChatTest_v1.0");
    }

  事前に MonobitNetwork.autoJoinLobby プロパティ に true を設定し、MUNサーバ上に用意されたデフォルトロビーへの入室を許可します。
  設定後、MonobitNetwork.ConnectServer() メソッドを使って、MUNサーバに接続します。
  接続要求を受けたサーバ側では「VoiceChatTest_v1.0」のアプリケーションとして認証させ、接続完了後デフォルトロビーに誘導します。


ルームを作成、あるいはルームに入室する

MonobitNetwork.JoinOrCreateRoom() メソッドを使い、
ロビー入室後にルームが未作成であれば作成し入室、作成済みであればそのルームに入室する

  続けて、VoiceChatScript.cs の 21 行目付近に、以下に記載している OnJoinedLobby() メソッドを追記します。
    // ロビーに入室した直後のコールバックメソッド
    public void OnJoinedLobby()
    {
        // もし「VoiceChatTest」と同名のルームが未作成なら、そのルーム作成して入室する
        // もし「VoiceChatTest」と同名のルームが作成済みなら、そのルームに入室する
        MonobitNetwork.JoinOrCreateRoom("VoiceChatTest", new RoomSettings(), null);
    }
  OnJoinedLobby() メソッド は、ロビーに入室した際に自動的にクライアント側で呼び出されるコールバックメソッドです。
  先の Start() メソッド内に記述した内容により、サーバ接続後、MUNサーバ側でデフォルトロビーに入室させますので、
  一連の接続処理が完了したあとでこのメソッドが呼び出されます。

  さらにこのメソッド内で MonobitNetwork.JoinOrCreateRoom() メソッド を呼び出すことで、ルームの作成or入室を行ないます。

  クライアント側で実行された際に、サーバ側に「VoiceChatTest」という名称のルームが作成されていない場合には作成して入室し、
  作成されていた場合にはそのまま入室します。
  この処置により、結果的にどのタイミングでクライアントが接続しても、最終的には1つのルーム内に複数のクライアントが接続します。


ルーム内でボイスチャット用オブジェクトを動的生成する

ルームに入室している場合、MonobitNetwork.Instantiate() メソッドで
プレハブから「ボイスチャット用オブジェクト」を動的に生成する

  あとは、ルームに入室したときに、ボイスチャット用のオブジェクトを動的に生成して「ルーム内でのボイスチャット」を可能にします。

  MUN の仕組みを使って「ルーム内でデータ同期するオブジェクトの動的生成」 には MonobitNetwork.Instantiate() メソッドを使って
  プレハブからオブジェクトを生成しなければなりません。

  そのための手順として、まず、VoiceChatScript.cs の 8 行目付近に、以下のパラメータを記述します。
    // プレハブ化した「ボイスチャット用オブジェクト」のデータ
    private GameObject chatObj = null;
  GameObject 型の chatObj を用意し、その初期値を null にします。
  先に言及すると、ボイスチャット用オブジェクトについて「ルーム入室中の最初の1回だけ」生成すれば一応シンプルな同期制御は可能になりますので、
  ここではその処理について2重実行されるのを避けるために、この変数を用意します。

  上記変数を使って、Update() メソッド内にて「ルーム入室中の最初の1回だけ」オブジェクトの動的生成を行ないます。
  続けてVoiceChatScript.cs の 22 行目付近に、以下の処理を記述します。
        // ルーム入室済みでボイスチャット用オブジェクトが未生成であれば、オブジェクトの動的生成を実行する
        if (MonobitNetwork.inRoom && chatObj == null)
        {
            chatObj = MonobitNetwork.Instantiate("Sphere", Vector3.zero, Quaternion.identity, 0);
            return;
        }
  MonobitNetwork.inRoom プロパティ が true、すなわちルーム入室済みであり、かつ chatObj が null の場合、
  MonobitNetwork.Instantiate() メソッドを使って、ボイスチャット用オブジェクト「Sphere」の動的生成を実行します。

  Unityの標準APIにある UnityEngine.Instantiate() メソッドと同様、このメソッドは実行結果として GameObject 型の情報を返すため、
  それを chatObj に代入して null 以外の値にすることで、オブジェクトの動的生成処理の「2重実行の防止」をします。


ここまでのVoiceChatScriptの内容


  ここまでの VoiceChatScript.cs の内容は以下の通りです。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using MonobitEngine;

public class VoiceChatScript : MonobitEngine.MonoBehaviour
{
    // プレハブ化した「ボイスチャット用オブジェクト」のデータ
    private GameObject chatObj = null;
    
    // Start is called before the first frame update
    void Start()
    {
        // MUNサーバに接続する
        MonobitNetwork.autoJoinLobby = true;
        MonobitNetwork.ConnectServer("VoiceChatTest_v1.0");
    }

    // Update is called once per frame
    void Update()
    {
        // ルーム入室済みでボイスチャット用オブジェクトが未生成であれば、オブジェクトの動的生成を実行する
        if (MonobitNetwork.inRoom && chatObj == null)
        {
            chatObj = MonobitNetwork.Instantiate("Sphere", Vector3.zero, Quaternion.identity, 0);
            return;
        }
    }

    // ロビーに入室した直後のコールバックメソッド
    public void OnJoinedLobby()
    {
        // もし「VoiceChatTest」と同名のルームが未作成なら、そのルーム作成して入室する
        // もし「VoiceChatTest」と同名のルームが作成済みなら、そのルームに入室する
        MonobitNetwork.JoinOrCreateRoom("VoiceChatTest", new RoomSettings(), null);
    }
}


プログラムを保存する

VoiceChatScript.cs を保存する

  作成した VoiceChatScript.cs を保存しましょう。
  VisualStudio(またはMonoDevelop)のメニューから VoiceChatScript.cs を保存するか、
  もしくは CTRL キー + S キーの同時押しで保存してください。