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

ブログの女の子を作る #102 ビジュアルスクリプティングで「オブジェクトを触るとTimeline実行」を作る【Unity】

 
前回は Timeline と Cinemachine を使って、Liella! の「始まりは君の空」を踊ってみた、というイベントシーンを作りました。これでモーションと音声、オブジェクトの表示・非表示をまとめて管理できるようになったので、イベントシーンを増やすのも簡単になります!
 
Timeline の数が増えてくると、それぞれを実行するための「トリガー(アクションの起点となるもの)」が欲しくなってきますね。
今回は、「何かのオブジェクトを触ると、Timelineを実行する」プログラムを作ります。
 
せっかくですのでいつものスクリプト言語(C#)ではなく、Unity 2021 から標準機能となった ビジュアルスクリプティング(Visual scripting、旧名Bolt)を使ってみました。



開発環境

・Blender 3.0.0
・Unity 2021.3.0f1
・CPU:AMD Ryzen 7 3700X
・グラボ:ASUS ROG-STRIX-RTX2060S-O8G-GAMING
 

(1) ビジュアルスクリプティングでやりたいこと

ビジュアルスクリプティングと、今回やりたいことです。
 

参考にさせていただいたサイト

ビジュアルスクリプティングを使う際、以下のサイトを参考にさせていただきました。
 
動画ベースの説明が分かりやすい。
 
以下の動画を見ると、なんとなく感じが分かると思います。
・ビジュアルスクリプティングシステムBoltを使ってみよう! 1回目
・StarterAssetsを使って三人称視点キャラクターを動かしたり、ギミックを動かしたりして遊ぶ
 
Visual Scripting とC#スクリプトとの比較です。
「C#スクリプトでは書けるのに、Visual Scriptingではどうしたら良いかわからない。。。」ことが多かったので、大変参考になりました。
 
ありがとうございました!
 

やりたいこと

今回やりたいことです。
1. Meta Quest 2のコントローラで何かのオブジェクトを触るとイベント発生。
2. イベント発生時、触ったオブジェクトに応じた Timeline をオン(無効→有効)する。
3. キャラクターが持ってるスマホを非表示にする。(Timeline実行中に、他のTimelineへ切り替えた場合の対策)
4. キャラクターを指定場所に移動する。
5. 最後に、Timelineを実行する。
6. Unity実行時は、指定しておいた Timeline をデフォルト実行したい。
 
これらをビジュアルスクリプティングで作っていきます。
 


(2) 下準備しておく

まずは下準備です。
 

Timeline を複数作成しておく

以下の4つを作りました。
・ベッドで足をパタパタ
・ソファに座る
・ソファに座って踊ってみた(前回の記事で作成)
・高い所にあるものを取る
 

作成した Timeline をオフにしておく

今回、「特定のTimelineでしか使わないオブジェクトやライトなど」があり、Timeline実行と同時にオンにしたかったので、それらをTimelineオブジェクト配下に配置することにしました。
こうしておくと、Timeline をオフ(無効状態)にすればそれらのオブジェクトもオフになるので、都合が良かったのですよ。
いろいろ方法はあると思いますが、今回はこれで。
 

シーン変数を設定する

Unityでビジュアルスクリプティングを使える状態にすると、Hierarchyに「VisualScripting SceneVariables」というオブジェクトが追加されます。
これが「シーン変数」で、Scene内のすべてのオブジェクトから使うことができます。共通的な設定値を保存しておくのに便利ですね。
 
今回は、以下の3つを登録しました。
 
1. Chara(Game Object)
キャラクターのオブジェクトを登録しておきます。
スクリプト内で、キャラクターのオブジェクトを使う際に便利になります。
 
2. AllTimelines(List of Game Object)
シーン内のすべての Timeline を登録する場所です。
Unity実行時に自動登録するので、内容は空ですよ。
 
3. CurrentTimeline(Game Object)
Unity実行時に、デフォルト実行する Timeline を登録しておきます。
今回は「Timeline_bed」を設定してます。
 

(3) ビジュアルスクリプトを作る

ビジュアルスクリプトで「やりたいこと」を作っていきます。
 

スクリプト1「Unity実行時に最初にしておくこと」を作る

名前は「InitSettings」です。
後述しますが、このスクリプトは「Unity起動時に必ず存在して有効になっているオブジェクト」にアタッチします。
 
2つの処理があります。
 
[シーン内のタイムラインをシーン変数に追加]
1. GameObject の Find で「Apartment/Timelines」にあるオブジェクトをすべて取得する。
2. Transform Get Child Count でループを繰り返す数を取得する。
3. For Loop で指定された数だけ繰り返し処理する。
・Transform Get Child で「ループ内の現在のTransform」を取得する。
・Get Variable でシーン変数の AllTimelines(配列) を取得する。
・Component Get Game Object で Transform を GameObject に変換する。
・List Add Item で AllTimelines変数 に追加する。
 
[デフォルト設定のタイムラインを実行]
1. Timeline を実行するスクリプト(RunTimeline。次章で作ります)を実行する。
 
ビジュアルスクリプトでは、スクリプトからスクリプトを呼び出すことができ、共通関数のように使えます。画面内では「Suggraph」と表示されてますね。
 

スクリプト2「いろんな処理をしてから、Timelineを実行する」を作る

名前は「RunTimeline」です。
このスクリプトは共通関数っぽく、他のスクリプトから呼ばれます。
 
今回、例えば「ベッド横のサイドテーブルを触ると、ベッドでのTimelineを起動」を作っていくのですが、他のTimelineでもやりたいことは同じ(何かを触ると、何かのTimelineを実行)ですので、プログラムを一つにまとめることができます。
 
4つの処理があります。
個別に見ていきましょう。
 

その1:全てのTimelineをオフ、選択されたTimelineのみオン

 
1. Get Variable でシーン変数の AllTimelines(配列) を取得する。
 
2. For Each Loop で配列内の要素数だけ、繰り返し処理する。
・取得した配列内の要素(オブジェクト)は Item で取得できる。
・Game Object の Set Active で取得したオブジェクト(ループ内の現在のオブジェクト=Timeline)をオフにする
 
3. Get Variable でオブジェクト変数の CurrentTimeline を取得する。
例えば「ベッド横のサイドテーブルのオブジェクト」に設定しておいたオブジェクト変数(=実行したいTimelineのオブジェクト)が取得できます。
 
4. Game Object の Set Active で取得したオブジェクト(先ほど取得したTimeline)をオンにする
 

その2:キャラが持ってるスマホを非表示

Timeline実行中に、他のTimelineへ切り替えた場合の対策です。
 
今回は、「スマホを非表示」という1処理だったので処理内に直接ノード配置してますが、その他にも複数処理が必要になった場合は、別スクリプトにして SubGraph で呼び出すのがスッキリして良いですね。
 
1. Get Variable でシーン変数の Chara(キャラクターのオブジェクト) を取得する。
2. Transform Find で「Armature/Hips/ (中略) /CharaSmartphone」オブジェクト(スマホ)を取得する。
3. Game Object の Set Active で取得したオブジェクトをオフにする
 

その3:キャラクターを指定場所に移動

下準備として、以下をやっておきましょう。
・Hierarchyで、CharaPosition という名前で空オブジェクトを作成する。
・Hierarchyで、該当するTimelineオブジェクト配下に、CharaPosition を配置する。
・Sceneで、CharaPositionを「Timeline実行時にキャラクターを移動したい場所」に移動し、必要に応じて回転も行う。
 
以下のスクリプトでは、CharaPosition の Transform情報を使ってキャラクターを移動することになります。
 
 
1. Get Variable でオブジェクト変数の CurrentTimeline を取得する。
2. Transform Find で CharaPosition オブジェクトを取得する。
 
3. Transform Get Position で 位置情報を取得する。
4. Transform Get Rotation で 回転情報を取得する。
 
5. Get Variable でシーン変数の Chara(キャラクターのオブジェクト) を取得する。
6. Transform Set Position で CharaPosition から取得した位置情報を設定する。
7. Transform Set Rotation で CharaPosition から取得した回転情報を設定する。
 

その4:Timelineを実行

 
1. Get Variable でオブジェクト変数の CurrentTimeline を取得する。
2. Playable Director Play で、先ほど取得した Timeline を実行する。
 
ここで実行されるのは、例えば「ベッド横のサイドテーブルのオブジェクト」に設定しておいた Timeline ですよ。
 

スクリプト3「オブジェクトが触られたか検知してTimeline実行」を作る

下準備として、Meta Quest のコントローラ内のオブジェクト(今回は非表示にしたCubeオブジェクト)に対して、以下を設定しておきます。
・タグを Player にする。
・Collider をアタッチする。
・Rigidbody をアタッチする。
 
スクリプトの名前は「TouchAction」です。
このスクリプトは、例えば「ベッド横のサイドテーブル」にアタッチします。
 
1. On Trigger Enter で触ってきたオブジェクトのコライダーを取得する。
2. Component Compare Tag で “Player” という名前であるかを比較する。
3. If で True の場合、Subgraph の Run Timeline を実行する。
 
これで、Meta Quest のコントローラで「ベッド横のサイドテーブル」を触るとタイムラインを実行できるようになります。
 


(4) 作ったスクリプトをオブジェクトに登録する

先ほど作ったスクリプトを Hierarchy内のオブジェクトに登録(アタッチ)していきます。
 

1. Unity起動時に実行するスクリプト

このスクリプトは「Unity起動時に必ず存在して有効になっている」オブジェクトにアタッチします。
 
何でも良いのですが、今回は「シーン変数のオブジェクト(VisualScripting SceneVariables)」にアタッチしてみました。
 
Add Component で「Script Machine」をアタッチし、Graph に「InitSettings」を登録します。
 

2. Timelineを実行するためのスクリプト

例えば、「ベッド横のサイドテーブル」のオブジェクトに登録します。
 
Add Component で「Script Machine」をアタッチし、Graph に「TouchAction」を登録します。
 
オブジェクトには、以下も設定しておきましょう。
[追加設定]
1. Collider をアタッチする。
Unityでは「衝突するオブジェクトの両方」にコライダーが設定されていないと検知できません。
Rigidbodyは片方だけでOKです。今回は、コントローラ側に設定してるので問題ありません。
 
2. オブジェクト変数(Variables)に「CurrentTimelne(Game Object)」を追加して、Value に「起動したい Timeline のオブジェクト(画像の例では Timeline_sofa)」を登録する。
 

(5) 動かして見る

これですべての準備が完了しました。
 
Unityを実行し、コントローラでオブジェクトを触ると、該当する Timeline が実行されます。
 


まとめ 

ビジュアルスクリプティングを使って、「何かのオブジェクトをコントローラで触ると、あらかじめ設定しておいた Timeline が実行する」仕組みを作ってみました。
 
今回はじめてビジュアルスクリプティングを使ってみたのですが、簡単そうに見えて「どのノードを使えば良いか」「線をどうつなぐと良いか」などで苦労しました。
ビジュアルスクリプティングだけでがっつりコーディングするのは厳しいかも知れませんが、処理の分岐が分かりやすく、実行時にも処理の流れが見えるなど良い点もたくさんありました。
 
用途によって使い分けするのが良いですね。
スポンサーリンク

コメント

  • トラックバックは利用できません。

  • コメント (0)

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

ブログの女の子を作る #101 TimelineとCinemachineでLiella!の「始まりは君の空」を「踊ってみた」イベントシーンを作る【Unity】

ブログの女の子を作る #103 Meta Quest 2+Oculus Linkでフレームレートが半分になる?なんとか動的解像度で36→72FPSに改善できました【Unity】


最近のコメント

だーしゅ
IT関係のお仕事してます。
3Dモデルの女の子は「アリス・ブロコ」。VRは楽しいですね。

[当ブログについて]