首页 > 其他分享 >Unity下简易字符串指令调试

Unity下简易字符串指令调试

时间:2023-02-22 18:12:14浏览次数:65  
标签:return methods var Unity 字符串 GMCommondAttribute public 调试 string

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;
    }
}

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

标签:return,methods,var,Unity,字符串,GMCommondAttribute,public,调试,string
From: https://www.cnblogs.com/Firepad-magic/p/17145379.html

相关文章

  • golang 字符串函数
    1.统计字符串的长度,按字节进行统计packagemainimport"fmt"funcmain(){ vars1string="hello,世界" fmt.Printf("s1字符串的长度为:%v",len(s1))//汉字为......
  • 案例:判断字符串abcoefoxyozzopp中出现次数最多的字符,并统计其次数
        //1.案例:判断字符串abcoefoxyozzopp中出现次数最多的字符,并统计其次数    varstr='abcoefoxyozzopp';    varo={};    fo......
  • 【iOS】Xcode 真机调试 App 启动长时间挂起
    导读: 最近在真机调试的过程中,突然出现了在App启动的时候长时间挂起卡顿现象,每次编译运行都会卡在启动界面近乎1分钟的情况,绝对令人崩溃。产生现象最开始的时候,是......
  • Xcode真机调试 —— 不使用数据线
    在身边没有数据线的情况下,是否可以进行真机调试?答案是肯定的。真机必须满足以下两个条件:1、电脑和手机处于同一个WIFI下;2、手机设备必须之前信任过电脑,并且配置过远程......
  • 进制,字符串,
     privatestringStringToHexString(strings,Encodingencode){byte[]b=encode.GetBytes(s);//按照指定编码将string编程字节数组......
  • Unity Shader标准光照模型的实现
    1Shader"Custom/P_Illumination"2{3Properties{4_BasicColor("基础颜色",Color)=(1.0,1.0,1.0,1.0)5_SpecularColor("高光颜色",Colo......
  • 使用 gdb 工具调试 Go
    排除应用程序故障是比较复杂的,特别是处理像Go这样的高并发语言。它更容易在具体位置使用print打印语句来确定程序状态,但是 这个方法 很难根据条件发展去动态响应 你......
  • php调试配置
    错误信息输出错误日志nginx把对php的请求发给php-fpmfastcgi进程来处理,默认的php-fpm只会输出php-fpm的错误信息,在php-fpm的errorslog里也看不到php的errorlog。原因是......
  • SOAP错误:错误代码:VersionMismatch,错误字符串:错误版本
    几经查找原因原来只需要把:<?xmlversion="1.0"encoding="utf-8"?><soap12:Envelopexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.......
  • 0x05_My-OS显示字符串和任意参数
    先看看效果: 要解决两个问题,第一个如何显示字符串,printf?我之前已经说了所有的头文件都要自己写,printf是stdio里的可是我们没有stdio我们要通过画像素点的方式显示字符......