Object Pool and Trail Renbderer

shooter.unitypackage(55kB)
Unity2021LTSで3Dテンプレートを使用。
New Input Systemを使うのでパッケージマネージャーからインストールする。

Sphereが飛び出し、時間がたつと消える。
Sphereはプレファブのインスタンスで作られるが、消えた後もプールに残っており再利用される。

プール制御は、空オブジェクトGunにつけたスクリプトで行う。
トリガー制御、射出時にCylinderが赤くなり音が鳴るのは、すべてGunで実行。
Gunの追加コンポーネント
GunObj(script) トリガー操作
ObjPoolManager(script) オブジェクトプールの管理
AudioSource 音を出す
KeyInput(script) スペースキーでトリガーのテスト入力

SphereはGunの原点で表示され、空オブジェクトGunのZ方向に射出される。
射出後はRigidBodyで重力や衝突の物理計算をおこなって進路が決まる。
Sphereの追加コンポーネント
Destroyer(script) 時間がたつと消えてプールに戻る。
RigidBody 重力や衝突の物理計算をおこなう。
TrailRenderer 軌跡の尾を引く。

TrailRendererにdefault-Perticleのマテリアルを設定。
Sphereのスケール1の時は、TrailのWidthが1でも問題ないがスケール変えたときは合わせないとはみ出す。

HoloLensでの使用
プラットフォームをUWPに切替えてから、プロジェクトを閉じる。
Mixed Reality Feature Tool を使って、プロジェクトをMRTKモジュールを加える。

加えるのは3つ。
Mixed Reality Toolkit Foundation
Mixed Reality Toolkit Tools
Mixed Reality OpenXR plugin
を選択しプロジェクトにインポート設定する。

プロジェクトを起動したら、MRTKの設定を行う。
MRTK HoloLens2プロジェクトの設定について
Gunオブジェクトを持って動かせるように、Gunオブジェクトに、コンポーネントを追加する。
Object Maniplatorコンポーネント
Constraint Managerコンポーネントは一緒に入る。
NearIntacractionGrabableコンポーネント
Object Maniplatorコンポーネントも必要。
Box Coliderコンポーネント
Gunにはコライダーが無いので、触る部分にコライダーを入れる。

メニューにtoolboxが追加されるので開く。

toolboxで3Dボタンなどのプレファブを選択して、シーンに挿入できる。

適当に一つシーンに挿入する。

Gunはスケール1のCylinderなので大きい。
3DボタンをGunの子供にすれば一緒に動くが、むしろ押しにくいので空間に置いておく。

ボタンを押したら弾(球)が出る設定
GunオブジェクトのGunObj(Script)コンポーネントのisFireをtrueにすると弾が出る。

GunObj(Script)コンポーネントに、isFireを切り替える、Button_ON()、Button_OFF()を呼び出しても動く。
public void Button_OFF()
{
GameObject gun = GameObject.Find("Gun");
gun.GetComponent().isFire = false;
}
public void Button_ON()
{
GameObject gun = GameObject.Find("Gun");
gun.GetComponent().isFire = true;
}
ボタンオブジェクトのインスペクターでEventに関数を追加する。
select objectのフォームに、ヒエラルキーからGunオブジェクトをドラックドロップすれば入る。

プレビューで確認 。


HoloLensで動作確認。
MRTKでGunオブジェクトを手で持って動かす設定
オブジェクトにコンポーネントを追加する。
Object Maniplatorコンポーネント
タッチポイントで操作できる。
両手操作で移動、回転、スケールができるEverythingになっているが、Scaleはしないようにしておく方が現実らしく自然。

NearIntacractionGrabableコンポーネント
Object Maniplatorコンポーネントも必要。
掴んで動かす操作ができる。
SphereもCylinderも、持つには大きすぎるのでscale1を、0.1~0.05くらいに小さくする。

触ったかどうかの検知だけ必要で、掴むのが不要であればNearIntacractionTouchableコンポーネントを使う


NearIntacractionTouchableは、検出方向(白矢印)があるので設定に注意が必要。

全方向で検出したい場合は、NearIntacractionTouchableVolumeコンポーネントを使う。
NearIntacractionGrabable
NearIntacractionTouchable
NearIntacractionTouchableVolume
いづれの場合も、指定コライダー接触時にトリガーを出すので、
Interactiveコンポーネントのレシーバーで受けてアクションを発動する。
