UdonSharpでオブジェクトをスポーンする
スイッチを押すと、指定したオブジェクトがスポーンして、さらにいい感じに他のプレイヤーと同期されてほしい。
スポーンする
ただし、スポーンしたオブジェクトは他プレイヤーと同期されない
Udon v1.0 から VRCInstanize は非推奨?(公式ドキュメント上のその旨の記述は見つけれていない)
Instantiate が使えるようになっているのでそれを使う
結局これでスポーンしたオブジェクトは他のプレイヤーと同期されない
最初から用意して非表示にしておき、ボタンを押すごとに表示していく
VRCObjectPool
今の VRChat がサポートしている Unity には ObjectPool が入っていない
なので代わりにコレを使う
同期する
とりあえず ObjectSync を付けておけば良い
成功例1
VRCObjectPool を使う
予めオブジェクトを設置する手間はあるが、これが今は確実
code:spawnSuccess-1.cs
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;
using VRC.SDK3.Components; // VRCObjectPool を使うため
public class SpawnButton : UdonSharpBehaviour
{
private VRCObjectPool pool;
void Start()
{
pool = (VRCObjectPool) GetComponent(typeof(VRCObjectPool));
}
public override void Interact()
{
// オブジェクトオーナーしか spawn の権限が無いため
Networking.SetOwner(Networking.LocalPlayer, this.gameObject);
pool.TryToSpawn();
}
}
失敗例1
これ自体はコンパイルは通るが、スポーンしたオブジェクトはインタラクトしたユーザーにしか見えない
code:spawnFailed-1.cs
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;
public class SpawnButton : UdonSharpBehaviour
{
public GameObject spawnObject;
Vector3 basePosition; Quaternion baseRotation;
void Start()
{
basePosition = spawnObject.transform.position;
baseRotation = spawnObject.transform.rotation;
}
public override void Interact()
{
Instantiate(spawnObject, basePosition, baseRotation);
}
}