プレイヤーカスタムパラメータ

目次

  概要
  注意事項
  事前設定
  MonobitEngine.MonobitNetwork.SetPlayerCustomParameters メソッド
  接続コールバック
  他クライアントのプレイヤーカスタムパラメータを取得するためには?


概要

プレイヤー(クライアント)のデータとして、ルーム内の他プレイヤー(クライアント)と共有させたい任意の情報群の設定

  プレイヤーカスタムパラメータは、プレイヤーの標準パラメータとは別に、プレイヤー(クライアント)の情報として、
  ルーム内のプレイヤー間で共有させたい、任意に設定可能な情報群です。

  考えられる要素としては、例えばプレイヤーの体力値などのゲーム固有のステータス情報や、クライアント個人のプロフィールに相当する情報などを指定し、
  ルーム内の他プレイヤーと情報共有させることができます。


注意事項

1クライアントに対して設定可能な、プレイヤーカスタムパラメータの最大数は 10 です。

  それ以上のプレイヤーカスタムパラメータを登録しようとすると、Unityクライアント上で以下のエラーを出力します。
Player parameters max over: 11/10

特定の1クライアント側で設定した後、全てのルーム内クライアントに情報が共有されるまで待つ必要があります

  プレイヤーカスタムパラメータは性質上、すべてのルーム内クライアントに情報が共有されるまで時間が掛かり、
  情報取得のためにはその時間経過を待つ必要があります。
  共有された情報の取得方法には十分留意してください。

  詳細については他クライアントのプレイヤーカスタムパラメータを取得するためには?をご覧ください。

プレイヤーカスタムパラメータのkey, valueは、特定のデータ型のみ指定可能です。

  プレイヤーカスタムパラメータはルームカスタムパラメータと同様に Hashtable のデータ型で設定することができますが、
  このとき、key および value として設定できるデータ型は、以下のものに限定されます。
・bool(Boolean)
・byte(Byte)
・char(SByte)
・short(Int16)
・unsingned short(UInt16)
・int(Int32)
・unsigned int(UInt32)
・long(Int64)
・unsigned long(UInt64)
・float(Single)
・double(Double)
・string(String)
・UnityEngine.Vector2
・UnityEngine.Vector3
・UnityEngine.Vector4
・UnityEngine.Quaternion
・MonobitEngine.MonobitPlayer
・上記一覧に対する配列型
  上述のデータ型以外をプレイヤーカスタムパラメータを設定しようとした場合エラーを返しますので、くれぐれもご注意ください。


事前設定

プレイヤーカスタムパラメータを「設定」するタイミングは、どのタイミングでも構いません。

  プレイヤーカスタムパラメータについては、任意のタイミングで設定することができます。

他プレイヤーと情報共有するためには、ルームに入室している必要があります。

  ただし、プレイヤーカスタムパラメータを他のプレイヤーと共有するためには、同一のルームに入室している必要があります。
  ルーム未入室の状態(例えば接続しただけ、ロビーに入室しているだけの状態)では、プレイヤーカスタムパラメータを他クライアントと共有させることが出来ません。

  情報共有手段として利用する際には、「ルームに入室している状態かどうか」に注意してください。


MonobitEngine.MonobitNetwork.SetPlayerCustomParameters メソッド

機能

  自身のプレイヤーカスタムパラメータについて変更を加えます。

  このメソッド自体の呼び出しは、MUNサーバへの接続状態やロビー/ルーム入室の是非を問わず、いつでも設定可能です。
  ただし、このメソッドで設定した情報は、自身がルームに入室していて、かつ、同一ルーム内にいるプレイヤー(クライアント)に対してのみ共有可能です。

引数

変数名 内容
Hashtable playerParameters 更新・設定・同期するプレイヤーカスタムパラメータのハッシュテーブルを設定します。

戻り値

内容
void -

記述例

// 自身のプレイヤーカスタムパラメータとして、「HitPoint」(体力)を、値「100」として設定します。
Hashtable customParams = new Hashtable();
customParams["HitPoint"] = 100;
MonobitEngine.MonobitNetwork.SetPlayerCustomParameters( customParams );


接続コールバック

プレイヤーのカスタムパラメータの変更を受信した際にコールバックされるメソッド

  ルーム内の1クライアントのパラメータが変更されたとき、OnMonobitPlayerParametersChanged コールバックメソッド が呼び出されます。

引数

変数名 内容
object[] playerAndUpdatedParams playerAndUpdatedProps[0] では、プレイヤーパラメータが変更されたプレイヤー情報について、
以下のパラメータで構成される MonobitEngine.MonobitPlayer クラスで取得します。
変数名 内容
int ID ルーム内にてユニークで定義される、プレイヤーの識別ID。
string Name プレイヤー名。
bool isHost このプレイヤーがルームホストであるかどうかの識別フラグ。
Hashtable customParameters プレイヤーに設定された任意のカスタムパラメータ。
Hashtable allParameters 上記4つのデータを統合した、プレイヤーに関する全情報。

playerAndUpdatedProps[1] では、変更されたプレイヤーパラメータ情報が Hashtable で取得します。

記述例

// プレイヤーのプロパティが変更されたときに、デバッグログを出力します。
public void OnMonobitPlayerParametersChanged(object[] playerAndUpdatedParams)
{
    Debug.Log("OnMonobitPlayerParametersChanged");
}




他クライアントのプレイヤーカスタムパラメータを取得するためには?

クライアントが設定した数値の変更を知るためには、接続コールバックから取得する

  プレイヤーカスタムパラメータは、同一ルームに所属しているクライアントに対してのみ取得することができますが、
  ルーム内の全クライアントに情報が行き渡るまでには若干のタイムラグが発生します。

  よって、特定のルーム内クライアントが設定した数値の変更を確実に知るためには、
  上述で示した OnMonobitPlayerParametersChanged() メソッド を用いるのが効果的です。

  例えば上記で触れた「HitPoint」が減少したときに何かしらのアクションを起こしたい場合、
  以下のように実装すれば、ルーム内のプレイヤーのダメージを受けた時の情報を取得することができます。
// HitPointが変更されたときに、デバッグログを出力します。
public void OnMonobitPlayerParametersChanged(object[] playerAndUpdatedParam)
{
    MonobitEngine.MonobitPlayer target = playerAndUpdatedParam[0] as MonobitEngine.MonobitPlayer;
    Hashtable targetParam = playerAndUpdatedParam[1] as Hashtable;
    Debug.Log("Player " + target.ID + " にダメージ。HiPoint が " + targetParam["HitPoint"] + " まで減少。");
}

継続したプレイヤーのカスタムパラメータ情報を受け取る場合、playerList プロパティから取得する

  上記以外でも、ルーム内で継続して維持されるデータについては
  MonobitEngine.MonobitNetwork.playerList プロパティ を利用することでも取得することが可能です。

  ただし、こちらの方法で取得する場合、設定された値の反映がいつ行われるかまでは判断がつきません。
  リアルタイムな情報の取得には不向きです。
  プレイヤーカスタムパラメータの一要素から「処理分岐が発生する」などのケースにおいては、
  OnMonobitPlayerParametesChanged() メソッドを使う方が良いでしょう。

  例えば上記で触れた「HitPoint」について、以下のように実装すれば、
  ルーム内の全プレイヤーの「HitPoint」の情報を常に表示させることができます。
// 同一ルーム内に所属している全プレイヤーの HitPoint を表示します。
if( MonobitEngine.MonobitNetwork,isRoom )
{
    foreach( MonobitEngine.MonobitPlayer player in MonobitEngine.MonobitNetwork.playerList )
    {
        Debug.Log( "PlayerName : " + player.name + ", HitPoint : " + player.customParameters["HitPoint"] );
    }
}