LoginSignup
3
1

More than 3 years have passed since last update.

UdonSharp日記~ObjectOwnerの変更~

Posted at

やったこと

前回の道の動的生成ではObjectOwnerの課題がありましたので、それを解決します。
具体的には、あるオブジェクトをピックアップした際に動的生成を行っているオブジェクトのOwnerを変更します。

加えて、十字のモデルを部屋っぽいモデルに変更しました。

#参考文献
黒鳥さんの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);
            }
        }
    }

無題.png

この方法でオーナーを変えたいオブジェクト以外を操作(今回は他オブジェクトのオーナーになる)することで、目的のオブジェクトのオーナーを変更することができます。

失敗談

他のオブジェクトの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を主張する他オブジェクトをたくさん作れてしまうので、ちょっと無理のある考え方でした。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1