カスタムコマンドの使い方


投稿日:2015年10月7日 | 最終更新日:2024年5月26日

エクセル上で使用するコマンドに独自定義のコマンドを追加したり、既存のコマンドの内容を書き換える方法を紹介します。

作成手順

サンプルのソースコードは、Utage\Sample\Scripts\SampleCustomCommand.cs にあります。

サンプル

サンプルとして、Text列の内容をUnityのDebug.Logとして出力するコマンド「DebugLog」を作ってみましょう。

コードの記述

カスタムコマンドは、AdvCustomCommandManagerを継承したコンポーネント作成し、コールバックを登録することで作成可能です。

using UnityEngine;

namespace Utage
{
    public class CustomCommandSample : AdvCustomCommandManager
    {
        public override void OnBootInit()
        {
            Utage.AdvCommandParser.OnCreateCustomCommandFromID+= CreateCustomCommand;
        }

        //AdvEnginのクリア処理のときに呼ばれる
        public override void OnClear()
        {
        }

        //カスタムコマンドの作成用コールバック
        public void CreateCustomCommand(string id, StringGridRow row, AdvSettingDataManager dataManager, ref AdvCommand command )
        {
            switch (id)
            {
                //既存のコマンドを改造コマンドに変えたい場合は、IDで判別
                //コメントアウトを解除すれば、テキスト表示がデバッグログ出力のみに変わる
//              case AdvCommandParser.IdText:
//                  command = new CustomAdvCommandText(row);
//                  break;
                //新しい名前のコマンドを作る
                case "DebugLog":
                    command = new AdvCommandDebugLog(row);
                    break;
            }
        }
    }
}

各カスタムコマンドを処理するために、AdvCommandを継承したクラスを作成する必要があります。


    //Textの内容をデバッグログで出力するカスタムコマンド
    public class AdvCommandDebugLog : AdvCommand
    {
        public AdvCommandDebugLog(StringGridRow row)
            :base(row)
        {
            //コンストラクタでParseすると、インポート時にエラーがでる

            //「Text」列の文字列を取得
            this.log = ParseCell<string>(AdvColumnName.Text);
        }

        //コマンド実行
        public override void DoCommand(AdvEngine engine)
        {
            Debug.Log(log);
        }

        string log;
    }

    // テキスト表示コマンドを書き換える。
    // あくまでサンプルとして、ログを出力するだけに
    public class CustomAdvCommandText : AdvCommand
    {
        public CustomAdvCommandText(StringGridRow row)
            : base(row)
        {
            //「Text」列の文字列を取得
            this.log = ParseCell<string>(AdvColumnName.Text);
        }

        //コマンド実行
        public override void DoCommand(AdvEngine engine)
        {
            Debug.Log(log);
        }

        string log;
    }

・コンストラクタで、Arg1やTextなどのエクセルの内容を解析・取得する
・DoCommandでコマンドの実行処理をする
というのが基本です。
ファイルをロードしたり、Wait処理をすることも可能です。詳しい使い方は、既存のコマンドのソースコードを参考にしてください。

AdvEngineにAddComponent

作成したコンポーネントは、必ずAdvEngineにAddComponentする必要があります。

セーブロードにも対応する

セーブロードに対応する場合は、セーブロードを独自拡張するを参考に必要な情報をセーブしてください。

注意点

カスタムコマンドは、基本的には「コマンドを追加」する形で使ってください。
テキスト表示のような既存のコマンドを書き換えるのは非推奨です。既存のコマンドの内部処理はアップデートで変わっていくので、互換性をとるのが難しくなるからです。