ワールドにアイテムを多数置いたり、Create Item Gimmickで生成できるようにしてあると、遊んでいるうちに散らかってしまうことがあります。
そうしたアイテムを元の場所に戻したり、削除する仕組みの作例を紹介します。
アイテムを一斉に削除する──増えすぎたアイテムを片付ける
アイテムは「Destroy Item Gimmick」を使って削除することができます。
Destroy Item GimmickのTargetにGlobalを指定することで、同じKeyを指定したアイテムを一斉に削除できます。
Create Item Gimmickで無制限に増やせるアイテムに設定しておくと、増えすぎたときにまとめてリセットできるのでオススメです。


- 消したいアイテムのGameObjectに、Inspectorの「Add Component」からDestroy Item Gimmickコンポーネントを追加します。
- Create Item Gimmickで生成されるアイテムの場合は、Item Templateに設定したPrefabを編集します。
- Destroy Item GimmickコンポーネントはItemコンポーネントと同じオブジェクトに設定する必要があります。
- Destroy Item GimmickのTargetを「Global」に設定し、Keyを入力します。ここではKeyを「ResetItems」とします。

続いて、リセットボタンを作成しましょう。
- Scene上に新規GameObjectを作成し、名前を「ResetButton」とします。
- ResetButtonに「Interact Item Trigger」コンポーネントを追加してください。
- Interact Item TriggerのTriggersには項目をひとつ設定し、Targetを「Global」、Keyを先ほどと同じ「ResetItems」、Valueを「Signal」とします。
- 最後に、ボタンの見た目とクリック判定になるよう、ResetButtonの子にCubeを作成します。

実行して試してみましょう。ResetButtonをクリックすると、Destroy Item Gimmickを設定したアイテムがすべて消えます。
Destroy Item GimmickのKeyを変更し、そのKeyに対応するリセットボタンを用意することで、特定の種類のアイテムだけを一斉削除することもできます。同時に消したいアイテムには同じKeyを、そうでないアイテムには異なるKeyを設定しましょう。
アイテムを一斉に元の位置に戻す──散らばったアイテムをリセット
ワールドに最初から置いてあるアイテムで、削除せずに片付けたい場合は「Warp Item Gimmick」を使って元の位置に戻すことができます。
この方法はCreate Item Gimmickで生成されるアイテムには利用できません。ワールドに最初から設置されるアイテムにのみ利用できます。

- Scene上に設置したアイテムに「Warp Item Gimmick」コンポーネントを追加します。
- TargetとKeyは先ほどと同様に、それぞれ「Global」「ResetItems」とします。
- Warp Item Gimmickの「Target Transform」に、アイテムのワープ先を示すGameObjectを指定する必要があります。
アイテムを移動させたい位置に新しい空のGameObjectを作成し、そのGameObjectをTarget Transformの欄にドラッグ&ドロップしてください。

先ほどと同じリセットボタンで動作するので、実行してみましょう。手で持つなどしてアイテムを移動させても、リセットボタンをクリックすると元の位置に戻ります。
手で持ったままのアイテムはワープしません。
手放したアイテムを元の位置に戻す・削除する
続いて、一斉ではなく個別のアイテムごとに片付ける方法を紹介します。
手で持ったアイテムを手放したときに元の位置に戻ったり削除されるようにしてみましょう。

- アイテムのオブジェクトに、手放したことを検知できる「On Release Item Trigger」コンポーネントを追加してください。
- On Release Item TriggerのTriggersに項目をひとつ追加し、Targetを「This」、Keyを「Release」、Valueを「Signal」とします。
- 続いてDestroy Item GimmickまたはWarp Item Gimmickを追加します。
- Targetを「This」、Keyを「Release」とトリガーと同じ設定にしてください。Warp Item GimmickにはTarget Transformの設定も忘れないようにしましょう。

実行して試してみましょう。アイテムを手で持って放すと、消えたり元の位置に戻ったりするようになっています。
手放して一定時間が経過したアイテムをリセットする
最後に少し複雑ですが、「手放したアイテムを一定時間以内に再度掴めば消えない」という仕組みをつくってみましょう。
先ほどの「手放すと元の位置に戻る・削除される」アイテムを基につくっていきます。
- まず、Destroy Item GimmickまたはWarp Item GimmickのKeyを「Reset」に変更します。Targetは「This」のままです。
- 「Release」が通知されてから、TimerやLogicを通して「Reset」が通知されるとリセットされるようにしていきます。
続いて、「現在アイテムを手で持った状態かどうか」を検出する仕組みをつくります。
- On Release Item TriggerのTriggersに、項目をさらにひとつ追加します。
- Targetを「This」、Keyを「isGrabbed」、Valueを「Bool」として、チェックが外れた状態になっていることを確認します。
- さらに「On Grab Item Trigger」を追加し、トリガーとしてTargetを「This」、Keyを「isGrabbed」、Valueを「Bool」、チェックを付けておきます。
- これで、アイテムを掴んだときに「isGrabbed」がTrueに、手放したときにFalseになります。
- 次に「Item Timer」コンポーネントを追加してください。
- Keyを「Release」として、手放したときに実行されるようにします。Delay Time Secondsに手放してから消えるまでの時間を設定します。
ここでは5秒としましょう。 - Item TimerのTriggersに項目をひとつ追加し、Keyを「ResetCheck」、Valueを「Signal」としてください。
- Keyを「Release」として、手放したときに実行されるようにします。Delay Time Secondsに手放してから消えるまでの時間を設定します。
- 最後に「Item Logic」コンポーネントを追加します。
- Targetを「This」、Keyを「ResetCheck」として、+ボタンで式をひとつ追加してください。
- 式のTargetは「This」、Keyは「Reset」、Typeは「Signal」とします。
- 演算子は「=Not」で、引数は「RoomState」「Bool」「This」「isGrabbed」を設定します。

これで、手放してから5秒後に手で持っていない状態なら、Resetが通知されギミックが動作するようになりました。実行して試してみましょう。
今回は手で持つことのできるアイテムの場合を紹介しましたが、Grabbable Itemの代わりにRidable Item、On Grab Item TriggerとOn Release Item Triggerの代わりにOn Get On Item TriggerとOn Get Off Item Triggerを使えば、降りてから一定時間後にリセットされる乗り物などもつくることができます。
アイテムのリセットを丁寧に設定しておくと、同じワールドで長時間遊んでいても散らかることなく快適に過ごすことができます。
また、ゲームワールドの武器などをリセットできるようにして、同じサーバーで何度でも遊べるようにすることもできます。あとから合流したお友達とも一緒に遊べるよう、一工夫してみましょう!