BlenderとUnityで作ったものをVR(Oculus  Quest/Oculus Link)で動かします

VRで焚き火する #13 薪を燃やして時間経過でじわじわ小さくする【Unity】

 
前回の記事では、コントローラーのトリガーを押すと薪を生成するように実装してみました。これで薪を大量に作れるようになりました!
 
Ignisの設定の一つに「燃え尽きた時にオブジェクトを消す」機能があります。便利な機能なのですが、一瞬で消えてしまうのでオブジェクトが大きい場合、少し違和感があります。
 
今回は、時間経過でじわじわ小さくなるよう実装してみます。



開発環境

・Unity 2020.3.15f2(High Definition RP 10.5.1)
・グラボ:ASUS ROG-STRIX-RTX2060S-O8G-GAMING
・Oculus 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)

  1. この記事へのコメントはありません。

VRで焚き火する #12 薪オブジェクトを大量に生成する【Unity】

VRで焚き火する #14 ポリモーフィズムで使い捨てライターに火をつける【Unity】

最近のコメント

だーしゅ
IT関係のお仕事してます。
VRは楽しいですね。

[当ブログについて]