Unity下简易字符串指令调试

Unity下简易字符串指令调试

输入相应的字符串命令即可调用特定的方法,比如让角色等级提升,生成特定数量的Boss等

using System;
using UnityEngine;
using System.Collections.Generic;
using System.Reflection;
using UnityEditor;

public class GMEditor : EditorWindow
{
    public string Input;

    [MenuItem("Tools/GMCmd")]
    static void ShowWindow()
    {
        GetWindow(typeof(GMEditor));
    }

    void OnGUI()
    {
        Input = GUILayout.TextField(Input, GUILayout.Height(30), GUILayout.Width(200));

        if (GUILayout.Button("Submit", GUILayout.Width(100), GUILayout.Height(30)))
        {
            Debug.Log(GMModule.Instance.Call(Input));
        }
    }

}

/// <summary>
/// 指令管理模块
/// </summary>
public class GMModule
{
    private static GMModule _instance;

    //单例
    public static GMModule Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new GMModule();
                _instance.Init();
            }

            return _instance;
        }
    }

    /// <summary>
    /// 存储命令及对应存储方法的字典
    /// </summary>
    private Dictionary<string, MethodInfo> m_methods = new Dictionary<string, MethodInfo>();

    #region Public Methods

    public void Init()
    {
        m_methods.Clear();

        var type = typeof(GMModule);
        var methods = type.GetMethods();
        foreach (var each in methods)
        {
            var attribute = each.GetCustomAttributes(typeof(GMCommondAttribute), false);
            if (attribute != null && attribute.Length > 0)
            {
                GMCommondAttribute gmc = attribute[0] as GMCommondAttribute;
                m_methods.Add(gmc.Cmd.ToLower(), each);
            }
        }
    }

    /// <summary>
    /// 执行指令
    /// </summary>
    public string Call(string input)
    {
        var tmpStr = input.ToLower().Split(' ');
        var cmdStr = tmpStr[0];
        if (m_methods.ContainsKey(cmdStr))
        {
            List<string> param = new List<string>();
            for (int i = 1; i < tmpStr.Length; ++i)
            {
                param.Add(tmpStr[i]);
            }

            var method = m_methods[cmdStr];
            var info = method.GetCustomAttributes(typeof(GMCommondAttribute), false)[0] as GMCommondAttribute;

            if (param.Count != info.ParamNum)
            {
                return "Usage: " + info.Usage;
            }
            else
            {
                return m_methods[cmdStr].Invoke(this, new object[] { param.ToArray() }) as string;
            }
        }
        else
        {
            return "Command Not Found!";
        }
    }

    #region CmdMethod
    [GMCommond("SpBoss", 2, "SpBoss 2 Dragon | 生成Boss")]
    public string SpawnBoss(string[] args)
    {
        //logic to spawn Boos
        return $"Spawn {int.Parse(args[0])} {args[1]}";
    }


    [GMCommond("userId", 0, "userId | 显示玩家ID")]
    public string Help(string[] args)
    {
        int userId = 666;

        //Query logic to get ID

        return "User id is:" + userId;
    }

    [GMCommond("lvUp", 1, "lvUp 80 | 升级到xx ")]
    public string LevelUp(string[] args)
    {
        //ask server to level up

        return "level up to " + args[0];
    }
    
    #endregion


    #endregion
}


/// <summary>
/// 指令特性,有字符串指令,参数个数,用例说明
/// </summary>
[AttributeUsage(AttributeTargets.Method)]
public class GMCommondAttribute : Attribute
{
    public string Cmd;
    public int ParamNum;
    public string Usage;

    public GMCommondAttribute(string cmd, int paramNum, string usage)
    {
        Cmd = cmd;
        ParamNum = paramNum;
        Usage = usage;
    }
}

有点像 字节码模式的简化版

posted @   世纪末の魔术师  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
  1. 1 ありがとう··· KOKIA
ありがとう··· - KOKIA
00:00 / 00:00
An audio error has occurred.

作词 : KOKIA

作曲 : KOKIA

编曲 : 日向敏文

作词 : KOKIA

作曲 : KOKIA

誰もが気付かぬうちに

誰もが気付かぬうちに

何かを失っている

フッと気付けばあなたはいない

思い出だけを残して

せわしい時の中

言葉を失った人形達のように

街角に溢れたノラネコのように

声にならない叫びが聞こえてくる

もしも もう一度あなたに会えるなら

もしも もう一度あなたに会えるなら

たった一言伝えたい

ありがとう

ありがとう

時には傷つけあっても

時には傷つけあっても

あなたを感じていたい

思い出はせめてもの慰め

いつまでもあなたはここにいる

もしも もう一度あなたに会えるなら

もしも もう一度あなたに会えるなら

たった一言伝えたい

ありがとう

ありがとう

もしも もう一度あなたに会えるなら

もしも もう一度あなたに会えるなら

たった一言伝えたい

もしも もう一度あなたに会えるなら

たった一言伝えたい

ありがとう

ありがとう

時には傷つけあっても

時には傷つけあっても

あなたを感じてたい

点击右上角即可分享
微信分享提示