GameObject Celler - mimyquality/FukuroUdon GitHub Wiki

概要

VRChatのワールドに置いて、多量のオブジェクトのアクティブを管理するギミックです。
主に店舗系ワールドのグラスや料理等、ピックアップオブジェクトの出し入れに使う想定です。

有り体に言うと、 VRC Object Pool を操作するU#スクリプトセットです。

導入手順

Installation

パッケージ内容

  • VRC Object Pool を Udon から操作しやすくするマネージャーコンポーネント
  • ObjectPool に登録したオブジェクトを操作するスイッチ
  • ObjectPool に登録したオブジェクトが触れると消せるコライダー (ゴミ箱的に使えます)

使い方

Packages > Fukuro Udon > Samples > GameObjectCeller フォルダー内にサンプルPrefab が入っています。プレハブを Hierarchy に置いてください。
ObjectPool オブジェクトの VRC Object Pool コンポーネントにある Pool 配列に、管理したいオブジェクトを登録することでギミックの対象になります。
サンプルPrefab には動作確認用 Pickupオブジェクトが Pool にセット済みです。不要であれば削除してください。

image

[!TIP] Pool 配列にセットされているオブジェクトが管理対象となるため、必ずしも ObjectPool オブジェクトの子オブジェクトにする必要はありません。
同期のため、ObjectPool オブジェクト自体は常にアクティブでいるようにしてください。

[!TIP] ギミックによっては、同期を担保するために非アクティブにしてはいけないオブジェクトを親オブジェクトとして、子をピックアップオブジェクトにしているギミックがあります。そういったギミックをスポーンさせたい場合は、子のピックアップオブジェクトの方をPool配列にセットしてください。
親の方をセットした場合、そのギミックの同期が壊れたり、リターンさせても再スポーン時に位置がリセットされないなどの不具合が出ます。

それぞれのスイッチは、子にある仮メッシュオブジェクトを消して好きな見た目のスイッチに差し替え、コライダーサイズを調整してお使いください。
Pool 配列に登録したオブジェクトはワールド読み込み時に自動で非アクティブになるため、Hierarchy 上で非表示にしておく必要はありません。また、アクティブ状態は同期しますが、位置同期はスポーンした時にしかしないため、必要に応じて登録オブジェクトに VRC Object Sync コンポーネントを追加してください。拙作 Manual ObjectSyncVRC 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