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;
}
}
有点像 字节码模式的简化版
Unity下简易字符串指令调试的更多相关文章
- Win8/Win7系统下用IE11浏览器调试js脚本
作为一个web开发者,调试js脚本是工作中的一部分,但是并不是所有的浏览器都会很好的兼容js脚本的.随着win8系统的发布,ie11也慢慢进入了大家的视野,ie11的众多优点及新特性就不必多说了(全面 ...
- [转] linux下的c/c++调试器gdb
PS:1. 断点C++类函数,用b 命名空间::类名::方法名 2. 编译参数一定要加-g,才可断点调试 http://www.cnblogs.com/xd502djj/archive/2012/08 ...
- 解决ubuntu unity下gvim菜单消失的问题
#问题描述:在终端下用gvim 指令打开 gvim就不显示菜单.在不启用unity的桌面环境下用终端打开gvim是有菜单的.从程序菜单中打开gvim是显示菜单的.用sudo打开gvim也可以显示菜单, ...
- Unity 3D 简易制作摄像机围绕物体随鼠标旋转效果
Unity 3D 简易制作摄像机围绕物体随鼠标旋转效果 梗概: 一. 摄像机围绕目标物体旋转, 即摄像机离目标物体有一定的距离且旋转轴心为该物体的位置. 二. 当目标物体被障碍物挡住后, 需要将摄像机 ...
- linux下的c/c++调试器gdb
Reference: http://www.cnblogs.com/xd502djj/archive/2012/08/30/2663960.html linux下的c/c++调试器gdb gdbLi ...
- Unity消息简易框架 Advanced C# messenger
Unity消息简易框架 Advanced C# messenger Unity C# 消息机制 [转载 雨凇MOMO博客] https://www.xuanyusong.com/archives/2 ...
- Unity下的开发框架--适应web和微端游戏异步资源请求的框架
一. 内容简介: 1. 框架对Web与微端游戏特性的支持: Web和微端游戏最重要的特性是,资源是持续从服务器上即时下载下来的.而保证体验流畅的关键就是保证资源下载分散到持续的体验过程中,并保 ...
- LyScript 获取上一条与下一条指令
LyScript 插件默认并没有提供上一条与下一条汇编指令的获取功能,当然你可以使用LyScriptTools工具包直接调用内置命令得到,不过这种方式显然在效率上并不理想,我们需要在LyScript插 ...
- 使用B或BL跳转时,下一条指令的地址是这样计算的
B跳转指令:它是个相对跳转指令,其机器码格式如下: [31:28]位是条件码:[27:24]位为“1010”(0xeaffffff)时,表示B跳转指令,为“1011”时,表示BL跳转指令:[23:0] ...
- Windows内核下操作字符串!
* Windows内核下操作字符串! */ #include <ntddk.h> #include <ntstrsafe.h> #define BUFFER_SIZE 1024 ...
随机推荐
- [FAQ] Win10 找到打开 hosts 文件
1. Win+R 打开运行窗口. 2. 输入命令 C:\Windows\System32\drivers\etc 回车. Refer:windows hosts Link:https://www.cn ...
- [FE] Quasar BEX 所有位置类型 types
科普:[FE] Quasar BEX 预览版指南 New Tab Quasar BEX 的默认类型是 New Tab,在新 tab 栏里打开内容. Dev Tools 也就是在开发者栏里面的内容. O ...
- [Go] golang 去除 URI 链接中的 query string 参数
思路是使用 golang 的 net/url 包提供的方法解析url各部分,其中 URL.RawQuery 为查询参数部分,格式如 :a=b&c=d 然后我们再通过 strings.Repla ...
- [Go] golang 执行 Linux 系统 command
执行系统 shell 命令示例: fileDir := "files/"out, err := exec.Command("sh", "-c" ...
- dotnet 6 使用 HttpWebRequest 进行 POST 文件将占用大量内存
我有用户给我报告一个内存不足的问题,经过了调查,找到了依然是使用已经被标记过时的 HttpWebRequest 进行文件推送,推送过程中,由于 System.Net.RequestStream 将会完 ...
- dotnet 使用 WpfAnalyzers 辅助分析 WPF 应用代码缺陷
引入 WpfAnalyzers 代码分析工具,相当于给团队加入一个免费的代码审查工具人,可以帮忙在日常开发找到很多代码缺陷.加入 WpfAnalyzers 代码分析工具,可以减少代码编写里的低级缺陷, ...
- 阿里面试Redis最常问的三个问题:缓存雪崩、击穿、穿透(带答案)
那提到Redis我相信各位在面试,或者实际开发过程中对缓存雪崩,穿透,击穿也不陌生吧,就算没遇到过但是你肯定听过,那三者到底有什么区别,我们又应该怎么去防止这样的情况发生呢,我们有请下一位受害者. 面 ...
- 第一章 Jenkins安装配置
Jenkins官网 # 官网: https://www.jenkins.iohttps://www.jenkins.io/zh/ # docker安装: https://www.jenkins.io/ ...
- LVGL 定时器
LVGL 8.0 以后好像取消了自定义任务模块,想要使用多线程只能使用系统的线程. 一.定时器结构体 typedef struct _lv_timer_t { uint32_t period; // ...
- Solution Set - Splay
A[洛谷P3369]维护集合,支持插入,删除,查询\(x\)的排名,查询排名\(x\)的数,查询前驱,查询后继. B[洛谷P3391]维护一个序列,支持区间翻转. C[洛谷P3380]维护数列,支持单 ...