【C#】写了一个游戏控制台,求改进

  1. 去年

    如题所示,楼主为自己的游戏写了一个控制台,主要是通过C#的反射来进行的,其中输入输出的系统依靠U3D内置的输入输出。
    此代码能够处理例如abc.def(1,1,1,1)或者不带参数abc.def()格式的命令,但是只能对静态类或者类中的静态方法处理,不能获取实例(其实是因为格式所限),例如本算法解析Player.GetInstance().AddHealth(1)就会执行Player.GetInstance(),以及难以对付层级结构多于2的类别,例如GameObject.transform.rotate(1,1,1)就会认为GameObject是类,“transform.rotate”这个字符串是方法,因此会执行不出来。
    不知道有没有什么改进的办法能够:
    1)执行某个类的实例的实例方法;
    2)解析更加复杂的格式。
    楼主自己的想法是,对于(1),增加一个位置ins用于存放所需类的实例,使用的时候先把ins放入该实例,然后对实例进行实例化方法,结束后再清空位置ins。用的时候就是三条命令:(如果【ins】代表把结果放入位置,【ref】代表使用位置;【~ins】代表清空)
    ins Player.GetInstance();
    ref.AddHealth(1);
    ~ins
    对于(2),这貌似比(1)要复杂得多,楼主还没有什么解决的方法。下面放上代码。
    。。。。为什么不能直接贴为什么非要放附件啊。。。。!!!
    code.txt

  2. 京斯

    2楼 2017年12月30日 管理员

    好麻烦,发不上去是防火墙误报导致的
    现在调整设置后大概解决了

    -----------------------------------------------------------------------------------------------
    using System;
    using System.Collections;
    using System.Reflection;
    
    public class CmdRecorder{
    	public char[] cmd;//define a pointer to an array
    	char pt;
    	public CmdRecorder(){
    		cmd = new Char[32];
    		pt = (char)0;
    	}
    
    	public void Append(char cr){
    		if (pt < 32) {
    			cmd [pt] = cr;
    			pt += (char)1;
    		}
    		return;
    	}
    
    	public override string ToString(){
    		string x =new string(cmd);
    		return x;
    	}
    
    	public void Clear(){
    		cmd = new char[32];//create and go to new array
    		pt = (char)0;
    	}
    }
    
    public static class CmdExecuter
    {
    	public static CmdRecorder cr= new CmdRecorder();
    
    	public static string[] AnalyseString()
    	{
    		string str = cr.ToString ();
    		string cls =null;
    		string func =null;
    		string param =null;
    		int i;
    		int ct=0;
    		for (i = 0; i < str.Length; i++) {
    			if (str [i] == '.') {
    				if (ct == 0) {
    					cls = str.Substring (0, i)+"";
    					ct = i;
    				} 
    			}
    			if (str [i] == '('&&cls!=null) {
    				func = str.Substring(ct+1, i-ct-1)+"";
    				ct = i;
    			}
    			if (str [i] == ')'&&func!=null) {
    				param = str.Substring (ct+1, i-ct-1)+"";
    			}
    		}
    
    		string[] sg = { cls, func, param };
    		return sg;
    	}
    
    	public static string[] AnalyseParameter(string str)
    	{
    		return str.Split (',');
    	}
    
    	public static void conexecute(){
    		string[] strg = AnalyseString ();
    		string[] strg1 = AnalyseParameter (strg[2]);
    		//Debug.Log (strg[0]+"_"+strg[1]+"_"+strg[2]);
    		//for (int i = 0; i < strg1.Length; i++) {
    			//Debug.Log (strg1 [i]);
    		//}
    		Type tp= null;
    		MethodInfo md=null;
    		ParameterInfo[] pi=null;
    		ArrayList obj = new ArrayList();
    		//Type[] tpg=null;
    		if (strg[0] != null) {
    			tp = Type.GetType (strg [0]);
    		}
    		if (tp != null && strg [1] != null) {
    			md = tp.GetMethod (strg [1]);
    		}
    		if (md != null) {
    			pi = md.GetParameters ();
    		}
    		if (tp == null || md == null) {
    			cr.Clear ();
    			return;
    		}
    		Debug.Log (pi);
    		if (pi != null) {
    			for (int j = 0; j < pi.Length; j++) {
    				obj.Add (int.Parse (strg1 [j]));//all change to int type
    			}
    			md.Invoke (md, obj.ToArray ());
    		} else {
    			md.Invoke (md,null);
    		}
    		cr.Clear ();
    		return;
    	}
    }
    ----------------------------------------------------------------------------------------------------
  3. @京斯 原来不能发代码是因为防火墙保护造成的,是否是为了防止恶意的javascript程序破坏论坛呢?


    不知对在下写的狗屁玩意儿有什么评价呢?

 

后才能发言