简单而言,就是fairyGUI的默认生成的代码不符合cocos creator3.8(3.x其他版本没试过)的import方式(具体怎么解释我也不知道,因为我只是个小白)
找到FairyGUI编辑器下的这个文件
用以下代码替换:
local function genCode(handler)
local settings = handler.project:GetSettings("Publish").codeGeneration
local codePkgName = handler:ToFilename(handler.pkg.name); --convert chinese to pinyin, remove special chars etc.
local exportCodePath = handler.exportCodePath..'/'..codePkgName
local namespaceName = codePkgName
local ns = 'fgui'
if settings.packageName~=nil and settings.packageName~='' then
namespaceName = settings.packageName..'.'..namespaceName;
end
--CollectClasses(stripeMemeber, stripeClass, fguiNamespace)
local classes = handler:CollectClasses(settings.ignoreNoname, settings.ignoreNoname, ns)
handler:SetupCodeFolder(exportCodePath, "ts") --check if target folder exists, and delete old files
local getMemberByName = settings.getMemberByName
local classCnt = classes.Count
local writer = CodeWriter.new({ blockFromNewLine=false, usingTabs=true })
for i=0,classCnt-1 do
local classInfo = classes[i]
local members = classInfo.members
local references = classInfo.references
writer:reset()
local refCount = references.Count
if refCount>0 then
for j=0,refCount-1 do
local ref = references[j]
writer:writeln('import %s from "./%s";', ref, ref)
end
writer:writeln()
end
---------------
local tbFguiType = {};
tbFguiType.UIPackage = true;
tbFguiType.GComponent = true;
local memberCnt = members.Count
for j=0,memberCnt-1 do
local memberInfo = members[j]
if string.sub(memberInfo.type, 1, 5) == "fgui." then
local szSubType = string.sub(memberInfo.type, 6);
tbFguiType[szSubType] = true;
memberInfo.type = szSubType;
end
-- writer:writeln('public %s:%s;', memberInfo.varName, memberInfo.type)
end
if next(tbFguiType) then
local tbFguiTypeArray = {}
for szType, _ in pairs(tbFguiType) do
table.insert(tbFguiTypeArray, szType);
end
writer:writeln(string.format('import {%s} from "fairygui-cc";', table.concat(tbFguiTypeArray, ", ")));
end
if string.sub(classInfo.superClassName, 1, 5) == "fgui." then
classInfo.superClassName = string.sub(classInfo.superClassName, 6);
end
---------------
-- if handler.project.type==ProjectType.ThreeJS then
-- writer:writeln('import * as fgui from "fairygui-three";');
-- if refCount==0 then writer:writeln() end
-- else
-- writer:writeln('import * from "fairygui-cc";');
-- end
writer:writeln('export default class %s extends %s', classInfo.className, classInfo.superClassName)
writer:startBlock()
writer:writeln()
local memberCnt = members.Count
for j=0,memberCnt-1 do
local memberInfo = members[j]
writer:writeln('public %s:%s;', memberInfo.varName, memberInfo.type)
end
writer:writeln('public static URL:string = "ui://%s%s";', handler.pkg.id, classInfo.resId)
writer:writeln()
writer:writeln('public static createInstance():%s', classInfo.className)
writer:startBlock()
writer:writeln('return <%s>(UIPackage.createObject("%s", "%s"));', classInfo.className, handler.pkg.name, classInfo.resName)
writer:endBlock()
writer:writeln()
writer:writeln('protected onConstruct():void')
writer:startBlock()
for j=0,memberCnt-1 do
local memberInfo = members[j]
if memberInfo.group==0 then
if getMemberByName then
writer:writeln('this.%s = <%s>(this.getChild("%s"));', memberInfo.varName, memberInfo.type, memberInfo.name)
else
writer:writeln('this.%s = <%s>(this.getChildAt(%s));', memberInfo.varName, memberInfo.type, memberInfo.index)
end
elseif memberInfo.group==1 then
if getMemberByName then
writer:writeln('this.%s = this.getController("%s");', memberInfo.varName, memberInfo.name)
else
writer:writeln('this.%s = this.getControllerAt(%s);', memberInfo.varName, memberInfo.index)
end
else
if getMemberByName then
writer:writeln('this.%s = this.getTransition("%s");', memberInfo.varName, memberInfo.name)
else
writer:writeln('this.%s = this.getTransitionAt(%s);', memberInfo.varName, memberInfo.index)
end
end
end
writer:endBlock()
writer:endBlock() --class
writer:save(exportCodePath..'/'..classInfo.className..'.ts')
end
writer:reset()
local binderName = codePkgName..'Binder'
for i=0,classCnt-1 do
local classInfo = classes[i]
writer:writeln('import %s from "./%s";', classInfo.className, classInfo.className)
end
if handler.project.type==ProjectType.ThreeJS then
writer:writeln('import * as fgui from "fairygui-three";');
writer:writeln();
end
writer:writeln()
writer:writeln('import { _decorator } from "cc";')
writer:writeln('import { UIObjectFactory } from "fairygui-cc";')
writer:writeln('const { ccclass} = _decorator;')
writer:writeln('@ccclass("%s")', binderName);
writer:writeln('export default class %s', binderName)
writer:startBlock()
writer:writeln('public static bindAll():void')
writer:startBlock()
for i=0,classCnt-1 do
local classInfo = classes[i]
writer:writeln('UIObjectFactory.setExtension(%s.URL, %s);', classInfo.className, classInfo.className)
end
writer:endBlock() --bindall
writer:endBlock() --class
writer:save(exportCodePath..'/'..binderName..'.ts')
end
return genCode
