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

目次

  概要
  事前設定
  MonobitEngine.MonobitView.RequestOwnership メソッド
  MonobitEngine.MonobitView.TransferOwnership メソッド (1)
  MonobitEngine.MonobitView.TransferOwnership メソッド (2)
  接続コールバック:OnOwnershipRequest メソッド


概要

インスタンス生成されたオブジェクトの所有者が、常に一定とは限らない!

  前節で「オブジェクトの所有権」について説明しました。
  原則的に、ネットワーク越しに作成されたオブジェクトのうち、シーンオブジェクトの所有者はホストで、
  それ以外のオブジェクトの所有者は作成者です。

  しかし、それが常に変わらない、ということはありません。

  分かりやすい例として、サッカーゲームを作るとしましょう。
  さて、「サッカーボール」は誰に所有権(操作する権利)があるでしょうか?

オブジェクトの所有権を「移譲」されるケースを作る

  上記の答えですが、サッカーボールを操作するのは、「そのボールを蹴っているプレイヤー」ですね。
  ボールのパスを受けたり、スライディングで奪ったり。
  あらゆる状況下で、そのボールを操作するプレイヤーが変わります。

  こういったケースの場合、どうしても「所有者を変更する」という制御が必要です。
  ここではその処理について触れておきましょう。


事前設定

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 メソッド

MonobitView.RequestOwnership により実行されるコールバック

  このコールバックは、MonobitView.RequestOwnership の呼び出しにより、該当するオブジェクトにて実行されるという、
  MUNが用意しているコールバックの中でも独特の動きを行ないます。

  コールバックによる許諾手続きについては、この項目の記述例を参考にしてください。

引数

変数名 内容
object[] viewAndPlayer viewAndPlayer[0] が、所有権の移譲を求めている MonobitView オブジェクト。
viewAndPlayer[1] が、リクエストをしている MonobitPlayer 情報。

戻り値

内容
void -

記述例

/*
 * リクエストしてきた相手がホストだったら、所有権を移譲する
 */
void OnOwnershipRequest( object[] viewAndPlayer )
{
    MonobitView view = viewAndPlayer[0] as MonobitView;
    MonobitPlayer player = viewAndPlayer[1] as MonobitPlayer;

    if( player.isHost )
    {
        view.TransferOwnership( player );
    }
}