//快速计算 protected static bool NumberMath2Value(char opCode, CQ_Value left, CQ_Value right, out CQ_Value returnValue) { try { returnValue = new CQ_Value(); Type retType = NumberUtil.GetReturnType_Math2Value(left.m_type, right.m_type); double leftValue = left.GetNumber(); // GetDouble(left.m_type, left.GetValue()); double rightValue = right.GetNumber(); // GetDouble(right.m_type, right.GetValue()); double finalValue; switch (opCode) { case '+': finalValue = leftValue + rightValue; break; case '-': finalValue = leftValue - rightValue; break; case '*': finalValue = leftValue * rightValue; break; case '/': finalValue = leftValue / rightValue; break; case '%': finalValue = leftValue % rightValue; break; default: throw new Exception("Invalid math operation::opCode = " + opCode); } if (NumberUtil.IsNumberType(retType)) { returnValue.SetNumber(retType, NumberUtil.ConvertNumber(finalValue, retType)); } return(true); } catch (Exception) { returnValue = CQ_Value.Null; return(false); } }
public CQ_Value ComputeValue(CQ_Content content) { #if CQUARK_DEBUG content.InStack(this); #endif object[] list = new object[_expressions.Count - 1]; int count = _expressions[0] == null ? (_expressions.Count - 1) : (int)_expressions[0].ComputeValue(content).GetNumber(); // if(count == 0) // throw new Exception("不能创建0长度数组"); CQ_Value vcount = new CQ_Value(); vcount.SetNumber(typeof(int), count); for (int i = 0; i < _expressions.Count - 1; i++) { list[i] = (_expressions[i + 1].ComputeValue(content).GetObject()); } CQ_Value[] param = new CQ_Value[] { vcount }; CQ_Value outvalue = CQ_Value.Null; //这几行是为了快速获取Unity的静态变量,而不需要反射 if (!Wrap.New(type.typeBridge.type, param, out outvalue)) { outvalue = type._class.New(content, param); } object obj = outvalue.GetObject(); for (int i = 0; i < list.Length; i++) { type._class.IndexSet(content, obj, i, list[i]); } #if CQUARK_DEBUG content.OutStack(this); #endif return(outvalue); }
void OnGUI() { if (GUI.Button(new Rect(0, 0, 200, 50), "Eval use String")) { string callExpr = "ScriptClass4 sc =new ScriptClass4();\n" + "sc.defHP1=100;\n" + "sc.defHP2=200;\n" + "return sc.GetHP();"; CQuarkParagraph block = new CQuarkParagraph(); CQuark.CQ_Value i = block.Execute(callExpr); result = "result=" + i; } if (GUI.Button(new Rect(200, 0, 200, 50), "Eval use Code")) { //得到类型 CQuark.IType typeOfScript = CQuark.AppDomain.GetTypeByKeyword("ScriptClass4"); CQuark.CQ_Content content = new CQuark.CQ_Content(); //调用脚本类构造创造一个实例 var thisOfScript = typeOfScript._class.New(content, new CQuark.CQ_Value[0]).GetObject(); //调用脚本类成员变量赋值 //Debug.LogWarning(thisOfScript+","+ typeOfScript+","+ typeOfScript.function); CQuark.CQ_Value v1 = new CQuark.CQ_Value(); v1.SetNumber(typeof(int), 150); CQuark.CQ_Value v2 = new CQuark.CQ_Value(); v2.SetNumber(typeof(int), 300); typeOfScript._class.MemberValueSet(content, thisOfScript, "defHP1", v1); typeOfScript._class.MemberValueSet(content, thisOfScript, "defHP2", v2); //调用脚本类成员函数 var returnvalue = typeOfScript._class.MemberCall(content, thisOfScript, "GetHP", new CQuark.CQ_Value[0]); result = "result=" + returnvalue; } GUI.Label(new Rect(0, 50, 200, 50), result); }