private static AssetAttributes DrawSingleAssetAttributes(BundleBuilderData data, string assetGuid, BundleBuilderWindow builder, bool batchMode, Action additionalOp) { var assetPath = AssetDatabase.GUIDToAssetPath(assetGuid); var assetObject = AssetDatabase.LoadMainAssetAtPath(assetPath); var attrs = data.GetAssetAttributes(assetGuid); var bNew = attrs == null; if (bNew) { attrs = new AssetAttributes(); } var nAssetPacker = (AssetPacker)EditorGUILayout.EnumPopup(attrs.packer, GUILayout.MaxWidth(110f)); var nPriority = EditorGUILayout.IntSlider(attrs.priority, 0, data.priorityMax, GUILayout.MaxWidth(220f)); EditorGUILayout.ObjectField(assetObject, typeof(Object), false, GUILayout.MaxWidth(180f)); EditorGUILayout.TextField(assetPath); var fileInfoWidth = 60f; EditorGUILayout.LabelField(GetFileSizeString(assetPath), _rightAlignStyle, GUILayout.MaxWidth(fileInfoWidth)); additionalOp?.Invoke(); if (batchMode) { if (nAssetPacker != attrs.packer) { builder?.ApplyAllMarks(attributes => attributes.packer = nAssetPacker); } if (nPriority != attrs.priority) { var deltaPriority = nPriority - attrs.priority; builder?.ApplyAllMarks(attributes => attributes.priority = Math.Max(0, Math.Min(data.priorityMax, attributes.priority + deltaPriority))); } } else { if (nAssetPacker != attrs.packer) { attrs.packer = nAssetPacker; data.MarkAsDirty(); } if (nPriority != attrs.priority) { attrs.priority = nPriority; data.MarkAsDirty(); } if (attrs.priority == 0 && attrs.packer == AssetPacker.Auto) { data.RemoveAssetAttributes(assetGuid); } else if (bNew) { if (attrs.priority != 0 || attrs.packer != AssetPacker.Auto) { var newAttributes = data.AddAssetAttributes(assetGuid); newAttributes.priority = attrs.priority; newAttributes.packer = attrs.packer; } } } return(attrs); }
private void InspectBundle(BundleBuilderData.BundleInfo bundle) { var bundleName = string.IsNullOrEmpty(bundle.name) ? "(null)" : bundle.name; Block(bundleName, () => { Block("Basic", () => { EditorGUI.BeginChangeCheck(); bundle.note = EditorGUILayout.TextField("Info", bundle.note); bundle.tag = EditorGUILayout.TextField("Tag", bundle.tag); bundle.streamingAssets = EditorGUILayout.Toggle("StreamingAssets", bundle.streamingAssets); bundle.load = (Manifest.BundleLoad)EditorGUILayout.EnumPopup("Load", bundle.load); bundle.type = (Manifest.BundleType)EditorGUILayout.EnumPopup("Type", bundle.type); bundle.priority = EditorGUILayout.IntSlider("Priority", bundle.priority, 0, 10000); if (EditorGUI.EndChangeCheck()) { _data.MarkAsDirty(); } }); Block("Target Assets", () => { EditorGUILayout.BeginHorizontal(); GUILayout.Space(44f); var addObject = EditorGUILayout.ObjectField(null, typeof(Object), false); if (addObject != null) { Defer(() => { var addObjectPath = AssetDatabase.GetAssetPath(addObject); bundle.targets.Add(new BundleBuilderData.BundleAssetTarget() { enabled = true, targetPath = addObjectPath, }); }); } EditorGUILayout.EndHorizontal(); var size = bundle.targets.Count; for (var i = 0; i < size; i++) { var target = bundle.targets[i]; EditorGUILayout.BeginHorizontal(); GUI.color = Color.red; if (GUILayout.Button("X", GUILayout.Width(20f))) { if (EditorUtility.DisplayDialog("删除", $"确定删除资源项?", "确定", "取消")) { Defer(() => bundle.targets.Remove(target)); } } GUI.color = _GUIColor; EditorGUI.BeginChangeCheck(); target.enabled = EditorGUILayout.Toggle(target.enabled, GUILayout.Width(12f)); if (target.targetPath.StartsWith("Assets/")) { var targetAsset = AssetDatabase.LoadMainAssetAtPath(target.targetPath); EditorGUILayout.ObjectField(targetAsset, typeof(Object), false); } else { EditorGUILayout.TextField(target.targetPath); } target.platform = (PackagePlatform)EditorGUILayout.EnumPopup(target.platform); if (EditorGUI.EndChangeCheck()) { _data.MarkAsDirty(); } EditorGUILayout.EndHorizontal(); } }); Block("Bundle Splits", () => { for (int splitIndex = 0, splitCount = bundle.splits.Count; splitIndex < splitCount; splitIndex++) { var bundleSplit = bundle.splits[splitIndex]; var splitName = string.IsNullOrEmpty(bundleSplit.name) ? "(default)" : bundleSplit.name; Foldout(splitName, () => { var sliceCount = bundleSplit.slices.Count; EditorGUI.BeginChangeCheck(); var duplicated = IsDuplicated(bundle, bundleSplit); if (duplicated) { GUI.color = Color.yellow; bundleSplit.name = EditorGUILayout.TextField( Text("bundle.split.name", "Name", "warning: duplicated bundle split name"), bundleSplit.name); GUI.color = _GUIColor; } else { bundleSplit.name = EditorGUILayout.TextField("Name", bundleSplit.name); } bundleSplit.encrypted = EditorGUILayout.Toggle("Encrypted?", bundleSplit.encrypted); bundleSplit.sliceObjects = EditorGUILayout.IntField("Slice Objects", bundleSplit.sliceObjects); var bundleSplitRawSize = 0L; var bundleSplitBuildSize = 0L; bundleSplit.GetTotalSize(out bundleSplitRawSize, out bundleSplitBuildSize); EditorGUILayout.LabelField("Total (Raw)", PathUtils.GetFileSizeString(bundleSplitRawSize)); EditorGUILayout.LabelField("Total (Build)", PathUtils.GetFileSizeString(bundleSplitBuildSize)); if (EditorGUI.EndChangeCheck()) { _data.MarkAsDirty(); } InspectRules(bundleSplit.rules); var validIndex = 0; for (var sliceIndex = 0; sliceIndex < sliceCount; sliceIndex++) { var bundleSlice = bundleSplit.slices[sliceIndex]; var assetCount = bundleSlice.GetAssetCount(); if (assetCount > 0) { validIndex++; Block("Slices", () => { var sliceName = bundleSlice.name; if (sliceCount > 1) { sliceName = string.Format("[{0}] {1}/{2}: {3}", validIndex, sliceIndex + 1, sliceCount, sliceName); } if (bundleSlice.streamingAssets) { GUI.color = Color.green; } EditorGUILayout.LabelField(sliceName); var intent = 40f; EditorGUILayout.BeginHorizontal(); GUILayout.Space(intent); EditorGUILayout.BeginVertical(); EditorGUI.BeginDisabledGroup(true); // var nStreamingAssets = EditorGUILayout.Toggle("StreamingAssets", bundleSlice.streamingAssets); // if (nStreamingAssets != slice.streamingAssets) // { // slice.streamingAssets = nStreamingAssets; // _data.MarkAsDirty(); // } EditorGUILayout.LabelField("Total (Raw): ", PathUtils.GetFileSizeString(bundleSlice.totalRawSize)); EditorGUILayout.LabelField("Total (Build): ", PathUtils.GetFileSizeString(bundleSlice.lastBuildSize)); EditorGUILayout.IntField("Objects: ", assetCount); EditorGUILayout.EnumPopup("Platform", bundleSlice.platform); EditorGUI.EndDisabledGroup(); if (_data.showBundleDetails) { //TODO: 太卡了, 需要优化展示方式 for (var assetIndex = 0; assetIndex < assetCount; assetIndex++) { var assetPath = bundleSlice.GetAssetPath(assetIndex); EditorGUILayout.BeginHorizontal(); DrawSingleAssetAttributes(_data, assetPath); if (GUILayout.Button("?", GUILayout.Width(20f))) { BundleBuilderWindow.DisplayAssetAttributes(assetPath); } EditorGUILayout.EndHorizontal(); } } EditorGUILayout.EndVertical(); EditorGUILayout.EndHorizontal(); GUI.color = _GUIColor; }, () => { GUI.color = Color.magenta; var rect = EditorGUILayout.GetControlRect(false, GUILayout.Width(20f)); rect.y -= 2f; rect.height += 1f; if (GUI.Button(rect, Text("reconstruct.split.slice", "❃", "重构分包切分"))) { if (EditorUtility.DisplayDialog("重构", $"确定重构分包切分?", "确定", "取消")) { Defer(() => { bundleSlice.Reset(); BundleBuilder.Scan(_data); _data.MarkAsDirty(); }); } } GUI.color = _GUIColor; }, () => { GUI.color = Color.red; var rect = EditorGUILayout.GetControlRect(false, GUILayout.Width(20f)); rect.y -= 2f; rect.height += 1f; if (GUI.Button(rect, Text("delete.split.slice", "X", "删除分包切分"))) { if (EditorUtility.DisplayDialog("删除", $"确定删除分包切分?", "确定", "取消")) { Defer(() => { bundleSplit.slices.Remove(bundleSlice); BundleBuilder.Scan(_data); _data.MarkAsDirty(); }); } } GUI.color = _GUIColor; }); } } }, () => { GUI.color = Color.yellow; var rect = EditorGUILayout.GetControlRect(false, GUILayout.Width(20f)); rect.y -= 2f; rect.height += 1f; EditorGUI.BeginDisabledGroup(splitIndex == 0); if (GUI.Button(rect, Text("moveup.split", "▲", "向前移动"))) { var newSplitIndex = splitIndex - 1; Defer(() => { bundle.splits.Remove(bundleSplit); bundle.splits.Insert(newSplitIndex, bundleSplit); _data.MarkAsDirty(); }); } EditorGUI.EndDisabledGroup(); GUI.color = _GUIColor; }, () => { GUI.color = Color.yellow; var rect = EditorGUILayout.GetControlRect(false, GUILayout.Width(20f)); rect.y -= 2f; rect.height += 1f; EditorGUI.BeginDisabledGroup(splitIndex == splitCount - 1); if (GUI.Button(rect, Text("movedown.split", "▼", "向后移动"))) { var newSplitIndex = splitIndex + 1; Defer(() => { bundle.splits.Remove(bundleSplit); bundle.splits.Insert(newSplitIndex, bundleSplit); _data.MarkAsDirty(); }); } EditorGUI.EndDisabledGroup(); GUI.color = _GUIColor; }, () => { GUI.color = Color.magenta; var rect = EditorGUILayout.GetControlRect(false, GUILayout.Width(20f)); rect.y -= 2f; rect.height += 1f; if (GUI.Button(rect, Text("reconstruct.split", "❃", "重构分包"))) { if (EditorUtility.DisplayDialog("重构", $"确定重构分包?", "确定", "取消")) { Defer(() => { bundleSplit.Reset(); BundleBuilder.Scan(_data); _data.MarkAsDirty(); }); } } GUI.color = _GUIColor; }, () => { GUI.color = Color.red; var rect = EditorGUILayout.GetControlRect(false, GUILayout.Width(20f)); rect.y -= 2f; rect.height += 1f; if (GUI.Button(rect, Text("delete.split", "X", "删除分包"))) { if (EditorUtility.DisplayDialog("删除", $"确定删除分包?", "确定", "取消")) { Defer(() => { bundle.splits.Remove(bundleSplit); _data.MarkAsDirty(); }); } } GUI.color = _GUIColor; }); } }, () => { GUI.color = Color.green; var rect = EditorGUILayout.GetControlRect(false, GUILayout.Width(20f)); rect.y -= 2f; rect.height += 1f; if (GUI.Button(rect, Text("add.split", "+", "添加分包"))) { Defer(() => { var newSplit = new BundleBuilderData.BundleSplit(); bundle.splits.Add(newSplit); _data.MarkAsDirty(); }); } GUI.color = _GUIColor; }); }); }
private static AssetAttributes DrawSearchResultAssetAttributes(Rect elementRect, BundleBuilderData data, SearchResult result, BundleBuilderWindow builder, bool batchMode) { var assetPath = result.assetPath; var fileInfoWidth = 60f; var sliceInfoWidth = 260f; var fileInfo = new FileInfo(assetPath); var fileSize = fileInfo.Exists ? fileInfo.Length : 0L; var attrs = data.GetAssetPathAttributes(assetPath); var bNew = attrs == null; if (bNew) { attrs = new AssetAttributes(); } var iRect = new Rect(elementRect.x, elementRect.y, 110f, elementRect.height); var nAssetPacker = (AssetPacker)EditorGUI.EnumPopup(iRect, attrs.packer); iRect.x += 110f + 8f; iRect.width = 220f; iRect.height = elementRect.height - 2f; var nPriority = EditorGUI.IntSlider(iRect, attrs.priority, 0, data.priorityMax); iRect.x += iRect.width; iRect.width = 180f; iRect.height = elementRect.height - 4f; if (assetPath.StartsWith("Assets/")) { var assetObject = AssetDatabase.LoadMainAssetAtPath(assetPath); EditorGUI.ObjectField(iRect, assetObject, typeof(Object), false); } else { EditorGUI.LabelField(iRect, "<External>"); } iRect.x += iRect.width; iRect.width = fileInfoWidth; iRect.height = elementRect.height - 2f; EditorGUI.LabelField(iRect, PathUtils.GetFileSizeString(fileSize), _rightAlignStyle); iRect.x += iRect.width; iRect.width = elementRect.width - iRect.x - sliceInfoWidth - 20f + 20f; EditorGUI.TextField(iRect, assetPath); iRect.x += iRect.width; iRect.width = sliceInfoWidth; iRect.height = elementRect.height - 2f; if (result.bundleInfo != null) { EditorGUI.TextField(iRect, result.bundleSlice.name); iRect.x += iRect.width; iRect.width = 20f; if (GUI.Button(iRect, ">")) { BundleAssetsWindow.Inspect(data, new List <BundleBuilderData.BundleInfo>(new[] { result.bundleInfo })); } } else { EditorGUI.BeginDisabledGroup(true); EditorGUI.TextField(iRect, "<null>"); iRect.x += iRect.width; iRect.width = 20f; GUI.Button(iRect, ">"); EditorGUI.EndDisabledGroup(); } if (batchMode) { if (nAssetPacker != attrs.packer) { builder?.ApplyAllMarks(attributes => attributes.packer = nAssetPacker); } if (nPriority != attrs.priority) { var deltaPriority = nPriority - attrs.priority; builder?.ApplyAllMarks(attributes => attributes.priority = Math.Max(0, Math.Min(data.priorityMax, attributes.priority + deltaPriority))); } } else { if (nAssetPacker != attrs.packer) { attrs.packer = nAssetPacker; data.MarkAsDirty(); } if (nPriority != attrs.priority) { attrs.priority = nPriority; data.MarkAsDirty(); } if (attrs.priority == 0 && attrs.packer == AssetPacker.Auto) { data.RemoveAssetPathAttributes(assetPath); } else if (bNew) { if (attrs.priority != 0 || attrs.packer != AssetPacker.Auto) { var newAttributes = data.AddAssetPathAttributes(assetPath); newAttributes.priority = attrs.priority; newAttributes.packer = attrs.packer; } } } return(attrs); }
private static AssetAttributes DrawSingleAssetAttributes(BundleBuilderData data, string assetGuid, BundleBuilderWindow builder, bool batchMode, bool rLookup) { var assetPath = AssetDatabase.GUIDToAssetPath(assetGuid); var assetObject = AssetDatabase.LoadMainAssetAtPath(assetPath); var attrs = data.GetAssetAttributes(assetGuid); var bNew = attrs == null; if (bNew) { attrs = new AssetAttributes(); } var nAssetPacker = (AssetPacker)EditorGUILayout.EnumPopup(attrs.packer, GUILayout.MaxWidth(80f)); var nPriority = EditorGUILayout.IntSlider(attrs.priority, 0, data.priorityMax, GUILayout.MaxWidth(220f)); EditorGUILayout.ObjectField(assetObject, typeof(Object), false, GUILayout.MaxWidth(180f)); EditorGUILayout.TextField(assetPath); if (rLookup) { BundleBuilderData.BundleInfo rBundleInfo; BundleBuilderData.BundleSplit rBundleSplit; BundleBuilderData.BundleSlice rBundleSlice; var exists = data.Lookup(assetGuid, out rBundleInfo, out rBundleSplit, out rBundleSlice); EditorGUI.BeginDisabledGroup(true); EditorGUILayout.TextField(exists ? rBundleSlice.name : "<null>"); EditorGUI.EndDisabledGroup(); if (GUILayout.Button(">", GUILayout.Width(20f))) { BundleAssetsWindow.Inspect(data, new List <BundleBuilderData.BundleInfo>(new[] { rBundleInfo })); } } if (batchMode) { if (nAssetPacker != attrs.packer) { builder?.ApplyAllMarks(attributes => attributes.packer = nAssetPacker); } if (nPriority != attrs.priority) { var deltaPriority = nPriority - attrs.priority; builder?.ApplyAllMarks(attributes => attributes.priority = Math.Max(0, Math.Min(data.priorityMax, attributes.priority + deltaPriority))); } } else { if (nAssetPacker != attrs.packer) { attrs.packer = nAssetPacker; data.MarkAsDirty(); } if (nPriority != attrs.priority) { attrs.priority = nPriority; data.MarkAsDirty(); } if (attrs.priority == 0 && attrs.packer == AssetPacker.Auto) { data.RemoveAssetAttributes(assetGuid); } else if (bNew) { if (attrs.priority != 0 || attrs.packer != AssetPacker.Auto) { var newAttributes = data.AddAssetAttributes(assetGuid); newAttributes.priority = attrs.priority; newAttributes.packer = attrs.packer; } } } return(attrs); }