//------------------------------------------------------------ // Game Framework // Copyright © 2013-2021 loyalsoft. All rights reserved. // Homepage: http://www.game7000.com/ // Feedback: http://www.game7000.com/ //------------------------------------------------------------ using GameFramework; using System.Collections.Generic; using UnityEditor; using UnityEngine; namespace UnityGameFramework.Editor.ResourceTools { /// /// 资源编辑器。 /// internal sealed partial class ResourceEditor : EditorWindow { private ResourceEditorController m_Controller = null; private MenuState m_MenuState = MenuState.Normal; private Resource m_SelectedResource = null; private ResourceFolder m_ResourceRoot = null; private HashSet m_ExpandedResourceFolderNames = null; private HashSet m_SelectedAssetsInSelectedResource = null; private HashSet m_ExpandedSourceFolders = null; private HashSet m_SelectedSourceAssets = null; private Texture m_MissingSourceAssetIcon = null; private HashSet m_CachedSelectedSourceFolders = null; private HashSet m_CachedUnselectedSourceFolders = null; private HashSet m_CachedAssignedSourceFolders = null; private HashSet m_CachedUnassignedSourceFolders = null; private HashSet m_CachedAssignedSourceAssets = null; private HashSet m_CachedUnassignedSourceAssets = null; private Vector2 m_ResourcesViewScroll = Vector2.zero; private Vector2 m_ResourceViewScroll = Vector2.zero; private Vector2 m_SourceAssetsViewScroll = Vector2.zero; private string m_InputResourceName = null; private string m_InputResourceVariant = null; private bool m_HideAssignedSourceAssets = false; private int m_CurrentResourceContentCount = 0; private int m_CurrentResourceRowOnDraw = 0; private int m_CurrentSourceRowOnDraw = 0; [MenuItem("Game Framework/Resource Tools/Resource Editor", false, 41)] private static void Open() { ResourceEditor window = GetWindow("Resource Editor", true); window.minSize = new Vector2(1400f, 600f); } private void OnEnable() { m_Controller = new ResourceEditorController(); m_Controller.OnLoadingResource += OnLoadingResource; m_Controller.OnLoadingAsset += OnLoadingAsset; m_Controller.OnLoadCompleted += OnLoadCompleted; m_Controller.OnAssetAssigned += OnAssetAssigned; m_Controller.OnAssetUnassigned += OnAssetUnassigned; m_MenuState = MenuState.Normal; m_SelectedResource = null; m_ResourceRoot = new ResourceFolder("Resources", null); m_ExpandedResourceFolderNames = new HashSet(); m_SelectedAssetsInSelectedResource = new HashSet(); m_ExpandedSourceFolders = new HashSet(); m_SelectedSourceAssets = new HashSet(); m_MissingSourceAssetIcon = EditorGUIUtility.IconContent("console.warnicon.sml").image; m_CachedSelectedSourceFolders = new HashSet(); m_CachedUnselectedSourceFolders = new HashSet(); m_CachedAssignedSourceFolders = new HashSet(); m_CachedUnassignedSourceFolders = new HashSet(); m_CachedAssignedSourceAssets = new HashSet(); m_CachedUnassignedSourceAssets = new HashSet(); m_ResourcesViewScroll = Vector2.zero; m_ResourceViewScroll = Vector2.zero; m_SourceAssetsViewScroll = Vector2.zero; m_InputResourceName = null; m_InputResourceVariant = null; m_HideAssignedSourceAssets = false; m_CurrentResourceContentCount = 0; m_CurrentResourceRowOnDraw = 0; m_CurrentSourceRowOnDraw = 0; if (m_Controller.Load()) { Debug.Log("Load configuration success."); } else { Debug.LogWarning("Load configuration failure."); } EditorUtility.DisplayProgressBar("Prepare Resource Editor", "Processing...", 0f); RefreshResourceTree(); EditorUtility.ClearProgressBar(); } private void OnGUI() { EditorGUILayout.BeginHorizontal(GUILayout.Width(position.width), GUILayout.Height(position.height)); { GUILayout.Space(2f); EditorGUILayout.BeginVertical(GUILayout.Width(position.width * 0.25f)); { GUILayout.Space(5f); EditorGUILayout.LabelField(Utility.Text.Format("Resource List ({0})", m_Controller.ResourceCount.ToString()), EditorStyles.boldLabel); EditorGUILayout.BeginHorizontal("box", GUILayout.Height(position.height - 52f)); { DrawResourcesView(); } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); { GUILayout.Space(5f); DrawResourcesMenu(); } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical(GUILayout.Width(position.width * 0.25f)); { GUILayout.Space(5f); EditorGUILayout.LabelField(Utility.Text.Format("Resource Content ({0})", m_CurrentResourceContentCount.ToString()), EditorStyles.boldLabel); EditorGUILayout.BeginHorizontal("box", GUILayout.Height(position.height - 52f)); { DrawResourceView(); } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); { GUILayout.Space(5f); DrawResourceMenu(); } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndVertical(); EditorGUILayout.BeginVertical(GUILayout.Width(position.width * 0.5f - 16f)); { GUILayout.Space(5f); EditorGUILayout.LabelField("Asset List", EditorStyles.boldLabel); EditorGUILayout.BeginHorizontal("box", GUILayout.Height(position.height - 52f)); { DrawSourceAssetsView(); } EditorGUILayout.EndHorizontal(); EditorGUILayout.BeginHorizontal(); { GUILayout.Space(5f); DrawSourceAssetsMenu(); } EditorGUILayout.EndHorizontal(); } EditorGUILayout.EndVertical(); GUILayout.Space(5f); } EditorGUILayout.EndHorizontal(); } private void DrawResourcesView() { m_CurrentResourceRowOnDraw = 0; m_ResourcesViewScroll = EditorGUILayout.BeginScrollView(m_ResourcesViewScroll); { DrawResourceFolder(m_ResourceRoot); } EditorGUILayout.EndScrollView(); } private void DrawResourceFolder(ResourceFolder folder) { bool expand = IsExpandedResourceFolder(folder); EditorGUILayout.BeginHorizontal(); { #if UNITY_2019_3_OR_NEWER bool foldout = EditorGUI.Foldout(new Rect(18f + 14f * folder.Depth, 20f * m_CurrentResourceRowOnDraw + 4f, int.MaxValue, 14f), expand, string.Empty, true); #else bool foldout = EditorGUI.Foldout(new Rect(18f + 14f * folder.Depth, 20f * m_CurrentResourceRowOnDraw + 2f, int.MaxValue, 14f), expand, string.Empty, true); #endif if (expand != foldout) { expand = !expand; SetExpandedResourceFolder(folder, expand); } #if UNITY_2019_3_OR_NEWER GUI.DrawTexture(new Rect(32f + 14f * folder.Depth, 20f * m_CurrentResourceRowOnDraw + 3f, 16f, 16f), ResourceFolder.Icon); EditorGUILayout.LabelField(string.Empty, GUILayout.Width(44f + 14f * folder.Depth), GUILayout.Height(18f)); #else GUI.DrawTexture(new Rect(32f + 14f * folder.Depth, 20f * m_CurrentResourceRowOnDraw + 1f, 16f, 16f), ResourceFolder.Icon); EditorGUILayout.LabelField(string.Empty, GUILayout.Width(40f + 14f * folder.Depth), GUILayout.Height(18f)); #endif EditorGUILayout.LabelField(folder.Name); } EditorGUILayout.EndHorizontal(); m_CurrentResourceRowOnDraw++; if (expand) { foreach (ResourceFolder subFolder in folder.GetFolders()) { DrawResourceFolder(subFolder); } foreach (ResourceItem resourceItem in folder.GetItems()) { DrawResourceItem(resourceItem); } } } private void DrawResourceItem(ResourceItem resourceItem) { EditorGUILayout.BeginHorizontal(); { string title = resourceItem.Name; if (resourceItem.Resource.Packed) { title = "[Packed] " + title; } float emptySpace = position.width; if (EditorGUILayout.Toggle(m_SelectedResource == resourceItem.Resource, GUILayout.Width(emptySpace - 12f))) { ChangeSelectedResource(resourceItem.Resource); } else if (m_SelectedResource == resourceItem.Resource) { ChangeSelectedResource(null); } GUILayout.Space(-emptySpace + 24f); #if UNITY_2019_3_OR_NEWER GUI.DrawTexture(new Rect(32f + 14f * resourceItem.Depth, 20f * m_CurrentResourceRowOnDraw + 3f, 16f, 16f), resourceItem.Icon); EditorGUILayout.LabelField(string.Empty, GUILayout.Width(30f + 14f * resourceItem.Depth), GUILayout.Height(18f)); #else GUI.DrawTexture(new Rect(32f + 14f * resourceItem.Depth, 20f * m_CurrentResourceRowOnDraw + 1f, 16f, 16f), resourceItem.Icon); EditorGUILayout.LabelField(string.Empty, GUILayout.Width(26f + 14f * resourceItem.Depth), GUILayout.Height(18f)); #endif EditorGUILayout.LabelField(title); } EditorGUILayout.EndHorizontal(); m_CurrentResourceRowOnDraw++; } private void DrawResourcesMenu() { switch (m_MenuState) { case MenuState.Normal: DrawResourcesMenu_Normal(); break; case MenuState.Add: DrawResourcesMenu_Add(); break; case MenuState.Rename: DrawResourcesMenu_Rename(); break; case MenuState.Remove: DrawResourcesMenu_Remove(); break; } } private void DrawResourcesMenu_Normal() { if (GUILayout.Button("Add", GUILayout.Width(65f))) { m_MenuState = MenuState.Add; m_InputResourceName = null; m_InputResourceVariant = null; GUI.FocusControl(null); } EditorGUI.BeginDisabledGroup(m_SelectedResource == null); { if (GUILayout.Button("Rename", GUILayout.Width(65f))) { m_MenuState = MenuState.Rename; m_InputResourceName = m_SelectedResource != null ? m_SelectedResource.Name : null; m_InputResourceVariant = m_SelectedResource != null ? m_SelectedResource.Variant : null; GUI.FocusControl(null); } if (GUILayout.Button("Remove", GUILayout.Width(65f))) { m_MenuState = MenuState.Remove; } if (m_SelectedResource == null) { EditorGUILayout.EnumPopup(LoadType.LoadFromFile); } else { LoadType loadType = (LoadType)EditorGUILayout.EnumPopup(m_SelectedResource.LoadType); if (loadType != m_SelectedResource.LoadType) { SetResourceLoadType(loadType); } } bool packed = EditorGUILayout.ToggleLeft("Packed", m_SelectedResource != null && m_SelectedResource.Packed, GUILayout.Width(65f)); if (m_SelectedResource != null && packed != m_SelectedResource.Packed) { SetResourcePacked(packed); } } EditorGUI.EndDisabledGroup(); } private void DrawResourcesMenu_Add() { GUI.SetNextControlName("NewResourceNameTextField"); m_InputResourceName = EditorGUILayout.TextField(m_InputResourceName); GUI.SetNextControlName("NewResourceVariantTextField"); m_InputResourceVariant = EditorGUILayout.TextField(m_InputResourceVariant, GUILayout.Width(60f)); if (GUI.GetNameOfFocusedControl() == "NewResourceNameTextField" || GUI.GetNameOfFocusedControl() == "NewResourceVariantTextField") { if (Event.current.isKey && Event.current.keyCode == KeyCode.Return) { EditorUtility.DisplayProgressBar("Add Resource", "Processing...", 0f); AddResource(m_InputResourceName, m_InputResourceVariant, true); EditorUtility.ClearProgressBar(); Repaint(); } } if (GUILayout.Button("Add", GUILayout.Width(50f))) { EditorUtility.DisplayProgressBar("Add Resource", "Processing...", 0f); AddResource(m_InputResourceName, m_InputResourceVariant, true); EditorUtility.ClearProgressBar(); } if (GUILayout.Button("Back", GUILayout.Width(50f))) { m_MenuState = MenuState.Normal; } } private void DrawResourcesMenu_Rename() { if (m_SelectedResource == null) { m_MenuState = MenuState.Normal; return; } GUI.SetNextControlName("RenameResourceNameTextField"); m_InputResourceName = EditorGUILayout.TextField(m_InputResourceName); GUI.SetNextControlName("RenameResourceVariantTextField"); m_InputResourceVariant = EditorGUILayout.TextField(m_InputResourceVariant, GUILayout.Width(60f)); if (GUI.GetNameOfFocusedControl() == "RenameResourceNameTextField" || GUI.GetNameOfFocusedControl() == "RenameResourceVariantTextField") { if (Event.current.isKey && Event.current.keyCode == KeyCode.Return) { EditorUtility.DisplayProgressBar("Rename Resource", "Processing...", 0f); RenameResource(m_SelectedResource, m_InputResourceName, m_InputResourceVariant); EditorUtility.ClearProgressBar(); Repaint(); } } if (GUILayout.Button("OK", GUILayout.Width(50f))) { EditorUtility.DisplayProgressBar("Rename Resource", "Processing...", 0f); RenameResource(m_SelectedResource, m_InputResourceName, m_InputResourceVariant); EditorUtility.ClearProgressBar(); } if (GUILayout.Button("Back", GUILayout.Width(50f))) { m_MenuState = MenuState.Normal; } } private void DrawResourcesMenu_Remove() { if (m_SelectedResource == null) { m_MenuState = MenuState.Normal; return; } GUILayout.Label(Utility.Text.Format("Remove '{0}' ?", m_SelectedResource.FullName)); if (GUILayout.Button("Yes", GUILayout.Width(50f))) { EditorUtility.DisplayProgressBar("Remove Resource", "Processing...", 0f); RemoveResource(); EditorUtility.ClearProgressBar(); m_MenuState = MenuState.Normal; } if (GUILayout.Button("No", GUILayout.Width(50f))) { m_MenuState = MenuState.Normal; } } private void DrawResourceView() { m_ResourceViewScroll = EditorGUILayout.BeginScrollView(m_ResourceViewScroll); { if (m_SelectedResource != null) { int index = 0; Asset[] assets = m_Controller.GetAssets(m_SelectedResource.Name, m_SelectedResource.Variant); m_CurrentResourceContentCount = assets.Length; foreach (Asset asset in assets) { SourceAsset sourceAsset = m_Controller.GetSourceAsset(asset.Guid); string assetName = sourceAsset != null ? (m_Controller.AssetSorter == AssetSorterType.Path ? sourceAsset.Path : (m_Controller.AssetSorter == AssetSorterType.Name ? sourceAsset.Name : sourceAsset.Guid)) : asset.Guid; EditorGUILayout.BeginHorizontal(); { float emptySpace = position.width; bool select = IsSelectedAssetInSelectedResource(asset); if (select != EditorGUILayout.Toggle(select, GUILayout.Width(emptySpace - 12f))) { select = !select; SetSelectedAssetInSelectedResource(asset, select); } GUILayout.Space(-emptySpace + 24f); #if UNITY_2019_3_OR_NEWER GUI.DrawTexture(new Rect(20f, 20f * index++ + 3f, 16f, 16f), sourceAsset != null ? sourceAsset.Icon : m_MissingSourceAssetIcon); EditorGUILayout.LabelField(string.Empty, GUILayout.Width(16f), GUILayout.Height(18f)); #else GUI.DrawTexture(new Rect(20f, 20f * index++ + 1f, 16f, 16f), sourceAsset != null ? sourceAsset.Icon : m_MissingSourceAssetIcon); EditorGUILayout.LabelField(string.Empty, GUILayout.Width(14f), GUILayout.Height(18f)); #endif EditorGUILayout.LabelField(assetName); } EditorGUILayout.EndHorizontal(); } } else { m_CurrentResourceContentCount = 0; } } EditorGUILayout.EndScrollView(); } private void DrawResourceMenu() { if (GUILayout.Button("All", GUILayout.Width(50f)) && m_SelectedResource != null) { Asset[] assets = m_Controller.GetAssets(m_SelectedResource.Name, m_SelectedResource.Variant); foreach (Asset asset in assets) { SetSelectedAssetInSelectedResource(asset, true); } } if (GUILayout.Button("None", GUILayout.Width(50f))) { m_SelectedAssetsInSelectedResource.Clear(); } m_Controller.AssetSorter = (AssetSorterType)EditorGUILayout.EnumPopup(m_Controller.AssetSorter, GUILayout.Width(60f)); GUILayout.Label(string.Empty); EditorGUI.BeginDisabledGroup(m_SelectedResource == null || m_SelectedAssetsInSelectedResource.Count <= 0); { if (GUILayout.Button(Utility.Text.Format("{0} >>", m_SelectedAssetsInSelectedResource.Count.ToString()), GUILayout.Width(80f))) { foreach (Asset asset in m_SelectedAssetsInSelectedResource) { UnassignAsset(asset); } m_SelectedAssetsInSelectedResource.Clear(); } } EditorGUI.EndDisabledGroup(); } private void DrawSourceAssetsView() { m_CurrentSourceRowOnDraw = 0; m_SourceAssetsViewScroll = EditorGUILayout.BeginScrollView(m_SourceAssetsViewScroll); { DrawSourceFolder(m_Controller.SourceAssetRoot); } EditorGUILayout.EndScrollView(); } private void DrawSourceAssetsMenu() { HashSet selectedSourceAssets = GetSelectedSourceAssets(); EditorGUI.BeginDisabledGroup(m_SelectedResource == null || selectedSourceAssets.Count <= 0); { if (GUILayout.Button(Utility.Text.Format("<< {0}", selectedSourceAssets.Count.ToString()), GUILayout.Width(80f))) { foreach (SourceAsset sourceAsset in selectedSourceAssets) { AssignAsset(sourceAsset, m_SelectedResource); } m_SelectedSourceAssets.Clear(); m_CachedSelectedSourceFolders.Clear(); } } EditorGUI.EndDisabledGroup(); EditorGUI.BeginDisabledGroup(selectedSourceAssets.Count <= 0); { if (GUILayout.Button(Utility.Text.Format("<<< {0}", selectedSourceAssets.Count.ToString()), GUILayout.Width(80f))) { int index = 0; int count = selectedSourceAssets.Count; foreach (SourceAsset sourceAsset in selectedSourceAssets) { EditorUtility.DisplayProgressBar("Add Resources", Utility.Text.Format("{0}/{1} processing...", (++index).ToString(), count.ToString()), (float)index / count); int dotIndex = sourceAsset.FromRootPath.IndexOf('.'); string name = dotIndex > 0 ? sourceAsset.FromRootPath.Substring(0, dotIndex) : sourceAsset.FromRootPath; AddResource(name, null, false); Resource resource = m_Controller.GetResource(name, null); if (resource == null) { continue; } AssignAsset(sourceAsset, resource); } EditorUtility.DisplayProgressBar("Add Resources", "Complete processing...", 1f); RefreshResourceTree(); EditorUtility.ClearProgressBar(); m_SelectedSourceAssets.Clear(); m_CachedSelectedSourceFolders.Clear(); } } EditorGUI.EndDisabledGroup(); bool hideAssignedSourceAssets = EditorGUILayout.ToggleLeft("Hide Assigned", m_HideAssignedSourceAssets, GUILayout.Width(100f)); if (hideAssignedSourceAssets != m_HideAssignedSourceAssets) { m_HideAssignedSourceAssets = hideAssignedSourceAssets; m_CachedSelectedSourceFolders.Clear(); m_CachedUnselectedSourceFolders.Clear(); m_CachedAssignedSourceFolders.Clear(); m_CachedUnassignedSourceFolders.Clear(); } GUILayout.Label(string.Empty); if (GUILayout.Button("Clean", GUILayout.Width(80f))) { EditorUtility.DisplayProgressBar("Clean", "Processing...", 0f); CleanResource(); EditorUtility.ClearProgressBar(); } if (GUILayout.Button("Save", GUILayout.Width(80f))) { EditorUtility.DisplayProgressBar("Save", "Processing...", 0f); SaveConfiguration(); EditorUtility.ClearProgressBar(); } } private void DrawSourceFolder(SourceFolder sourceFolder) { if (m_HideAssignedSourceAssets && IsAssignedSourceFolder(sourceFolder)) { return; } bool expand = IsExpandedSourceFolder(sourceFolder); EditorGUILayout.BeginHorizontal(); { bool select = IsSelectedSourceFolder(sourceFolder); if (select != EditorGUILayout.Toggle(select, GUILayout.Width(12f + 14f * sourceFolder.Depth))) { select = !select; SetSelectedSourceFolder(sourceFolder, select); } GUILayout.Space(-14f * sourceFolder.Depth); #if UNITY_2019_3_OR_NEWER bool foldout = EditorGUI.Foldout(new Rect(18f + 14f * sourceFolder.Depth, 20f * m_CurrentSourceRowOnDraw + 4f, int.MaxValue, 14f), expand, string.Empty, true); #else bool foldout = EditorGUI.Foldout(new Rect(18f + 14f * sourceFolder.Depth, 20f * m_CurrentSourceRowOnDraw + 2f, int.MaxValue, 14f), expand, string.Empty, true); #endif if (expand != foldout) { expand = !expand; SetExpandedSourceFolder(sourceFolder, expand); } #if UNITY_2019_3_OR_NEWER GUI.DrawTexture(new Rect(32f + 14f * sourceFolder.Depth, 20f * m_CurrentSourceRowOnDraw + 3f, 16f, 16f), SourceFolder.Icon); EditorGUILayout.LabelField(string.Empty, GUILayout.Width(30f + 14f * sourceFolder.Depth), GUILayout.Height(18f)); #else GUI.DrawTexture(new Rect(32f + 14f * sourceFolder.Depth, 20f * m_CurrentSourceRowOnDraw + 1f, 16f, 16f), SourceFolder.Icon); EditorGUILayout.LabelField(string.Empty, GUILayout.Width(26f + 14f * sourceFolder.Depth), GUILayout.Height(18f)); #endif EditorGUILayout.LabelField(sourceFolder.Name); } EditorGUILayout.EndHorizontal(); m_CurrentSourceRowOnDraw++; if (expand) { foreach (SourceFolder subSourceFolder in sourceFolder.GetFolders()) { DrawSourceFolder(subSourceFolder); } foreach (SourceAsset sourceAsset in sourceFolder.GetAssets()) { DrawSourceAsset(sourceAsset); } } } private void DrawSourceAsset(SourceAsset sourceAsset) { if (m_HideAssignedSourceAssets && IsAssignedSourceAsset(sourceAsset)) { return; } EditorGUILayout.BeginHorizontal(); { float emptySpace = position.width; bool select = IsSelectedSourceAsset(sourceAsset); if (select != EditorGUILayout.Toggle(select, GUILayout.Width(emptySpace - 12f))) { select = !select; SetSelectedSourceAsset(sourceAsset, select); } GUILayout.Space(-emptySpace + 24f); #if UNITY_2019_3_OR_NEWER GUI.DrawTexture(new Rect(32f + 14f * sourceAsset.Depth, 20f * m_CurrentSourceRowOnDraw + 3f, 16f, 16f), sourceAsset.Icon); EditorGUILayout.LabelField(string.Empty, GUILayout.Width(30f + 14f * sourceAsset.Depth), GUILayout.Height(18f)); #else GUI.DrawTexture(new Rect(32f + 14f * sourceAsset.Depth, 20f * m_CurrentSourceRowOnDraw + 1f, 16f, 16f), sourceAsset.Icon); EditorGUILayout.LabelField(string.Empty, GUILayout.Width(26f + 14f * sourceAsset.Depth), GUILayout.Height(18f)); #endif EditorGUILayout.LabelField(sourceAsset.Name); Asset asset = m_Controller.GetAsset(sourceAsset.Guid); EditorGUILayout.LabelField(asset != null ? GetResourceFullName(asset.Resource.Name, asset.Resource.Variant) : string.Empty, GUILayout.Width(position.width * 0.15f)); } EditorGUILayout.EndHorizontal(); m_CurrentSourceRowOnDraw++; } private void ChangeSelectedResource(Resource resource) { if (m_SelectedResource == resource) { return; } m_SelectedResource = resource; m_SelectedAssetsInSelectedResource.Clear(); } private void SaveConfiguration() { if (m_Controller.Save()) { Debug.Log("Save configuration success."); } else { Debug.LogWarning("Save configuration failure."); } } private void AddResource(string name, string variant, bool refresh) { if (variant == string.Empty) { variant = null; } string fullName = GetResourceFullName(name, variant); if (m_Controller.AddResource(name, variant, null, LoadType.LoadFromFile, false)) { if (refresh) { RefreshResourceTree(); } Debug.Log(Utility.Text.Format("Add resource '{0}' success.", fullName)); m_MenuState = MenuState.Normal; } else { Debug.LogWarning(Utility.Text.Format("Add resource '{0}' failure.", fullName)); } } private void RenameResource(Resource resource, string newName, string newVariant) { if (resource == null) { Debug.LogWarning("Resource is invalid."); return; } if (newVariant == string.Empty) { newVariant = null; } string oldFullName = resource.FullName; string newFullName = GetResourceFullName(newName, newVariant); if (m_Controller.RenameResource(resource.Name, resource.Variant, newName, newVariant)) { RefreshResourceTree(); Debug.Log(Utility.Text.Format("Rename resource '{0}' to '{1}' success.", oldFullName, newFullName)); m_MenuState = MenuState.Normal; } else { Debug.LogWarning(Utility.Text.Format("Rename resource '{0}' to '{1}' failure.", oldFullName, newFullName)); } } private void RemoveResource() { string fullName = m_SelectedResource.FullName; if (m_Controller.RemoveResource(m_SelectedResource.Name, m_SelectedResource.Variant)) { ChangeSelectedResource(null); RefreshResourceTree(); Debug.Log(Utility.Text.Format("Remove resource '{0}' success.", fullName)); } else { Debug.LogWarning(Utility.Text.Format("Remove resource '{0}' failure.", fullName)); } } private void SetResourceLoadType(LoadType loadType) { string fullName = m_SelectedResource.FullName; if (m_Controller.SetResourceLoadType(m_SelectedResource.Name, m_SelectedResource.Variant, loadType)) { Debug.Log(Utility.Text.Format("Set resource '{0}' load type to '{1}' success.", fullName, loadType.ToString())); } else { Debug.LogWarning(Utility.Text.Format("Set resource '{0}' load type to '{1}' failure.", fullName, loadType.ToString())); } } private void SetResourcePacked(bool packed) { string fullName = m_SelectedResource.FullName; if (m_Controller.SetResourcePacked(m_SelectedResource.Name, m_SelectedResource.Variant, packed)) { Debug.Log(Utility.Text.Format("{1} resource '{0}' success.", fullName, packed ? "Pack" : "Unpack")); } else { Debug.LogWarning(Utility.Text.Format("{1} resource '{0}' failure.", fullName, packed ? "Pack" : "Unpack")); } } private void AssignAsset(SourceAsset sourceAsset, Resource resource) { if (!m_Controller.AssignAsset(sourceAsset.Guid, resource.Name, resource.Variant)) { Debug.LogWarning(Utility.Text.Format("Assign asset '{0}' to resource '{1}' failure.", sourceAsset.Name, resource.FullName)); } } private void UnassignAsset(Asset asset) { if (!m_Controller.UnassignAsset(asset.Guid)) { Debug.LogWarning(Utility.Text.Format("Unassign asset '{0}' from resource '{1}' failure.", asset.Guid, m_SelectedResource.FullName)); } } private void CleanResource() { int unknownAssetCount = m_Controller.RemoveUnknownAssets(); int unusedResourceCount = m_Controller.RemoveUnusedResources(); RefreshResourceTree(); Debug.Log(Utility.Text.Format("Clean complete, {0} unknown assets and {1} unused resources has been removed.", unknownAssetCount.ToString(), unusedResourceCount.ToString())); } private void RefreshResourceTree() { m_ResourceRoot.Clear(); Resource[] resources = m_Controller.GetResources(); foreach (Resource resource in resources) { string[] splitedPath = resource.Name.Split('/'); ResourceFolder folder = m_ResourceRoot; for (int i = 0; i < splitedPath.Length - 1; i++) { ResourceFolder subFolder = folder.GetFolder(splitedPath[i]); folder = subFolder == null ? folder.AddFolder(splitedPath[i]) : subFolder; } string fullName = resource.Variant != null ? Utility.Text.Format("{0}.{1}", splitedPath[splitedPath.Length - 1], resource.Variant) : splitedPath[splitedPath.Length - 1]; folder.AddItem(fullName, resource); } } private bool IsExpandedResourceFolder(ResourceFolder folder) { return m_ExpandedResourceFolderNames.Contains(folder.FromRootPath); } private void SetExpandedResourceFolder(ResourceFolder folder, bool expand) { if (expand) { m_ExpandedResourceFolderNames.Add(folder.FromRootPath); } else { m_ExpandedResourceFolderNames.Remove(folder.FromRootPath); } } private bool IsSelectedAssetInSelectedResource(Asset asset) { return m_SelectedAssetsInSelectedResource.Contains(asset); } private void SetSelectedAssetInSelectedResource(Asset asset, bool select) { if (select) { m_SelectedAssetsInSelectedResource.Add(asset); } else { m_SelectedAssetsInSelectedResource.Remove(asset); } } private bool IsExpandedSourceFolder(SourceFolder sourceFolder) { return m_ExpandedSourceFolders.Contains(sourceFolder); } private void SetExpandedSourceFolder(SourceFolder sourceFolder, bool expand) { if (expand) { m_ExpandedSourceFolders.Add(sourceFolder); } else { m_ExpandedSourceFolders.Remove(sourceFolder); } } private bool IsSelectedSourceFolder(SourceFolder sourceFolder) { if (m_CachedSelectedSourceFolders.Contains(sourceFolder)) { return true; } if (m_CachedUnselectedSourceFolders.Contains(sourceFolder)) { return false; } foreach (SourceAsset sourceAsset in sourceFolder.GetAssets()) { if (m_HideAssignedSourceAssets && IsAssignedSourceAsset(sourceAsset)) { continue; } if (!IsSelectedSourceAsset(sourceAsset)) { m_CachedUnselectedSourceFolders.Add(sourceFolder); return false; } } foreach (SourceFolder subSourceFolder in sourceFolder.GetFolders()) { if (m_HideAssignedSourceAssets && IsAssignedSourceFolder(sourceFolder)) { continue; } if (!IsSelectedSourceFolder(subSourceFolder)) { m_CachedUnselectedSourceFolders.Add(sourceFolder); return false; } } m_CachedSelectedSourceFolders.Add(sourceFolder); return true; } private void SetSelectedSourceFolder(SourceFolder sourceFolder, bool select) { if (select) { m_CachedSelectedSourceFolders.Add(sourceFolder); m_CachedUnselectedSourceFolders.Remove(sourceFolder); SourceFolder folder = sourceFolder; while (folder != null) { m_CachedUnselectedSourceFolders.Remove(folder); folder = folder.Folder; } } else { m_CachedSelectedSourceFolders.Remove(sourceFolder); m_CachedUnselectedSourceFolders.Add(sourceFolder); SourceFolder folder = sourceFolder; while (folder != null) { m_CachedSelectedSourceFolders.Remove(folder); folder = folder.Folder; } } foreach (SourceAsset sourceAsset in sourceFolder.GetAssets()) { if (m_HideAssignedSourceAssets && IsAssignedSourceAsset(sourceAsset)) { continue; } SetSelectedSourceAsset(sourceAsset, select); } foreach (SourceFolder subSourceFolder in sourceFolder.GetFolders()) { if (m_HideAssignedSourceAssets && IsAssignedSourceFolder(subSourceFolder)) { continue; } SetSelectedSourceFolder(subSourceFolder, select); } } private bool IsSelectedSourceAsset(SourceAsset sourceAsset) { return m_SelectedSourceAssets.Contains(sourceAsset); } private void SetSelectedSourceAsset(SourceAsset sourceAsset, bool select) { if (select) { m_SelectedSourceAssets.Add(sourceAsset); SourceFolder folder = sourceAsset.Folder; while (folder != null) { m_CachedUnselectedSourceFolders.Remove(folder); folder = folder.Folder; } } else { m_SelectedSourceAssets.Remove(sourceAsset); SourceFolder folder = sourceAsset.Folder; while (folder != null) { m_CachedSelectedSourceFolders.Remove(folder); folder = folder.Folder; } } } private bool IsAssignedSourceAsset(SourceAsset sourceAsset) { if (m_CachedAssignedSourceAssets.Contains(sourceAsset)) { return true; } if (m_CachedUnassignedSourceAssets.Contains(sourceAsset)) { return false; } return m_Controller.GetAsset(sourceAsset.Guid) != null; } private bool IsAssignedSourceFolder(SourceFolder sourceFolder) { if (m_CachedAssignedSourceFolders.Contains(sourceFolder)) { return true; } if (m_CachedUnassignedSourceFolders.Contains(sourceFolder)) { return false; } foreach (SourceAsset sourceAsset in sourceFolder.GetAssets()) { if (!IsAssignedSourceAsset(sourceAsset)) { m_CachedUnassignedSourceFolders.Add(sourceFolder); return false; } } foreach (SourceFolder subSourceFolder in sourceFolder.GetFolders()) { if (!IsAssignedSourceFolder(subSourceFolder)) { m_CachedUnassignedSourceFolders.Add(sourceFolder); return false; } } m_CachedAssignedSourceFolders.Add(sourceFolder); return true; } private HashSet GetSelectedSourceAssets() { if (!m_HideAssignedSourceAssets) { return m_SelectedSourceAssets; } HashSet selectedUnassignedSourceAssets = new HashSet(); foreach (SourceAsset sourceAsset in m_SelectedSourceAssets) { if (!IsAssignedSourceAsset(sourceAsset)) { selectedUnassignedSourceAssets.Add(sourceAsset); } } return selectedUnassignedSourceAssets; } private string GetResourceFullName(string name, string variant) { return variant != null ? Utility.Text.Format("{0}.{1}", name, variant) : name; } private void OnLoadingResource(int index, int count) { EditorUtility.DisplayProgressBar("Loading Resources", Utility.Text.Format("Loading resources, {0}/{1} loaded.", index.ToString(), count.ToString()), (float)index / count); } private void OnLoadingAsset(int index, int count) { EditorUtility.DisplayProgressBar("Loading Assets", Utility.Text.Format("Loading assets, {0}/{1} loaded.", index.ToString(), count.ToString()), (float)index / count); } private void OnLoadCompleted() { EditorUtility.ClearProgressBar(); } private void OnAssetAssigned(SourceAsset[] sourceAssets) { HashSet affectedFolders = new HashSet(); foreach (SourceAsset sourceAsset in sourceAssets) { m_CachedAssignedSourceAssets.Add(sourceAsset); m_CachedUnassignedSourceAssets.Remove(sourceAsset); affectedFolders.Add(sourceAsset.Folder); } foreach (SourceFolder sourceFolder in affectedFolders) { SourceFolder folder = sourceFolder; while (folder != null) { m_CachedUnassignedSourceFolders.Remove(folder); folder = folder.Folder; } } } private void OnAssetUnassigned(SourceAsset[] sourceAssets) { HashSet affectedFolders = new HashSet(); foreach (SourceAsset sourceAsset in sourceAssets) { m_CachedAssignedSourceAssets.Remove(sourceAsset); m_CachedUnassignedSourceAssets.Add(sourceAsset); affectedFolders.Add(sourceAsset.Folder); } foreach (SourceFolder sourceFolder in affectedFolders) { SourceFolder folder = sourceFolder; while (folder != null) { m_CachedSelectedSourceFolders.Remove(folder); m_CachedAssignedSourceFolders.Remove(folder); m_CachedUnassignedSourceFolders.Add(folder); folder = folder.Folder; } } } } }