オリジナルコマンドの作成

独自のコマンドを作成して任意の処理を追加することができます

    using System;
    using System.Collections;
    using Newtonsoft.Json;

    // 必須定義
    [Serializable]
    [JsonConverter(typeof(JNJsondConverter))]

    //JNCommandを継承
    public class SampleCommand : JNCommand
    {
        //オリジナルパラメーター
        public string originalParam = String.Empty;

        //コンストラクタはマクロ定義からの読み込み処理でコールされないケースがあるので使用しないこと

        //コマンド実行直前の初期化
        public override void Awake(IJNView view)
        {
            //Engineに登録しているViewが渡されるので、キャストで独自のViewが利用可能
            var originalView = view as OriginalView;
        }

        //リソースの読み込み等を行う
        public override IEnumerator AwakeCoroutine()
        {
            yield break;
        }

        //コマンドの本処理
        public override void Execute()
        {
            //コルーチンを使用したい場合はJNCommandではなくJNCoroutineCommandを継承することで
            //public virtual IEnumerator ExecuteCoroutine()が使用できる

            JNDebugLog.Log("Executed the command");
        }

        //コマンドの終了処理
        public override void End()
        {

        }
    }
エンジンとの連携について


コンバーターの作成

Newtonsoft.Jsonの仕様に沿って、Jsonコンバーターを作成する

    using System;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;

    public class SampleConverter : JsonConverter
    {
        public override bool CanConvert(Type objectType)
        {
            return objectType == typeof(IJNJsonConvert);
        }
        public override bool CanRead { get { return true; } }
        public override bool CanWrite { get { return false; } }

        // JSONデータからインスタンスを作成
        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            // JSON Read
            JObject jobject = JObject.Load(reader);
            var targetType = jobject[JNConst.COMMAND_TYPE_PARAM_KEY].ToString();

            //targetTypeから変換する型を特定して、デシリアライズして返却する
            switch (targetType)
            {
                //Jsonにおける定義名称は自由に設定
                case nameof(SampleCommand):
                case "TestCommand":
                    return jobject.ToObject();

                //独自コマンドを増やす場合は、定義を増やす
                case nameof(SampleCommand2):
                case "TestCommand2":
                    return jobject.ToObject();

                default:
                    throw new NotSupportedException("コンバート失敗");
            }

        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            throw new NotImplementedException();
        }
    }

コンバーターの省略


コンバーターの登録

作成したコンバーターをエンジンに登録する

void Start()
{
    //独自のコマンドのコンバーターを登録する
    JNJsonConverter.OriginalConverter = new SampleConverter();

    //Engine SetUp...

    //Engine Start...
}
void Start()
{
    //コンバータークラスを作らず、簡易的にデリゲートでコンバートを定義できる
    //JNJsonConverter.OriginalConverter = new SampleConverter();
    JNJsonConverter.OriginalConvertDelegate = (str, obj) =>
    {
        switch (str)
        {
            case "TestCommand":
                return obj.ToObject();
            default:
                return null;
        }
    };

    //Engine SetUp...

    //Engine Start...
}


シナリオで使用する

作成したコマンドをシナリオファイルで定義し、使用する

{
    "name" : "sample_original",
    "scenario":[
        {
            "commands": [
                {
                    /* Original Param */
                    "originalParam": "value",

                    "type": "TestCommand"
                }
            ]
        }
    ]
}