オブジェクト所有権の移譲

目次

  概要
  事前設定
  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種類によって設定されます。
設定値 反映内容
Fixed インスタンスの生成から破棄までの間、所有者は生成時の状態を保ちます。
これがデフォルトの設定であり、この状態では「所有権の移譲」は出来ません。
TakeOver 所有権を取得したい側が RequestOwnership メソッド を実行することによって、自由に所有権を取得することができます。
Request 所有権を取得したい側が RequestOwnership メソッド を実行し、
所有権を移譲する側が OnOwnershipRequest コールバックメソッド 内で TransferOwnership メソッド
実行することによって、所有権を取得することができます。


MonobitEngine.MonobitView.RequestOwnership メソッド

機能

  オブジェクトの所有権に対し、所有権の移譲をリクエストします。

引数

変数名 内容
- - -

戻り値

内容
void -

付記

  該当する 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 所有権の移譲先となる、相手プレイヤーを指定します。

戻り値

内容
void -

記述例

/*
 * ボタン入力によって、所有権を強制的にホストに移譲します。
*/
class Foo : MonobitEngine.MonoBehaviour
{
    ...
    
    void OnGUI()
    {
        ...
        
        if( GUILayout.Button( "所有権をホストに" ) )
        {
            monobitView.TransferOwnership( MonobitEngine.MonobitNetwork.host );
        }
        
        ...
    }
    
    ...
}


MonobitEngine.MonobitView.TransferOwnership メソッド (2)

機能

  オブジェクトの所有権を、指定したプレイヤーに移譲します。
  基本的に単独で呼ばれるケースは少なく、OnOwnershipRequest コールバックとセットで利用されます。

引数

変数名 内容
int newOwnerId 所有権の移譲先となる、相手プレイヤーIDを指定します。

戻り値

内容
void -

記述例

/*
 * ボタン入力によって、所有権を強制的に自分自身のものにします。
 */
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 );
    }
}