▲前のページへ
次のページへ▼

キャラクタ同期(3) キャラクタ消去処理


【目次】
概要
途中退室した非プレイヤーキャラクタを削除する
バトル終了後に全キャラクタを削除する


概要

■ オンラインゲームの常 : 非プレイヤーキャラクタの適宜消去
  ここまでの実装で「参加したキャラクタをリアルタイムに出現させる」という処理は組み込みましたが、
  同時に「参加しているキャラクタをリアルタイムに削除する」という処理を組み込まなければいけません。

  例えば、途中で回線が切断したり、故意にアプリケーションを閉じたりした場合、
  そのユーザーのキャラクタを画面から消したほうが「プレイヤーがログアウトした」ということを
  明示的に示すことができます。

  ここではそういった場合にキャラクタを削除するための手法について触れてみます。


途中退室した非プレイヤーキャラクタを削除する

■ 途中退室したかどうかを検知する。
  プレイヤーが途中退室したかどうかを検知する方法は様々ありますが、
  最も簡易的で確実なのが、「非プレイヤーキャラクタの位置情報を最後に受信してからどのくらい時間経過したか」を調べる方法です。

  Unity の Project ビューにある Assets/Project/Scripts/sample フォルダを開き、SD_Unitychan_NPC.cs の 11行目に
  以下の変数を宣言しておきましょう。
    private UInt64 receiveTime = 0;     // キャラクタの移動受信時間
  

  同じく SD_Unitychan_NPC.cs の 30 行目に以下の項目を設け、「5秒以上通信が途絶えたら、その非プレイヤーキャラクタを消去する」
  という処理を組み込みます。
        // 5秒以上通信が途絶えていたら、キャラクタを削除する
        if (mln.Utility.GetSecond() - this.receiveTime >= 5)
        {
            Destroy(ClientScene.g_CharaList[charaId]);
            ClientScene.g_CharaList[charaId] = null;
        }
  

  この receiveTime は受信ごとに値を更新する必要がありますので、アクセッサメソッドを用意します。
  同じく SD_Unitychan_NPC.cs の 59 行目に以下の内容を記述してください。
    public void SetReceiveTime(UInt64 receiveTime)
    {
        this.receiveTime = receiveTime;
    }
  

  最後にこの SetReceiveTime を、非プレイヤーキャラクタの位置情報更新時に、そのときの時間を設定て管理します。
  Unity の Project ビューにある Assets/Project/Scripts/pu フォルダを開き、GameRpcClientPU.cs の 215行目に
  以下の項目を追加します。
            // 受信時間の代入
            script.SetReceiveTime(mln.Utility.GetSecond());
  


バトル終了後に全キャラクタを削除する

■ バトルが終了したら、すべてのキャラクタを削除しデフォルト状態に戻す。
  この辺りはゲームデザインによって異なりますが。
  今回のサンプルでは「基礎編:サンプル概要」でも触れている通り、バトル終了後にバトルルームから退出して、
  マッチングルーム入室前の状態に戻しています。

  今回のサンプルから「勝手に」増やしているプレイヤー/非プレイヤーキャラクタはバトル終了後に消去し、
  全体的なリセットを掛けるようにしましょう。

  Unity の Projectビューにある Assets/Projects/Scripts/sample/core フォルダを開き、
  Client.cs の 515行目(先にSend_BattlePlayerInfoメソッドを追加した後の行)付近に以下のコードを追加しましょう。
    public void DestroyAllChara()
    {
        lock (ClientScene.g_mutex)
        {
            // キャラクタ情報をすべて消す
            foreach (UInt64 keys in ClientScene.g_CharaList.Keys)
            {
                MonoBehaviour.Destroy(ClientScene.g_CharaList[keys]);
            }
            ClientScene.g_CharaList.Clear();
        }
    }


  これをバトル終了時に呼び出します。
  Client.cs の 445行目付近(に以下のコードを追加してください。
                DestroyAllChara();
  


▲前のページへ
次のページへ▼