宴のカスタムコマンド作成について

  • 13
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

「宴」とは?

「宴」はビジュアルノベルをUnityで簡単に作成するためのツールです。シナリオデータはExcelでシンプルに書けるので、複雑なスクリプトの文法を覚える必要はありません。Unityを使っているためPCだけでなく、スマートフォンやブラウザ用のアプリを作ることもできます。ビジュアルノベルに限らず、ゲームの会話シーンの作成を作ることもできます。

(公式サイトより引用)

また、「宴」はアセットストアで購入・ダウンロードが可能です。
https://www.assetstore.unity3d.com/jp/#!/content/15905

カスタムコマンドとは?

「宴」ではカスタムコマンドを作成することで、Excelで使用できるコマンドに独自のものを追加することができます。
Debug.Logを呼び出すサンプルの説明が公式サイトにあります。
http://madnesslabo.net/utage/?page_id=3195

作成例

ではさっそくカスタムコマンドを作成してみます。
どうせ作るなら今までにない機能を「宴」に追加してみたいですね…。

と思っていたらTwitterでこんな動画が!これは「宴」から動かせたら面白いかも…(棒)

ソースも公開されているので、これを「宴」のカスタムコマンドから呼び出すようにしたいと思います。

    public class CustomCommandCycloneX10 : AdvCustomCommandManager
    {
        public override void OnBootInit()
        {
            Utage.AdvCommandParser.OnCreateCustomCommnadFromID += CreateCustomCommand;
        }

        public override void OnClear()
        {
            CycloneX10 cycloneX10 = GetComponent<CycloneX10>();
            if (cycloneX10)
            {
                cycloneX10.pattern = 0;
                cycloneX10.level = 0;
            }
        }

        public void CreateCustomCommand(string id, StringGridRow row, AdvSettingDataManager dataManager, ref AdvCommand command)
        {
            switch (id)
            {
                case "CycloneX10":
                    command = new AdvCommandCycloneX10(row);
                    break;
            }
        }
    }

まず、AdvCustomCommandManagerを継承したクラスを作成します。
OnBootInitが初期化時に呼ばれるので、そこでカスタムコマンドを作成するデリゲートを追加します。
コマンド名は「CycloneX10」とします。
また、シナリオ終了時にOnClearが呼ばれるので、回転を止める処理を書いておきます。

    public class AdvCommandCycloneX10 : AdvCommand
    {
        public AdvCommandCycloneX10(StringGridRow row)
            : base(row)
        {
            this.pattern = ParseCell<int>(AdvColumnName.Arg1);
            this.level = ParseCell<int>(AdvColumnName.Arg2);
        }

        public override void DoCommand(AdvEngine engine)
        {
            CycloneX10 cycloneX10 = engine.GetComponent<CycloneX10>();
            if (cycloneX10 == null)
            {
                cycloneX10 = engine.gameObject.AddComponent<CycloneX10>();
            }

            cycloneX10.pattern = pattern;
            cycloneX10.level = level;
        }

        int pattern;
        int level;
    }

次に、実際にコマンドの処理を行うためのAdvCommandクラスを継承したクラスを作成します。
コマンド処理クラスにはコンストラクタでExcel上のコマンド行の情報が渡されるので、それをパースして保管します。
実際に処理を行う際はDoCommandメソッドが呼ばれます。ここではサイクロンX10を制御するためのコンポーネントを(なければ追加してから)呼び出します。Arg1を回転パターン、Arg2を回転の強さとしました。

作成したソースは以下にまとめて公開しました。
https://github.com/tnayuki/Unity-UtageForCycloneX10

使用方法

まず作成したカスタムコマンドマネージャをシーン中のAdvEngineに追加します。

コンポーネントの追加

さらにExcelに以下のように記述することで…

Excel.png

アセットコンテスト大賞受賞おめでとうございます!

ちょうど本日結果が発表されたUnityアセットコンテストで、「宴」は大賞を受賞しました!
おめでとうございます!

http://blogs.unity3d.com/jp/2015/12/24/unityassetcontestjp1st/

そしてメリークリスマス!

以上、12日目に続きUnity 2 Advent Calendar 2015の24日目として書かせていただきました。

さて、今夜はクリスマスイブ。ひとりで過ごしたり勉強会に参加したり、いろいろな過ごし方があると思いますが、今回作成したカスタムコマンドを使えばUnityとより親密な夜を過ごせるんじゃないでしょうか。
ではぼくはクリスマスプレゼントを買って家に帰ります。みなさんいい夜を!

この投稿は Unity 2 Advent Calendar 201524日目の記事です。