【Unity】プレハブ用のオブジェクトプールを作ってみた

■このオブジェクトプールの特徴

よくあるオブジェクトを非アクティブ状態にしてプール。
プレハブのInstanceIDで管理するのでリストの登録が不要。
片方向リンクリストなので高速。
導入時のスクリプトの変更が少ない。
プール時だけ管理する為、普通にDestroyしても影響なし。
シーンに直接配置した場合はプールせずにDestroyする。
プレハブごとに初期化とプール時のイベントを登録。
オブジェクトプールマネージャのサンプルを付属。

ダウンロードはこちら
■ファイル構成

ObjectPool.cs :オブジェクトプール本体のスクリプト(シングルトン)
ObjectPoolItem.cs :プールしたいプレハブのルートに追加するスクリプト
ObjectPoolManager_sample.cs :プールする数を調整するスクリプトのサンプル
readme.txt :オブジェクトプールの説明

■使い方
  1. プレハブにObjectPoolItemコンポーネントを追加する。
  2. プレハブ生成はusing A_rosuko.ObjectPool;を追加して
    Instantiate(プレハブ, pos , qt);を下記に書き換えてください。
    ObjectPool.Instance.GetGameObject(プレハブ , pos , qt);
  3. プールはusing A_rosuko.ObjectPool;を追加して
    Destroy(gameObject);を下記に書き換える。
    ObjectPool.Instance.SleepGameObject(ObjectPoolItem);※ObjectPool.Instance.SleepGameObject(gameObject);でも動作しますが、
    内部でGetConponent<ObjectPoolItem>()してますのでObjectPoolItemをキャッシュして渡す方が速いです。
  4. 初期化などが必要であればエディタのインスペクターからOnEventWakeUpやOnEventSleepイベントに関数を登録してください。
■仕組み

オブジェクトプール本体のDictionaryでリンクリストの先頭を作成する。
DictionaryのキーはプレハブのInstanceIDとする。
各オブジェクトのObjectPoolItemコンポーネント側で接続するリンクリストの先頭をキャッシュしておき、先頭の次に接続する。
プールから取り出す時はリンクリストの先頭の次から取り出し、その次を先頭に接続しなおす。

■保証及び責任、著作権について

本ソフトウェアは無保証です。
本ソフトウェアの使用を通して生じたいかなる損害、不利益に対しても、制作者は責任を負わないものとします。

ObjactPool:Copyright 2018 A_rosuko
Released under the MIT license

■参考

Unity公式チュートリアル(第01回 オブジェクトプーリング)
Unityマニアックス(第1章オブジェクトプーリング)
wikipedia(Object pool pattern)

LightwaveのLscriptによる不連続UV編集

以前Twitterで公開していたLightwaveのプラグインを置いておきます。
LightwaveでUV編集がやりにくいので数値入力できるものを作ってみたのですが、少し中途半端なものになりました。
Lscriptを調べてみたところ、非連続UVのポイントを選択している状態を取得する方法がわからず、詳しく説明すると

  1. Lscriptではモデル空間上のポイントID+ポリゴンIDの組み合わせで非連続UVのポイント座標を取得と設定はできる。
  2. UVマップで選択したポイントからはモデル空間上のポイントIDが渡されている。

という理由から1ポリゴン+1ポイントで操作する場合は問題ないですが、
多ポリゴン+多ポイントになるとUVマップで選択したポイントにモデル空間で同じポイントのIDが含まれてくるので、意図しないポイントが操作対象になります。
(UVマップ上で選択しても同じモデル空間のポイントが一緒に動く)

今回作ったプラグインはポリゴン選択のみの操作には使えるはずです。
ポリゴン+ポイントの選択はおまけ機能と思ってください。

今回作ったプラグインはこちら

そのうち、作り方がわかったら修正したいです。
詳しい方いましたら教えていただけると嬉しいです。

■下記補足

  • UVのポイント操作は標準で入っている「UV値変換」がおすすめです。
    (こちらは逆に非連続UVのポリゴン選択の操作がダメ)
  • UVのポリゴン選択に「Select UV Island」と一緒に使うと便利です。