ModelCodeGenHandler.lua 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. ---@class ModelCodeGenHandler 非热更层代码生成器
  2. local ModelCodeGenHandler = {}
  3. --- 执行生成非热更层代码
  4. ---@param handler CS.FairyEditor.PublishHandler
  5. ---@param codeGenConfig CodeGenConfig
  6. function ModelCodeGenHandler.Do(handler, codeGenConfig)
  7. local codePkgName = handler:ToFilename(handler.pkg.name); --convert chinese to pinyin, remove special chars etc.
  8. --- 从自定义配置中读取路径和命名空间
  9. local exportCodePath = codeGenConfig.ModelCodeOutPutPath .. '/' .. codePkgName
  10. local namespaceName = codeGenConfig.ModelNameSpace
  11. --- 初始化自定义组件名前缀
  12. local classNamePrefix = codeGenConfig.ClassNamePrefix
  13. --- 初始化自定义成员变量名前缀
  14. local memberVarNamePrefix = codeGenConfig.MemerVarNamePrefix
  15. --- 从FGUI编辑器中读取配置
  16. ---@type CS.FairyEditor.GlobalPublishSettings.CodeGenerationConfig
  17. local settings = handler.project:GetSettings("Publish").codeGeneration
  18. local getMemberByName = settings.getMemberByName
  19. --- 所有将要导出的类
  20. ---@type CS.FairyEditor.PublishHandler.ClassInfo[]
  21. local classes = handler:CollectClasses(codeGenConfig.CodeStrip, codeGenConfig.CodeStrip, nil)
  22. handler:SetupCodeFolder(exportCodePath, "cs") --check if target folder exists, and delete old files
  23. local classCnt = classes.Count
  24. local writer = CodeWriter.new()
  25. for i = 0, classCnt - 1 do
  26. local classInfo = classes[i]
  27. local members = classInfo.members
  28. writer:reset()
  29. writer:writeln('using FairyGUI;')
  30. writer:writeln('using FairyGUI.Utils;')
  31. writer:writeln()
  32. writer:writeln('namespace %s', namespaceName)
  33. writer:startBlock()
  34. writer:writeln('public partial class %s%s : %s', classNamePrefix, classInfo.className, classInfo.superClassName)
  35. writer:startBlock()
  36. -- 是否为自定义组件标记数组
  37. local crossPackageFlagsArray = {}
  38. local memberCnt = members.Count
  39. for j = 0, memberCnt - 1 do
  40. ---@type CS.FairyEditor.PublishHandler.MemberInfo
  41. local memberInfo = members[j]
  42. local typeName = memberInfo.type
  43. crossPackageFlagsArray[j] = false
  44. -- 判断是不是自定义类型组件
  45. if memberInfo.res ~= nil then
  46. --- 组装自定义组件前缀
  47. typeName = classNamePrefix .. memberInfo.res.name
  48. crossPackageFlagsArray[j] = true
  49. end
  50. --- 组装自定义成员前缀
  51. writer:writeln('public %s %s;', typeName, memberVarNamePrefix .. memberInfo.varName)
  52. end
  53. --- 组装自定义组件前缀
  54. local className = classNamePrefix .. classInfo.className
  55. writer:writeln('public const string URL = "ui://%s%s";', handler.pkg.id, classInfo.resId)
  56. writer:writeln()
  57. writer:writeln('public static %s CreateInstance()', className)
  58. writer:startBlock()
  59. writer:writeln('return (%s)UIPackage.CreateObject("%s", "%s", typeof(%s));', className, handler.pkg.name, classInfo.resName, className)
  60. writer:endBlock()
  61. writer:writeln()
  62. if handler.project.type == ProjectType.MonoGame then
  63. writer:writeln("protected override void OnConstruct()")
  64. writer:startBlock()
  65. else
  66. writer:writeln('public override void ConstructFromXML(XML xml)')
  67. writer:startBlock()
  68. writer:writeln('base.ConstructFromXML(xml);')
  69. writer:writeln()
  70. end
  71. for j = 0, memberCnt - 1 do
  72. local memberInfo = members[j]
  73. --- 组装自定义成员前缀
  74. local memberVarName = memberVarNamePrefix .. memberInfo.varName
  75. if memberInfo.group == 0 then
  76. if getMemberByName then
  77. if crossPackageFlagsArray[j]
  78. then
  79. --- 组装自定义组件前缀
  80. writer:writeln('%s = (%s)GetChild("%s");', memberVarName, classNamePrefix .. memberInfo.res.name, memberInfo.name)
  81. else
  82. writer:writeln('%s = (%s)GetChild("%s");', memberVarName, memberInfo.type, memberInfo.name)
  83. end
  84. else
  85. if crossPackageFlagsArray[j]
  86. then
  87. --- 组装自定义组件前缀
  88. writer:writeln('%s = (%s)GetChildAt(%s);', memberVarName, classNamePrefix .. memberInfo.res.name, memberInfo.index)
  89. else
  90. writer:writeln('%s = (%s)GetChildAt(%s);', memberVarName, memberInfo.type, memberInfo.index)
  91. end
  92. end
  93. elseif memberInfo.group == 1 then
  94. if getMemberByName then
  95. writer:writeln('%s = GetController("%s");', memberVarName, memberInfo.name)
  96. else
  97. writer:writeln('%s = GetControllerAt(%s);', memberVarName, memberInfo.index)
  98. end
  99. else
  100. if getMemberByName then
  101. writer:writeln('%s = GetTransition("%s");', memberVarName, memberInfo.name)
  102. else
  103. writer:writeln('%s = GetTransitionAt(%s);', memberVarName, memberInfo.index)
  104. end
  105. end
  106. end
  107. writer:endBlock()
  108. writer:endBlock() --class
  109. writer:endBlock() --namepsace
  110. writer:save(exportCodePath .. '/' .. className .. '.cs')
  111. end
  112. writer:reset()
  113. --- 为了统一命名,这里也组装自定义组件前缀
  114. local binderName = classNamePrefix .. codePkgName .. 'Binder'
  115. writer:writeln('using FairyGUI;')
  116. writer:writeln()
  117. writer:writeln('namespace %s', 'ET')
  118. writer:startBlock()
  119. writer:writeln('public class %s', binderName)
  120. writer:startBlock()
  121. writer:writeln('public static void BindAll()')
  122. writer:startBlock()
  123. for i = 0, classCnt - 1 do
  124. local classInfo = classes[i]
  125. --- 组装自定义组件前缀
  126. local className = classNamePrefix .. classInfo.className
  127. writer:writeln('UIObjectFactory.SetPackageItemExtension(%s.URL, typeof(%s));', className, className)
  128. end
  129. writer:endBlock() --bindall
  130. writer:endBlock() --class
  131. writer:endBlock() --namespace
  132. writer:save(exportCodePath .. '/' .. binderName .. '.cs')
  133. end
  134. return ModelCodeGenHandler