やったこと
前回の道の動的生成ではObjectOwnerの課題がありましたので、それを解決します。
具体的には、あるオブジェクトをピックアップした際に動的生成を行っているオブジェクトのOwnerを変更します。
加えて、十字のモデルを部屋っぽいモデルに変更しました。
blenderとUdonSharpをこねこね。モデル変更とpickupオブジェクトを介して、統括のGameObjectのOwnerを変更するギミックを作成したよ。
— はんちょ (@sadimensions) May 5, 2020
(このワールドは同期変数から新たに部屋を作成しているので、同期変数に書込みできると新たな部屋を作れる。つまり部屋を作れる = Owner)#MadeWithUdon #UdonSharp pic.twitter.com/9r07t79Ws7
#参考文献
黒鳥さんのUdonメモ SetOwner
やり方
//public変数の宣言抜粋
//----Objectオーナー変更機能OnerChange----
//名前空間 OC-----------------------------
public GameObject OC_Cube;//オーナー変更のきっかけとなるキューブ
//----------------------------------------
//Owner変更処理部分抜粋
//----Oner Change機能 の実装----
public void OC_Update()
{
//キューブのオーナーを得る
var cubeOwner = Networking.GetOwner(OC_Cube);
if (Networking.IsOwner(Networking.LocalPlayer, OC_Cube))
{
//キューブのオーナーが自分かつこのスクリプト(道を生成しているスクリプト)の
//オーナーが自分ではない場合
if (Networking.GetOwner(this.gameObject) != cubeOwner)
{
//このスクリプトのオーナーを自分に変更する
Networking.SetOwner(Networking.LocalPlayer, this.gameObject);
}
}
}
この方法でオーナーを変えたいオブジェクト以外を操作(今回は他オブジェクトのオーナーになる)することで、目的のオブジェクトのオーナーを変更することができます。
失敗談
他のオブジェクトのUdonSharpコードから他のオブジェクトのOwnerを変更することはできません。
SetOwnerの関数は第二引数にgameObjectを取ります。
Networking.SetOwner(Networking.LocalPlayer, gameObject);
そのためgameObjectCubeさえ指定ができれば、どこからでもOwnerを変更できると考え
”Cubeの方に”下記のUdonSharpを組みました。
public override void OnPickup() {
//managerはpublic変数でとってきた道の動的生成をするgameObject
Networking.SetOwner(Networking.LocalPlayer, manager);
}
cubeをピックアップした際にcubeが参照しているmanagerというgameObjectのOwnerを自分に設定することを意図しているのですが、これは意図通りに動作しませんでした。
他のオブジェクトから該当オブジェクトのOwnerを変更出来たら、同時にOwnerを主張する他オブジェクトをたくさん作れてしまうので、ちょっと無理のある考え方でした。