Unityのアドベンチャーゲーム制作アセットAdventure Creator を使って、オブジェクトにアタッチしたスクリプトを有効/無効にするテストをしてみました。
オブジェクトにアタッチしたコンポーネントの有効化と無効化をマウスクリックで切り替える
Adventure Creatorはまだ勉強中で知らない機能も多いものの、用意されているアクションを使用すれば大抵のことはできると思うのですが、今回はゲームオブジェクトにアタッチしたコンポーネントの有効/無効を切り替えられるか試してみることにしました。
具体的な内容としては、UnityのStandard Assetsで提供されているImage EffectコンポーネントをCameraオブジェトにアタッチして、その有効/無効を切り替えられるか試してみました。
公式フォーラムで解決方法を探す
まずは、それができるのかどうか調べたところ、公式フォーラムのスレッドに答えがありました。”Object – Send Message – enable/disable (attached) Script “を参考にしました。翻訳すると次の通りです。
“TurnOn()”関数と”TurnOff()”関数を作成した新しいスクリプトをオブジェクトにアタッチし、次のように目的のコンポーネントを有効/無効にするコードを記述します。
GetComponent
GetComponent
その後、アクションで[Object]:Sendメッセージアクションを使用して、好きなように有効/無効を切り替えることができます。
Game Managerセットとシーン階層の作成
ということで解決方法もわかったので早速やってみます。毎度おなじみ、Adventure CreatorのNew
Game Wizardで新しいマネージャーセットとシーン階層を作っておきましょう。メニュー:Adventure Creator > Getting standard > New
Game Wizardを選択。今回はカメラにエフェクトをかけるのでPlayerは 一人称視点にしました。
シーン階層を作成します。実はNew Game Wizardで設定を作成する際、作業中のシーンを開いていると、シーン階層を作ってくれません。(当たり前ですね!)というわけで、新規シーン階層を作るには作業中のシーンを閉じて新規シーンを作成してから、[AC Game Editor] > [Scene]タブ > Basic structure > Organise room objects: [With folders]ボタンをクリック。良く忘れてしまうので繰り返して書いておきました。
Image Effectsアセットのインポート
これまではメニュー:Assets > Standard Assets > Effectsを選択してインポートすると、Image Effectsアセットが含まれていましたが、バージョン5.5以降は、Asset Storeから”Legacy Image Effects “をインポートするようになりました。
Asset Storeの説明を翻訳するとこのように書いてあります。
Unity 5.5以降のユーザには、新しいPost Processing Stackを使用することを強くお勧めします。
Unity5.5以降で、メニュー:Assets > Import Package > Effectsを選択してインポートをした場合、[ImageEffects]フォルダは次のようになっています。フォルダ内のテキストに「古いImage EffectsはAsset Storeに移動したよ!新しいのを使ってね!」と書かれています。
Asset Storeから古いImage Effectsをインポートすると次のようにフォルダが追加されます。
テストシーンの作成
ではテスト用のシーンを作りましょう。基本オブジェクトを組み合わせて簡単なシーンを用意しました。[Shift]+[V]キーで頂点スナップモードに切り換え、Planeオブジェクトを[Ctrl]+[D]キーで複製を繰り返してでビシッと並べてみました。マテリアルはUnityのAsset Storeから無料アセットYughues Free Metal Materials を使用しました。
ちょっとSFっぽい感じになりました。
Playerプレハブの作成とエフェクトコンポーネントの追加
以前の記事の手順でFirst Personプレイヤーキャラクターのプレハブを作成します。
そしてPlayerプレハブのCameraオブジェクトにImage Effectを追加します。今回は被写体深度のエフェクトを追加します。[Project]ウィンドウからPlayerプレハブの右側の三角形をクリックして階層を開きCameraを選択。[Inspector]ウィンドウ > [Add Component]ボタンをクリック > Image Effects > Camera > Depth of Field (Lens Blur, Scatter, DX…)を選択。設定はこんな感じにしました。
そのまま再生するとこんな感じです。中央のオブジェクトの距離にピントを合わせています。
Hotspotアクション用のオブジェクトを追加
シーン中央のオブジェクトをクリックするとエフェクトが切り替えられるようにHotspotのコンポーネントを追加します。[Hierarchy]ウィンドウでオブジェクトを選択。[Inspector]ウィンドウ > [Add Component]ボタンをクリック > Adventure Creator > Hotspots > Hotspotを選択。[Use interaction]パネルの右側の[+]ボタンをクリック。[create]ボタンをクリックしてアクションを作成します。
コンポーネントの有効/無効を切り替えるスクリプトを作成
公式フォーラムのスレッドに書いてあった通り、スクリプトを作成しましょう。内容は次の通りです。自作スクリプトの場合は不要ですが、Standard Assetのスクリプトは名前空間が定義されているので”using UnityStandardAssets.ImageEffects;”を宣言して呼び出します。
using System.Collections; using System.Collections.Generic; using UnityEngine; // StandardAssetsのスクリプトは名前空間が定義されているので使用を宣言する using UnityStandardAssets.ImageEffects; public class ToggleDof : MonoBehaviour { // コンポーネントを有効にする処理(Send messageで呼び出す関数) void TurnOn() { // 被写体深度エフェクトコンポーネントを有効にする GetComponent<DepthOfField>().enabled = true; } // コンポーネントを無効にする処理(Send messageで呼び出す関数) void TurnOff() { // 被写体深度エフェクトコンポーネントを無効にする GetComponent<DepthOfField>().enabled = false; } }
スクリプトをPlayerプレハブ階層のCameraオブジェクトにアタッチします。そして[Depth of Field (Script)]コンポーネントのチェックを外して無効にしておきます。
Hotspotアクションを作成
では、アクションの編集をしましょう。Hotspotコンポーネントから追加したアクションを選択します。[Hierarchy]ウィンドウ > _Interactions > Item: Useを選択。メニュー:Adventure Creator > Editors > ActionList Editorを選択。 [ActionList Editor]ウィンドウが開いたら最初のアクションノードを次のように変更します。
- Action type: [Object] [Send message]
- Object to affect: [Player Camera]
- Messsage to send: [Turn On]
アクションで”Object to affect: “にカメラオブジェクトを設定すると自動的に[Record ConstantID]が追加されます。これはプレハブのようにシーンに存在しないオブジェクトを識別するIDのようです。
ではゲームを再生してみましょう。中央のオブジェクトをクリックすると他のオブジェクトがピンボケになれば成功です。このままではピンポケのままなのでエフェクトをオフにできるよう、オブジェクトを左右に追加しました。
Hotspotコンポーネントを設定しました。次のようになります。
- Action type: [Object] [Send message]
- Object to affect: [Player Camera]
- Messsage to send: [Turn Off]
ゲームを再生して動作を確認します。ちゃんとエフェクトを切り替えることができるようになりました。
ここまでの内容をWebGLでビルドしてみました。
一つのオブジェクトでエフェクトを切り替えるようにする方が現実的だと思いますが、変数の処理が必要なのでまたあらためて紹介したいと思います。