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

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

Unity下简易字符串指令调试的更多相关文章

  1. Win8/Win7系统下用IE11浏览器调试js脚本

    作为一个web开发者,调试js脚本是工作中的一部分,但是并不是所有的浏览器都会很好的兼容js脚本的.随着win8系统的发布,ie11也慢慢进入了大家的视野,ie11的众多优点及新特性就不必多说了(全面 ...

  2. [转] linux下的c/c++调试器gdb

    PS:1. 断点C++类函数,用b 命名空间::类名::方法名 2. 编译参数一定要加-g,才可断点调试 http://www.cnblogs.com/xd502djj/archive/2012/08 ...

  3. 解决ubuntu unity下gvim菜单消失的问题

    #问题描述:在终端下用gvim 指令打开 gvim就不显示菜单.在不启用unity的桌面环境下用终端打开gvim是有菜单的.从程序菜单中打开gvim是显示菜单的.用sudo打开gvim也可以显示菜单, ...

  4. Unity 3D 简易制作摄像机围绕物体随鼠标旋转效果

    Unity 3D 简易制作摄像机围绕物体随鼠标旋转效果 梗概: 一. 摄像机围绕目标物体旋转, 即摄像机离目标物体有一定的距离且旋转轴心为该物体的位置. 二. 当目标物体被障碍物挡住后, 需要将摄像机 ...

  5. linux下的c/c++调试器gdb

    Reference:  http://www.cnblogs.com/xd502djj/archive/2012/08/30/2663960.html linux下的c/c++调试器gdb gdbLi ...

  6. Unity消息简易框架 Advanced C# messenger

    Unity消息简易框架 Advanced C# messenger Unity C# 消息机制  [转载 雨凇MOMO博客] https://www.xuanyusong.com/archives/2 ...

  7. Unity下的开发框架--适应web和微端游戏异步资源请求的框架

    一.   内容简介: 1.   框架对Web与微端游戏特性的支持: Web和微端游戏最重要的特性是,资源是持续从服务器上即时下载下来的.而保证体验流畅的关键就是保证资源下载分散到持续的体验过程中,并保 ...

  8. LyScript 获取上一条与下一条指令

    LyScript 插件默认并没有提供上一条与下一条汇编指令的获取功能,当然你可以使用LyScriptTools工具包直接调用内置命令得到,不过这种方式显然在效率上并不理想,我们需要在LyScript插 ...

  9. 使用B或BL跳转时,下一条指令的地址是这样计算的

    B跳转指令:它是个相对跳转指令,其机器码格式如下: [31:28]位是条件码:[27:24]位为“1010”(0xeaffffff)时,表示B跳转指令,为“1011”时,表示BL跳转指令:[23:0] ...

  10. Windows内核下操作字符串!

    * Windows内核下操作字符串! */ #include <ntddk.h> #include <ntstrsafe.h> #define BUFFER_SIZE 1024 ...

随机推荐

  1. 划重点|iOS15正式发布, 全新的通知推送系统,你必须要知道!

    ​简介: 今年友盟+联合达摩院决策智能实验室讲算法技术,推出国内首个智能推送功能,帮助产品运营人员实现一键式触达的精细化运营.通过精心打磨的在线学习与优化算法,对推送人群与推送文案进行精准匹配,最大化 ...

  2. [GPT] Unable to negotiate with xx.xx.xx.xx port 22: no matching host key type found. Their offer: ssh-rsa,ssh-dss

      这个错误通常发生在 SSH 客户端无法找到与 SSH服务器 匹配的主机密钥类型时. 这可能是因为SSH服务器配置为使用SSH客户端不支持的主机密钥类型. 要解决此问题,您需要将缺少的主机密钥类型添 ...

  3. WPF 应用启动过程同时启动多个 UI 线程且访问 ContentPresenter 可能让多个 UI 线程互等

    在应用启动过程里,除了主 UI 线程之外,如果还多启动了新的 UI 线程,且此新的 UI 线程碰到 ContentPresenter 类型,那么将可能存在让新的 UI 线程和主 UI 线程互等.这是多 ...

  4. 2019-4-29-Roslyn-将这个文件放在你的项目文件夹,无论哪个控制台项目都会输出林德熙是逗比...

    title author date CreateTime categories Roslyn 将这个文件放在你的项目文件夹,无论哪个控制台项目都会输出林德熙是逗比 lindexi 2019-4-29 ...

  5. 利用MOS管构成基本的数字逻辑门

    欢迎各位朋友关注"郝旭帅电子设计团队",本微信公众号会定时更新相关技术类资料.软件等等,希望各位朋友都能在本微信公众号获得一些自己想要的"东西". 非门原理图中 ...

  6. 纯css高斯背景模糊(毛玻璃,伪元素,完整实例)

    先上效果图: 写博客不管是做笔记还是干啥,直接上源码不行么,还不放效果图,拆分成几段谁慢慢看,慢慢理解去 自己动手,丰衣足食,上代码: <!DOCTYPE HTML> <html l ...

  7. Oracle细粒度审计策略

    场景:经常需要查看某些表做了哪些操作. Oracle中,可以添加细粒度策略来获取,如下: begin dbms_fga.add_policy(object_schema => 'portxx', ...

  8. 开源电子邮件营销平台 listmonk 使用教程

    做产品肯定要做电子邮件营销,特别是面向海外的产品,电子邮件营销已成为企业与客户沟通.建立品牌忠诚度和推动销售的重要工具,可以直接接触到目标受众,提供个性化内容,并以相对较低的成本获得可观的投资回报.你 ...

  9. 文件上传--php user.ini详解

    文件上传 参考文档:https://www.php.net/manual/zh/configuration.file.per-user.php 如果你的 PHP 以模块化运行在 Apache 里,则用 ...

  10. HDU 多校 2023 Round #6 题解

    HDU 多校 2023 Round #6 题解 \(\text{By DaiRuiChen007}\) A. Count Problem Link 题目大意 求有多少个长度为 \(n\),字符集大小为 ...