search
LoginSignup
16

More than 5 years have passed since last update.

posted at

updated at

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

「宴」とは?

「宴」はビジュアルノベルを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アセットコンテストで、「宴」は大賞を受賞しました!
おめでとうございます!

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

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
16