GameObject Celler - mimyquality/FukuroUdon GitHub Wiki
概要
VRChatのワールドに置いて、多量のオブジェクトのアクティブを管理するギミックです。
主に店舗系ワールドのグラスや料理等、ピックアップオブジェクトの出し入れに使う想定です。
有り体に言うと、 VRC Object Pool
を操作するU#スクリプトセットです。
導入手順
パッケージ内容
VRC Object Pool
を Udon から操作しやすくするマネージャーコンポーネント- ObjectPool に登録したオブジェクトを操作するスイッチ
- ObjectPool に登録したオブジェクトが触れると消せるコライダー (ゴミ箱的に使えます)
使い方
Packages > Fukuro Udon > Samples > GameObjectCeller フォルダー内にサンプルPrefab が入っています。プレハブを Hierarchy に置いてください。
ObjectPool オブジェクトの VRC Object Pool
コンポーネントにある Pool 配列に、管理したいオブジェクトを登録することでギミックの対象になります。
サンプルPrefab には動作確認用 Pickupオブジェクトが Pool にセット済みです。不要であれば削除してください。
[!TIP] Pool 配列にセットされているオブジェクトが管理対象となるため、必ずしも ObjectPool オブジェクトの子オブジェクトにする必要はありません。
同期のため、ObjectPool オブジェクト自体は常にアクティブでいるようにしてください。
[!TIP] ギミックによっては、同期を担保するために非アクティブにしてはいけないオブジェクトを親オブジェクトとして、子をピックアップオブジェクトにしているギミックがあります。そういったギミックをスポーンさせたい場合は、子のピックアップオブジェクトの方をPool配列にセットしてください。
親の方をセットした場合、そのギミックの同期が壊れたり、リターンさせても再スポーン時に位置がリセットされないなどの不具合が出ます。
それぞれのスイッチは、子にある仮メッシュオブジェクトを消して好きな見た目のスイッチに差し替え、コライダーサイズを調整してお使いください。
Pool 配列に登録したオブジェクトはワールド読み込み時に自動で非アクティブになるため、Hierarchy 上で非表示にしておく必要はありません。また、アクティブ状態は同期しますが、位置同期はスポーンした時にしかしないため、必要に応じて登録オブジェクトに VRC Object Sync
コンポーネントを追加してください。拙作 Manual ObjectSync を VRC Object Sync
の代わりに使う事も可能です。
SpawnSwitch & ReturnAllSwitch
とりあえず一番よく使いそうなスイッチをサンプルプレハブに含めてあります。
- SpawnSwitchはTargetに設定した ObjectPool からオブジェクトを1つスポーンさせます。
- ReturnAllSwitchはTargetに設定した ObjectPool の Pool 配列内オブジェクトを全てリターン(非アクティブに)します。
スイッチの Switch Type を切り替える事で、スイッチが実行する機能を変える事ができます。
Dust Box
Target に設定した ObjectPool の Pool 配列内オブジェクトがこのコライダーと接触すると、接触したオブジェクトがリターンします。
Dust Box と接触するには、Pool 配列に登録されたオブジェクトにコライダーが付いていて、Dust Box のコライダーと衝突(Trigger)イベントを起こす関係になっている必要があります。標準では、Dust Box には isTrigger オンのコライダーのみが付いています。
Trigger イベントの詳細は Unity マニュアルの衝突の基本を参照してください。
高度な使い方
ObjectPool Manager
VRC Object Pool
を前提としたスクリプトです。
VRC Object Pool
のエイリアスとなるメソッド・プロパティを含む、以下の追加メソッドとプロパティが扱えます。
返り値 | 名前 | 説明 |
---|---|---|
GameObject[] | Pool | VRCObjectPool.Pool のエイリアスです |
Vector3[] | StartPosition | VRCObjectPool.startPosition のエイリアスです |
Quaternion[] | StartRotation | VRCObjectPool.startRotation のエイリアスです |
GameObject | LastSpawnedObject | 最後にスポーンしたオブジェクト。一度も TryToSpawn に成功していない場合はnull |
int | CountAll | 有効なプールオブジェクトの総数 |
int | CountActive | アクティブになっているオブジェクトの数 |
int | CountInactive | 非アクティブになっているオブジェクトの数 |
void | Shuffle() | VRCObjectPool.Shuffle() のエイリアスです |
GameObject | TryToSpawn() | VRCObjectPool.TryToSpawn() のエイリアスです。返り値:スポーンに成功した時はその GameObject、それ以外は null |
GameObject[] | SpawnAll() | プール内の全てのオブジェクトが出るまで TryToSpawn します。返り値:スポーンに成功した GameObject が含まれた GameObject[] 配列 |
void | Return(GameObject) | VRCObjectPool.Return(GameObject) のエイリアスです |
void | Return() | プールの要素番号が最も若いアクティブオブジェクトを Return します |
void | Return(int) | Return するオブジェクトをプールの要素番号で指定して Return します |
void | ReturnAll() | 全てのプールオブジェクトを Return します |
ObjectPool Controller
ObjectPool Manager
のスポーン・リターン操作をするためのスイッチ用スクリプトです。
同じオブジェクトにコライダーを付けるとインタラクトできるように鳴ります。
- Target : 操作対象の
ObjectPool Manager
です - Switch Type : このオブジェクトをインタラクトした時の挙動です
- Spawn : Tatget のオーナーに TryToSpawn() を実行させます
- RandomSpawn : Tatget のオーナーに Shuffle() と TryToSpawn() を実行させます
- SpawnAll : Tatget のオーナーに SpawnAll() を実行させます
- ReturnFirst : Tatget のオーナーに Return() を実行させます ※引数無し
- ReturnAll : Tatget のオーナーに ReturnAll() を実行させます
サンプル
以下のワールドにサンプルを設置しています。
https://vrchat.com/home/world/wrld_4b7ed36e-c436-409f-9f87-8a6f4c80e79b