VRで焚き火する #13 薪を燃やして時間経過でじわじわ小さくする【Unity】
前回の記事では、コントローラーのトリガーを押すと薪を生成するように実装してみました。これで薪を大量に作れるようになりました!
Ignisの設定の一つに「燃え尽きた時にオブジェクトを消す」機能があります。便利な機能なのですが、一瞬で消えてしまうのでオブジェクトが大きい場合、少し違和感があります。
今回は、時間経過でじわじわ小さくなるよう実装してみます。
目次
開発環境
・Unity 2020.3.15f2(High Definition RP 10.5.1)
・CPU:AMD Ryzen 7 3700X
・グラボ:ASUS ROG-STRIX-RTX2060S-O8G-GAMING
・Meta Quest 2(Oculus Link利用)
・炎アセット:Ignis – Interactive Fire
(1) Ignisの設定では一瞬で消えてしまう
Ignisの設定で「Advanced -> Burn settings -> Delete after burnout」にチェックを入れると、燃え尽きて炭状態になったタイミングで、オブジェクトが消えるようになります。
設定はここですね。
消えてくれるのは良いのですが、一瞬で消えてしまうので違和感があります。
動画で確認してみる
動画で見てみるとこんな感じです。
もう少しゆっくりと消えてくれると良いのですが。
(2) じわじわ小さくする仕組みを考える
実際にキャンプで焚き火をしてみると、もちろん一瞬で消えることはなく、時間経過とともに少しずつ薪が小さくなって最後に炭が残る、そんな感じです。炭も消えてしまうと掃除が楽で良いですが、「不便なことを楽しむのもキャンプ」ですので、あえて炭は残すことにしましょう。
それを踏まえて、以下を考えてみました。
薪オブジェクトの燃え方
・薪は火がついてから 30秒 で燃え尽き始める。
・燃え尽きるまでの時間は 30秒 にする。
今回の記事用に時間を短くしていますが、本番ではもっと長くする予定です。
じわじわ小さくする仕様
・火がついてから30秒経ったら、薪オブジェクトの大きさを少しずつ小さくする。
・最終的に体積が半分くらいになる。
こんな感じで良さそうですね。
(3) じわじわ小さくするスクリプトを実装する
まずは、スクリプトを実装します。
コルーチンを使って実装する
FireWood という薪オブジェクト専用のスクリプト(クラス)を作ります。
[FireWood.cs]
using System.Collections; using UnityEngine; namespace Amaotolog { /// <summary> /// 薪クラス /// </summary> public class FireWood : MonoBehaviour { // 時間経過で薪が小さくなる public void GetSmaller() { IEnumerator getSmallerIE = GetSmallerIE(); StartCoroutine(getSmallerIE); } private IEnumerator GetSmallerIE() { for (int i = 0; i < 150; i++) { float adjust = -0.002f; transform.localScale += new Vector3(adjust, adjust, adjust); yield return new WaitForSeconds(0.1f); } } } }
12行目で、GetSmaller というメソッドを宣言しています。他のスクリプトから実行しますので、public宣言です。
14,15行目で、Unityのコルーチンという仕組みを使って、GetSmallerIEメソッド を実行しています。
17~25行目で、オブジェクトをじわじわ小さくする処理を実装しています。
21,22行目で、-0.002f という小さい値を使って、オブジェクトの localScale を小さくします。19行目のループ回数は 150回 なので、最終的には 0.3f 小さくなります。
なお、いまの実装では、どんなサイズのオブジェクトでも同じ値を使うので、オブジェクトの長さや体積の比率を応じて「小さくする値」を変更するのも良いですね。
23行目で、yield return をこのように実装することで、0.1秒後に次の行に進ませることができます。今回の場合なら、次のループ処理が実行されるようになります。
(4) 薪オブジェクトの Ignis を設定する
次は、Ignis の設定です。
燃え方の時間を設定する
まず、薪オブジェクトの Ignisコンポーネント を設定していきます。
・薪は火がついてから 30秒 で燃え尽き始める → Burn Out Start_s:30
・燃え尽きるまでの時間も 30秒 にする → Burn Out Length_s:30
です。
ちなみに Ignition time は火がつくまでの時間です。いまは 20秒 にしてます。
これくらい太い薪ならもっと時間がかかりますが、デモ用なので短めです。小枝や松ぼっくりなら数秒、みたいな感じでオブジェクトによって時間を変えるのも面白そう。
FlameTriggerCallbacks を使って遅延実行する
次に、先ほど作ったスクリプトが「火がついてから30秒経ったら実行」されるように設定していきます。
Ignis でイベント処理を扱う場合、「Advanced -> Advanced setup」で「Enable Flame Events」ボタンをクリックすると追加される FlameEventInvoker を使う方法がありますが、今回は遅延実行したいので、もう一つの方法 FlameTriggerCallbacks を使います。
これを使うと、Inspector で遅延時間を指定しつつ、実行したいメソッドも指定できます。便利です!
まず薪オブジェクトに、先ほど作ったスクリプト(FireWood)と FlameTriggerCallbacks を Add Component で追加します。ついでに Delay Seconds を 30 に変更しておきましょう。
次に、Flame Trigger Callbacks で「Callback Functions の +アイコン」をクリックして、Listに1行増やします。
Runtime Only → Editor and Runtime に変更し、「None (Object)」に 「薪オブジェクト(今回は Wood1)」をD&Dします。
すると、No Function と表示されていた箇所が触れるようになるので、Firewood の「GetSmallerメソッド」を指定します。
これで、この薪オブジェクトは「火がついてから 30秒 経ったら、FirewoodクラスのGetSmallerメソッドが実行される」ようになりました。他の薪も同じ設定をやっておきます。ある程度は、オブジェクトを複数設定した状態で一括設定できますよ。
これで完了です。
(5) 動画で確認してみる
VRモード(Oculus Link)で確認してみましょう。
薪を燃やして時間経過でじわじわ小さくする
動画で確認してみます。
火がついてから 30秒 経ったら、じわじわと薪が小さくなってますね。最後には小さな炭だけが残りました。
まとめ
薪オブジェクトがじわじわと小さくなるよう実装してみました。
実際の焚き火でも、時間が経つと薪が炭になってどんどん崩れていきますので、少しだけそんな感じに近づけたと思います。
次回は、火をつけるライターをつくります。見た目は普通のライターですが、威力はターボです。
コメント
トラックバックは利用できません。
コメント (0)
この記事へのコメントはありません。