VRで焚き火する #15 開閉式のオイルライターに揺らめく火をつける【Unity】
前回の記事では、ポリモーフィズムというものを使って、使い捨てライターに火をつけてみました。
アセットストアを見ていると、更に良い感じのライターを見つけました。
今回は、開閉式のオイルライターに火をつけてみます。前回の実装のおかげで、スクリプトは1つ作るだけで済みました。
目次
開発環境
・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) オイルライターのアセットを見つけました
今回使わせていただいたのは「Bush-Craft Extension Pack」アセットのオイルライターです。
以前、焚き火の薪を準備した時と同じメーカー様でした。
ありがとうございます!
open/closeの2種類あった
オイルライターのPrefab を見てみると、
・Lighter-classic_open_n
・Lighter-classic_closed_n
の2種類ありました。
このPrefabを使いわけると開閉式のライターができそうですね。
こちらのライターもクオリティ高いです。
Material設定で Metallic や Smoothness の値を高めにすると、良い感じに金属の光沢が出てきました。
かっこ良いです。
(2) ライターに Ignis を設定する
オイルライターに炎アセット Ignis を設定して、火がつくように設定していきます。
基本的な設定方法は、前回の使い捨てライターと同じです。
前回作成したFlameオブジェクトを追加する
前回の記事で作った「Ignis用のそこそこ大きい見えないFlameオブジェクト」を今回も使います。
Flameオブジェクトを複製して、オイルライターの Lighter-classic_open_n の下に移動します。
Flameオブジェクトは Point Light も設定済みでしたね。
次に、Mesh Renderer のチェックを外します。
これで、オブジェクトが見えなくなります。
2つのオブジェクトをまとめる
2つのライターオブジェクトを扱いやすくするために、専用のオブジェクトを作っておきましょう。
Hierarchy で空オブジェクトを作成し、名前を Lighter-classic に変更します。
ここに、Lighter-classic_open_n と Lighter-classic_closed_n を移動しておきます。
これで良いですね。
2つのオブジェクトを重ねる
次に、Transform の値を同じにすることで、2つのオブジェクトを重ねた状態にします。
重なりました。
Transform の値を Copy Component でコピーし、Pate Component Values で貼りつけると楽ですね。
これで、片方のオブジェクトだけがアクティブ状態になれば、ライターが空いている/閉まっているように見えます。
(3) 新しくスクリプトを作る
前回の使い捨てライターの時は、オブジェクト指向のポリモーフィズムを使った実装をしました。
[実装1] イベントメソッド用のインターフェイスを作る
[実装2] オン/オフ用のライタークラスを作る
[実装3] 薪クラスを修正する
[実装4] 既存スクリプトに追加する
の4つを実装したのでした。
オイルライタークラスを作るだけ!
今回は [実装2] だけでOKです!
[実装1]はそのまま使えますし、[実装3]は今回の作業とは関係ありません。
仮に、ポリモーフィズムを使った実装でなければ、[実装4]で既存スクリプト(TransformMover.cs)に対して、「今回作成したオイルライター専用のスクリプト(クラス)を取得して、DoubleTriggerActionメソッドを実行する」という改修を行う必要がありましたが、その作業も必要ありません。
既存スクリプトを修正しなくて良いということは、それらの動作確認試験も必要ないということ。
非常に楽です。
[実装1] オン/オフ用のオイルライタークラスを作る
オン/オフ用のオイルライタークラスを作ります。
このクラスの DoubleTriggerActionメソッド を実行すると、Lighter-classic_open_n と Lighter-classic_closed_n のアクティブ状態を切り替えることができます。Flameオブジェクトは常にアクティブ状態(=Ignis で火がついている状態)ですので、ライターの開閉状態の切り替えと火のオン/オフが同時にできますよ。
using UnityEngine; namespace Amaotolog { /// <summary> /// オイルライタークラス /// </summary> public class LighterClassic : MonoBehaviour, ITriggerAction { // アクション処理(火を点ける/消す) public void DoubleTriggerAction() { GameObject objClose = transform.Find("Lighter-classic_closed_n").gameObject; GameObject objOpen = transform.Find("Lighter-classic_open_n").gameObject; // アクティブ状態を切り替える objClose.SetActive(!objClose.activeSelf); objOpen.SetActive(!objOpen.activeSelf); } } }
基本的な実装は、ライタークラス(Lighter.cs)と同じです。
そちらをご参考くださいね。
(4) コンポーネントとスクリプトを追加する
残りの設定をやっていきます。
オイルライターオブジェクトに設定する
オイルライターオブジェクト(Lighter-classic)に対して、以下を設定します。
・Tag(タグ)を「Grab」に変更する。
・オイルライタークラス(LighterClassic)を追加する。
・Rigidbody と Box Collider を追加する。
・「Rigidbody -> Collision Detection」の設定を Continuous Dynamic に変更する。
揺らめく火を設定する
ライターの炎は普通のライトなので単純に光っているだけです。
これを揺らめくようにするには、ライトオブジェクト(Point Light)に「FlameLightFlicker」を追加します。
「/OAVA-Flame/Scripts/Additional/」以下にあります。
揺らめきの強さや速度などを Inspector で設定できるのが便利ですね。もちろん焚き火でも使うことができますよ。
これですべての作業が完了しました。
(5) 動画で確認してみる
VRモード(Oculus Link)で確認してみましょう。
オイルライターで火をつける
動画で確認してみます。
オイルライターをつかんで、更にトリガーを押すとライターが開いて火がつきました。
火を消すと、ライターも閉じてますね。
まとめ
焚き火に火をつけるためにオイルライターを作ってみました。
前回の記事でポリモーフィズムを使った実装をしていたので、今回はスクリプト作成が1つで済みました。既存部分の試験も必要なかったので、かなり楽でしたよ。
コメント
トラックバックは利用できません。
コメント (0)
この記事へのコメントはありません。