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. [ML] 工程师使用 Keras 的步骤指引

    设置 import numpy as np import tensorflow as tf from tensorflow import keras 介绍 在训练模型之前准备数据(将其转换为 NumP ...

  2. [FAQ] Error: com.mysql.jdbc.Driver not loaded. :jdbc_driver_library

    以上问题出现在 logstash.conf 未配置好 MySQL 的 JDBC 驱动时导致的错误提示. 首先,下载好 MySQL JDBC 驱动库,可以放到 logstash.conf 所在当前目录或 ...

  3. [BlockChain] 三方互惠是公共区块链得以发展的基石, dApp数字通证的运转需要可持续性玩法

    ------------------------------- 公链 旷工    开发者/用户 ------------------------------- -------------------- ...

  4. dotnet 根据基线包版本实现库版本兼容

    本文来告诉大家如何根据 基线包版本 的功能来实现自动在构建过程中,告诉开发者,当前版本是否存在不兼容旧版本的变更.其不兼容变更包括二进制中断变更和 API 不兼容变更和源代码中断变更.可以让库开发者花 ...

  5. PostMan接口测试实用小点

    PostMan接口测试实用小点 1. 接口测试变量存取操作 在Postman中有很多地方可以存储一些变量,这里只介绍经常使用的环境变量.变量设置后,在UI界面可以通过{{变量名}}获取到对应值. 在环 ...

  6. 003_Orcad菜单讲解与偏好设置

    003_Orcad菜单讲解与偏好设置 菜单栏用的比较多的是File和Options项. 网格建议用lines,比较方便对齐. Auto Reference和Intertool Commuication ...

  7. SpringMVC学习二(日期参数/数据保存/重定向)

    接受的参数为日期类型 controller进行数据保存 Controller如何进行重定向跳转 1.对于前端页面传来日期类型的数据时如何进行处理,有两种方法 1.1在对应的Controller中插入代 ...

  8. Solution Set - 加训 CF!

    加训一些 CF 题,这里写一些简要题解,可能是草稿. 暂定只做 Div.1 的题和 Div.1+Div.2 的后一半题.

  9. 02.go-admin IDE配置配置命令启动方式讲解笔记

    目录 go-admin版本 视频地址 一.代码地址 二.在线文档 三.首次配置需要初始化数据库资源信息(已初始化过数据库的,跳过此步) 配置数据库迁移 五.配置启动项目,用goland IDE进行启动 ...

  10. python教程6.4-json序列化

    序列化:dumps,编码,将python类型转成json对象 反序列化:loads,解码,将json对象转成python对象 pickle 模块提供了四个功能:dumps.loads.dump.loa ...