オブジェクト所有権の移譲
目次
概要
事前設定
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 メソッド▲
機能
オブジェクトの所有権に対し、所有権の移譲をリクエストします。
引数
戻り値
付記
該当する 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 メソッド▲
MonobitView.RequestOwnership により実行されるコールバック
このコールバックは、MonobitView.RequestOwnership の呼び出しにより、該当するオブジェクトにて実行されるという、
MUNが用意しているコールバックの中でも独特の動きを行ないます。
コールバックによる許諾手続きについては、この項目の記述例を参考にしてください。
引数
型 |
変数名 |
内容 |
object[] |
viewAndPlayer |
viewAndPlayer[0] が、所有権の移譲を求めている MonobitView オブジェクト。 viewAndPlayer[1] が、リクエストをしている MonobitPlayer 情報。 |
戻り値
記述例
/*
* リクエストしてきた相手がホストだったら、所有権を移譲する
*/
void OnOwnershipRequest( object[] viewAndPlayer )
{
MonobitView view = viewAndPlayer[0] as MonobitView;
MonobitPlayer player = viewAndPlayer[1] as MonobitPlayer;
if( player.isHost )
{
view.TransferOwnership( player );
}
}