Unityメモ – 宴でイメージエフェクトを使ってみた

Posted: 2015年9月5日 カテゴリー: プログラミングメモ, Unity, Unity メモ
タグ:, , , , ,

もう当分書かないと思っていた宴ネタ再びです。

今回は宴で作ったゲームにUnityの標準イメージエフェクトを使う方法を紹介します。

 

blg16
こんな感じの画面を作ります

 

[注意事項]

今回は宴事態のスクリプトを弄るので、あまり推奨出来る方法ではありません。その内正式にサポートされるみたいなので、それを待った方が懸命かもしれません。

 

[実装]

では実装に入ります。今回は画面全体をセピア調にするエフェクトを追加します。

まず、イメージエフェクトのスタンダードアセットを追加します。

 

blg17Assets > Import Package > Effects でインポートしてください。

 

インポートが出来たら、宴で使われているカメラ(UICamera)にセピア用のスクリプトをアタッチしてください。

blg18

 

セピア調のスクリプトをアタッチしている間は常にエフェクトが出ていますので、取りあえずはOffにしておきます。

これでイメージエフェクトの準備が出来ましたので、次は宴から呼び出す処理を追加します。

宴のリファレンスにあるSeneMessageコマンドを使う を参考にしていますので、そちらも参照してください。

まず、宴からメッセージを受け取るクラスを作るのですが、その前に受け取るコマンド一覧を変数として保持しているクラスを作成します。

 

using UnityEngine;

public static class CommandDefine
{
public const string LOG = "Log";
public const string SEPIA = "Sepia";
public const string LOAD = "Load";
public const string RESET = "Reset";
}

 

これは単純にスクリプト内に文字列の直打ちは減らしたいから宣言しています。List<String>等を宣言し、インスペクターから足していくとかでも大丈夫です。

次に、実際にメッセージを受け取るクラスを作成します。これは上記のリファレンスを参考にしています。

 

using UnityEngine;
using UnityEngine.UI;
using System.Collections.Generic;
using Utage;

public class UtageMessageReciever
: MonoBehaviour
{
public AdvEngine Engine { get { return this.m_engine ?? (this.m_engine = FindObjectOfType<AdvEngine>()); } }

[SerializeField]
AdvEngine m_engine;

/// summary;
/// イメージエフェクトがあるカメラ
/// summary;
[SerializeField]
Camera m_camera;

/// summary;
/// セピア調フラグの変数名
/// summary
[SerializeField]
string m_sepiaVariableName = "IsSepia";

void Awake()
{
}

//SendMessageコマンドが実行されたタイミング
void OnDoCommand(AdvCommandSendMessage command)
{
switch (command.Name)
{
case CommandDefine.SEPIA:
OnSepia(command);
break;
default:
Debug.Log("Unknown Message:" + command.Name);
break;
}
}

//SendMessageコマンドの処理待ちタイミング
void OnWait(AdvCommandSendMessage command)
{
switch (command.Name)
{
default:
command.IsWait = false;
break;
}
}

private void OnSepia(AdvCommandSendMessage command)
{
// セピアのon/off設定
bool isEnabled = bool.Parse(command.Arg2);
m_camera.GetComponent<UnityStandardAssets.ImageEffects.SepiaTone>().enabled = isEnabled;

// 変数設定
Engine.Param.TrySetParameter(m_sepiaVariableName, isEnabled);
}

 

このクラスではSendMessageでSepiaのコマンドが送られてきたらon/offを設定し、それを変数に保存しています。

m_sepiaVariableNameがセピア調フラグの変数名指定なので、これと同じ名前のフラグを宴のパラメーターに追加します。

今回は「IsSepia」を追加しています。

 

blg19フラグ追加

 

クラスや変数の設定が出来ましたので、新たにゲームオブジェクトを作り、先ほどのスクリプトをアタッチし、変数を設定します。

blg20AdvEngineへの参照も追加してください

 

そして、リファレンスにある通り、AdvEngineのAdvScenarioPlayerコンポーネントのSendMessageTargetに上記で作ったオブジェクトを指定してください。

 

blg21

 

これで準備出来ましたので、実際にシナリオ(エクセル)から呼び出してみます。

 

blg22

 

これでフラグがTrueの間は画面が変更されるはずです。

 

blg16

 

ここで終わり・・・と言いたい所なのですが、現状は二つ問題が有ります。

一つ目はエフェクトの途中でタイトル画面画面に戻るとエフェクトが残ったままになります。

もう一つは途中でセーブし、ロードするとエフェクトが設定されていません。

 

まずはタイトルに戻る時の対応を入れます。

UtageMessageRecieverクラスの中に状態を全てリセットする為のメソッドを追加します。今の所はカメラの処理のみです。

 

    private void Reset()
    {
        m_camera.GetComponent<UnityStandardAssets.ImageEffects.SepiaTone>().enabled = false;
    }

 

そして、宴の中にあるシナリオを終了する処理の中にこれを呼び出す処理を追加します。

AdvScenarioPlayer内のEndScenario()メソッドの最後にメッセージを送る対象(今回は上の方でUtageMessageRecieverのゲームオブジェクトに設定したやつです)に”Reset”のメッセージを送ります。

(現在のバージョンだとAdvScenarioPlayer.csの131行目からです)

 

        ///<summary>
        /// シナリオ終了
        /// </summary>
        public void EndScenario()
        {
            Engine.Clear();
            SendMessageTarget.SendMessage(CommandDefine.RESET);
            isEndScenario = true;
        }

 

“Reset”はCommandDefineの中に足してありますので、そこから指定しています。

これで終了時にリセット処理が呼ばれカメラのリセットが呼ばれます。他の処理を追加した時にも同じ所で纏めて処理は出来ると思います。

 

次はセーブ/ロード処理です。

まずUtageMessageRecieverにロード用メソッドを追加します。

 

    private void Load()
    {
        object isSepia = false;
        if (!Engine.Param.TryGetParameter(m_sepiaVariableName, out isSepia))
        {
            Debug.Log("Param NOT found!");
            return;
        }
        
        m_camera.GetComponent<UnityStandardAssets.ImageEffects.SepiaTone>().enabled = (bool)isSepia;
    }

 

これは変数一覧からフラグを獲得し、見つかった時はその値をカメラに適応させています。

次はシナリオ終了時と同じ様に、ロード時にメッセージを送る処理を追加します。

今回はAdvEngine内のLoadSaveData()メソッドの最後に追加しました

(AdvEngine.csの420行目ぐらい)

 

        ///<summary>
        /// セーブデータのロード
        /// </summary>
        /// <param name="saveData">ロードするセーブデータ</param>
        void LoadSaveData(AdvSaveData saveData)
        {
            Clear();
            saveData.LoadGameData(this);

            //古いセーブデータかを設定しておく
            ScenarioPlayer.IsOldVersion = (saveData.FileVersion <= AdvSaveData.Version2);

            StartScenario(saveData.CurrentSenarioLabel, saveData.CurrentPage, saveData.CurrentGallerySceneLabel);

            // ロード処理
            ScenarioPlayer.SendMessageTarget.SendMessage(CommandDefine.LOAD);
        }

 

一番下にある一行です。今回も”Load”はCommandDefineに追加してあります。

気が付いた方が居るか解りませんが、実はセピア調のフラグ設定はここの部分の為に追加してあります。

ただ、順番的に後で説明するのが面倒だったので、順番を無視して最初に説明を入れてました、すみません・・・

 

これでロード時にもセピア調の設定が呼ばれるはずです。

今回の解説は以上です。

注意事項でも説明した通り、宴の内部を弄っているのであまり推奨出来ません。

主な理由は宴本体がアップデートされた時に差異が出来て入れ直す必要が有ったり、やり過ぎるとそもそもアップデートがしにくくなる事があるので、内部の変更は最小限に収めたい所です。

 

宴ネタは流石にもう当分は無いと思う・・・

 

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中