オブジェクト所有権の移譲
目次
概要
事前設定
MonobitEngine.MonobitView.RequestOwnership メソッド
MonobitEngine.MonobitView.TransferOwnership メソッド (1)
MonobitEngine.MonobitView.TransferOwnership メソッド (2)
接続コールバック:OnOwnershipRequest メソッド
インスタンス生成されたオブジェクトの所有者が、常に一定とは限らない!
前節で「オブジェクトの所有権」について説明しました。
原則的にオブジェクトの所有権はそのオブジェクト生成メソッドを実行したときに決定されますが、
それが常に変わらない、ということはありません。
オブジェクトの所有権を「移譲」されるケースを作る
分かりやすい例として、サッカーのゲームを作るとしましょう。サッカーですから、当然「サッカーボール」が必要です。
ボールのパスを受けたり、スライディングで奪ったり。あらゆる状況下で、そのボールを操作するプレイヤーが変わります。
この場合サッカーボールを操作するのは、「ボールを蹴っているプレイヤー」なわけですから、
その操作の権限=所有権を、ボールを持っているクライアント側で管理した方が作りやすくなります。
こういったケースの場合、どうしても「所有者を変更する」という制御が必要です。
MUN では所有権移譲方式として3種類用意しています。
所有権移譲方式 |
反映内容 |
Fixed |
インスタンスの生成から破棄までの間、所有者は生成時の状態を保ちます(デフォルト設定) |
TakeOver |
所有権を取得したい側がリクエストを実行するだけで、自由に所有権を移譲することができます。 |
Request |
所有権を取得したい側がリクエストを実行し、かつ所有者側がリクエストの可否判定をすることで、
所有権を移譲することができます。 |
デフォルトの設定は Fixed であり、大抵の場合これだけで成立します。
上記で例えた「サッカーボール」は、TakeOver がそれに相当するでしょう。
Request はゲーム内アイテムの交換など、ある程度通信制御外(データベースなど)と連動するオブジェクトに対して適用する形になるでしょう。
事前設定▲
MonobitViewコンポーネントの「Ownership Transfer」の項目設定が必要です
あらかじめ、「オブジェクトの所有者が変わる可能性がある」オブジェクトに登録している、
MonobitView コンポーネントの「Ownership Transfer」について設定する必要があります。
この項目は、以下の3種類によって設定されます。
MonobitEngine.MonobitView.RequestOwnership メソッド▲
機能
オブジェクトの所有権に対し、所有権の移譲をリクエストします。
引数
戻り値
付記
該当する MonobitView の Ownership Transfer の設定値によって、このメソッドの結果が異なります。
設定値 |
反映内容 |
Fixed |
所有権移譲リクエストを無視します。 |
TakeOver |
所有権が移譲され、呼び出し側が所有権を持ちます。 |
Request |
所有権の移譲リクエストを受けた側の OnOwnershipRequest コールバックを呼び出します。 |
記述例
/*
* ボタン入力によって、所有権の移譲をリクエストします。
* (MonobitView コンポーネントの「Ownership Transfer」の設定値によって、結果が異なります。)
*/
class Foo : MonobitEngine.MonoBehaviour
{
...
void OnGUI()
{
...
if( GUILayout.Button( "所有権のリクエスト" ) )
{
monobitView.RequestOwnership();
}
...
}
...
}
MonobitEngine.MonobitView.TransferOwnership メソッド (1)▲
機能
オブジェクトの所有権を、指定したプレイヤーに移譲します。
基本的に単独で呼ばれるケースは少なく、OnOwnershipRequest コールバックとセットで利用されます。
引数
型 |
変数名 |
内容 |
MonobitEngine.MonoBehaviour |
newOwner |
所有権の移譲先となる、相手プレイヤーを指定します。 |
戻り値
記述例
/*
* ボタン入力によって、所有権を強制的にホストに移譲します。
*/
class Foo : MonobitEngine.MonoBehaviour
{
...
void OnGUI()
{
...
if( GUILayout.Button( "所有権をホストに" ) )
{
monobitView.TransferOwnership( MonobitEngine.MonobitNetwork.host );
}
...
}
...
}
MonobitEngine.MonobitView.TransferOwnership メソッド (2)▲
機能
オブジェクトの所有権を、指定したプレイヤーに移譲します。
基本的に単独で呼ばれるケースは少なく、OnOwnershipRequest コールバックとセットで利用されます。
引数
型 |
変数名 |
内容 |
int |
newOwnerId |
所有権の移譲先となる、相手プレイヤーIDを指定します。 |
戻り値
記述例
/*
* ボタン入力によって、所有権を強制的に自分自身のものにします。
*/
class Foo : MonobitEngine.MonoBehaviour
{
...
void OnGUI()
{
...
if( GUILayout.Button( "所有権を自分自身に" ) )
{
monobitView.TransferOwnership( MonobitEngine.MonobitNetwork.player.ID );
}
...
}
...
}
接続コールバック:OnOwnershipRequest メソッド▲
MonobitEngine.MonobitView.RequestOwnership により実行されるコールバック
このメソッドの実行結果に応じて、以下の接続コールバックが呼び出されます。
(接続コールバックについては こちら を参照してください。)
OnOwnershipRequest メソッド |
自身、もしくはルーム内の誰かが、MonobitEngine.MonobitNetwork.Instantiate() を使ってプレハブをインスタンス化したときにコールされます。
インスタンス化対象となるプレハブにアタッチされているスクリプトでのみコールされますので、ご注意ください。 |
ここでは上述の MonobitView.RequestOwnership メソッド が実行された場合の権限の委譲方法について記述します。
/*
* リクエストしてきた相手がホストだったら、所有権を移譲する
*/
void OnOwnershipRequest( object[] viewAndPlayer )
{
MonobitView view = viewAndPlayer[0] as MonobitView;
MonobitPlayer player = viewAndPlayer[1] as MonobitPlayer;
if( player.isHost )
{
view.TransferOwnership( player );
}
}