hch
1 天以前 a19acb609721b89419fe55785643a0d4f1959368
Main/Core/GameEngine/Launch/ConfigInitTask.cs
@@ -1,6 +1,7 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine;
public class ConfigInitTask : LaunchTask
{
@@ -30,8 +31,162 @@
        // TODO YYL
        // OperationLogCollect.Instance.RecordLauchEvent(3);
        // OperationLogCollect.Instance.RecordEvent(3);
#if UNITY_EDITOR
        var config = FuncConfigConfig.Get("HeroAttrFormula");
        var propertyFormula = config.Numerical1;
        var fightPropertyFormula = config.Numerical2;
        var fightPowerFormula = config.Numerical3;
        var skillFightPowerFormula = config.Numerical4;
        //读取文件 FightPowerFormula.cs文件,通过公式字符串生成代码
        var filePath = "Assets/Scripts/Main/System/Main/FightPowerFormula.cs";
        var fileContent = File.ReadAllText(filePath);
        // 生成新的代码内容
        var newContent = GenerateFightPowerFormulaCode(propertyFormula, fightPropertyFormula, fightPowerFormula, skillFightPowerFormula);
        // 如果内容有变化,则写入文件
        if (newContent != fileContent)
        {
            File.WriteAllText(filePath, newContent);
            Debug.LogError("战斗公式有变更 FightPowerFormula.cs 已根据配置公式重新生成, 请提交代码!");
        }
        else
        {
            Debug.Log("FightPowerFormula.cs 内容未变化,无需重新生成");
        }
#endif
    }
#if UNITY_EDITOR
    private string GenerateFightPowerFormulaCode(string propertyFormula, string fightPropertyFormula, string fightPowerFormula, string skillFightPowerFormula)
    {
        // 提取变量名
        var propertyVariables = ExtractVariables(propertyFormula);
        var fightPropertyVariables = ExtractVariables(fightPropertyFormula);
        var fightPowerVariables = ExtractVariables(fightPowerFormula);
        var skillFightPowerVariables = ExtractVariables(skillFightPowerFormula);
        // 处理公式中的类型转换操作符
        var processedPropertyFormula = ProcessTypeConversionOperators(propertyFormula);
        var processedFightPropertyFormula = ProcessTypeConversionOperators(fightPropertyFormula);
        var processedFightPowerFormula = ProcessTypeConversionOperators(fightPowerFormula);
        var processedSkillFightPowerFormula = ProcessTypeConversionOperators(skillFightPowerFormula);
        // 生成代码
        var code = new System.Text.StringBuilder();
        code.AppendLine("using System.Collections.Generic;");
        code.AppendLine();
        code.AppendLine("public class FightPowerFormula");
        code.AppendLine("{");
        // 添加公式注释
        code.AppendLine("    // 基础属性公式");
        code.AppendLine($"    // {propertyFormula}");
        code.AppendLine("    // 战斗属性公式");
        code.AppendLine($"    // {fightPropertyFormula}");
        code.AppendLine("    // 战斗力公式");
        code.AppendLine($"    // {fightPowerFormula}");
        code.AppendLine("    // 技能战斗力公式");
        code.AppendLine($"    // {skillFightPowerFormula}");
        code.AppendLine();
        // 生成基础属性计算方法
        code.AppendLine("    public static double GetBaseAttr(Dictionary<string, double> variables)");
        code.AppendLine("    {");
        foreach (var variable in propertyVariables)
        {
            code.AppendLine($"        double {variable} = variables[\"{variable}\"];");
        }
        code.AppendLine();
        code.AppendLine($"        return {processedPropertyFormula};");
        code.AppendLine("    }");
        code.AppendLine();
        // 生成战斗属性计算方法
        code.AppendLine("    public static double GetFightAttr(Dictionary<string, double> variables)");
        code.AppendLine("    {");
        foreach (var variable in fightPropertyVariables)
        {
            code.AppendLine($"        double {variable} = variables[\"{variable}\"];");
        }
        code.AppendLine();
        code.AppendLine($"        return {processedFightPropertyFormula};");
        code.AppendLine("    }");
        code.AppendLine();
        // 生成战斗力计算方法
        code.AppendLine("    public static double GetFightPower(Dictionary<string, double> variables)");
        code.AppendLine("    {");
        foreach (var variable in fightPowerVariables)
        {
            code.AppendLine($"        double {variable} = variables[\"{variable}\"];");
        }
        code.AppendLine();
        code.AppendLine($"        return {processedFightPowerFormula};");
        code.AppendLine("    }");
        code.AppendLine();
        // 生成技能战斗力计算方法
        code.AppendLine("    public static double GetSkillsFightPower(Dictionary<string, double> variables)");
        code.AppendLine("    {");
        foreach (var variable in skillFightPowerVariables)
        {
            code.AppendLine($"        double {variable} = variables[\"{variable}\"];");
        }
        code.AppendLine();
        code.AppendLine($"        return {processedSkillFightPowerFormula};");
        code.AppendLine("    }");
        code.AppendLine();
        code.AppendLine("}");
        return code.ToString();
    }
    private string ProcessTypeConversionOperators(string formula)
    {
        // 将类型转换操作符转换为加括号的形式
        var processedFormula = formula;
        // 处理 long(expression) 转换为 (long)(expression)
        processedFormula = System.Text.RegularExpressions.Regex.Replace(processedFormula, @"\b(long|int|float|double)\s*\(", "($1)(");
        return processedFormula;
    }
    private List<string> ExtractVariables(string formula)
    {
        var variables = new List<string>();
        var words = formula.Split(new char[] { ' ', '+', '-', '*', '/', '(', ')', ',', '=', '<', '>', '!', '&', '|', '%', ':' }, StringSplitOptions.RemoveEmptyEntries);
        foreach (var word in words)
        {
            // 过滤掉数字、运算符和关键字
            if (!double.TryParse(word, out _) && !IsOperator(word) && !IsKeyword(word) && !variables.Contains(word))
            {
                variables.Add(word);
            }
        }
        return variables;
    }
    private bool IsOperator(string word)
    {
        var operators = new string[] { "if", "else", "min", "max", "long", "int", "float", "double" };
        return operators.Contains(word);
    }
    private bool IsKeyword(string word)
    {
        var keywords = new string[] { "return", "var", "class", "public", "private", "static", "void", "using", "namespace" };
        return keywords.Contains(word);
    }
#endif
    public override void Update()
    {
        if (done)