private static void Parse(string json, string name) { AIRuntimeTreeData data = AIRuntimeUtil.Parse(json, name); AIRuntimeTaskData task = data.task; ParseTask(task); }
private static void ParseTask(AIRuntimeTaskData task) { if (task.mode == Mode.Custom) { //避免不同task 生成同一份代码 加速生成 if (!maker_list.Contains(task.type)) { GenerateTaskCode(task); AICppMaker.GenerateTaskCode(task); } } if (task.children != null) { for (int i = 0, max = task.children.Count; i < max; i++) { ParseTask(task.children[i]); } } }
private static void Generate_head_file(AIRuntimeTaskData task) { string ai_n_h = ai_h; ai_n_h = ai_n_h.Replace("[*Name*]", task.type); string s_var = string.Empty; if (task.vars != null) { for (int i = 0, max = task.vars.Count; i < max; i++) { s_var += TransCppType(task.vars[i].type) + " " + task.vars[i].name + ";\n\t"; } } ai_n_h = ai_n_h.Replace("[*Arg*]", s_var); string dest_h = Path.Combine(path_dest, "AIRuntime" + task.type + ".h"); File.WriteAllText(dest_h, ai_n_h); }
private static void Generate_cpp_file(AIRuntimeTaskData task) { string ai_n_c = ai_c; ai_n_c = ai_n_c.Replace("[*Name*]", task.type); string dest_c = Path.Combine(path_dest, "AIRuntime" + task.type + ".cpp"); if (task.vars != null) { string rel_str = string.Empty; for (int i = 0, max = task.vars.Count; i < max; i++) { AIVar var = task.vars[i]; if (var.type == "GameObject" || var.type == "Transform") { rel_str += "delete " + var.name + ";"; } } ai_n_c = ai_n_c.Replace("[*arg-0*]", rel_str); //Init(AITaskData* data) string init_str = string.Empty; for (int i = 0, max = task.vars.Count; i < max; i++) { string val = "data->vars[\"" + task.vars[i].name + "\"]->val"; string op = GetOpByType(task.vars[i].type, val); if (!string.IsNullOrEmpty(op)) { if (task.vars[i] is AITreeSharedVar) { AITreeSharedVar var = task.vars[i] as AITreeSharedVar; if (!var.IsShared) { init_str += var.name + " = " + op + " \n\t"; } } else { init_str += task.vars[i].name + " = " + op + " \n\t"; } } } ai_n_c = ai_n_c.Replace("[*arg-1*]", init_str); //OnTick() string tick_str = string.Empty; string imp_str = string.Empty; if (task.vars != null) { for (int i = 0, max = task.vars.Count; i < max; i++) { imp_str += "," + task.vars[i].name; if (task.vars[i] is AITreeSharedVar) { AITreeSharedVar var = task.vars[i] as AITreeSharedVar; if (var.IsShared) { tick_str += var.name + " = " + GetTreeVarCode(var.type, var.BindName) + "\n\t"; } } } } ai_n_c = ai_n_c.Replace("[*arg-2*]", tick_str); ai_n_c = ai_n_c.Replace("[*tickarg*]", imp_str); } else { ai_n_c = ai_n_c.Replace("[*arg-0*]", ""); ai_n_c = ai_n_c.Replace("[*arg-1*]", ""); ai_n_c = ai_n_c.Replace("[*arg-2*]", ""); ai_n_c = ai_n_c.Replace("[*tickarg*]", ""); } File.WriteAllText(dest_c, ai_n_c); }
public static void GenerateTaskCode(AIRuntimeTaskData task) { Init(task.type); Generate_head_file(task); Generate_cpp_file(task); }
private static void GenerateTaskCode(AIRuntimeTaskData task) { //声明代码的部分 CodeCompileUnit compunit = new CodeCompileUnit(); CodeNamespace sample = new CodeNamespace("AI.Runtime"); //引用命名空间 sample.Imports.Add(new CodeNamespaceImport("UnityEngine")); compunit.Namespaces.Add(sample); //在命名空间下添加一个类 CodeTypeDeclaration wrapClass = new CodeTypeDeclaration("AIRuntime" + task.type + " : AIRunTimeBase"); sample.Types.Add(wrapClass); //添加成员 if (task.vars != null) { for (int i = 0, max = task.vars.Count; i < max; i++) { CodeTypeReference type = new CodeTypeReference(task.vars[i].type); CodeMemberField field = new CodeMemberField(type, task.vars[i].name); field.Attributes = MemberAttributes.Public; wrapClass.Members.Add(field); } } //为这个类添加一个方法 Init() CodeMemberMethod method = new CodeMemberMethod(); method.Name = "Init"; method.Attributes = MemberAttributes.Override | MemberAttributes.Public; method.Parameters.Add(new CodeParameterDeclarationExpression(typeof(AIRuntimeTaskData), "data")); method.ReturnType = new CodeTypeReference(typeof(void));//返回值 AddState(method, "base.Init(data);"); if (task.vars != null) { for (int i = 0, max = task.vars.Count; i < max; i++) { if (task.vars[i] is AITreeSharedVar) { AITreeSharedVar var = task.vars[i] as AITreeSharedVar; if (!var.IsShared) { InnerMakeTask(var, i, method); } } else { AIVar var = task.vars[i]; if (var.val != null) { InnerMakeTask(var, i, method); } } } } //OnTick() CodeMemberMethod method2 = new CodeMemberMethod(); method2.Name = "OnTick"; method2.Attributes = MemberAttributes.Override | MemberAttributes.Public; method2.Parameters.Add(new CodeParameterDeclarationExpression(typeof(XEntity), "entity")); method2.ReturnType = new CodeTypeReference("AIRuntimeStatus");//返回值 string state = "return AITreeImpleted." + task.type + "Update(entity"; if (task.vars != null) { for (int i = 0, max = task.vars.Count; i < max; i++) { state += ", " + task.vars[i].name; if (task.vars[i] is AITreeSharedVar) { AITreeSharedVar var = task.vars[i] as AITreeSharedVar; if (var.IsShared) { string st = "var in" + var.name + " = _tree.GetVariable(\"" + var.BindName + "\"); "; AddState(method2, st); st = "if (in" + var.name + " != null) " + var.name + " = (" + var.type + ")in" + var.name + ";"; AddState(method2, st); } } } } state += ");"; method2.Statements.Add(new CodeSnippetStatement("\t\t\t" + state)); wrapClass.Members.Add(method); wrapClass.Members.Add(method2); //output StringBuilder fileContent = new StringBuilder(); using (StringWriter sw = new StringWriter(fileContent)) { CodeDomProvider.CreateProvider("CSharp").GenerateCodeFromCompileUnit(compunit, sw, new CodeGeneratorOptions()); } string filePath = unity_AI_code + "AIRuntime" + task.type + ".cs"; if (File.Exists(filePath)) { File.Delete(filePath); } File.WriteAllText(filePath, fileContent.ToString()); maker_list.Add(task.type); }
public static AIRunTimeBase MakeRuntime(AIRuntimeTaskData data, AI.Runtime.AIRunTimeTree tree) { AIRunTimeBase rst = null; switch (data.type) { case "Sequence": rst = new AIRuntimeSequence(); break; case "Selector": rst = new AIRuntimeSelector(); break; case "Inverter": rst = new AIRuntimeInverter(); break; case "RotateSelf": rst = new AIRuntimeRotateSelf(); break; case "MoveForward": rst = new AIRuntimeMoveForward(); break; case "ResetTarget": rst = new AIRuntimeResetTarget(); break; case "StatusRandom": rst = new AIRuntimeStatusRandom(); break; case "FindTargetByDistance": rst = new AIRuntimeFindTargetByDistance(); break; case "DoSelectNearest": rst = new AIRuntimeDoSelectNearest(); break; case "RotateToTarget": rst = new AIRuntimeRotateToTarget(); break; case "ValueDistance": rst = new AIRuntimeValueDistance(); break; case "NavToTarget": rst = new AIRuntimeNavToTarget(); break; case "StopNavMove": rst = new AIRuntimeStopNavMove(); break; case "XAIActionSkill": rst = new AIRuntimeXAIActionSkill(); break; case "Wait": rst = new AIRuntimeWait(); break; case "ValueHP": rst = new AIRuntimeValueHP(); break; case "Log": rst = new AIRuntimeLog(); break; } if (rst != null) { rst.SetTree(tree); rst.Init(data); } return(rst); }