"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.PrefabParse = void 0; const fse = __importStar(require("fs-extra")); const ParseResult_1 = require("../../seek_miss/ParseResult"); const WSimpleParse_1 = require("./WSimpleParse"); const WCustomParse_1 = require("./WCustomParse"); const WParticleParse_1 = require("./WParticleParse"); class PrefabParse { constructor() { /** * */ this._uuidMissedResult = new ParseResult_1.ParseResult(); this._simpleTypes = new Map(); this._extTypes = new Map(); this._simpleParse = new WSimpleParse_1.SimpleParse(); this._customParse = new WCustomParse_1.CustomParse(); this._particleParse = new WParticleParse_1.ParticleParse(); this._simpleTypes.set('cc.Sprite', true); this._simpleTypes.set('cc.Label', true); this._simpleTypes.set('cc.Button', true); this._simpleTypes.set('cc.MeshRenderer', true); this._simpleTypes.set('cc.SkinnedMeshRenderer', true); this._simpleTypes.set('cc.Animation', true); this._simpleTypes.set('cc.SkeletalAnimation', true); this._simpleTypes.set('cc.AudioSource', true); this._simpleTypes.set('cc.Graphics', true); this._simpleTypes.set('cc.RichText', true); this._simpleTypes.set('dragonBones.ArmatureDisplay', true); this._simpleTypes.set('cc.Billboard', true); this._simpleTypes.set('cc.Line', true); this._simpleTypes.set('cc.MotionStreak', true); this._simpleTypes.set('CCPropertyOverrideInfo', true); this._simpleTypes.set('cc.PrefabInfo', true); //粒子系统需要额外的处理 // this._simpleTypes.set('cc.ParticleSystem', true); this._simpleTypes.set('cc.ParticleSystem2D', true); this._simpleTypes.set('cc.UIStaticBatch', true); this._simpleTypes.set('cc.SkinnedMeshBatchRenderer', true); this._simpleTypes.set('cc.BoxCollider', true); this._simpleTypes.set('sp.Skeleton', true); this._simpleTypes.set('cc.TiledMap', true); this._simpleTypes.set('cc.EditBox', true); this._simpleTypes.set('cc.VideoPlayer', true); this._extTypes.set('cc.Node', true); this._extTypes.set('cc.UITransform', true); this._extTypes.set('cc.RenderRoot2D', true); this._extTypes.set('cc.BlockInputEvents', true); this._extTypes.set('cc.DirectionalLight', true); this._extTypes.set('cc.SphereLight', true); this._extTypes.set('cc.SpotLight', true); this._extTypes.set('cc.SubContextView', true); this._extTypes.set('cc.WebView', true); this._extTypes.set('cc.RigidBody', true); this._extTypes.set('cc.Camera', true); this._extTypes.set('cc.Canvas', true); this._extTypes.set('cc.LabelOutline', true); this._extTypes.set('cc.LabelShadow', true); this._extTypes.set('cc.Layout', true); this._extTypes.set('cc.Widget', true); this._extTypes.set('cc.UIMeshRenderer', true); this._extTypes.set('cc.Toggle', true); this._extTypes.set('cc.ToggleContainer', true); this._extTypes.set('cc.UIOpacity', true); this._extTypes.set('cc.TargetInfo', true); } /** * @zh 检测预制件里是否会有丢失的uuid的引用, * @param prefabPath 预制件(场景)的完整路径 */ async testPrefab(prefabPath, fullUuid, compressedUuid) { let string = fse.readFileSync(prefabPath, 'utf-8'); let fatherJson = JSON.parse(string); for (let nodeJson of fatherJson) { let type = nodeJson.__type__; if (type != 'cc.Node') continue; let components = nodeJson._components; if (!components || components.length <= 0) continue; for (let each of components) { if (each && each.__id__) { let comJson = fatherJson[each.__id__]; if (this._extTypes.has(comJson.__type__)) continue; let parse; if (this._simpleTypes.has(comJson.__type__)) { parse = this._simpleParse; } else if (comJson.__type__ == 'cc.ParticleSystem') { parse = this._particleParse; } else { // parse = this._simpleParse; parse = this._customParse; } let ret = await parse.parse(comJson, fatherJson, fullUuid, compressedUuid); if (ret.length) { let prefabInfo = await this._uuidMissedResult.getPrefabInfoByFullPath(prefabPath); let fullNodePath = this.findFullNodePath(fatherJson, nodeJson); let comInfo = new ParseResult_1.ComInfo(); comInfo.comName = parse.comName; comInfo.propertyName = ret.join(', '); prefabInfo.putNodesInfo(fullNodePath, comInfo); } } } } } /** * * @param json prefab的数组json字符串 * @param element json字符串里的某一项组件 * @returns 这个组件在预制件里的完整路径 */ findFullNodePath(json, nodeJson) { let nodeNames = []; nodeNames.push(nodeJson._name); while (nodeJson._parent) { nodeJson = json[nodeJson._parent.__id__]; nodeNames.push(nodeJson._name); } nodeNames = nodeNames.reverse(); return nodeNames.join('/'); } /** * 返回测试后所有的丢失了的uuid的路径 */ getResult() { return this._uuidMissedResult; } } exports.PrefabParse = PrefabParse;