コード例 #1
0
    private static void Parse(string json, string name)
    {
        AIRuntimeTreeData data = AIRuntimeUtil.Parse(json, name);
        AIRuntimeTaskData task = data.task;

        ParseTask(task);
    }
コード例 #2
0
 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]);
         }
     }
 }
コード例 #3
0
ファイル: AICppMaker.cs プロジェクト: xfilson/dn_asset
    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);
    }
コード例 #4
0
ファイル: AICppMaker.cs プロジェクト: xfilson/dn_asset
    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);
    }
コード例 #5
0
ファイル: AICppMaker.cs プロジェクト: xfilson/dn_asset
 public static void GenerateTaskCode(AIRuntimeTaskData task)
 {
     Init(task.type);
     Generate_head_file(task);
     Generate_cpp_file(task);
 }
コード例 #6
0
    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);
    }
コード例 #7
0
ファイル: AIRuntimeFactory.cs プロジェクト: xfilson/dn_asset
        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);
        }