123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- ---@class ModelCodeGenHandler 非热更层代码生成器
- local ModelCodeGenHandler = {}
- --- 执行生成非热更层代码
- ---@param handler CS.FairyEditor.PublishHandler
- ---@param codeGenConfig CodeGenConfig
- function ModelCodeGenHandler.Do(handler, codeGenConfig)
- local codePkgName = handler:ToFilename(handler.pkg.name); --convert chinese to pinyin, remove special chars etc.
- --- 从自定义配置中读取路径和命名空间
- local exportCodePath = codeGenConfig.ModelCodeOutPutPath .. '/' .. codePkgName
- local namespaceName = codeGenConfig.ModelNameSpace
- --- 初始化自定义组件名前缀
- local classNamePrefix = codeGenConfig.ClassNamePrefix
- --- 初始化自定义成员变量名前缀
- local memberVarNamePrefix = codeGenConfig.MemerVarNamePrefix
-
- --- 从FGUI编辑器中读取配置
- ---@type CS.FairyEditor.GlobalPublishSettings.CodeGenerationConfig
- local settings = handler.project:GetSettings("Publish").codeGeneration
- local getMemberByName = settings.getMemberByName
- --- 所有将要导出的类
- ---@type CS.FairyEditor.PublishHandler.ClassInfo[]
- local classes = handler:CollectClasses(codeGenConfig.CodeStrip, codeGenConfig.CodeStrip, nil)
- handler:SetupCodeFolder(exportCodePath, "cs") --check if target folder exists, and delete old files
- local classCnt = classes.Count
- local writer = CodeWriter.new()
- for i = 0, classCnt - 1 do
- local classInfo = classes[i]
- local members = classInfo.members
- writer:reset()
- writer:writeln('using FairyGUI;')
- writer:writeln('using FairyGUI.Utils;')
- writer:writeln()
- writer:writeln('namespace %s', namespaceName)
- writer:startBlock()
- writer:writeln('public partial class %s%s : %s', classNamePrefix, classInfo.className, classInfo.superClassName)
- writer:startBlock()
- -- 是否为自定义组件标记数组
- local crossPackageFlagsArray = {}
- local memberCnt = members.Count
- for j = 0, memberCnt - 1 do
- ---@type CS.FairyEditor.PublishHandler.MemberInfo
- local memberInfo = members[j]
- local typeName = memberInfo.type
- crossPackageFlagsArray[j] = false
- -- 判断是不是自定义类型组件
- if memberInfo.res ~= nil then
- --- 组装自定义组件前缀
- typeName = classNamePrefix .. memberInfo.res.name
- crossPackageFlagsArray[j] = true
- end
- --- 组装自定义成员前缀
- writer:writeln('public %s %s;', typeName, memberVarNamePrefix .. memberInfo.varName)
- end
- --- 组装自定义组件前缀
- local className = classNamePrefix .. classInfo.className
- writer:writeln('public const string URL = "ui://%s%s";', handler.pkg.id, classInfo.resId)
- writer:writeln()
- writer:writeln('public static %s CreateInstance()', className)
- writer:startBlock()
- writer:writeln('return (%s)UIPackage.CreateObject("%s", "%s", typeof(%s));', className, handler.pkg.name, classInfo.resName, className)
- writer:endBlock()
- writer:writeln()
- if handler.project.type == ProjectType.MonoGame then
- writer:writeln("protected override void OnConstruct()")
- writer:startBlock()
- else
- writer:writeln('public override void ConstructFromXML(XML xml)')
- writer:startBlock()
- writer:writeln('base.ConstructFromXML(xml);')
- writer:writeln()
- end
- for j = 0, memberCnt - 1 do
- local memberInfo = members[j]
- --- 组装自定义成员前缀
- local memberVarName = memberVarNamePrefix .. memberInfo.varName
- if memberInfo.group == 0 then
- if getMemberByName then
- if crossPackageFlagsArray[j]
- then
- --- 组装自定义组件前缀
- writer:writeln('%s = (%s)GetChild("%s");', memberVarName, classNamePrefix .. memberInfo.res.name, memberInfo.name)
- else
- writer:writeln('%s = (%s)GetChild("%s");', memberVarName, memberInfo.type, memberInfo.name)
- end
- else
- if crossPackageFlagsArray[j]
- then
- --- 组装自定义组件前缀
- writer:writeln('%s = (%s)GetChildAt(%s);', memberVarName, classNamePrefix .. memberInfo.res.name, memberInfo.index)
- else
- writer:writeln('%s = (%s)GetChildAt(%s);', memberVarName, memberInfo.type, memberInfo.index)
- end
- end
- elseif memberInfo.group == 1 then
- if getMemberByName then
- writer:writeln('%s = GetController("%s");', memberVarName, memberInfo.name)
- else
- writer:writeln('%s = GetControllerAt(%s);', memberVarName, memberInfo.index)
- end
- else
- if getMemberByName then
- writer:writeln('%s = GetTransition("%s");', memberVarName, memberInfo.name)
- else
- writer:writeln('%s = GetTransitionAt(%s);', memberVarName, memberInfo.index)
- end
- end
- end
- writer:endBlock()
- writer:endBlock() --class
- writer:endBlock() --namepsace
- writer:save(exportCodePath .. '/' .. className .. '.cs')
- end
- writer:reset()
- --- 为了统一命名,这里也组装自定义组件前缀
- local binderName = classNamePrefix .. codePkgName .. 'Binder'
- writer:writeln('using FairyGUI;')
- writer:writeln()
- writer:writeln('namespace %s', 'ET')
- writer:startBlock()
- writer:writeln('public class %s', binderName)
- writer:startBlock()
- writer:writeln('public static void BindAll()')
- writer:startBlock()
- for i = 0, classCnt - 1 do
- local classInfo = classes[i]
- --- 组装自定义组件前缀
- local className = classNamePrefix .. classInfo.className
- writer:writeln('UIObjectFactory.SetPackageItemExtension(%s.URL, typeof(%s));', className, className)
- end
- writer:endBlock() --bindall
- writer:endBlock() --class
- writer:endBlock() --namespace
- writer:save(exportCodePath .. '/' .. binderName .. '.cs')
- end
- return ModelCodeGenHandler
|