diff --git a/.idea/.idea.BABA_YAGA/.idea/workspace.xml b/.idea/.idea.BABA_YAGA/.idea/workspace.xml index 7cfc8b88..b4e7b6eb 100644 --- a/.idea/.idea.BABA_YAGA/.idea/workspace.xml +++ b/.idea/.idea.BABA_YAGA/.idea/workspace.xml @@ -6,44 +6,17 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + diff --git a/Assets/Editor/HierarchyEnhancer.cs b/Assets/Editor/HierarchyEnhancer.cs index edde70ed..2d2f3a06 100644 --- a/Assets/Editor/HierarchyEnhancer.cs +++ b/Assets/Editor/HierarchyEnhancer.cs @@ -1,81 +1,81 @@ -// =============================================================================== -// HierarchyEnhancer - Quick Toggle for GameObjects +// // =============================================================================== +// // HierarchyEnhancer - Quick Toggle for GameObjects +// // +// // Creator: Scove +// // Last Updated: 2024-05-08 +// // Version: 2.0 +// // +// // Purpose: +// // Adds a handy toggle checkbox to the right side of every item in the Hierarchy. +// // This allows you to enable or disable GameObjects instantly without selecting them. +// // +// // Key Features: +// // 1. One-click activation/deactivation directly in Hierarchy. +// // 2. Full Undo/Redo support integrated with Unity's system. +// // 3. Optimized UI placement to avoid overlapping with object names. +// // 4. Visual clarity: Helps quickly identify inactive objects in a complex tree. +// // +// // How to Use: +// // 1. Place this script in an 'Editor' folder. +// // 2. Look at your Hierarchy window; a small checkbox will appear on the far right. +// // 3. Click the checkbox to toggle the Active/Inactive state of any GameObject. +// // =============================================================================== // -// Creator: Scove -// Last Updated: 2024-05-08 -// Version: 2.0 +// using UnityEditor; +// using UnityEngine; // -// Purpose: -// Adds a handy toggle checkbox to the right side of every item in the Hierarchy. -// This allows you to enable or disable GameObjects instantly without selecting them. +// namespace Editor +// { +// [InitializeOnLoad] +// public class HierarchyEnhancer +// { +// // Define the width of the toggle area +// private const float TOGGLE_WIDTH = 16f; // -// Key Features: -// 1. One-click activation/deactivation directly in Hierarchy. -// 2. Full Undo/Redo support integrated with Unity's system. -// 3. Optimized UI placement to avoid overlapping with object names. -// 4. Visual clarity: Helps quickly identify inactive objects in a complex tree. +// static HierarchyEnhancer() +// { +// // Subscribe to the hierarchy item GUI event +// EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyItemGUI; +// } // -// How to Use: -// 1. Place this script in an 'Editor' folder. -// 2. Look at your Hierarchy window; a small checkbox will appear on the far right. -// 3. Click the checkbox to toggle the Active/Inactive state of any GameObject. -// =============================================================================== - -using UnityEditor; -using UnityEngine; - -namespace Editor -{ - [InitializeOnLoad] - public class HierarchyEnhancer - { - // Define the width of the toggle area - private const float TOGGLE_WIDTH = 16f; - - static HierarchyEnhancer() - { - // Subscribe to the hierarchy item GUI event - EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyItemGUI; - } - - private static void OnHierarchyItemGUI(int instanceID, Rect selectionRect) - { - // Get the GameObject associated with this instance ID - GameObject obj = EditorUtility.EntityIdToObject(instanceID) as GameObject; - if (obj == null) return; - - // Calculate the position for the Toggle (Aligned to the far right) - // selectionRect.xMax gives us the right boundary of the Hierarchy row - Rect toggleRect = new Rect(selectionRect); - toggleRect.x = selectionRect.xMax - TOGGLE_WIDTH; - toggleRect.width = TOGGLE_WIDTH; - - // Check current active state - bool isActive = obj.activeSelf; - - // Handle UI and changes - EditorGUI.BeginChangeCheck(); - - // Set the color based on active state (Optional polish) - Color originalColor = GUI.color; - if (!isActive) GUI.color = new Color(1f, 1f, 1f, 0.5f); // Dim the toggle if inactive - - bool newActive = EditorGUI.Toggle(toggleRect, isActive); - - GUI.color = originalColor; // Restore original color for other elements - - if (EditorGUI.EndChangeCheck()) - { - // Record undo before applying the change - Undo.RecordObject(obj, "Toggle GameObject Active State"); - obj.SetActive(newActive); - - // If it's a Prefab, mark the scene as dirty to ensure it saves - if (!Application.isPlaying) - { - EditorUtility.SetDirty(obj); - } - } - } - } -} \ No newline at end of file +// private static void OnHierarchyItemGUI(int instanceID, Rect selectionRect) +// { +// // Get the GameObject associated with this instance ID +// GameObject obj = EditorUtility.EntityIdToObject(instanceID) as GameObject; +// if (obj == null) return; +// +// // Calculate the position for the Toggle (Aligned to the far right) +// // selectionRect.xMax gives us the right boundary of the Hierarchy row +// Rect toggleRect = new Rect(selectionRect); +// toggleRect.x = selectionRect.xMax - TOGGLE_WIDTH; +// toggleRect.width = TOGGLE_WIDTH; +// +// // Check current active state +// bool isActive = obj.activeSelf; +// +// // Handle UI and changes +// EditorGUI.BeginChangeCheck(); +// +// // Set the color based on active state (Optional polish) +// Color originalColor = GUI.color; +// if (!isActive) GUI.color = new Color(1f, 1f, 1f, 0.5f); // Dim the toggle if inactive +// +// bool newActive = EditorGUI.Toggle(toggleRect, isActive); +// +// GUI.color = originalColor; // Restore original color for other elements +// +// if (EditorGUI.EndChangeCheck()) +// { +// // Record undo before applying the change +// Undo.RecordObject(obj, "Toggle GameObject Active State"); +// obj.SetActive(newActive); +// +// // If it's a Prefab, mark the scene as dirty to ensure it saves +// if (!Application.isPlaying) +// { +// EditorUtility.SetDirty(obj); +// } +// } +// } +// } +// } \ No newline at end of file diff --git a/Assets/Editor/HierarchySeparators.cs b/Assets/Editor/HierarchySeparators.cs index 8b231596..a7644723 100644 --- a/Assets/Editor/HierarchySeparators.cs +++ b/Assets/Editor/HierarchySeparators.cs @@ -1,84 +1,84 @@ -// =============================================================================== -// HierarchySeparators - Visual Organization for Unity Hierarchy +// // =============================================================================== +// // HierarchySeparators - Visual Organization for Unity Hierarchy +// // +// // Creator: Scove +// // Last Updated: 2024-05-08 +// // Version: 2.0 +// // +// // Purpose: +// // Converts GameObjects starting with "//" into visual separators or headers. +// // This helps organize large scenes by creating clear, readable sections. +// // +// // Key Features: +// // 1. Automatic formatting: "// player" becomes a bold, centered "PLAYER" header. +// // 2. Custom background: Draws a distinctive bar to separate different logic groups. +// // 3. Clean UI: Strips out the "//" prefix for a professional look in the editor. +// // +// // How to Use: +// // 1. Place this script in an 'Editor' folder. +// // 2. Create an Empty GameObject in your Hierarchy. +// // 3. Rename it starting with "//" (e.g., "// --- ENVIRONMENT ---"). +// // =============================================================================== // -// Creator: Scove -// Last Updated: 2024-05-08 -// Version: 2.0 +// using UnityEditor; +// using UnityEngine; // -// Purpose: -// Converts GameObjects starting with "//" into visual separators or headers. -// This helps organize large scenes by creating clear, readable sections. +// namespace Editor +// { +// [InitializeOnLoad] +// public class HierarchySeparators +// { +// // Custom styling colors +// private static readonly Color HeaderBackgroundColor = new Color(0.22f, 0.22f, 0.22f, 1f); +// private static readonly Color TextColor = new Color(0.9f, 0.9f, 0.9f, 1f); +// private static readonly Color BorderColor = new Color(0.15f, 0.15f, 0.15f, 1f); // -// Key Features: -// 1. Automatic formatting: "// player" becomes a bold, centered "PLAYER" header. -// 2. Custom background: Draws a distinctive bar to separate different logic groups. -// 3. Clean UI: Strips out the "//" prefix for a professional look in the editor. +// static HierarchySeparators() +// { +// // Subscribe to the hierarchy item GUI event +// EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyItemGUI; +// } // -// How to Use: -// 1. Place this script in an 'Editor' folder. -// 2. Create an Empty GameObject in your Hierarchy. -// 3. Rename it starting with "//" (e.g., "// --- ENVIRONMENT ---"). -// =============================================================================== - -using UnityEditor; -using UnityEngine; - -namespace Editor -{ - [InitializeOnLoad] - public class HierarchySeparators - { - // Custom styling colors - private static readonly Color HeaderBackgroundColor = new Color(0.22f, 0.22f, 0.22f, 1f); - private static readonly Color TextColor = new Color(0.9f, 0.9f, 0.9f, 1f); - private static readonly Color BorderColor = new Color(0.15f, 0.15f, 0.15f, 1f); - - static HierarchySeparators() - { - // Subscribe to the hierarchy item GUI event - EditorApplication.hierarchyWindowItemOnGUI += OnHierarchyItemGUI; - } - - private static void OnHierarchyItemGUI(int instanceID, Rect selectionRect) - { - // Get the object from the instance ID - GameObject obj = EditorUtility.EntityIdToObject(instanceID) as GameObject; - - // Trigger only if the name starts with "//" - if (obj != null && obj.name.StartsWith("//")) - { - // 1. Draw Background - EditorGUI.DrawRect(selectionRect, HeaderBackgroundColor); - - // 2. Draw Subtle Bottom Border for better depth - Rect borderRect = new Rect(selectionRect.x, selectionRect.yMax - 1f, selectionRect.width, 1f); - EditorGUI.DrawRect(borderRect, BorderColor); - - // 3. Configure Text Style - GUIStyle headerStyle = new GUIStyle(EditorStyles.boldLabel) - { - alignment = TextAnchor.MiddleCenter, - normal = { textColor = TextColor }, - fontSize = 11, - fontStyle = FontStyle.Bold - }; - - // 4. Clean and Format the string - // Removes "//", trims spaces, and converts to Uppercase - string headerName = obj.name.Replace("//", "").Trim().ToUpper(); - - // 5. Draw the Header Label - EditorGUI.LabelField(selectionRect, headerName, headerStyle); - - // Optional: To prevent selecting the separator as a normal object - // (keeps focus on actual game objects), uncomment the lines below: - - if (Event.current.type == EventType.MouseDown && selectionRect.Contains(Event.current.mousePosition)) - { - Selection.activeGameObject = null; - } - - } - } - } -} \ No newline at end of file +// private static void OnHierarchyItemGUI(int instanceID, Rect selectionRect) +// { +// // Get the object from the instance ID +// GameObject obj = EditorUtility.EntityIdToObject(instanceID) as GameObject; +// +// // Trigger only if the name starts with "//" +// if (obj != null && obj.name.StartsWith("//")) +// { +// // 1. Draw Background +// EditorGUI.DrawRect(selectionRect, HeaderBackgroundColor); +// +// // 2. Draw Subtle Bottom Border for better depth +// Rect borderRect = new Rect(selectionRect.x, selectionRect.yMax - 1f, selectionRect.width, 1f); +// EditorGUI.DrawRect(borderRect, BorderColor); +// +// // 3. Configure Text Style +// GUIStyle headerStyle = new GUIStyle(EditorStyles.boldLabel) +// { +// alignment = TextAnchor.MiddleCenter, +// normal = { textColor = TextColor }, +// fontSize = 11, +// fontStyle = FontStyle.Bold +// }; +// +// // 4. Clean and Format the string +// // Removes "//", trims spaces, and converts to Uppercase +// string headerName = obj.name.Replace("//", "").Trim().ToUpper(); +// +// // 5. Draw the Header Label +// EditorGUI.LabelField(selectionRect, headerName, headerStyle); +// +// // Optional: To prevent selecting the separator as a normal object +// // (keeps focus on actual game objects), uncomment the lines below: +// +// if (Event.current.type == EventType.MouseDown && selectionRect.Contains(Event.current.mousePosition)) +// { +// Selection.activeGameObject = null; +// } +// +// } +// } +// } +// } \ No newline at end of file diff --git a/Assets/Editor/ReflectTreeViewState.cs b/Assets/Editor/ReflectTreeViewState.cs new file mode 100644 index 00000000..0360942a --- /dev/null +++ b/Assets/Editor/ReflectTreeViewState.cs @@ -0,0 +1,23 @@ +using UnityEditor; +using UnityEngine; +using UnityEditor.IMGUI.Controls; +using System.Reflection; + +public class ReflectTreeViewState : EditorWindow +{ + [MenuItem("Tools/Reflect TreeViewState")] + public static void ShowWindow() + { + var type = typeof(TreeViewState); + var sb = new System.Text.StringBuilder(); + foreach (var p in type.GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) + { + sb.AppendLine("Prop: " + p.Name + " - " + p.PropertyType.FullName); + } + foreach (var f in type.GetFields(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) + { + sb.AppendLine("Field: " + f.Name + " - " + f.FieldType.FullName); + } + Debug.Log(sb.ToString()); + } +} diff --git a/Assets/Editor/ReflectTreeViewState.cs.meta b/Assets/Editor/ReflectTreeViewState.cs.meta new file mode 100644 index 00000000..c679d32c --- /dev/null +++ b/Assets/Editor/ReflectTreeViewState.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 52d65087605ff1841a952350f53f3a3e \ No newline at end of file diff --git a/Assets/Plugin.meta b/Assets/Plugins.meta similarity index 77% rename from Assets/Plugin.meta rename to Assets/Plugins.meta index f6c636f2..6d884048 100644 --- a/Assets/Plugin.meta +++ b/Assets/Plugins.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4f008884399e3704fb50da2d7d219083 +guid: 65c18d699fcadad459bc3e16558c2bd2 folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/Plugins/Sirenix.meta b/Assets/Plugins/Sirenix.meta new file mode 100644 index 00000000..2b43858a --- /dev/null +++ b/Assets/Plugins/Sirenix.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7db84c72b2408b24da5a225550b562ff +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies.meta b/Assets/Plugins/Sirenix/Assemblies.meta new file mode 100644 index 00000000..fc264204 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 05b1eef81f23d6648992c93437892982 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/NoEditor.meta b/Assets/Plugins/Sirenix/Assemblies/NoEditor.meta new file mode 100644 index 00000000..c5b7db43 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/NoEditor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aa3dc305dd00dad49bbc1ff3996b055d +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/NoEditor/Sirenix.Serialization.dll b/Assets/Plugins/Sirenix/Assemblies/NoEditor/Sirenix.Serialization.dll new file mode 100644 index 00000000..7bbb21a2 Binary files /dev/null and b/Assets/Plugins/Sirenix/Assemblies/NoEditor/Sirenix.Serialization.dll differ diff --git a/Assets/Plugins/Sirenix/Assemblies/NoEditor/Sirenix.Serialization.dll.meta b/Assets/Plugins/Sirenix/Assemblies/NoEditor/Sirenix.Serialization.dll.meta new file mode 100644 index 00000000..1a97dca0 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/NoEditor/Sirenix.Serialization.dll.meta @@ -0,0 +1,79 @@ +fileFormatVersion: 2 +guid: 5651992cdad94894a3af7dc3f1da9170 +timeCreated: 1488828285 +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 1 + Exclude Linux: 1 + Exclude Linux64: 1 + Exclude LinuxUniversal: 1 + Exclude N3DS: 0 + Exclude OSXIntel: 1 + Exclude OSXIntel64: 1 + Exclude OSXUniversal: 1 + Exclude PS4: 0 + Exclude PSM: 0 + Exclude PSP2: 0 + Exclude SamsungTV: 0 + Exclude Tizen: 0 + Exclude WebGL: 0 + Exclude WiiU: 0 + Exclude Win: 1 + Exclude Win64: 1 + Exclude WindowsStoreApps: 0 + Exclude XboxOne: 0 + Exclude iOS: 0 + Exclude tvOS: 0 + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + N3DS: + enabled: 1 + settings: {} + PS4: + enabled: 1 + settings: {} + PSM: + enabled: 1 + settings: {} + PSP2: + enabled: 1 + settings: {} + SamsungTV: + enabled: 1 + settings: {} + Tizen: + enabled: 1 + settings: {} + WebGL: + enabled: 1 + settings: {} + WiiU: + enabled: 1 + settings: {} + WindowsStoreApps: + enabled: 1 + settings: + CPU: AnyCPU + XboxOne: + enabled: 1 + settings: {} + iOS: + enabled: 1 + settings: {} + tvOS: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/NoEditor/Sirenix.Utilities.dll b/Assets/Plugins/Sirenix/Assemblies/NoEditor/Sirenix.Utilities.dll new file mode 100644 index 00000000..cddf36ec Binary files /dev/null and b/Assets/Plugins/Sirenix/Assemblies/NoEditor/Sirenix.Utilities.dll differ diff --git a/Assets/Plugins/Sirenix/Assemblies/NoEditor/Sirenix.Utilities.dll.meta b/Assets/Plugins/Sirenix/Assemblies/NoEditor/Sirenix.Utilities.dll.meta new file mode 100644 index 00000000..21e88ae1 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/NoEditor/Sirenix.Utilities.dll.meta @@ -0,0 +1,79 @@ +fileFormatVersion: 2 +guid: 5978f8f3dd274e848fbb7a123bde1fb9 +timeCreated: 1488828285 +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 1 + Exclude Linux: 1 + Exclude Linux64: 1 + Exclude LinuxUniversal: 1 + Exclude N3DS: 0 + Exclude OSXIntel: 1 + Exclude OSXIntel64: 1 + Exclude OSXUniversal: 1 + Exclude PS4: 0 + Exclude PSM: 0 + Exclude PSP2: 0 + Exclude SamsungTV: 0 + Exclude Tizen: 0 + Exclude WebGL: 0 + Exclude WiiU: 0 + Exclude Win: 1 + Exclude Win64: 1 + Exclude WindowsStoreApps: 0 + Exclude XboxOne: 0 + Exclude iOS: 0 + Exclude tvOS: 0 + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + N3DS: + enabled: 1 + settings: {} + PS4: + enabled: 1 + settings: {} + PSM: + enabled: 1 + settings: {} + PSP2: + enabled: 1 + settings: {} + SamsungTV: + enabled: 1 + settings: {} + Tizen: + enabled: 1 + settings: {} + WebGL: + enabled: 1 + settings: {} + WiiU: + enabled: 1 + settings: {} + WindowsStoreApps: + enabled: 1 + settings: + CPU: AnyCPU + XboxOne: + enabled: 1 + settings: {} + iOS: + enabled: 1 + settings: {} + tvOS: + enabled: 1 + settings: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/NoEmitAndNoEditor.meta b/Assets/Plugins/Sirenix/Assemblies/NoEmitAndNoEditor.meta new file mode 100644 index 00000000..cefd7a7a --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/NoEmitAndNoEditor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a73a691127ad93941b89586292291dab +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/NoEmitAndNoEditor/Sirenix.Serialization.dll b/Assets/Plugins/Sirenix/Assemblies/NoEmitAndNoEditor/Sirenix.Serialization.dll new file mode 100644 index 00000000..eeda3e28 Binary files /dev/null and b/Assets/Plugins/Sirenix/Assemblies/NoEmitAndNoEditor/Sirenix.Serialization.dll differ diff --git a/Assets/Plugins/Sirenix/Assemblies/NoEmitAndNoEditor/Sirenix.Serialization.dll.meta b/Assets/Plugins/Sirenix/Assemblies/NoEmitAndNoEditor/Sirenix.Serialization.dll.meta new file mode 100644 index 00000000..ac8769d2 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/NoEmitAndNoEditor/Sirenix.Serialization.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: d2a8f0021d6b47c5923d8972dfb81ef1 +timeCreated: 1488828285 +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Android: + enabled: 1 + settings: {} + Any: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 1 + Exclude Linux: 0 + Exclude Linux64: 0 + Exclude LinuxUniversal: 0 + Exclude N3DS: 1 + Exclude OSXIntel: 0 + Exclude OSXIntel64: 0 + Exclude OSXUniversal: 0 + Exclude PS4: 1 + Exclude PSM: 1 + Exclude PSP2: 1 + Exclude SamsungTV: 1 + Exclude Tizen: 1 + Exclude WebGL: 1 + Exclude WiiU: 1 + Exclude Win: 0 + Exclude Win64: 0 + Exclude WindowsStoreApps: 1 + Exclude XboxOne: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + Linux: + enabled: 1 + settings: {} + Linux64: + enabled: 1 + settings: {} + LinuxUniversal: + enabled: 1 + settings: {} + OSXIntel: + enabled: 1 + settings: {} + OSXIntel64: + enabled: 1 + settings: {} + OSXUniversal: + enabled: 1 + settings: {} + PSM: + enabled: 0 + settings: {} + Win: + enabled: 1 + settings: {} + Win64: + enabled: 1 + settings: {} + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/NoEmitAndNoEditor/Sirenix.Utilities.dll b/Assets/Plugins/Sirenix/Assemblies/NoEmitAndNoEditor/Sirenix.Utilities.dll new file mode 100644 index 00000000..a742fd2e Binary files /dev/null and b/Assets/Plugins/Sirenix/Assemblies/NoEmitAndNoEditor/Sirenix.Utilities.dll differ diff --git a/Assets/Plugins/Sirenix/Assemblies/NoEmitAndNoEditor/Sirenix.Utilities.dll.meta b/Assets/Plugins/Sirenix/Assemblies/NoEmitAndNoEditor/Sirenix.Utilities.dll.meta new file mode 100644 index 00000000..f158c550 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/NoEmitAndNoEditor/Sirenix.Utilities.dll.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 1e0a9643dc0d4b46bf2321f72c4e503e +timeCreated: 1488828285 +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Android: + enabled: 1 + settings: {} + Any: + enabled: 0 + settings: + Exclude Android: 0 + Exclude Editor: 1 + Exclude Linux: 0 + Exclude Linux64: 0 + Exclude LinuxUniversal: 0 + Exclude N3DS: 1 + Exclude OSXIntel: 0 + Exclude OSXIntel64: 0 + Exclude OSXUniversal: 0 + Exclude PS4: 1 + Exclude PSM: 1 + Exclude PSP2: 1 + Exclude SamsungTV: 1 + Exclude Tizen: 1 + Exclude WebGL: 1 + Exclude WiiU: 1 + Exclude Win: 0 + Exclude Win64: 0 + Exclude WindowsStoreApps: 1 + Exclude XboxOne: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + Linux: + enabled: 1 + settings: {} + Linux64: + enabled: 1 + settings: {} + LinuxUniversal: + enabled: 1 + settings: {} + OSXIntel: + enabled: 1 + settings: {} + OSXIntel64: + enabled: 1 + settings: {} + OSXUniversal: + enabled: 1 + settings: {} + PSM: + enabled: 0 + settings: {} + Win: + enabled: 1 + settings: {} + Win64: + enabled: 1 + settings: {} + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Attributes.dll b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Attributes.dll new file mode 100644 index 00000000..9bb2a2a3 Binary files /dev/null and b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Attributes.dll differ diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Attributes.dll.meta b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Attributes.dll.meta new file mode 100644 index 00000000..77ae9293 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Attributes.dll.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 47a84ebde4ec47fabb620b30cc7a3e5c +timeCreated: 1488828285 +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux: 0 + Exclude Linux64: 0 + Exclude LinuxUniversal: 0 + Exclude N3DS: 0 + Exclude OSXIntel: 0 + Exclude OSXIntel64: 0 + Exclude OSXUniversal: 0 + Exclude PS4: 0 + Exclude PSM: 0 + Exclude PSP2: 0 + Exclude SamsungTV: 0 + Exclude Tizen: 0 + Exclude WebGL: 0 + Exclude WiiU: 0 + Exclude Win: 0 + Exclude Win64: 0 + Exclude WindowsStoreApps: 0 + Exclude XboxOne: 0 + Exclude iOS: 0 + Exclude tvOS: 0 + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Attributes.xml b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Attributes.xml new file mode 100644 index 00000000..3fc1c9e6 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Attributes.xml @@ -0,0 +1,6441 @@ + + + + Sirenix.OdinInspector.Attributes + + + + + AssetLists is used on lists and arrays and single elements of unity types, and replaces the default list drawer with a list of all possible assets with the specified filter. + Use this to both filter and include or exclude assets from a list or an array, without navigating the project window. + + + Asset lists works on all asset types such as materials, scriptable objects, prefabs, custom components, audio, textures etc, and does also show inherited types. + + + The following example will display an asset list of all prefabs located in the project window. + + public class AssetListExamples : MonoBehaviour + { + [InfoBox("The AssetList attribute work on both lists of UnityEngine.Object types and UnityEngine.Object types, but have different behaviour.")] + [AssetList] + [InlineEditor(InlineEditorModes.LargePreview)] + public GameObject Prefab; + + [AssetList] + public List<PlaceableObject> PlaceableObjects; + + [AssetList(Path = "Plugins/Sirenix/")] + [InlineEditor(InlineEditorModes.LargePreview)] + public UnityEngine.Object Object; + + [AssetList(AutoPopulate = true)] + public List<PlaceableObject> PlaceableObjectsAutoPopulated; + + [AssetList(LayerNames = "MyLayerName")] + public GameObject[] AllPrefabsWithLayerName; + + [AssetList(AssetNamePrefix = "Rock")] + public List<GameObject> PrefabsStartingWithRock; + + [AssetList(Path = "/Plugins/Sirenix/")] + public List<GameObject> AllPrefabsLocatedInFolder; + + [AssetList(Tags = "MyTagA, MyTabB", Path = "/Plugins/Sirenix/")] + public List<GameObject> GameObjectsWithTag; + + [AssetList(Path = "/Plugins/Sirenix/")] + public List<Material> AllMaterialsInSirenix; + + [AssetList(Path = "/Plugins/Sirenix/")] + public List<ScriptableObject> AllScriptableObjects; + + [InfoBox("Use a method as a custom filter for the asset list.")] + [AssetList(CustomFilterMethod = "HasRigidbodyComponent")] + public List<GameObject> MyRigidbodyPrefabs; + + private bool HasRigidbodyComponent(GameObject obj) + { + return obj.GetComponent<Rigidbody>() != null; + } + } + + + + + + If true, all assets found and displayed by the asset list, will automatically be added to the list when inspected. + + + + + Comma separated list of tags to filter the asset list. + + + + + Filter the asset list to only include assets with a specified layer. + + + + + Filter the asset list to only include assets which name begins with. + + + + + Filter the asset list to only include assets which is located at the specified path. + + + + + Filter the asset list to only include assets for which the given filter method returns true. + + + + + Initializes a new instance of the class. + + + + + The AssetSelector attribute can be used on all Unity types and will prepend a small button next to the object field that when clicked, + will present the user with a dropdown of assets to select from which can be customized from the attribute. + + + + + True by default. + + + + + True by default. If the ValueDropdown attribute is applied to a list, then disabling this, + will render all child elements normally without using the ValueDropdown. The ValueDropdown will + still show up when you click the add button on the list drawer, unless is true. + + + + + False by default. + + + + + If the ValueDropdown attribute is applied to a list, and is set to true, then enabling this, + will exclude existing values, instead of rendering a checkbox indicating whether the item is already included or not. + + + + + If the dropdown renders a tree-view, then setting this to true will ensure everything is expanded by default. + + + + + By default, the dropdown will create a tree view. + + + + + Gets or sets the width of the dropdown. Default is zero. + + + + + Gets or sets the height of the dropdown. Default is zero. + + + + + Gets or sets the title for the dropdown. Null by default. + + + + + Specify which folders to search in. Specifying no folders will make it search in your entire project. + Use the property for a more clean way of populating this array through attributes. + + + + + The filters we should use when calling AssetDatabase.FindAssets. + + + + + + Specify which folders to search in. Specifying no folders will make it search in your entire project. + You can declare multiple paths using '|' as the separator. + Example: [AssetList(Paths = "Assets/Textures|Assets/Other/Textures")] + + + This property is simply a more clean way of populating the array. + + + + + + AssetsOnly is used on object properties, and restricts the property to project assets, and not scene objects. + Use this when you want to ensure an object is from the project, and not from the scene. + + + The following example shows a component with a game object property, that must be a prefab from the project, and not a scene object. + + public MyComponent : MonoBehaviour + { + [AssetsOnly] + public GameObject MyPrefab; + } + + + + + + + BoxGroup is used on any property and organizes the property in a boxed group. + Use this to cleanly organize relevant values together in the inspector. + + + The following example shows how BoxGroup is used to organize properties together into a box. + + public class BoxGroupExamples : MonoBehaviour + { + // Box with a centered title. + [BoxGroup("Centered Title", centerLabel: true)] + public int A; + + [BoxGroup("Centered Title", centerLabel: true)] + public int B; + + [BoxGroup("Centered Title", centerLabel: true)] + public int C; + + // Box with a title. + [BoxGroup("Left Oriented Title")] + public int D; + + [BoxGroup("Left Oriented Title")] + public int E; + + // Box with a title recieved from a field. + [BoxGroup("$DynamicTitle1"), LabelText("Dynamic Title")] + public string DynamicTitle1 = "Dynamic box title"; + + [BoxGroup("$DynamicTitle1")] + public int F; + + // Box with a title recieved from a property. + [BoxGroup("$DynamicTitle2")] + public int G; + + [BoxGroup("$DynamicTitle2")] + public int H; + + // Box without a title. + [InfoBox("You can also hide the label of a box group.")] + [BoxGroup("NoTitle", false)] + public int I; + + [BoxGroup("NoTitle")] + public int J; + + [BoxGroup("NoTitle")] + public int K; + + #if UNITY_EDITOR + public string DynamicTitle2 + { + get { return UnityEditor.PlayerSettings.productName; } + } + #endif + + [BoxGroup("Boxed Struct"), HideLabel] + public SomeStruct BoxedStruct; + + public SomeStruct DefaultStruct; + + [Serializable] + public struct SomeStruct + { + public int One; + public int Two; + public int Three; + } + } + + + + + + + + + + + If true a label for the group will be drawn on top. + + + + + If true the header label will be places in the center of the group header. Otherwise it will be in left side. + + + + + If non-null, this is used instead of the group's name as the title label. + + + + + Adds the property to the specified box group. + + The box group. + If true a label will be drawn for the group. + If set to true the header label will be centered. + The order of the group in the inspector. + + + + Initializes a new instance of the class. Use the other constructor overloads in order to show a header-label on the box group. + + + + + Combines the box group with another group. + + The other group. + + + + Buttons are used on functions, and allows for clickable buttons in the inspector. + + + The following example shows a component that has an initialize method, that can be called from the inspector. + + public class MyComponent : MonoBehaviour + { + [Button] + private void Init() + { + // ... + } + } + + + + The following example show how a Button could be used to test a function. + + public class MyBot : MonoBehaviour + { + [Button] + private void Jump() + { + // ... + } + } + + + + The following example show how a Button can named differently than the function it's been attached to. + + public class MyComponent : MonoBehaviour + { + [Button("Function")] + private void MyFunction() + { + // ... + } + } + + + + + + + + Use this to override the label on the button. + + + + + The style in which to draw the button. + + + + + If the button contains parameters, you can disable the foldout it creates by setting this to true. + + + + + Whether to display the button method's parameters (if any) as values in the inspector. True by default. + If this is set to false, the button method will instead be invoked through an ActionResolver or ValueResolver (based on whether it returns a value), giving access to contextual named parameter values like "InspectorProperty property" that can be passed to the button method. + + + + + Whether the containing object or scene (if there is one) should be marked dirty when the button is clicked. True by default. Note that if this is false, undo for any changes caused by the button click is also disabled, as registering undo events also causes dirtying. + + + + + Gets the height of the button. If it's zero or below then use default. + + + + + The icon to be displayed inside the button. + + + + + The alignment of the icon that is displayed inside the button. + + + + + The alignment of the button represented by a range from 0 to 1 where 0 is the left edge of the available space and 1 is the right edge. + ButtonAlignment only has an effect when Stretch is set to false. + + + + + Whether the button should stretch to fill all of the available space. Default value is true. + + + + + If the button has a return type, set this to false to not draw the result. Default value is true. + + + + + Creates a button in the inspector named after the method. + + + + + Creates a button in the inspector named after the method. + + The size of the button. + + + + Creates a button in the inspector named after the method. + + The size of the button. + + + + Creates a button in the inspector with a custom name. + + Custom name for the button. + + + + Creates a button in the inspector with a custom name. + + Custom name for the button. + Size of the button. + + + + Creates a button in the inspector with a custom name. + + Custom name for the button. + Size of the button in pixels. + + + + Creates a button in the inspector named after the method. + + Button style for methods with parameters. + + + + Creates a button in the inspector named after the method. + + The size of the button. + Button style for methods with parameters. + + + + Creates a button in the inspector named after the method. + + The size of the button. + Button style for methods with parameters. + + + + Creates a button in the inspector with a custom name. + + Custom name for the button. + Button style for methods with parameters. + + + + Creates a button in the inspector with a custom name. + + Custom name for the button. + Size of the button. + Button style for methods with parameters. + + + + Creates a button in the inspector with a custom name. + + Custom name for the button. + Size of the button in pixels. + Button style for methods with parameters. + + + + Creates a button in the inspector with a custom icon. + + The icon to be displayed inside the button. + The alignment of the icon that is displayed inside the button. + + + + Creates a button in the inspector with a custom icon. + + The icon to be displayed inside the button. + + + + Creates a button in the inspector with a custom icon. + + The icon to be displayed inside the button. + Custom name for the button. + + + + ButtonGroup is used on any instance function, and adds buttons to the inspector organized into horizontal groups. + Use this to organize multiple button in a tidy horizontal group. + + + The following example shows how ButtonGroup is used to organize two buttons into one group. + + public class MyComponent : MonoBehaviour + { + [ButtonGroup("MyGroup")] + private void A() + { + // .. + } + + [ButtonGroup("MyGroup")] + private void B() + { + // .. + } + } + + + + The following example shows how ButtonGroup can be used to create multiple groups of buttons. + + public class MyComponent : MonoBehaviour + { + [ButtonGroup("First")] + private void A() + { } + + [ButtonGroup("First")] + private void B() + { } + + [ButtonGroup("")] + private void One() + { } + + [ButtonGroup("")] + private void Two() + { } + + [ButtonGroup("")] + private void Three() + { } + } + + + + + + + + + + + + + Gets the height of the button. If it's zero or below then use default. + + + + + The alignment of the icon that is displayed inside the button. + + + + + The alignment of the button represented by a range from 0 to 1 where 0 is the left edge of the available space and 1 is the right edge. + + + + + Whether the button should stretch to fill all of the available space. Default value is true. + + + + + Organizes the button into the specified button group. + + The group to organize the button into. + The order of the group in the inspector.. + + + + Button style for methods with parameters. + + + + + Draws a foldout box around the parameters of the method with the button on the box header itself. + This is the default style of a method with parameters. + + + + + Draws a button with a foldout to expose the parameters of the method. + + + + + Draws a foldout box around the parameters of the method with the button at the bottom of the box. + + + + + The ChildGameObjectsOnly attribute can be used on Components and GameObject fields and will prepend a small button next to the object-field that + will search through all child gameobjects for assignable objects and present them in a dropdown for the user to choose from. + + + + + + ColorPalette is used on any Color property, and allows for choosing colors from different definable palettes. + Use this to allow the user to choose from a set of predefined color options. + + + See and edit the color palettes in Tools > Odin > Inspector > Preferences > Drawers > Color Palettes. + The color property is not tied to the color palette, and can be edited. Therefore the color will also not update if the ColorPalette is edited. + + + The following example shows how ColorPalette is applied to a property. The user can freely choose between all available ColorPalettes. + + public class ColorPaletteExamples : MonoBehaviour + { + [ColorPalette] + public Color ColorOptions; + + [ColorPalette("Underwater")] + public Color UnderwaterColor; + + [ColorPalette("Fall"), HideLabel] + public Color WideColorPalette; + + [ColorPalette("My Palette")] + public Color MyColor; + + [ColorPalette("Clovers")] + public Color[] ColorArray; + } + + + + + + Gets the name of the palette. + + + + + Indicates if the color palette should show alpha values or not. + + + + + Adds a color palette options to a Color property. + + + + + Adds color options to a Color property from a specific palette. + + Name of the palette. + + + + CustomContextMenu is used on any property, and adds a custom options to the context menu for the property. + Use this for when you want to add custom actions to the context menu of a property. + + + CustomContextMenu currently does not support static functions. + + + The following example shows how CustomContextMenu is used to add a custom option to a property. + + public class MyComponent : MonoBehaviour + { + [CustomContextMenu("My custom option", "MyAction")] + public Vector3 MyVector; + + private void MyAction() + { + MyVector = Random.onUnitSphere; + } + } + + + + + + + A resolved string defining the name of the menu item. + + + + + The name of the callback method. Obsolete; use the Action member instead. + + + + + A resolved string defining the action to take when the context menu is clicked. + + + + + Adds a custom option to the context menu of the property. + + A resolved string defining the name of the menu item. + A resolved string defining the action to take when the context menu is clicked. + + + + Instead of making a new attribute, and a new drawer, for a one-time thing, you can with this attribute, make a method that acts as a custom property drawer. + These drawers will out of the box have support for undo/redo and multi-selection. + + + Usage: + + public class CustomDrawerExamples : MonoBehaviour + { + public float From = 2, To = 7; + + [CustomValueDrawer("MyStaticCustomDrawerStatic")] + public float CustomDrawerStatic; + + [CustomValueDrawer("MyStaticCustomDrawerInstance")] + public float CustomDrawerInstance; + + [CustomValueDrawer("MyStaticCustomDrawerArray")] + public float[] CustomDrawerArray; + + #if UNITY_EDITOR + + private static float MyStaticCustomDrawerStatic(float value, GUIContent label) + { + return EditorGUILayout.Slider(value, 0f, 10f); + } + + private float MyStaticCustomDrawerInstance(float value, GUIContent label) + { + return EditorGUILayout.Slider(value, this.From, this.To); + } + + private float MyStaticCustomDrawerArray(float value, GUIContent label) + { + return EditorGUILayout.Slider(value, this.From, this.To); + } + + #endif + } + + + + + + Name of the custom drawer method. Obsolete; use the Action member instead. + + + + + A resolved string that defines the custom drawer action to take, such as an expression or method invocation. + + + + + Instead of making a new attribute, and a new drawer, for a one-time thing, you can with this attribute, make a method that acts as a custom property drawer. + These drawers will out of the box have support for undo/redo and multi-selection. + + A resolved string that defines the custom drawer action to take, such as an expression or method invocation. + + + + Delays applying changes to properties while they still being edited in the inspector. + Similar to Unity's built-in Delayed attribute, but this attribute can also be applied to properties. + + + + + DetailedInfoBox is used on any property, and displays a message box that can be expanded to show more details. + Use this to convey a message to a user, and give them the option to see more details. + + + The following example shows how DetailedInfoBox is used on a field. + + public class MyComponent : MonoBehaviour + { + [DetailedInfoBox("This is a message", "Here is some more details about that message")] + public int MyInt; + } + + + + + + + The message for the message box. + + + + + The hideable details of the message box. + + + + + Type of the message box. + + + + + Optional name of a member to hide or show the message box. + + + + + Displays a message box with hideable details. + + The message for the message box. + The hideable details of the message box. + Type of the message box. + Optional name of a member to hide or show the message box. + + + + Customize the behavior for dictionaries in the inspector. + + + + + Specify an alternative key label for the dictionary drawer. + + + + + Specify an alternative value label for the dictionary drawer. + + + + + Specify how the dictionary should draw its items. + + + + + Gets or sets a value indicating whether this instance is read only. + + + + + Gets or sets a value indicating the default key column width of the dictionary. + + + + + DisableContextMenu is used on any property and disables the context menu for that property. + Use this if you do not want the context menu to be available for a property. + + + The following example shows how DisableContextMenu is used on a property. + + public class MyComponent : MonoBehaviour + { + [DisableContextMenu] + public Vector3 MyVector; + } + + + + + + + Whether to disable the context menu for the member itself. + + + + + Whether to disable the context menu for collection elements. + + + + + Initializes a new instance of the class. + + Whether to disable the context menu for the member itself. + Whether to also disable the context menu of collection elements. + + + + DisableIf is used on any property, and can disable or enable the property in the inspector. + Use this to disable properties when they are irrelevant. + + + The following example shows how a property can be disabled by the state of a field. + + public class MyComponent : MonoBehaviour + { + public bool DisableProperty; + + [DisableIf("DisableProperty")] + public int MyInt; + + public SomeEnum SomeEnumField; + + [DisableIf("SomeEnumField", SomeEnum.SomeEnumMember)] + public string SomeString; + } + + + + The following examples show how a property can be disabled by a function. + + public class MyComponent : MonoBehaviour + { + [EnableIf("MyDisableFunction")] + public int MyInt; + + private bool MyDisableFunction() + { + // ... + } + } + + + + + + + + The name of a bool member field, property or method. Obsolete; use the Condition member instead. + + + + + A resolved string that defines the condition to check the value of, such as a member name or an expression. + + + + + The optional condition value. + + + + + Disables a property in the inspector, based on the value of a resolved string. + + A resolved string that defines the condition to check the value of, such as a member name or an expression. + + + + Disables a property in the inspector, if the resolved string evaluates to the specified value. + + A resolved string that defines the condition to check the value of, such as a member name or an expression. + Value to check against. + + + + Disables a member based on which type of a prefab and instance it is in. + + + + + DisableInEditorMode is used on any property, and disables the property when not in play mode. + Use this when you only want a property to be editable when in play mode. + + + The following example shows how DisableInEditorMode is used to disable a property when in the editor. + + public class MyComponent : MonoBehaviour + { + [DisableInEditorMode] + public int MyInt; + } + + + + + + + + + Disables a property if it is drawn within an . + + + + + Disables a property if it is drawn from a non-prefab asset or instance. + + + + + DisableInPlayMode is used on any property, and disables the property when in play mode. + Use this to prevent users from editing a property when in play mode. + + + The following example shows how DisableInPlayMode is used to disable a property when in play mode. + + public class MyComponent : MonoBehaviour + { + [DisableInPlayMode] + public int MyInt; + } + + + + + + + + + + + Disables a property if it is drawn from a prefab asset. + + + + + Disables a property if it is drawn from a prefab instance. + + + + + Disables a property if it is drawn from a prefab asset or a prefab instance. + + + + + DisallowModificationsIn disables / grays out members, preventing modifications from being made and enables validation, + providing error messages in case a modification was made prior to introducing the attribute. + + + + + + + + DisplayAsString is used on any property, and displays a string in the inspector as text. + Use this for when you want to show a string in the inspector, but not allow for any editing. + + + DisplayAsString uses the property's ToString method to display the property as a string. + + + The following example shows how DisplayAsString is used to display a string property as text in the inspector. + + public class MyComponent : MonoBehaviour + { + [DisplayAsString] + public string MyInt = 5; + + // You can combine with to display a message in the inspector. + [DisplayAsString, HideLabel] + public string MyMessage = "This string will be displayed as text in the inspector"; + + [DisplayAsString(false)] + public string InlineMessage = "This string is very long, but has been configured to not overflow."; + } + + + + + + + + If true, the string will overflow past the drawn space and be clipped when there's not enough space for the text. + If false the string will expand to multiple lines, if there's not enough space when drawn. + + + + + How the string should be aligned. + + + + + The size of the font. + + + + + If true the string will support rich text. + + + + + String for formatting the value. Type must implement the IFormattable interface. + + + + + Displays the property as a string in the inspector. + + + + + Displays the property as a string in the inspector. + + Value indicating if the string should overflow past the available space, or expand to multiple lines when there's not enough horizontal space. + + + + Displays the property as a string in the inspector. + + How the string should be aligned. + + + + Displays the property as a string in the inspector. + + The size of the font. + + + + Displays the property as a string in the inspector. + + Value indicating if the string should overflow past the available space, or expand to multiple lines when there's not enough horizontal space. + How the string should be aligned. + + + + Displays the property as a string in the inspector. + + Value indicating if the string should overflow past the available space, or expand to multiple lines when there's not enough horizontal space. + The size of the font. + + + + Displays the property as a string in the inspector. + + The size of the font. + How the string should be aligned. + + + + Displays the property as a string in the inspector. + + Value indicating if the string should overflow past the available space, or expand to multiple lines when there's not enough horizontal space. + The size of the font. + How the string should be aligned. + + + + Displays the property as a string in the inspector. + + How the string should be aligned. + If true the string will support rich text. + + + + Displays the property as a string in the inspector. + + The size of the font. + If true the string will support rich text. + + + + Displays the property as a string in the inspector. + + Value indicating if the string should overflow past the available space, or expand to multiple lines when there's not enough horizontal space. + How the string should be aligned. + If true the string will support rich text. + + + + Displays the property as a string in the inspector. + + Value indicating if the string should overflow past the available space, or expand to multiple lines when there's not enough horizontal space. + The size of the font. + If true the string will support rich text. + + + + Displays the property as a string in the inspector. + + The size of the font. + How the string should be aligned. + If true the string will support rich text. + + + + Displays the property as a string in the inspector. + + Value indicating if the string should overflow past the available space, or expand to multiple lines when there's not enough horizontal space. + The size of the font. + How the string should be aligned. + If true the string will support rich text. + + + + Indicates that the member should not be drawn as a value reference, if it becomes a reference to another value in the tree. Beware, and use with care! This may lead to infinite draw loops! + + + + + DontApplyToListElements is used on other attributes, and indicates that those attributes should be applied only to the list, and not to the elements of the list. + Use this on attributes that should only work on a list or array property as a whole, and not on each element of the list. + + + The following example shows how DontApplyToListElements is used on . + + [DontApplyToListElements] + [AttributeUsage(AttributeTargets.All, AllowMultiple = true, Inherited = true)] + public sealed class VisibleIfAttribute : Attribute + { + public string MemberName { get; private set; } + + public VisibleIfAttribute(string memberName) + { + this.MemberName = memberName; + } + } + + + + + + Tells the validation system that this member should not be validated. It will not show validation messages in the inspector, and it will not be scanned by the project validator. + + + + + DrawWithUnity can be applied to a field or property to make Odin draw it using Unity's old drawing system. Use it if you want to selectively disable Odin drawing for a particular member. + + + Note that this attribute does not mean "disable Odin completely for this property"; it is visual only in nature, and in fact represents an Odin drawer which calls into Unity's old property drawing system. As Odin is still ultimately responsible for arranging the drawing of the property, and since other attributes exist with a higher priority than this attribute, and it is not guaranteed that Unity will draw the property if another attribute is present to override this one. + + + + + Force Odin to draw this value as an IMGUI-embedded UI Toolkit Visual Element. + + + + + An attribute that enables GUI. + + + + public class InlineEditorExamples : MonoBehaviour + { + [EnableGUI] + public string SomeReadonlyProperty { get { return "My GUI is usually disabled." } } + } + + + + + + + EnableIf is used on any property, and can enable or disable the property in the inspector. + Use this to enable properties when they are relevant. + + + The following example shows how a property can be enabled by the state of a field. + + public class MyComponent : MonoBehaviour + { + public bool EnableProperty; + + [EnableIf("EnableProperty")] + public int MyInt; + + public SomeEnum SomeEnumField; + + [EnableIf("SomeEnumField", SomeEnum.SomeEnumMember)] + public string SomeString; + } + + + + The following examples show how a property can be enabled by a function. + + public class MyComponent : MonoBehaviour + { + [EnableIf("MyEnableFunction")] + public int MyInt; + + private bool MyEnableFunction() + { + // ... + } + } + + + + + + + + + + + The name of a bool member field, property or method. Obsolete; use the Condition member instead. + + + + + A resolved string that defines the condition to check the value of, such as a member name or an expression. + + + + + The optional condition value. + + + + + Enables a property in the inspector, based on the value of a resolved string. + + A resolved string that defines the condition to check the value of, such as a member name or an expression. + + + + Enables a property in the inspector, if the resolved string evaluates to the specified value. + + A resolved string that defines the condition to check the value of, such as a member name or an expression. + Value to check against. + + + + Enables a member based on which type of a prefab and instance it is. + + + + + Draws an enum selector in the inspector with next and previous buttons to let you cycle through the available values for the enum property. + + + + public enum MyEnum + { + One, + Two, + Three, + } + + public class MyMonoBehaviour : MonoBehaviour + { + [EnumPaging] + public MyEnum Value; + } + + + + + + + Draws an enum in a horizontal button group instead of a dropdown. + + + + public class MyComponent : MonoBehvaiour + { + [EnumToggleButtons] + public MyBitmaskEnum MyBitmaskEnum; + + [EnumToggleButtons] + public MyEnum MyEnum; + } + + [Flags] + public enum MyBitmaskEnum + { + A = 1 << 1, // 1 + B = 1 << 2, // 2 + C = 1 << 3, // 4 + ALL = A | B | C + } + + public enum MyEnum + { + A, + B, + C + } + + + + + + + FilePath is used on string properties, and provides an interface for file paths. + + + The following example demonstrates how FilePath is used. + + public class FilePathExamples : MonoBehaviour + { + // By default, FilePath provides a path relative to the Unity project. + [FilePath] + public string UnityProjectPath; + + // It is possible to provide custom parent path. Parent paths can be relative to the Unity project, or absolute. + [FilePath(ParentFolder = "Assets/Plugins/Sirenix")] + public string RelativeToParentPath; + + // Using parent path, FilePath can also provide a path relative to a resources folder. + [FilePath(ParentFolder = "Assets/Resources")] + public string ResourcePath; + + // Provide a comma seperated list of allowed extensions. Dots are optional. + [FilePath(Extensions = "cs")] + public string ScriptFiles; + + // By setting AbsolutePath to true, the FilePath will provide an absolute path instead. + [FilePath(AbsolutePath = true)] + [BoxGroup("Conditions")] + public string AbsolutePath; + + // FilePath can also be configured to show an error, if the provided path is invalid. + [FilePath(RequireValidPath = true)] + public string ValidPath; + + // By default, FilePath will enforce the use of forward slashes. It can also be configured to use backslashes instead. + [FilePath(UseBackslashes = true)] + public string Backslashes; + + // FilePath also supports member references with the $ symbol. + [FilePath(ParentFolder = "$DynamicParent", Extensions = "$DynamicExtensions")] + public string DynamicFilePath; + + public string DynamicParent = "Assets/Plugin/Sirenix"; + + public string DynamicExtensions = "cs, unity, jpg"; + } + + + + + + + + If true the FilePath will provide an absolute path, instead of a relative one. + + + + + Comma separated list of allowed file extensions. Dots are optional. + Supports member referencing with $. + + + + + ParentFolder provides an override for where the path is relative to. ParentFolder can be relative to the Unity project, or an absolute path. + Supports member referencing with $. + + + + + If true an error will be displayed for invalid, or missing paths. + + + + + If true an error will be displayed for non-existing paths. + + + + + By default FilePath enforces forward slashes. Set UseBackslashes to true if you want backslashes instead. + + + + + If true the file path will include the file's extension. + + + + + Gets or sets a value indicating whether the path should be read only. + + + + + FolderPath is used on string properties, and provides an interface for directory paths. + + + The following example demonstrates how FolderPath is used. + + public class FolderPathExamples : MonoBehaviour + { + // By default, FolderPath provides a path relative to the Unity project. + [FolderPath] + public string UnityProjectPath; + + // It is possible to provide custom parent patn. ParentFolder paths can be relative to the Unity project, or absolute. + [FolderPath(ParentFolder = "Assets/Plugins/Sirenix")] + public string RelativeToParentPath; + + // Using ParentFolder, FolderPath can also provide a path relative to a resources folder. + [FolderPath(ParentFolder = "Assets/Resources")] + public string ResourcePath; + + // By setting AbsolutePath to true, the FolderPath will provide an absolute path instead. + [FolderPath(AbsolutePath = true)] + public string AbsolutePath; + + // FolderPath can also be configured to show an error, if the provided path is invalid. + [FolderPath(RequireValidPath = true)] + public string ValidPath; + + // By default, FolderPath will enforce the use of forward slashes. It can also be configured to use backslashes instead. + [FolderPath(UseBackslashes = true)] + public string Backslashes; + + // FolderPath also supports member references with the $ symbol. + [FolderPath(ParentFolder = "$DynamicParent")] + public string DynamicFolderPath; + + public string DynamicParent = "Assets/Plugins/Sirenix"; + } + + + + + + + + If true the FolderPath will provide an absolute path, instead of a relative one. + + + + + ParentFolder provides an override for where the path is relative to. ParentFolder can be relative to the Unity project, or an absolute path. + Supports member referencing with $. + + + + + If true an error will be displayed for invalid, or missing paths. + + + + + If true an error will be displayed for non-existing paths. + + + + + By default FolderPath enforces forward slashes. Set UseBackslashes to true if you want backslashes instead. + + + + + FoldoutGroup is used on any property, and organizes properties into a foldout. + Use this to organize properties, and to allow the user to hide properties that are not relevant for them at the moment. + + + The following example shows how FoldoutGroup is used to organize properties into a foldout. + + public class MyComponent : MonoBehaviour + { + [FoldoutGroup("MyGroup")] + public int A; + + [FoldoutGroup("MyGroup")] + public int B; + + [FoldoutGroup("MyGroup")] + public int C; + } + + + + The following example shows how properties can be organizes into multiple foldouts. + + public class MyComponent : MonoBehaviour + { + [FoldoutGroup("First")] + public int A; + + [FoldoutGroup("First")] + public int B; + + [FoldoutGroup("Second")] + public int C; + } + + + + + + + + + + + Gets a value indicating whether or not the foldout should be expanded by default. + + + + + Gets a value indicating whether or not the Expanded property has been set. + + + + + Adds the property to the specified foldout group. + + Name of the foldout group. + The order of the group in the inspector. + + + + Adds the property to the specified foldout group. + + Name of the foldout group. + Whether or not the foldout should be expanded by default. + The order of the group in the inspector. + + + + Combines the foldout property with another. + + The group to combine with. + + + + GUIColor is used on any property and changes the GUI color used to draw the property. + + + The following example shows how GUIColor is used on a properties to create a rainbow effect. + + public class MyComponent : MonoBehaviour + { + [GUIColor(1f, 0f, 0f)] + public int A; + + [GUIColor(1f, 0.5f, 0f, 0.2f)] + public int B; + + [GUIColor("GetColor")] + public int C; + + private Color GetColor() { return this.A == 0 ? Color.red : Color.white; } + } + + + + + + The GUI color of the property. + + + + Supports a variety of color formats, including named colors (e.g. "red", "orange", "green", "blue"), hex codes (e.g. "#FF0000" and "#FF0000FF"), and RGBA (e.g. "RGBA(1,1,1,1)") or RGB (e.g. "RGB(1,1,1)"), including Odin attribute expressions (e.g "@this.MyColor"). Here are the available named colors: black, blue, clear, cyan, gray, green, grey, magenta, orange, purple, red, transparent, transparentBlack, transparentWhite, white, yellow, lightblue, lightcyan, lightgray, lightgreen, lightgrey, lightmagenta, lightorange, lightpurple, lightred, lightyellow, darkblue, darkcyan, darkgray, darkgreen, darkgrey, darkmagenta, darkorange, darkpurple, darkred, darkyellow. + + + + Sets the GUI color for the property. + + The red channel. + The green channel. + The blue channel. + The alpha channel. + + + + Sets the GUI color for the property. + + Supports a variety of color formats, including named colors (e.g. "red", "orange", "green", "blue"), hex codes (e.g. "#FF0000" and "#FF0000FF"), and RGBA (e.g. "RGBA(1,1,1,1)") or RGB (e.g. "RGB(1,1,1)"), including Odin attribute expressions (e.g "@this.MyColor"). + + + + Indicates that Odin should hide the reference box, if this property would otherwise be drawn as a reference to another property, due to duplicate reference values being encountered. + Note that if the value is referencing itself recursively, then the reference box will be drawn regardless of this attribute in all recursive draw calls. + + + + + HideIf is used on any property and can hide the property in the inspector. + Use this to hide irrelevant properties based on the current state of the object. + + + This example shows a component with fields hidden by the state of another field. + + public class MyComponent : MonoBehaviour + { + public bool HideProperties; + + [HideIf("HideProperties")] + public int MyInt; + + [HideIf("HideProperties", false)] + public string MyString; + + public SomeEnum SomeEnumField; + + [HideIf("SomeEnumField", SomeEnum.SomeEnumMember)] + public string SomeString; + } + + + + This example shows a component with a field that is hidden when the game object is inactive. + + public class MyComponent : MonoBehaviour + { + [HideIf("MyVisibleFunction")] + public int MyHideableField; + + private bool MyVisibleFunction() + { + return !this.gameObject.activeInHierarchy; + } + } + + + + + + + + + The name of a bool member field, property or method. Obsolete; use the Condition member instead. + + + + + A resolved string that defines the condition to check the value of, such as a member name or an expression. + + + + + The optional condition value. + + + + + Whether or not to slide the property in and out when the state changes. + + + + + Hides a property in the inspector, based on the value of a resolved string. + + A resolved string that defines the condition to check the value of, such as a member name or an expression. + Whether or not to slide the property in and out when the state changes. + + + + Hides a property in the inspector, if the resolved string evaluates to the specified value. + + A resolved string that defines the condition to check the value of, such as a member name or an expression. + Value to check against. + Whether or not to slide the property in and out when the state changes. + + + +

HideIfGroup allows for showing or hiding a group of properties based on a condition.

+

The attribute is a group attribute and can therefore be combined with other group attributes, and even be used to show or hide entire groups.

+

Note that in the vast majority of cases where you simply want to be able to control the visibility of a single group, it is better to use the VisibleIf parameter that *all* group attributes have.

+
+ + + + + +
+ + + Whether or not to visually animate group visibility changes. + + + + + The optional member value. + + + + + Name of member to use when to hide the group. Defaults to the name of the group, by can be overriden by setting this property. + + + + + A resolved string that defines the condition to check the value of, such as a member name or an expression. + + + + + Makes a group that can be shown or hidden based on a condition. + + The group path. + If true then a fade animation will be played when the group is hidden or shown. + + + + Makes a group that can be shown or hidden based on a condition. + + The group path. + The value the member should equal for the property to shown. + If true then a fade animation will be played when the group is hidden or shown. + + + + Combines HideIfGroup attributes. + + Another ShowIfGroup attribute. + + + + Hides a member based on which type of a prefab and instance it is in. + + + + + HideInEditorMode is used on any property, and hides the property when not in play mode. + Use this when you only want a property to only be visible play mode. + + + The following example shows how HideInEditorMode is used to hide a property when in the editor. + + public class MyComponent : MonoBehaviour + { + [HideInEditorMode] + public int MyInt; + } + + + + + + + + + + Hides a property if it is drawn within an . + + + + + Hides a property if it is drawn from a non prefab instance or asset. + + + + + HideInPlayMode is used on any property, and hides the property when not in editor mode. + Use this when you only want a property to only be visible the editor. + + + The following example shows how HideInPlayMode is used to hide a property when in play mode. + + public class MyComponent : MonoBehaviour + { + [HideInPlayMode] + public int MyInt; + } + + + + + + + + + + Hides a property if it is drawn from a prefab asset. + + + + + Hides a property if it is drawn from a prefab instance. + + + + + Hides a property if it is drawn from a prefab instance or a prefab asset. + + + + + The HideInTables attribute is used to prevent members from showing up as columns in tables drawn using the . + + + + + HideLabel is used on any property, and hides the label in the inspector. + Use this to hide the label of properties in the inspector. + + + The following example show how HideLabel is used to hide the label of a game object property. + + public class MyComponent : MonoBehaviour + { + [HideLabel] + public GameObject MyGameObjectWithoutLabel; + } + + + + + + + Apply HideMonoScript to your class to prevent the Script property from being shown in the inspector. + + This attribute has the same effect on a single type that the global configuration option "Show Mono Script In Editor" in "Preferences -> Odin Inspector -> General -> Drawers" has globally when disabled. + + + + The following example shows how to use this attribute. + + [HideMonoScript] + public class MyComponent : MonoBehaviour + { + // The Script property will not be shown for this component in the inspector + } + + + + + + + Apply HideNetworkBehaviourFields to your class to prevent the special "Network Channel" and "Network Send Interval" properties from being shown in the inspector for a NetworkBehaviour. + This attribute has no effect on classes that are not derived from NetworkBehaviour. + + + The following example shows how to use this attribute. + + [HideNetworkBehaviourFields] + public class MyComponent : NetworkBehaviour + { + // The "Network Channel" and "Network Send Interval" properties will not be shown for this component in the inspector + } + + + + + + + Hides the polymorphic object-picker shown above the properties of non-Unity serialized reference types. + + + When the object picker is hidden, you can right click and set the instance to null, in order to set a new value. + If you don't want this behavior, you can use attribute to ensure people can't change the value. + + + + + public class MyComponent : SerializedMonoBehaviour + { + [Header("Hidden Object Pickers")] + [Indent] + [HideReferenceObjectPicker] + public MyCustomReferenceType OdinSerializedProperty1; + + [Indent] + [HideReferenceObjectPicker] + public MyCustomReferenceType OdinSerializedProperty2; + + [Indent] + [Header("Shown Object Pickers")] + public MyCustomReferenceType OdinSerializedProperty3; + + [Indent] + public MyCustomReferenceType OdinSerializedProperty4; + + public class MyCustomReferenceType + { + public int A; + public int B; + public int C; + } + } + + + + + + HorizontalGroup is used group multiple properties horizontally in the inspector. + The width can either be specified as percentage or pixels. + All values between 0 and 1 will be treated as a percentage. + If the width is 0 the column will be automatically sized. + Margin-left and right can only be specified in pixels. + + + The following example shows how three properties have been grouped together horizontally. + + // The width can either be specified as percentage or pixels. + // All values between 0 and 1 will be treated as a percentage. + // If the width is 0 the column will be automatically sized. + // Margin-left and right can only be specified in pixels. + + public class HorizontalGroupAttributeExamples : MonoBehaviour + { + [HorizontalGroup] + public int A; + + [HideLabel, LabelWidth (150)] + [HorizontalGroup(150)] + public LayerMask B; + + // LabelWidth can be helpfull when dealing with HorizontalGroups. + [HorizontalGroup("Group 1"), LabelWidth(15)] + public int C; + + [HorizontalGroup("Group 1"), LabelWidth(15)] + public int D; + + [HorizontalGroup("Group 1"), LabelWidth(15)] + public int E; + + // Having multiple properties in a column can be achived using multiple groups. Checkout the "Combining Group Attributes" example. + [HorizontalGroup("Split", 0.5f, PaddingRight = 15)] + [BoxGroup("Split/Left"), LabelWidth(15)] + public int L; + + [BoxGroup("Split/Right"), LabelWidth(15)] + public int M; + + [BoxGroup("Split/Left"), LabelWidth(15)] + public int N; + + [BoxGroup("Split/Right"), LabelWidth(15)] + public int O; + + // Horizontal Group also has supprot for: Title, MarginLeft, MarginRight, PaddingLeft, PaddingRight, MinWidth and MaxWidth. + [HorizontalGroup("MyButton", MarginLeft = 0.25f, MarginRight = 0.25f)] + public void SomeButton() + { + + } + } + + + + + + + + + + + The width. Values between 0 and 1 will be treated as percentage, 0 = auto, otherwise pixels. + + + + + The margin left. Values between 0 and 1 will be treated as percentage, 0 = ignore, otherwise pixels. + + + + + The margin right. Values between 0 and 1 will be treated as percentage, 0 = ignore, otherwise pixels. + + + + + The padding left. Values between 0 and 1 will be treated as percentage, 0 = ignore, otherwise pixels. + + + + + The padding right. Values between 0 and 1 will be treated as percentage, 0 = ignore, otherwise pixels. + + + + + The minimum Width. Values between 0 and 1 will be treated as percentage, 0 = ignore, otherwise pixels. + + + + + The maximum Width. Values between 0 and 1 will be treated as percentage, 0 = ignore, otherwise pixels. + + + + + The width between each column. Values between 0 and 1 will be treated as percentage, otherwise pixels. + + + + + Adds a title above the horizontal group. + + + + + Fallback to using the default label width, whatever that might be. + + + + + The label width, 0 = auto. + + + + + Organizes the property in a horizontal group. + + The group for the property. + The width of the property. Values between 0 and 1 are interpolated as a percentage, otherwise pixels. + The left margin in pixels. + The right margin in pixels. + The order of the group in the inspector. + + + + Organizes the property in a horizontal group. + + The width of the property. Values between 0 and 1 are interpolated as a percentage, otherwise pixels. + The left margin in pixels. + The right margin in pixels. + The order of the group in the inspector. + + + + Merges the values of two group attributes together. + + The other group to combine with. + + + + Indent is used on any property and moves the property's label to the right. + Use this to clearly organize properties in the inspector. + + + The following example shows how a property is indented by Indent. + + public class MyComponent : MonoBehaviour + { + [Indent] + public int IndentedInt; + } + + + + + + Indicates how much a property should be indented. + + + + + Indents a property in the inspector. + + How much a property should be indented. + + + + InfoBox is used on any property, and display a text box above the property in the inspector. + Use this to add comments or warn about the use of different properties. + + + The following example shows different info box types. + + public class MyComponent : MonoBehaviour + { + [InfoBox("This is an int property")] + public int MyInt; + + [InfoBox("This info box is a warning", InfoMessageType.Warning)] + public float MyFloat; + + [InfoBox("This info box is an error", InfoMessageType.Error)] + public object MyObject; + + [InfoBox("This info box is just a box", InfoMessageType.None)] + public Vector3 MyVector; + } + + + + The following example how info boxes can be hidden by fields and properties. + + public class MyComponent : MonoBehaviour + { + [InfoBox("This info box is hidden by an instance field.", "InstanceShowInfoBoxField")] + public int MyInt; + public bool InstanceShowInfoBoxField; + + [InfoBox("This info box is hideable by a static field.", "StaticShowInfoBoxField")] + public float MyFloat; + public static bool StaticShowInfoBoxField; + + [InfoBox("This info box is hidden by an instance property.", "InstanceShowInfoBoxProperty")] + public int MyOtherInt; + public bool InstanceShowInfoBoxProperty { get; set; } + + [InfoBox("This info box is hideable by a static property.", "StaticShowInfoBoxProperty")] + public float MyOtherFloat; + public static bool StaticShowInfoBoxProperty { get; set; } + } + + + + The following example shows how info boxes can be hidden by functions. + + public class MyComponent : MonoBehaviour + { + [InfoBox("This info box is hidden by an instance function.", "InstanceShowFunction")] + public int MyInt; + public bool InstanceShowFunction() + { + return this.MyInt == 0; + } + + [InfoBox("This info box is hidden by a static function.", "StaticShowFunction")] + public short MyShort; + public bool StaticShowFunction() + { + return true; + } + + // You can also specify a function with the same type of parameter. + // Use this to specify the same function, for multiple different properties. + [InfoBox("This info box is hidden by an instance function with a parameter.", "InstanceShowParameterFunction")] + public GameObject MyGameObject; + public bool InstanceShowParameterFunction(GameObject property) + { + return property != null; + } + + [InfoBox("This info box is hidden by a static function with a parameter.", "StaticShowParameterFunction")] + public Vector3 MyVector; + public bool StaticShowParameterFunction(Vector3 property) + { + return property.magnitude == 0f; + } + } + + + + + + + + The message to display in the info box. + + + + + The type of the message box. + + + + + Optional member field, property or function to show and hide the info box. + + + + + When true the InfoBox will ignore the GUI.enable flag and always draw as enabled. + + + + + The icon to be displayed next to the message. + + + + Supports a variety of color formats, including named colors (e.g. "red", "orange", "green", "blue"), hex codes (e.g. "#FF0000" and "#FF0000FF"), and RGBA (e.g. "RGBA(1,1,1,1)") or RGB (e.g. "RGB(1,1,1)"), including Odin attribute expressions (e.g "@this.MyColor"). Here are the available named colors: black, blue, clear, cyan, gray, green, grey, magenta, orange, purple, red, transparent, transparentBlack, transparentWhite, white, yellow, lightblue, lightcyan, lightgray, lightgreen, lightgrey, lightmagenta, lightorange, lightpurple, lightred, lightyellow, darkblue, darkcyan, darkgray, darkgreen, darkgrey, darkmagenta, darkorange, darkpurple, darkred, darkyellow. + + + + Displays an info box above the property. + + The message for the message box. Supports referencing a member string field, property or method by using $. + The type of the message box. + Name of member bool to show or hide the message box. + + + + Displays an info box above the property. + + The message for the message box. Supports referencing a member string field, property or method by using $. + Name of member bool to show or hide the message box. + + + + Displays an info box above the property. + + The message for the message box. Supports referencing a member string field, property or method by using $. + The icon to be displayed next to the message. + Name of member bool to show or hide the message box. + + + + The inline button adds a button to the end of a property. + + + Due to a bug, multiple inline buttons are currently not supported. + + + The following examples demonstrates how InlineButton can be used. + + public class MyComponent : MonoBehaviour + { + // Adds a button to the end of the A property. + [InlineButton("MyFunction")] + public int A; + + // This is example demonstrates how you can change the label of the button. + // InlineButton also supports refering to string members with $. + [InlineButton("MyFunction", "Button")] + public int B; + + private void MyFunction() + { + // ... + } + } + + + + + + + + Name of member method to call when the button is clicked. Obsolete; use the Action member instead. + + + + + A resolved string that defines the action to perform when the button is clicked, such as an expression or method invocation. + + + + + Optional label of the button. + + + + + Optional resolved string that specifies a condition for whether to show the inline button or not. + + + + Supports a variety of color formats, including named colors (e.g. "red", "orange", "green", "blue"), hex codes (e.g. "#FF0000" and "#FF0000FF"), and RGBA (e.g. "RGBA(1,1,1,1)") or RGB (e.g. "RGB(1,1,1)"), including Odin attribute expressions (e.g "@this.MyColor"). Here are the available named colors: black, blue, clear, cyan, gray, green, grey, magenta, orange, purple, red, transparent, transparentBlack, transparentWhite, white, yellow, lightblue, lightcyan, lightgray, lightgreen, lightgrey, lightmagenta, lightorange, lightpurple, lightred, lightyellow, darkblue, darkcyan, darkgray, darkgreen, darkgrey, darkmagenta, darkorange, darkpurple, darkred, darkyellow. + + + Supports a variety of color formats, including named colors (e.g. "red", "orange", "green", "blue"), hex codes (e.g. "#FF0000" and "#FF0000FF"), and RGBA (e.g. "RGBA(1,1,1,1)") or RGB (e.g. "RGB(1,1,1)"), including Odin attribute expressions (e.g "@this.MyColor"). Here are the available named colors: black, blue, clear, cyan, gray, green, grey, magenta, orange, purple, red, transparent, transparentBlack, transparentWhite, white, yellow, lightblue, lightcyan, lightgray, lightgreen, lightgrey, lightmagenta, lightorange, lightpurple, lightred, lightyellow, darkblue, darkcyan, darkgray, darkgreen, darkgrey, darkmagenta, darkorange, darkpurple, darkred, darkyellow. + + + + Draws a button to the right of the property. + + A resolved string that defines the action to perform when the button is clicked, such as an expression or method invocation. + Optional label of the button. + + + + Draws a button to the right of the property. + + A resolved string that defines the action to perform when the button is clicked, such as an expression or method invocation. + The icon to be shown inside the button. + Optional label of the button. + + + + InlineAttribute is used on any property or field with a type that inherits from UnityEngine.Object. This includes components and assets etc. + + + + public class InlineEditorExamples : MonoBehaviour + { + [DisableInInlineEditors] + public Vector3 DisabledInInlineEditors; + + [HideInInlineEditors] + public Vector3 HiddenInInlineEditors; + + [InlineEditor] + public Transform InlineComponent; + + [InlineEditor(InlineEditorModes.FullEditor)] + public Material FullInlineEditor; + + [InlineEditor(InlineEditorModes.GUIAndHeader)] + public Material InlineMaterial; + + [InlineEditor(InlineEditorModes.SmallPreview)] + public Material[] InlineMaterialList; + + [InlineEditor(InlineEditorModes.LargePreview)] + public GameObject InlineObjectPreview; + + [InlineEditor(InlineEditorModes.LargePreview)] + public Mesh InlineMeshPreview; + } + + + + + + + + If true, the inline editor will start expanded. + + + + + Draw the header editor header inline. + + + + + Draw editor GUI inline. + + + + + Draw editor preview inline. + + + + + Maximum height of the inline editor. If the inline editor exceeds the specified height, a scrollbar will appear. + Values less or equals to zero will let the InlineEditor expand to its full size. + + + + + The size of the editor preview if drawn together with GUI. + + + + + The size of the editor preview if drawn alone. + + + + + If false, this will prevent the InlineEditor attribute from incrementing the InlineEditorAttributeDrawer.CurrentInlineEditorDrawDepth. + This is helpful in cases where you want to draw the entire editor, and disregard attributes + such as [] and []. + + + + + Whether to set GUI.enabled = false when drawing an editor for an asset that is locked by source control. Defaults to true. + + + + + How the InlineEditor attribute drawer should draw the object field. + + + + + Where to draw the preview. + + + + + Initializes a new instance of the class. + + The inline editor mode. + How the object field should be drawn. + + + + Initializes a new instance of the class. + + How the object field should be drawn. + + + + The Inline Property is used to place the contents of a type next to the label, instead of being rendered in a foldout. + + + + public class InlinePropertyExamples : MonoBehaviour + { + public Vector3 Vector3; + + public Vector3Int Vector3Int; + + [InlineProperty(LabelWidth = 12)] // It can be placed on classes as well as members + public Vector2Int Vector2Int; + + } + + [Serializable] + [InlineProperty(LabelWidth = 12)] // It can be placed on classes as well as members + public struct Vector3Int + { + [HorizontalGroup] + public int X; + + [HorizontalGroup] + public int Y; + + [HorizontalGroup] + public int Z; + } + + [Serializable] + public struct Vector2Int + { + [HorizontalGroup] + public int X; + + [HorizontalGroup] + public int Y; + } + + + + + + + Specify a label width for all child properties. + + + + + LabelText is used to change the labels of properties. + Use this if you want a different label than the name of the property. + + + The following example shows how LabelText is applied to a few property fields. + + public MyComponent : MonoBehaviour + { + [LabelText("1")] + public int MyInt1; + + [LabelText("2")] + public int MyInt2; + + [LabelText("3")] + public int MyInt3; + } + + + + + + + The new text of the label. + + + + + Whether the label text should be nicified before it is displayed, IE, "m_someField" becomes "Some Field". + If the label text is resolved via a member reference, an expression, or the like, then the evaluated result + of that member reference or expression will be nicified. + + + + + The icon to be displayed. + + + + Supports a variety of color formats, including named colors (e.g. "red", "orange", "green", "blue"), hex codes (e.g. "#FF0000" and "#FF0000FF"), and RGBA (e.g. "RGBA(1,1,1,1)") or RGB (e.g. "RGB(1,1,1)"), including Odin attribute expressions (e.g "@this.MyColor"). Here are the available named colors: black, blue, clear, cyan, gray, green, grey, magenta, orange, purple, red, transparent, transparentBlack, transparentWhite, white, yellow, lightblue, lightcyan, lightgray, lightgreen, lightgrey, lightmagenta, lightorange, lightpurple, lightred, lightyellow, darkblue, darkcyan, darkgray, darkgreen, darkgrey, darkmagenta, darkorange, darkpurple, darkred, darkyellow. + + + + Give a property a custom label. + + The new text of the label. + + + + Give a property a custom icon. + + The icon to be shown next to the property. + + + + Give a property a custom label. + + The new text of the label. + Whether to nicify the label text. + + + + Give a property a custom label with a custom icon. + + The new text of the label. + The icon to be displayed. + + + + Give a property a custom label with a custom icon. + + The new text of the label. + Whether to nicify the label text. + The icon to be displayed. + + + + LabelWidth is used to change the width of labels for properties. + + + The following example shows how LabelText is applied to a few property fields. + + public MyComponent : MonoBehaviour + { + [LabelWidth("3")] + public int MyInt3; + } + + + + + + + The new text of the label. + + + + + Give a property a custom label. + + The width of the label. + + + + Customize the behavior for lists and arrays in the inspector. + + + This example shows how you can add your own custom add button to a list. + + [ListDrawerSettings(HideAddButton = true, OnTitleBarGUI = "DrawTitleBarGUI")] + public List<MyType> SomeList; + + #if UNITY_EDITOR + private void DrawTitleBarGUI() + { + if (SirenixEditorGUI.ToolbarButton(EditorIcons.Plus)) + { + this.SomeList.Add(new MyType()); + } + } + #endif + + + + This attribute is scheduled for refactoring. + + + + + If true, the add button will not be rendered in the title toolbar. You can use OnTitleBarGUI to implement your own add button. + + + true if [hide add button]; otherwise, false. + + + + + If true, the remove button will not be rendered on list items. You can use OnBeginListElementGUI and OnEndListElementGUI to implement your own remove button. + + + true if [hide remove button]; otherwise, false. + + + + + Specify the name of a member inside each list element which defines the label being drawn for each list element. + + + + + Override the default behaviour for adding objects to the list. + If the referenced member returns the list type element, it will be called once per selected object. + If the referenced method returns void, it will only be called once regardless of how many objects are selected. + + + + + Calls a method before each list element. The member referenced must have a return type of void, and an index parameter of type int which represents the element index being drawn. + + + + + Calls a method after each list element. The member referenced must have a return type of void, and an index parameter of type int which represents the element index being drawn. + + + + + If true, object/type pickers will never be shown when the list add button is clicked, and default(T) will always be added instantly instead, where T is the element type of the list. + + + + + Whether adding a new element should copy the last element. False by default. + + + + A resolved string with "int index" and "Color defaultColor" parameters that lets you control the color of individual elements. Supports a variety of color formats, including named colors (e.g. "red", "orange", "green", "blue"), hex codes (e.g. "#FF0000" and "#FF0000FF"), and RGBA (e.g. "RGBA(1,1,1,1)") or RGB (e.g. "RGB(1,1,1)"), including Odin attribute expressions (e.g "@this.MyColor"). Here are the available named colors: black, blue, clear, cyan, gray, green, grey, magenta, orange, purple, red, transparent, transparentBlack, transparentWhite, white, yellow, lightblue, lightcyan, lightgray, lightgreen, lightgrey, lightmagenta, lightorange, lightpurple, lightred, lightyellow, darkblue, darkcyan, darkgray, darkgreen, darkgrey, darkmagenta, darkorange, darkpurple, darkred, darkyellow. + + + + Override the default setting specified in the Advanced Odin Preferences window and explicitly tell whether paging should be enabled or not. + + + + + Override the default setting specified in the Advanced Odin Preferences window and explicitly tell whether items should be draggable or not. + + + + + Override the default setting specified in the Advanced Odin Preferences window and explicitly tells how many items each page should contain. + + + + + Mark a list as read-only. This removes all editing capabilities from the list such as Add, Drag and delete, + but without disabling GUI for each element drawn as otherwise would be the case if the was used. + + + + + Override the default setting specified in the Advanced Odin Preferences window and explicitly tell whether or not item count should be shown. + + + + + Whether to show a foldout for the collection or not. If this is set to false, the collection will *always* be expanded. + + + + + Whether to show a foldout for the collection or not. If this is set to false, the collection will *always* be expanded. + + This documentation used to wrongly state that this value would override the default setting specified in the Advanced Odin Preferences + window and explicitly tell whether or not the list should be expanded or collapsed by default. This value *would* do that, but it would + also simultaneously act as ShowFoldout, leading to weird and unintuitive behaviour. + + + + + + Override the default setting specified in the Odin Preferences window and explicitly tell whether or not the list should be expanded or collapsed by default. + Note that this will override the persisted expand state, as this is set *every time* the collection drawer is initialized. + + + + + If true, a label is drawn for each element which shows the index of the element. + + + + + Use this to inject custom GUI into the title-bar of the list. + + + + + Whether the Paging property is set. + + + + + Whether the ShowItemCount property is set. + + + + + Whether the NumberOfItemsPerPage property is set. + + + + + Whether the Draggable property is set. + + + + + Whether the IsReadOnly property is set. + + + + + Whether the ShowIndexLabels property is set. + + + + + Whether the DefaultExpandedState property is set. + + + + + MaxValue is used on primitive fields. It caps value of the field to a maximum value. + Use this to define a maximum value for the field. + + + Note that this attribute only works in the editor! Values changed from scripting will not be capped at a maximum. + + + The following example shows a component where a speed value must be less than or equal to 200. + + public class Car : MonoBehaviour + { + // The speed of the car must be less than or equal to 200. + [MaxValue(200)] + public float Speed; + } + + + + The following example shows how MaxValue can be combined with . + + public class Health : MonoBehaviour + { + // The speed value must be between 0 and 200. + [MinValue(0), MaxValue(200)] + public float Speed; + } + + + + + + + The maximum value for the property. + + + + + The string with which to resolve a maximum value. This could be a field, property or method name, or an expression. + + + + + Sets a maximum value for the property in the inspector. + + The max value. + + + + Sets a maximum value for the property in the inspector. + + The string with which to resolve a maximum value. This could be a field, property or method name, or an expression. + + + + Draw a special slider the user can use to specify a range between a min and a max value. + Uses a Vector2 where x is min and y is max. + + + The following example shows how MinMaxSlider is used. + + public class Player : MonoBehaviour + { + [MinMaxSlider(4, 5)] + public Vector2 SpawnRadius; + } + + + + + + The hardcoded min value for the slider. + + + + + The hardcoded max value for the slider. + + + + + The name of a field, property or method to get the min value from. Obsolete; use MinValueGetter instead. + + + + + A resolved string that should evaluate to a float value, which is used as the min bounds. + + + + + The name of a field, property or method to get the max value from. Obsolete; use MaxValueGetter instead. + + + + + A resolved string that should evaluate to a float value, which is used as the max bounds. + + + + + The name of a Vector2 field, property or method to get the min max values from. Obsolete; use MinMaxValueGetter instead. + + + + + A resolved string that should evaluate to a Vector2 value, which is used as the min/max bounds. If this is non-null, it overrides the behaviour of the MinValue, MinValueGetter, MaxValue and MaxValueGetter members. + + + + + Draw float fields for min and max value. + + + + + Draws a min-max slider in the inspector. X will be set to min, and Y will be set to max. + + The min value. + The max value. + If true number fields will drawn next to the MinMaxSlider. + + + + Draws a min-max slider in the inspector. X will be set to min, and Y will be set to max. + + A resolved string that should evaluate to a float value, which is used as the min bounds. + The max value. + If true number fields will drawn next to the MinMaxSlider. + + + + Draws a min-max slider in the inspector. X will be set to min, and Y will be set to max. + + The min value. + A resolved string that should evaluate to a float value, which is used as the max bounds. + If true number fields will drawn next to the MinMaxSlider. + + + + Draws a min-max slider in the inspector. X will be set to min, and Y will be set to max. + + A resolved string that should evaluate to a float value, which is used as the min bounds. + A resolved string that should evaluate to a float value, which is used as the max bounds. + If true number fields will drawn next to the MinMaxSlider. + + + + Draws a min-max slider in the inspector. X will be set to min, and Y will be set to max. + + A resolved string that should evaluate to a Vector2 value, which is used as the min/max bounds. If this is non-null, it overrides the behaviour of the MinValue, MinValueGetter, MaxValue and MaxValueGetter members. + If true number fields will drawn next to the MinMaxSlider. + + + + MinValue is used on primitive fields. It caps value of the field to a minimum value. + Use this to define a minimum value for the field. + + + Note that this attribute only works in the editor! Values changed from scripting will not be capped at a minimum. + + + The following example shows a player component that must have at least 1 life. + + public class Player : MonoBehaviour + { + // The life value must be set to at least 1. + [MinValue(1)] + public int Life; + } + + + + The following example shows how MinValue can be combined with + + public class Health : MonoBehaviour + { + // The health value must be between 0 and 100. + [MinValue(0), MaxValue(100)] + public float Health; + } + + + + + + + The minimum value for the property. + + + + + The string with which to resolve a minimum value. This could be a field, property or method name, or an expression. + + + + + Sets a minimum value for the property in the inspector. + + The minimum value. + + + + Sets a minimum value for the property in the inspector. + + The string with which to resolve a minimum value. This could be a field, property or method name, or an expression. + + + + MultiLineProperty is used on any string property. + Use this to allow users to edit strings in a multi line textbox. + + + MultiLineProperty is similar to Unity's but can be applied to both fields and properties. + + + The following example shows how MultiLineProperty is applied to properties. + + public class MyComponent : MonoBehaviour + { + [MultiLineProperty] + public string MyString; + + [ShowInInspector, MultiLineProperty(10)] + public string PropertyString; + } + + + + + + The number of lines for the text box. + + + + + Makes a multiline textbox for editing strings. + + The number of lines for the text box. + + + + + OnCollectionChanged can be put on collections, and provides an event callback when the collection is about to be changed through the inspector, + and when the collection has been changed through the inspector. Additionally, it provides a CollectionChangeInfo struct containing information + about the exact changes made to the collection. This attribute works for all collections with a collection resolver, amongst them arrays, lists, + dictionaries, hashsets, stacks and linked lists. + + + + Note that this attribute only works in the editor! Collections changed by script will not trigger change events! + + + The following example shows how OnCollectionChanged can be used to get callbacks when a collection is being changed. + + [OnCollectionChanged("Before", "After")] + public List<string> list; + + public void Before(CollectionChangeInfo info) + { + if (info.ChangeType == CollectionChangeType.Add || info.ChangeType == CollectionChangeType.Insert) + { + Debug.Log("Adding to the list!"); + } + else if (info.ChangeType == CollectionChangeType.RemoveIndex || info.ChangeType == CollectionChangeType.RemoveValue) + { + Debug.Log("Removing from the list!"); + } + } + + public void After(CollectionChangeInfo info) + { + if (info.ChangeType == CollectionChangeType.Add || info.ChangeType == CollectionChangeType.Insert) + { + Debug.Log("Finished adding to the list!"); + } + else if (info.ChangeType == CollectionChangeType.RemoveIndex || info.ChangeType == CollectionChangeType.RemoveValue) + { + Debug.Log("Finished removing from the list!"); + } + } + + + + + + The OnInspectorDispose attribute takes in an action string as an argument (typically the name of a method to be invoked, or an expression to be executed), and executes that action when the property's drawers are disposed in the inspector. + Disposing will happen at least once, when the inspector changes selection or the property tree is collected by the garbage collector, but may also happen several times before that, most often when the type of a polymorphic property changes and it refreshes its drawer setup and recreates all its children, disposing of the old setup and children. + + + The following example demonstrates how OnInspectorDispose works. + + public class MyComponent : MonoBehaviour + { + [OnInspectorDispose(@"@UnityEngine.Debug.Log(""Dispose event invoked!"")")] + [ShowInInspector, InfoBox("When you change the type of this field, or set it to null, the former property setup is disposed. The property setup will also be disposed when you deselect this example."), DisplayAsString] + public BaseClass PolymorphicField; + + public abstract class BaseClass { public override string ToString() { return this.GetType().Name; } } + public class A : BaseClass { } + public class B : BaseClass { } + public class C : BaseClass { } + } + + + + + + This constructor should be used when the attribute is placed directly on a method. + + + + + This constructor should be used when the attribute is placed on a non-method member. + + + + + OnInspectorGUI is used on any property, and will call the specified function whenever the inspector code is running. + Use this to create custom inspector GUI for an object. + + + + + public MyComponent : MonoBehaviour + { + [OnInspectorGUI] + private void MyInspectorGUI() + { + GUILayout.Label("Label drawn from callback"); + } + } + + + + The following example shows how a callback can be set before another property. + + public MyComponent : MonoBehaviour + { + [OnInspectorGUI("MyInspectorGUI", false)] + public int MyField; + + private void MyInspectorGUI() + { + GUILayout.Label("Label before My Field property"); + } + } + + + + The following example shows how callbacks can be added both before and after a property. + + public MyComponent : MonoBehaviour + { + [OnInspectorGUI("GUIBefore", "GUIAfter")] + public int MyField; + + private void GUIBefore() + { + GUILayout.Label("Label before My Field property"); + } + + private void GUIAfter() + { + GUILayout.Label("Label after My Field property"); + } + } + + + + + + The resolved action string that defines the action to be invoked before the property is drawn, if any. + + + + + The resolved action string that defines the action to be invoked after the property is drawn, if any. + + + + + The name of the method to be called before the property is drawn, if any. Obsolete; use the Prepend member instead. + + + + + The name of the method to be called after the property is drawn, if any. Obsolete; use the Append member instead. + + + + + Calls a function decorated with this attribute, when the inspector is being drawn. + + + + + Adds callbacks to the specified action when the property is being drawn. + + The resolved action string that defines the action to be invoked. + If true the method will be called after the property has been drawn. Otherwise the method will be called before. + + + + Adds callbacks to the specified actions when the property is being drawn. + + The resolved action string that defines the action to be invoked before the property is drawn, if any. + The resolved action string that defines the action to be invoked after the property is drawn, if any. + + + + The OnInspectorInit attribute takes in an action string as an argument (typically the name of a method to be invoked, or an expression to be executed), and executes that action when the property's drawers are initialized in the inspector. + Initialization will happen at least once during the first drawn frame of any given property, but may also happen several times later, most often when the type of a polymorphic property changes and it refreshes its drawer setup and recreates all its children. + + + The following example demonstrates how OnInspectorInit works. + + public class MyComponent : MonoBehaviour + { + // Display current time for reference. + [ShowInInspector, DisplayAsString, PropertyOrder(-1)] + public string CurrentTime { get { GUIHelper.RequestRepaint(); return DateTime.Now.ToString(); } } + + // OnInspectorInit executes the first time this string is about to be drawn in the inspector. + // It will execute again when the example is reselected. + [OnInspectorInit("@TimeWhenExampleWasOpened = DateTime.Now.ToString()")] + public string TimeWhenExampleWasOpened; + + // OnInspectorInit will not execute before the property is actually "resolved" in the inspector. + // Remember, Odin's property system is lazily evaluated, and so a property does not actually exist + // and is not initialized before something is actually asking for it. + // + // Therefore, this OnInspectorInit attribute won't execute until the foldout is expanded. + [FoldoutGroup("Delayed Initialization", Expanded = false, HideWhenChildrenAreInvisible = false)] + [OnInspectorInit("@TimeFoldoutWasOpened = DateTime.Now.ToString()")] + public string TimeFoldoutWasOpened; + } + + + + + + This constructor should be used when the attribute is placed directly on a method. + + + + + This constructor should be used when the attribute is placed on a non-method member. + + + + + + OnStateUpdate provides an event callback when the property's state should be updated, when the StateUpdaters run on the property instance. + This generally happens at least once per frame, and the callback will be invoked even when the property is not visible. This can be used to + approximate custom StateUpdaters like [ShowIf] without needing to make entire attributes and StateUpdaters for one-off cases. + + + + The following example shows how OnStateUpdate can be used to control the visible state of a property. + + public class MyComponent : MonoBehaviour + { + [OnStateUpdate("@$property.State.Visible = ToggleMyInt")] + public int MyInt; + + public bool ToggleMyInt; + } + + + + The following example shows how OnStateUpdate can be used to control the expanded state of a list. + + public class MyComponent : MonoBehaviour + { + [OnStateUpdate("@$property.State.Expanded = ExpandList")] + public List<string> list; + + public bool ExpandList; + } + + The following example shows how OnStateUpdate can be used to control the state of another property. + + public class MyComponent : MonoBehaviour + { + public List>string< list; + + [OnStateUpdate("@#(list).State.Expanded = $value")] + public bool ExpandList; + } + + + + + + + OnValueChanged works on properties and fields, and calls the specified function + whenever the value has been changed via the inspector. + + + + Note that this attribute only works in the editor! Properties changed by script will not call the function. + + + The following example shows how OnValueChanged is used to provide a callback for a property. + + public class MyComponent : MonoBehaviour + { + [OnValueChanged("MyCallback")] + public int MyInt; + + private void MyCallback() + { + // .. + } + } + + + + The following example show how OnValueChanged can be used to get a component from a prefab property. + + public class MyComponent : MonoBehaviour + { + [OnValueChanged("OnPrefabChange")] + public GameObject MyPrefab; + + // RigidBody component of MyPrefab. + [SerializeField, HideInInspector] + private RigidBody myPrefabRigidbody; + + private void OnPrefabChange() + { + if(MyPrefab != null) + { + myPrefabRigidbody = MyPrefab.GetComponent<Rigidbody>(); + } + else + { + myPrefabRigidbody = null; + } + } + } + + + + + + Name of callback member function. Obsolete; use the Action member instead. + + + + + A resolved string that defines the action to perform when the value is changed, such as an expression or method invocation. + + + + + Whether to perform the action when a child value of the property is changed. + + + + + Whether to perform the action when an undo or redo event occurs via UnityEditor.Undo.undoRedoPerformed. True by default. + + + + + Whether to perform the action when the property is initialized. This will generally happen when the property is first viewed/queried (IE when the inspector is first opened, or when its containing foldout is first expanded, etc), and whenever its type or a parent type changes, or it is otherwise forced to rebuild. + + + + + Adds a callback for when the property's value is changed. + + A resolved string that defines the action to perform when the value is changed, such as an expression or method invocation. + Whether to perform the action when a child value of the property is changed. + + + + Overrides the 'Reference Required by Default' rule to allow for null values. + Has no effect if the rule is disabled. + + This attribute does not do anything unless you have Odin Validator and the 'Reference Required by Default' rule is enabled. + + + + + Specifies how non-default constructors are handled. + + + + + Excludes types with non default constructors from the Selector. + + + + + Attempts to find the most straightforward constructor to call, prioritizing default values. + + + + + Uses if no default constructor is found. + + + + + Logs a warning instead of constructing the object, indicating that an attempt was made to construct an object without a default constructor. + + + + + Determines whether the base type should be displayed in the drawer. + + + + + Indicates if the drawer should be read-only once a value is assigned. + + + + + Specifies how non-default constructors are handled. + + + + + Specifies a custom function for creating an instance of the selected . + + Does not get called for UnityEngine.Object types. + + + The resolver expects any method that takes a single parameter of , where the parameter is named 'type', and which returns an . + + + Implementation example: public object Method(Type type). + + + + + + Draws a square ObjectField which renders a preview for UnityEngine.Object types. + This object field also adds support for drag and drop, dragging an object to another square object field, swaps the values. + If you hold down control while letting go it will replace the value, And you can control + click the object field to quickly delete the value it holds. + + + These object fields can also be selectively enabled and customized globally from the Odin preferences window. + + + + The following example shows how PreviewField is applied to a few property fields. + + public MyComponent : MonoBehaviour + { + [PreviewField] + public UnityEngine.Object SomeObject; + + [PreviewField] + public Texture SomeTexture; + + [HorizontalGroup, HideLabel, PreviewField(30)] + public Material A, B, C, D, F; + } + + + + + + + The height of the object field + + + + + The FilterMode to be used for the preview. + + + + + Left aligned. + + + + + Whether an alignment value is specified. + + + + + A resolved value that should resolve to the desired preview texture. + + + + + Draws a square object field which renders a preview for UnityEngine.Object type objects. + + + + + Draws a square object field which renders a preview for UnityEngine.Object type objects. + + The height of the preview field. + + + + Draws a square object field which renders a preview for UnityEngine.Object type objects. + + A resolved value that should resolve to the desired preview texture. + The filter mode to be used for the preview texture. + + + + Draws a square object field which renders a preview for UnityEngine.Object type objects. + + A resolved value that should resolve to the desired preview texture. + The height of the preview field. + The filter mode to be used for the preview texture. + + + + Draws a square object field which renders a preview for UnityEngine.Object type objects. + + The height of the preview field. + The alignment of the preview field. + + + + Draws a square object field which renders a preview for UnityEngine.Object type objects. + + A resolved value that should resolve to the desired preview texture. + The alignment of the preview field. + The filter mode to be used for the preview texture. + + + + Draws a square object field which renders a preview for UnityEngine.Object type objects. + + A resolved value that should resolve to the desired preview texture. + The height of the preview field. + The alignment of the preview field. + The filter mode to be used for the preview texture. + + + + Draws a square object field which renders a preview for UnityEngine.Object type objects. + + The alignment of the preview field. + + + + Draws a horizontal progress bar based on the value of the property. + Use it for displaying a meter to indicate how full an inventory is, or to make a visual indication of a health bar. + + + The following example shows how ProgressBar can be used. + + public class ProgressBarExample : MonoBehaviour + { + // Default progress bar. + [ProgressBar(0, 100)] + public int ProgressBar; + + // Health bar. + [ProgressBar(0, 100, ColorMember = "GetHealthBarColor")] + public float HealthBar = 50; + + private Color GetHealthBarColor(float value) + { + // Blends between red, and yellow color for when the health is below 30, + // and blends between yellow and green color for when the health is above 30. + return Color.Lerp(Color.Lerp( + Color.red, Color.yellow, MathUtilities.LinearStep(0f, 30f, value)), + Color.green, MathUtilities.LinearStep(0f, 100f, value)); + } + + // Stacked health bar. + // The ProgressBar attribute is placed on property, without a set method, so it can't be edited directly. + // So instead we have this Range attribute on a float to change the value. + [Range(0, 300)] + public float StackedHealth; + + [ProgressBar(0, 100, ColorMember = "GetStackedHealthColor", BackgroundColorMember = "GetStackHealthBackgroundColor")] + private float StackedHealthProgressBar + { + // Loops the stacked health value between 0, and 100. + get { return this.StackedHealth - 100 * (int)((this.StackedHealth - 1) / 100); } + } + + private Color GetStackedHealthColor() + { + return + this.StackedHealth > 200 ? Color.cyan : + this.StackedHealth > 100 ? Color.green : + Color.red; + } + + private Color GetStackHealthBackgroundColor() + { + return + this.StackedHealth > 200 ? Color.green : + this.StackedHealth > 100 ? Color.red : + new Color(0.16f, 0.16f, 0.16f, 1f); + } + + // Custom color and height. + [ProgressBar(-100, 100, r: 1, g: 1, b: 1, Height = 30)] + public short BigProgressBar = 50; + + // You can also reference members by name to dynamically assign the min and max progress bar values. + [ProgressBar("DynamicMin", "DynamicMax")] + public float DynamicProgressBar; + + public float DynamicMin, DynamicMax; + } + + + + + + + + + The minimum value. + + + + + The maximum value. + + + + + The name of a field, property or method to get the min values from. Obsolete; use the MinGetter member instead. + + + + + A resolved string that should evaluate to a float value, and will be used as the min bounds. + + + + + The name of a field, property or method to get the max values from. Obsolete; use the MaxGetter member instead. + + + + + A resolved string that should evaluate to a float value, and will be used as the max bounds. + + + + + The red channel of the color of the progress bar. + + + + + The green channel of the color of the progress bar. + + + + + The blue channel of the color of the progress bar. + + + + + The height of the progress bar in pixels. Defaults to 12 pixels. + + + + + Optional reference to a Color field, property or method, to dynamically change the color of the progress bar. Obsolete; use the ColorGetter member instead. + + + + Supports a variety of color formats, including named colors (e.g. "red", "orange", "green", "blue"), hex codes (e.g. "#FF0000" and "#FF0000FF"), and RGBA (e.g. "RGBA(1,1,1,1)") or RGB (e.g. "RGB(1,1,1)"), including Odin attribute expressions (e.g "@this.MyColor"). Here are the available named colors: black, blue, clear, cyan, gray, green, grey, magenta, orange, purple, red, transparent, transparentBlack, transparentWhite, white, yellow, lightblue, lightcyan, lightgray, lightgreen, lightgrey, lightmagenta, lightorange, lightpurple, lightred, lightyellow, darkblue, darkcyan, darkgray, darkgreen, darkgrey, darkmagenta, darkorange, darkpurple, darkred, darkyellow. + + + + Optional reference to a Color field, property or method, to dynamically change the background color of the progress bar. + Default background color is (0.16, 0.16, 0.16, 1). + Obsolete; use the BackgroundColorGetter member instead. + + + + Optional resolved string that should evaluate to a Color value, to dynamically change the background color of the progress bar. Default background color is (0.16, 0.16, 0.16, 1). It supports a variety of color formats, including named colors (e.g. "red", "orange", "green", "blue"), hex codes (e.g. "#FF0000" and "#FF0000FF"), and RGBA (e.g. "RGBA(1,1,1,1)") or RGB (e.g. "RGB(1,1,1)"), including Odin attribute expressions (e.g "@this.MyColor"). Here are the available named colors: black, blue, clear, cyan, gray, green, grey, magenta, orange, purple, red, transparent, transparentBlack, transparentWhite, white, yellow, lightblue, lightcyan, lightgray, lightgreen, lightgrey, lightmagenta, lightorange, lightpurple, lightred, lightyellow, darkblue, darkcyan, darkgray, darkgreen, darkgrey, darkmagenta, darkorange, darkpurple, darkred, darkyellow. + + + + If true then the progress bar will be drawn in tiles. + + + + + References a member by name to get a custom value label string from. Obsolete; use the CustomValueStringGetter member instead. + + + + + A resolved string to get a custom value label string from. + + + + + Draws a progress bar for the value. + + The minimum value. + The maximum value. + The red channel of the color of the progress bar. + The green channel of the color of the progress bar. + The blue channel of the color of the progress bar. + + + + Draws a progress bar for the value. + + A resolved string that should evaluate to a float value, and will be used as the min bounds. + The maximum value. + The red channel of the color of the progress bar. + The green channel of the color of the progress bar. + The blue channel of the color of the progress bar. + + + + Draws a progress bar for the value. + + The minimum value. + A resolved string that should evaluate to a float value, and will be used as the max bounds. + The red channel of the color of the progress bar. + The green channel of the color of the progress bar. + The blue channel of the color of the progress bar. + + + + Draws a progress bar for the value. + + A resolved string that should evaluate to a float value, and will be used as the min bounds. + A resolved string that should evaluate to a float value, and will be used as the max bounds. + The red channel of the color of the progress bar. + The green channel of the color of the progress bar. + The blue channel of the color of the progress bar. + + + + If true then there will be drawn a value label on top of the progress bar. + + + + + Gets a value indicating if the user has set a custom DrawValueLabel value. + + + + + The alignment of the value label on top of the progress bar. Defaults to center. + + + + + Gets a value indicating if the user has set a custom ValueLabelAlignment value. + + + + + Attribute to derive from if you wish to create a new property group type, such as box groups or tab groups. + Note that this attribute has special behaviour for "combining" several attributes into one, as one group, + may be declared across attributes in several members, completely out of order. See . + + + All group attributes for a group with the same name (and of the same attribute type) are combined into a single representative group attribute using the method, which is called by the method. + This behaviour is a little unusual, but it is important that you understand it when creating groups with many custom parameters that may have to be combined. + + + This example shows how could be implemented. + + [AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)] + public class BoxGroupAttribute : PropertyGroupAttribute + { + public string Label { get; private set; } + public bool ShowLabel { get; private set; } + public bool CenterLabel { get; private set; } + + public BoxGroupAttribute(string group, bool showLabel = true, bool centerLabel = false, float order = 0) + : base(group, order) + { + this.Label = group; + this.ShowLabel = showLabel; + this.CenterLabel = centerLabel; + } + + protected override void CombineValuesWith(PropertyGroupAttribute other) + { + // The given attribute parameter is *guaranteed* to be of type BoxGroupAttribute. + var attr = other as BoxGroupAttribute; + + // If this attribute has no label, we the other group's label, thus preserving the label across combines. + if (this.Label == null) + { + this.Label = attr.Label; + } + + // Combine ShowLabel and CenterLabel parameters. + this.ShowLabel |= attr.ShowLabel; + this.CenterLabel |= attr.CenterLabel; + } + } + + + + + + + + + + + The ID used to grouping properties together. + + + + + The name of the group. This is the last part of the group ID if there is a path, otherwise it is just the group ID. + + + + + The order of the group. + + + + + Whether to hide the group by default when all its children are not visible. True by default. + + + + + Whether to animate the visibility changes of this group or make the visual transition instantly. True by default. + + + + + If not null, this resolved string controls the group's visibility. Note that if is true, there must be *both* a visible child *and* this condition must be true, before the group is shown. + + + + + Initializes a new instance of the class. + + The group identifier. + The group order. + + + + Initializes a new instance of the class. + + The group identifier. + + + + Combines this attribute with another attribute of the same type. + This method invokes the virtual method to invoke custom combine logic. + All group attributes are combined to one attribute used by a single OdinGroupDrawer. + Example: protected override void CombineValuesWith(PropertyGroupAttribute other) { this.Title = this.Title ?? (other as MyGroupAttribute).Title; } + + The attribute to combine with. + The instance that the method was invoked on. + The argument 'other' was null. + + Attributes to combine are not of the same type. + or + PropertyGroupAttributes to combine must have the same group id. + + + + + Override this method to add custom combine logic to your group attribute. This method determines how your group's parameters combine when spread across multiple attribute declarations in the same class. + Remember, in .NET, member order is not guaranteed, so you never know which order your attributes will be combined in. + + The attribute to combine with. This parameter is guaranteed to be of the correct attribute type. + + This example shows how attributes are combined. + + protected override void CombineValuesWith(PropertyGroupAttribute other) + { + // The given attribute parameter is *guaranteed* to be of type BoxGroupAttribute. + var attr = other as BoxGroupAttribute; + + // If this attribute has no label, we the other group's label, thus preserving the label across combines. + if (this.Label == null) + { + this.Label = attr.Label; + } + + // Combine ShowLabel and CenterLabel parameters. + this.ShowLabel |= attr.ShowLabel; + this.CenterLabel |= attr.CenterLabel; + } + + + + + + PropertyOrder is used on any property, and allows for ordering of properties. + Use this to define in which order your properties are shown. + + + Lower order values will be drawn before higher values. + There is unfortunately no way of ensuring that properties are in the same order, as they appear in your class. PropertyOrder overcomes this. + + + The following example shows how PropertyOrder is used to order properties in the inspector. + + public class MyComponent : MonoBehaviour + { + [PropertyOrder(1)] + public int MySecondProperty; + + [PropertyOrder(-1)] + public int MyFirstProperty; + } + + + + + + The order for the property. + + + + + Initializes a new instance of the class. + + + + + Defines a custom order for the property. + + The order for the property. + + + + PropertyRange attribute creates a slider control to set the value of a property to between the specified range. + This is equivalent to Unity's Range attribute, but this attribute can be applied to both fields and property. + + The following example demonstrates how PropertyRange is used. + + public class MyComponent : MonoBehaviour + { + [PropertyRange(0, 100)] + public int MyInt; + + [PropertyRange(-100, 100)] + public float MyFloat; + + [PropertyRange(-100, -50)] + public decimal MyDouble; + + // This attribute also supports dynamically referencing members by name to assign the min and max values for the range field. + [PropertyRange("DynamicMin", "DynamicMax"] + public float MyDynamicValue; + + public float DynamicMin, DynamicMax; + } + + + + + + + + + The minimum value. + + + + + The maximum value. + + + + + The name of a field, property or method to get the min value from. Obsolete; use the MinGetter member instead. + + + + + A resolved string that should evaluate to a float value, and will be used as the min bounds. + + + + + The name of a field, property or method to get the max value from. Obsolete; use the MaxGetter member instead. + + + + + A resolved string that should evaluate to a float value, and will be used as the max bounds. + + + + + Creates a slider control to set the value of the property to between the specified range.. + + The minimum value. + The maximum value. + + + + Creates a slider control to set the value of the property to between the specified range.. + + A resolved string that should evaluate to a float value, and will be used as the min bounds. + The maximum value. + + + + Creates a slider control to set the value of the property to between the specified range.. + + The minimum value. + A resolved string that should evaluate to a float value, and will be used as the max bounds. + + + + Creates a slider control to set the value of the property to between the specified range.. + + A resolved string that should evaluate to a float value, and will be used as the min bounds. + A resolved string that should evaluate to a float value, and will be used as the max bounds. + + + + The PropertySpace attribute have the same function as Unity's existing Space attribute, but can be applied anywhere as opposed to just fields. + + + The following example demonstrates the usage of the PropertySpace attribute. + + [PropertySpace] // Defaults to a space of 8 pixels just like Unity's Space attribute. + public int MyField; + + [ShowInInspector, PropertySpace(16)] + public int MyProperty { get; set; } + + [ShowInInspector, PropertySpace(16, 16)] + public int MyProperty { get; set; } + + [Button, PropertySpace(32)] + public void MyMethod() + { + ... + } + + [PropertySpace(-8)] // A negative space can also be remove existing space between properties. + public int MovedUp; + + + + + + + + + + The space between properties in pixels. + + + + + The space between properties in pixels. + + + + + Adds a space of 8 pixels between properties. + + + + + Adds a space between properties. + + + + + Adds a space between properties. + + + + + PropertyTooltip is used on any property, and creates tooltips for when hovering the property in the inspector. + Use this to explain the purpose, or how to use a property. + + + This is similar to Unity's but can be applied to both fields and properties. + + + The following example shows how PropertyTooltip is applied to various properties. + + public class MyComponent : MonoBehaviour + { + [PropertyTooltip("This is an int property.")] + public int MyField; + + [ShowInInspector, PropertyTooltip("This is another int property.")] + public int MyProperty { get; set; } + } + + + + + + + + + + + The message shown in the tooltip. + + + + + Adds a tooltip to the property in the inspector. + + The message shown in the tooltip. + + + + ReadOnly is used on any property, and prevents the property from being changed in the inspector. + Use this for when you want to see the value of a property in the inspector, but don't want it to be changed. + + + This attribute only affects the inspector! Values can still be changed by script. + + + The following example shows how a field can be displayed in the editor, but not be editable. + + public class Health : MonoBehaviour + { + public int MaxHealth; + + [ReadOnly] + public int CurrentHealth; + } + + + + ReadOnly can also be combined with . + + public class Health : MonoBehaviour + { + public int MaxHealth; + + [ShowInInspector, ReadOnly] + private int currentHealth; + } + + + + + + + Required is used on any object property, and draws a message in the inspector if the property is missing. + Use this to clearly mark fields as necessary to the object. + + + The following example shows different uses of the Required attribute. + + public class MyComponent : MonoBehaviour + { + [Required] + public GameObject MyPrefab; + + [Required(InfoMessageType.Warning)] + public Texture2D MyTexture; + + [Required("MyMesh is nessessary for this component.")] + public Mesh MyMesh; + + [Required("MyTransform might be important.", InfoMessageType.Info)] + public Transform MyTransform; + } + + + + + + + + The message of the info box. + + + + + The type of the info box. + + + + + Adds an error box to the inspector, if the property is missing. + + + + + Adds an info box to the inspector, if the property is missing. + + The message to display in the error box. + The type of info box to draw. + + + + Adds an error box to the inspector, if the property is missing. + + The message to display in the error box. + + + + Adds an info box to the inspector, if the property is missing. + + The type of info box to draw. + + + + Makes a member required based on which type of a prefab and instance it is in. + + + + + The message of the info box. + + + + + The type of the info box. + + + + + Adds an error box to the inspector, if the property is missing. + + + + + Adds an info box to the inspector, if the property is missing. + + The message to display in the error box. + The type of info box to draw. + + + + Adds an error box to the inspector, if the property is missing. + + The message to display in the error box. + + + + Adds an info box to the inspector, if the property is missing. + + The type of info box to draw. + + + + The message of the info box. + + + + + The type of the info box. + + + + + Adds an error box to the inspector, if the property is missing. + + + + + Adds an info box to the inspector, if the property is missing. + + The message to display in the error box. + The type of info box to draw. + + + + Adds an error box to the inspector, if the property is missing. + + The message to display in the error box. + + + + Adds an info box to the inspector, if the property is missing. + + The type of info box to draw. + + + + + The minimum length of the collection. If not set, there is no minimum length restriction. + + + + + The maximum length of the collection. If not set, there is no maximum length restriction. + + + + + A C# expression for getting the minimum length of the collection, for example "@this.otherList.Count". + If set, MinLength will be the fallback in case nothing in case MinLengthGetter returns null. + + + + + A C# expression for getting the maximum length of the collection, for example "@this.otherList.Count". + If set, MaxLength will be the fallback in case nothing in case MaxLengthGetter returns null. + + + + + Limits the collection to be contain the specified number of elements. + + + + + Limits the collection to be contain the specified number of elements. + + The minimum and maximum length of the collection. + + + + Limits the collection to be contain the specified number of elements. + + The minimum length of the collection. + The maximum length of the collection. + + + + Limits the collection to be contain the specified number of elements. + + The minimum length of the collection. + A C# expression for getting the maximum length of the collection, for example "@this.otherList.Count". If set, MaxLength will be the fallback in case nothing in case MaxLengthGetter returns null. + + + + Limits the collection to be contain the specified number of elements. + + The minimum and maximum length of the collection. + + + + Limits the collection to be contain the specified number of elements. + + A C# expression for getting the minimum length of the collection, for example "@this.otherList.Count". If set, MinLength will be the fallback in case nothing in case MinLengthGetter returns null. + A C# expression for getting the maximum length of the collection, for example "@this.otherList.Count". If set, MaxLength will be the fallback in case nothing in case MaxLengthGetter returns null. + + + + Limits the collection to be contain the specified number of elements. + + A C# expression for getting the minimum length of the collection, for example "@this.otherList.Count". If set, MinLength will be the fallback in case nothing in case MinLengthGetter returns null. + The maximum length of the collection. + + + + Groups buttons into a group that will position and resize the buttons based on the amount of available layout space. + + + + [ResponsiveButtonGroup] + public void Foo() { } + + [ResponsiveButtonGroup] + public void Bar() { } + + [ResponsiveButtonGroup] + public void Baz() { } + + + + + [ResponsiveButtonGroup(UniformLayout = true)] + public void Foo() { } + + [ResponsiveButtonGroup] + public void Bar() { } + + [ResponsiveButtonGroup] + public void Baz() { } + + + + + [ResponsiveButtonGroupAttribute(UniformLayout = true, DefaultButtonSize = ButtonSizes.Large)] + public void Foo() { } + + [GUIColor(0, 1, 0))] + [Button(ButtonSizes.Large)] + [ResponsiveButtonGroup] + public void Bar() { } + + [ResponsiveButtonGroup] + public void Baz() { } + + + + + [TabGroup("SomeTabGroup", "SomeTab")] + [ResponsiveButtonGroup("SomeTabGroup/SomeTab/SomeBtnGroup")] + public void Foo() { } + + [ResponsiveButtonGroup("SomeTabGroup/SomeTab/SomeBtnGroup")] + public void Bar() { } + + [ResponsiveButtonGroup("SomeTabGroup/SomeTab/SomeBtnGroup")] + public void Baz() { } + + + + + + The default size of the button. + + + + + If true then the widths of a line of buttons will be the same. + + + + + Draws a button that will be placed in a group that will respond to the horizontal space available to the group. + + The name of the group to place the button in. + + + + Merges the values of this group with another ResponsiveButtonGroupAttribute. + + The attribute to combine with. + + + + SceneObjectsOnly is used on object properties, and restricts the property to scene objects, and not project assets. + Use this when you want to ensure an object is a scene object, and not from a project asset. + + + The following example shows a component with a game object property, that must be from a scene, and not a prefab asset. + + public MyComponent : MonoBehaviour + { + [SceneObjectsOnly] + public GameObject MyPrefab; + } + + + + + + + Adds a search filter that can search the children of the field or type on + which it is applied. Note that this does not currently work when directly + applied to dictionaries, though a search field "above" the dictionary will + still search the dictionary's properties if it is searching recursively. + + + + + Whether to use fuzzy string matching for the search. + Default value: true. + + + + + The options for which things to use to filter the search. + Default value: All. + + + + + Whether to search recursively, or only search the top level properties. + Default value: true. + + + + + + ShowDrawerChain lists all prepend, append and value drawers being used in the inspector. + This is great in situations where you want to debug, and want to know which drawers might be involved in drawing the property. + + Your own custom drawers are highlighted with a green label. + Drawers, that have not been called during the draw chain, will be greyed out in the inspector to make it clear which drawers have had an effect on the properties. + + + + public class MyComponent : MonoBehaviour + { + [ShowDrawerChain] + public int IndentedInt; + } + + + + + + ShowIf is used on any property and can hide the property in the inspector. + Use this to hide irrelevant properties based on the current state of the object. + + + This example shows a component with fields hidden by the state of another field. + + public class MyComponent : MonoBehaviour + { + public bool ShowProperties; + + [ShowIf("showProperties")] + public int MyInt; + + [ShowIf("showProperties", false)] + public string MyString; + + public SomeEnum SomeEnumField; + + [ShowIf("SomeEnumField", SomeEnum.SomeEnumMember)] + public string SomeString; + } + + + + This example shows a component with a field that is hidden when the game object is inactive. + + public class MyComponent : MonoBehaviour + { + [ShowIf("MyVisibleFunction")] + public int MyHideableField; + + private bool MyVisibleFunction() + { + return this.gameObject.activeInHierarchy; + } + } + + + + + + + + + The name of a bool member field, property or method. Obsolete; use the Condition member instead. + + + + + A resolved string that defines the condition to check the value of, such as a member name or an expression. + + + + + The optional condition value. + + + + + Whether or not to slide the property in and out when the state changes. + + + + + Shows a property in the inspector, based on the value of a resolved string. + + A resolved string that defines the condition to check the value of, such as a member name or an expression. + Whether or not to slide the property in and out when the state changes. + + + + Shows a property in the inspector, if the resolved string evaluates to the specified value. + + A resolved string that defines the condition to check the value of, such as a member name or an expression. + Value to check against. + Whether or not to slide the property in and out when the state changes. + + + +

ShowIfGroup allows for showing or hiding a group of properties based on a condition.

+

The attribute is a group attribute and can therefore be combined with other group attributes, and even be used to show or hide entire groups.

+

Note that in the vast majority of cases where you simply want to be able to control the visibility of a single group, it is better to use the VisibleIf parameter that *all* group attributes have.

+
+ + + + + +
+ + + Whether or not to visually animate group visibility changes. Alias for AnimateVisibility. + + + + + The optional member value. + + + + + Name of member to use when to hide the group. Defaults to the name of the group, by can be overriden by setting this property. + + + + + A resolved string that defines the condition to check the value of, such as a member name or an expression. + + + + + Makes a group that can be shown or hidden based on a condition. + + The group path. + If true then a fade animation will be played when the group is hidden or shown. + + + + Makes a group that can be shown or hidden based on a condition. + + The group path. + The value the member should equal for the property to shown. + If true then a fade animation will be played when the group is hidden or shown. + + + + Combines ShowIfGroup attributes. + + Another ShowIfGroup attribute. + + + + Shows a member based on which type of a prefab and instance it is in. + + + + + Only shows a property if it is drawn within an . + + + + + ShowInInspector is used on any member, and shows the value in the inspector. Note that the value being shown due to this attribute DOES NOT mean that the value is being serialized. + + + This can for example be combined with to allow for live debugging of values. + + + + The following example shows how ShowInInspector is used to show properties in the inspector, that otherwise wouldn't. + + public class MyComponent : MonoBehaviour + { + [ShowInInspector] + private int myField; + + [ShowInInspector] + public int MyProperty { get; set; } + } + + + + + + Marks a type as being specially serialized. Odin uses this attribute to check whether it should include non-Unity-serialized members in the inspector. + + + + + + ShowPropertyResolver shows the property resolver responsible for bringing the member into the property tree. + This is useful in situations where you want to debug why a particular member that is normally not shown in the inspector suddenly is. + + + + + public class MyComponent : MonoBehaviour + { + [ShowPropertyResolver] + public int IndentedInt; + } + + + + + + The SuffixLabel attribute draws a label at the end of a property. + Use this for conveying intend about a property. Is the distance measured in meters, kilometers, or in light years?. + Is the angle measured in degrees or radians? + Using SuffixLabel, you can place a neat label at the end of a property, to clearly show how the the property is used. + + + The following example demonstrates how SuffixLabel is used. + + public class MyComponent : MonoBehaviour + { + // The SuffixLabel attribute draws a label at the end of a property. + // It's useful for conveying intend about a property. + // Fx, this field is supposed to have a prefab assigned. + [SuffixLabel("Prefab")] + public GameObject GameObject; + + // Using the Overlay property, the suffix label will be drawn on top of the property instead of behind it. + // Use this for a neat inline look. + [SuffixLabel("ms", Overlay = true)] + public float Speed; + + [SuffixLabel("radians", Overlay = true)] + public float Angle; + + // The SuffixLabel attribute also supports string member references by using $. + [SuffixLabel("$Suffix", Overlay = true)] + public string Suffix = "Dynamic suffix label"; + } + + + + + + + + + + The label displayed at the end of the property. + + + + + If true the suffix label will be drawn on top of the property, instead of after. + + + + + The icon to be displayed. + + + + Supports a variety of color formats, including named colors (e.g. "red", "orange", "green", "blue"), hex codes (e.g. "#FF0000" and "#FF0000FF"), and RGBA (e.g. "RGBA(1,1,1,1)") or RGB (e.g. "RGB(1,1,1)"), including Odin attribute expressions (e.g "@this.MyColor"). Here are the available named colors: black, blue, clear, cyan, gray, green, grey, magenta, orange, purple, red, transparent, transparentBlack, transparentWhite, white, yellow, lightblue, lightcyan, lightgray, lightgreen, lightgrey, lightmagenta, lightorange, lightpurple, lightred, lightyellow, darkblue, darkcyan, darkgray, darkgreen, darkgrey, darkmagenta, darkorange, darkpurple, darkred, darkyellow. + + + + Draws a label at the end of the property. + + The text of the label. + If true the suffix label will be drawn on top of the property, instead of after. + + + + Draws a label at the end of the property. + + The text of the label. + The icon to be displayed. + If true the suffix label will be drawn on top of the property, instead of after. + + + + Draws a label at the end of the property. + + The icon to be displayed. + + + + SuppressInvalidAttributeError is used on members to suppress the inspector error message you get when applying an attribute to a value that it's not supposed to work on. + This can be very useful for applying attributes to generic parameter values, when it only applies to some of the possible types that the value might become. + + + The following example shows a case where the attribute might be useful. + + public class NamedValue<T> + { + public string Name; + + // The Range attribute will be applied if T is compatible with it, but if T is not compatible, an error will not be shown. + [SuppressInvalidAttributeError, Range(0, 10)] + public T Value; + } + + + + + + TabGroup is used on any property, and organizes properties into different tabs. + Use this to organize different value to make a clean and easy to use inspector. + + + Use groups to create multiple tab groups, each with multiple tabs and even sub tabs. + + + The following example shows how to create a tab group with two tabs. + + public class MyComponent : MonoBehaviour + { + [TabGroup("First")] + public int MyFirstInt; + + [TabGroup("First")] + public int AnotherInt; + + [TabGroup("Second")] + public int MySecondInt; + } + + + + The following example shows how multiple groups of tabs can be created. + + public class MyComponent : MonoBehaviour + { + [TabGroup("A", "FirstGroup")] + public int FirstGroupA; + + [TabGroup("B", "FirstGroup")] + public int FirstGroupB; + + // The second tab group has been configured to have constant height across all tabs. + [TabGroup("A", "SecondGroup", true)] + public int SecondgroupA; + + [TabGroup("B", "SecondGroup")] + public int SecondGroupB; + + [TabGroup("B", "SecondGroup")] + public int AnotherInt; + } + + + + This example demonstrates how multiple tabs groups can be combined to create tabs in tabs. + + public class MyComponent : MonoBehaviour + { + [TabGroup("ParentGroup", "First Tab")] + public int A; + + [TabGroup("ParentGroup", "Second Tab")] + public int B; + + // Specify 'First Tab' as a group, and another child group to the 'First Tab' group. + [TabGroup("ParentGroup/First Tab/InnerGroup", "Inside First Tab A")] + public int C; + + [TabGroup("ParentGroup/First Tab/InnerGroup", "Inside First Tab B")] + public int D; + + [TabGroup("ParentGroup/Second Tab/InnerGroup", "Inside Second Tab")] + public int E; + } + + + + + + + The default tab group name which is used when the single-parameter constructor is called. + + + + + Name of the tab. + + + + + Should this tab be the same height as the rest of the tab group. + + + + + If true, the content of each page will not be contained in any box. + + + + + If true, the tab group will be hidden if it only contains one tab. + + + + Supports a variety of color formats, including named colors (e.g. "red", "orange", "green", "blue"), hex codes (e.g. "#FF0000" and "#FF0000FF"), and RGBA (e.g. "RGBA(1,1,1,1)") or RGB (e.g. "RGB(1,1,1)"), including Odin attribute expressions (e.g "@this.MyColor"). Here are the available named colors: black, blue, clear, cyan, gray, green, grey, magenta, orange, purple, red, transparent, transparentBlack, transparentWhite, white, yellow, lightblue, lightcyan, lightgray, lightgreen, lightgrey, lightmagenta, lightorange, lightpurple, lightred, lightyellow, darkblue, darkcyan, darkgray, darkgreen, darkgrey, darkmagenta, darkorange, darkpurple, darkred, darkyellow. + + + + Specify how tabs should be layouted. + + + + + Organizes the property into the specified tab in the default group. + Default group name is '_DefaultTabGroup' + + The tab. + if set to true [use fixed height]. + The order. + + + + Organizes the property into the specified tab in the specified group. + + The group to attach the tab to. + The name of the tab. + Set to true to have a constant height across the entire tab group. + The order of the group. + + + + Organizes the property into the specified tab in the specified group. + + The group to attach the tab to. + The name of the tab. + Set to true to have a constant height across the entire tab group. + The order of the group. + + + + Name of all tabs in this group. + + + + + The TableColumnWidth attribute is used to further customize the width of a column in tables drawn using the . + + + + [TableList] + public List<SomeType> TableList = new List<SomeType>(); + + [Serializable] + public class SomeType + { + [LabelWidth(30)] + [TableColumnWidth(130, false)] + [VerticalGroup("Combined")] + public string A; + + [LabelWidth(30)] + [VerticalGroup("Combined")] + public string B; + + [Multiline(2), Space(3)] + public string fields; + } + + + + + + + The width of the column. + + + + + Whether the column should be resizable. True by default. + + + + + Initializes a new instance of the class. + + The width of the column in pixels. + If true then the column can be resized in the inspector. + + + + Renders lists and arrays in the inspector as tables. + + + + + + + If ShowPaging is enabled, this will override the default setting specified in the Odin Preferences window. + + + + + Mark the table as read-only. This removes all editing capabilities from the list such as Add and delete, + but without disabling GUI for each element drawn as otherwise would be the case if the was used. + + + + + The default minimum column width - 40 by default. This can be overwriten by individual columns using the . + + + + + If true, a label is drawn for each element which shows the index of the element. + + + + + Whether to draw all rows in a scroll-view. + + + + + The number of pixels before a scroll view appears. 350 by default. + + + + + The number of pixels before a scroll view appears. 0 by default. + + + + + If true, expanding and collapsing the table from the table title-bar is no longer an option. + + + + + Whether to hide the toolbar containing the add button and pagin etc.s + + + + + The cell padding. + + + + + Whether paging buttons should be added to the title bar. The default value of this, can be customized from the Odin Preferences window. + + + + + Whether the ShowPaging property has been set. + + + + + Sets the Min and Max ScrollViewHeight. + + + + + The TableMatrix attribute is used to further specify how Odin should draw two-dimensional arrays. + + + + // Inheriting from SerializedMonoBehaviour is only needed if you want Odin to serialize the multi-dimensional arrays for you. + // If you prefer doing that yourself, you can still make Odin show them in the inspector using the ShowInInspector attribute. + public class TableMatrixExamples : SerializedMonoBehaviour + { + [InfoBox("Right-click and drag column and row labels in order to modify the tables."), PropertyOrder(-10), OnInspectorGUI] + private void ShowMessageAtOP() { } + + [BoxGroup("Two Dimensional array without the TableMatrix attribute.")] + public bool[,] BooleanTable = new bool[15, 6]; + + [BoxGroup("ReadOnly table")] + [TableMatrix(IsReadOnly = true)] + public int[,] ReadOnlyTable = new int[5, 5]; + + [BoxGroup("Labled table")] + [TableMatrix(HorizontalTitle = "X axis", VerticalTitle = "Y axis")] + public GameObject[,] LabledTable = new GameObject[15, 10]; + + [BoxGroup("Enum table")] + [TableMatrix(HorizontalTitle = "X axis")] + public InfoMessageType[,] EnumTable = new InfoMessageType[4,4]; + + [BoxGroup("Custom table")] + [TableMatrix(DrawElementMethod = "DrawColoredEnumElement", ResizableColumns = false)] + public bool[,] CustomCellDrawing = new bool[30,30]; + + #if UNITY_EDITOR + + private static bool DrawColoredEnumElement(Rect rect, bool value) + { + if (Event.current.type == EventType.MouseDown && rect.Contains(Event.current.mousePosition)) + { + value = !value; + GUI.changed = true; + Event.current.Use(); + } + + UnityEditor.EditorGUI.DrawRect(rect.Padding(1), value ? new Color(0.1f, 0.8f, 0.2f) : new Color(0, 0, 0, 0.5f)); + + return value; + } + + #endif + } + + + + + + If true, inserting, removing and dragging columns and rows will become unavailable. But the cells themselves will remain modifiable. + If you want to disable everything, you can use the attribute. + + + + + Whether or not columns are resizable. + + + + + The vertical title label. + + + + + The horizontal title label. + + + + + Override how Odin draws each cell. + [TableMatrix(DrawElementMethod='DrawMyElement')] + public MyType[,] myArray; + private static MyType DrawElement(Rect rect, MyType value) { return GUI.DrawMyType(rect, value); } + + + + + The height for all rows. 0 = default row height. + + + + + If true, the height of each row will be the same as the width of the first cell. + + + + + If true, no column indices drawn. + + + + + If true, no row indices drawn. + + + + + Whether the drawn table should respect the current GUI indent level. + + + + + If true, tables are drawn with rows/columns reversed (C# initialization order). + + + + + A resolved string that should evaluate to a tuple (string, LabelDirection) which will be used as the label for the rows and columns of the table. + + + [TableMatrix(SquareCells = true, Labels = "GetLabel")] + public int[,] ChessBoard = new int[8, 8]; + + private (string, LabelDirection) GetLabel(int[,] array, TableAxis axis, int index) + { + var chessFileLetters = "ABCDEFGH"; + + switch (axis) + { + case TableAxis.Y: + return ((array.GetLength(1) - index).ToString(), LabelDirection.LeftToRight); + case TableAxis.X: + return (chessFileLetters[index].ToString(), LabelDirection.TopToBottom); + default: + return (index.ToString(), LabelDirection.LeftToRight); + } + } + + + + + Title is used to make a bold header above a property. + + + The following example shows how Title is used on different properties. + + public class TitleExamples : MonoBehaviour + { + [Title("Titles and Headers")] + [InfoBox( + "The Title attribute has the same purpose as Unity's Header attribute," + + "but it also supports properties, and methods." + + "\n\nTitle also offers more features such as subtitles, options for horizontal underline, bold text and text alignment." + + "\n\nBoth attributes, with Odin, supports either static strings, or refering to members strings by adding a $ in front.")] + public string MyTitle = "My Dynamic Title"; + public string MySubtitle = "My Dynamic Subtitle"; + + [Title("Static title")] + public int C; + public int D; + + [Title("Static title", "Static subtitle")] + public int E; + public int F; + + [Title("$MyTitle", "$MySubtitle")] + public int G; + public int H; + + [Title("Non bold title", "$MySubtitle", bold: false)] + public int I; + public int J; + + [Title("Non bold title", "With no line seperator", horizontalLine: false, bold: false)] + public int K; + public int L; + + [Title("$MyTitle", "$MySubtitle", TitleAlignments.Right)] + public int M; + public int N; + + [Title("$MyTitle", "$MySubtitle", TitleAlignments.Centered)] + public int O; + public int P; + + [Title("$Combined", titleAlignment: TitleAlignments.Centered)] + public int Q; + public int R; + + [ShowInInspector] + [Title("Title on a Property")] + public int S { get; set; } + + [Title("Title on a Method")] + [Button] + public void DoNothing() + { } + + public string Combined { get { return this.MyTitle + " - " + this.MySubtitle; } } + } + + + + + + + + The title displayed above the property in the inspector. + + + + + Optional subtitle. + + + + + If true the title will be displayed with a bold font. + + + + + Gets a value indicating whether or not to draw a horizontal line below the title. + + + + + Title alignment. + + + + + Creates a title above any property in the inspector. + + The title displayed above the property in the inspector. + Optional subtitle + Title alignment + Horizontal line + If true the title will be drawn with a bold font. + + + + Groups properties vertically together with a title, an optional subtitle, and an optional horizontal line. + + + + + Optional subtitle. + + + + + Title alignment. + + + + + Gets a value indicating whether or not to draw a horizontal line below the title. + + + + + If true the title will be displayed with a bold font. + + + + + Gets a value indicating whether or not to indent all group members. + + + + + Groups properties vertically together with a title, an optional subtitle, and an optional horizontal line. + + The title- + Optional subtitle. + The text alignment. + Horizontal line. + Bold text. + Whether or not to indent all group members. + The group order. + + + + Combines TitleGroup attributes. + + The other group attribute to combine with. + + + + Toggle is used on any field or property, and allows to enable or disable the property in the inspector. + Use this to create a property that can be turned off or on. + + + Toggle does current not support any static members for toggling. + + + The following example shows how Toggle is used to create a toggleable property. + + public class MyComponent : MonoBehaviour + { + [Toggle("Enabled")] + public MyToggleable MyToggler = new MyToggleable(); + } + + public class MyToggleable + { + public bool Enabled; + + public int MyValue; + } + + + + + + + + Name of any bool field or property to enable or disable the object. + + + + + If true, all other open toggle groups will collapse once another one opens. + + + + + Create a togglable property in the inspector. + + Name of any bool field or property to enable or disable the object. + + + + ToggleGroup is used on any field, and create a toggleable group of options. + Use this to create options that can be enabled or disabled. + + + The functions as the ID for the ToggleGroup, and therefore all members of a toggle group must specify the same toggle member. + This attribute does not support static members! + + + The following example shows how ToggleGroup is used to create two separate toggleable groups. + + public class MyComponent : MonoBehaviour + { + // This attribute has a title specified for the group. The title only needs to be applied to a single attribute for a group. + [ToggleGroup("FirstToggle", order: -1, groupTitle: "First")] + public bool FirstToggle; + + [ToggleGroup("FirstToggle")] + public int MyInt; + + // This group specifies a member string as the title of the group. A property or a function can also be used. + [ToggleGroup("SecondToggle", titleStringMemberName: "SecondGroupTitle")] + public bool SecondToggle { get; set; } + + [ToggleGroup("SecondToggle")] + public float MyFloat; + + [HideInInspector] + public string SecondGroupTitle = "Second"; + } + + + + "/> + + + + Title of the toggle group in the inspector. + If null will be used instead. + + + + + If true, all other open toggle groups will collapse once another one opens. + + + + + Creates a ToggleGroup. See . + + Name of any bool field or property to enable or disable the ToggleGroup. + The order of the group. + Use this to name the group differently than toggleMemberName. + + + + Creates a ToggleGroup. See . + + Name of any bool field or property to enable or disable the ToggleGroup. + Use this to name the group differently than toggleMemberName. + + + + Obsolete constructor overload. + + Obsolete overload. + Obsolete overload. + Obsolete overload. + Obsolete overload. + + + + Name of any bool field, property or function to enable or disable the ToggleGroup. + + + + + Name of any string field, property or function, to title the toggle group in the inspector. + If null will be used instead. + + + + + Combines the ToggleGroup with another ToggleGroup. + + Another ToggleGroup. + + + + Draws the checkbox before the label instead of after. + + ToggleLeftAttribute can be used an all fields and properties of type boolean + + + public class MyComponent : MonoBehaviour + { + [ToggleLeft] + public bool MyBoolean; + } + + + + + + Specifies whether a base type should be used instead of all types. + + + + + Filters the result. + + + + + Name of any field, property or method member that implements IList. E.g. arrays or Lists. Obsolete; use the FilterGetter member instead. + + + + + A resolved string that should evaluate to a value that is assignable to IList; e.g, arrays and lists are compatible. + + + + + Gets or sets the title for the dropdown. Null by default. + + + + + If true, the value will be drawn normally after the type selector dropdown has been drawn. False by default. + + + + + Creates a dropdown menu for a property. + + A resolved string that should evaluate to a value that is assignable to IList; e.g, arrays and lists are compatible. + + + + The TypeInfoBox attribute adds an info box to the very top of a type in the inspector. + Use this to add an info box to the top of a class in the inspector, without having to use neither the PropertyOrder nor the OnInspectorGUI attribute. + + + The following example demonstrates the use of the TypeInfoBox attribute. + + [TypeInfoBox("This is my component and it is mine.")] + public class MyComponent : MonoBehaviour + { + // Class implementation. + } + + + + + + + + The message to display in the info box. + + + + + Draws an info box at the top of a type in the inspector. + + The message to display in the info box. + + + Specifies if the '<none>' item is shown. + + + Specifies if categories are shown. + + + + Specifies if namespaces are preferred over assembly category names for category names. + + + + + Function for filtering types displayed in the Type Selector. + + + + The resolver expects any method that takes a single parameter of , with the parameter name 'type', and which returns a indicating whether the is included or not; + + + Implementation example: public bool SomeFilterMethod(Type type). + + + + + + The unit of underlying value. + + + + + The unit displayed in the number field. + + + + + Name of the underlying unit. + + + + + Name of the unit displayed in the number field. + + + + + If true the number field is drawn as read-only text. + + + + + If true disables the option to change display unit with the right-click context menu. + + + + + Displays the number as a unit field. + + The unit of underlying value. + + + + Displays the number as a unit field. + + The name of the underlying value. + + + + Displays the number as a unit field. + + The unit of underlying value. + The unit to display the value as in the inspector. + + + + Displays the number as a unit field. + + The unit of underlying value. + The unit to display the value as in the inspector. + + + + Displays the number as a unit field. + + The unit of underlying value. + The unit to display the value as in the inspector. + + + + Displays the number as a unit field. + + The unit of underlying value. + The unit to display the value as in the inspector. + + + + Units for use with and . + + + + + ValidateInput is used on any property, and allows to validate input from inspector. + Use this to enforce correct values. + + + ValidateInput refuses invalid values. + ValidateInput only works in the editor. Values changed through scripting will not be validated. + + + The following examples shows how a speed value can be forced to be above 0. + + public class MyComponent : MonoBehaviour + { + [ValidateInput("ValidateInput")] + public float Speed; + + // Specify custom output message and message type. + [ValidateInput("ValidateInput", "Health must be more than 0!", InfoMessageType.Warning)] + public float Health; + + private bool ValidateInput(float property) + { + return property > 0f; + } + } + + + + The following example shows how a static function could also be used. + + public class MyComponent : MonoBehaviour + { + [ValidateInput("StaticValidateFunction")] + public int MyInt; + + private static bool StaticValidateFunction(int property) + { + return property != 0; + } + } + + + + + + + + Default message for invalid values. + + + + + OBSOLETE; use the Condition member instead. + A resolved string that should evaluate to a boolean value, and which should validate the input. Note that in expressions, the $value named parameter, and in methods, a parameter named value, can be used to get the validated value instead of referring to the value by its containing member. This makes it easier to reuse validation strings. + + + + + A resolved string that should evaluate to a boolean value, and which should validate the input. Note that in expressions, the $value named parameter, and in methods, a parameter named value, can be used to get the validated value instead of referring to the value by its containing member. This makes it easier to reuse validation strings. + + + + + The type of the message. + + + + + Whether to also trigger validation when changes to child values happen. This is true by default. + + + + + If true, the validation method will not only be executed when the User has changed the value. It'll run once every frame in the inspector. + + + + + Initializes a new instance of the class. + + A resolved string that should evaluate to a boolean value, and which should validate the input. Note that in expressions, the $value named parameter, and in methods, a parameter named value, can be used to get the validated value instead of referring to the value by its containing member. This makes it easier to reuse validation strings. + Default message for invalid values. + Type of the message. + + + + Obsolete. Rejecting invalid input is no longer supported. Use the other constructors instead. + + Obsolete overload. + Obsolete overload. + Obsolete overload. + Obsolete overload. + + + + ValueDropdown is used on any property and creates a dropdown with configurable options. + Use this to give the user a specific set of options to select from. + + + Due to a bug in Unity, enums will sometimes not work correctly. The last example shows how this can be fixed. + + + The following example shows a how the ValueDropdown can be used on an int property. + + public class MyComponent : MonoBehaviour + { + [ValueDropdown("myValues")] + public int MyInt; + + // The selectable values for the dropdown. + private int[] myValues = { 1, 2, 3 }; + } + + + + The following example shows how ValueDropdownList can be used for objects, that do not implement a usable ToString. + + public class MyComponent : MonoBehaviour + { + [ValueDropdown("myVectorValues")] + public Vector3 MyVector; + + // The selectable values for the dropdown, with custom names. + private ValueDropdownList<Vector3> myVectorValues = new ValueDropdownList<Vector3>() + { + {"Forward", Vector3.forward }, + {"Back", Vector3.back }, + {"Up", Vector3.up }, + {"Down", Vector3.down }, + {"Right", Vector3.right }, + {"Left", Vector3.left }, + }; + } + + + + The following example shows how the ValueDropdown can on any member that implements IList. + + public class MyComponent : MonoBehaviour + { + // Member field of type float[]. + private float[] valuesField; + + [ValueDropdown("valuesField")] + public float MyFloat; + + // Member property of type List<thing>. + private List<string> ValuesProperty { get; set; } + + [ValueDropdown("ValuesProperty")] + public string MyString; + + // Member function that returns an object of type IList. + private IList<ValueDropdownItem<int>> ValuesFunction() + { + return new ValueDropdownList<int> + { + { "The first option", 1 }, + { "The second option", 2 }, + { "The third option", 3 }, + }; + } + + [ValueDropdown("ValuesFunction")] + public int MyInt; + } + + + + Due to a bug in Unity, enums member arrays will in some cases appear as empty. This example shows how you can get around that. + + public class MyComponent : MonoBehaviour + { + // Make the field static. + private static MyEnum[] MyStaticEnumArray = MyEnum[] { ... }; + + // Force Unity to serialize the field, and hide the property from the inspector. + [SerializeField, HideInInspector] + private MyEnum MySerializedEnumArray = MyEnum[] { ... }; + } + + + + + + + Name of any field, property or method member that implements IList. E.g. arrays or Lists. Obsolete; use the ValuesGetter member instead. + + + + + A resolved string that should evaluate to a value that is assignable to IList; e.g, arrays and lists are compatible. + + + + + The number of items before enabling search. Default is 10. + + + + + False by default. + + + + + True by default. If the ValueDropdown attribute is applied to a list, then disabling this, + will render all child elements normally without using the ValueDropdown. The ValueDropdown will + still show up when you click the add button on the list drawer, unless is true. + + + + + False by default. + + + + + If the ValueDropdown attribute is applied to a list, and is set to true, then enabling this, + will exclude existing values, instead of rendering a checkbox indicating whether the item is already included or not. + + + + + If the dropdown renders a tree-view, then setting this to true will ensure everything is expanded by default. + + + + + If true, instead of replacing the drawer with a wide dropdown-field, the dropdown button will be a little button, drawn next to the other drawer. + + + + + Disables the the GUI for the appended drawer. False by default. + + + + + By default, a single click selects and confirms the selection. + + + + + By default, the dropdown will create a tree view. + + + + + Gets or sets the width of the dropdown. Default is zero. + + + + + Gets or sets the height of the dropdown. Default is zero. + + + + + Gets or sets the title for the dropdown. Null by default. + + + + + False by default. + + + + + Whether to draw all child properties in a foldout. + + + + + Whether values selected by the value dropdown should be copies of the original or references (in the case of reference types). Defaults to true. + + + + + If this is set to true, the actual property value will *only* be changed *once*, when the selection in the dropdown is fully confirmed. + + + + + Creates a dropdown menu for a property. + + A resolved string that should evaluate to a value that is assignable to IList; e.g, arrays and lists are compatible. + + + + + + + + + Gets the label for the dropdown item. + + The label text for the item. + + + + Gets the value of the dropdown item. + + The value for the item. + + + + Use this with to specify custom names for values. + + The type of the value. + + + + Adds the specified value with a custom name. + + The name of the item. + The value. + + + + Adds the specified value. + + The value. + + + + + + + + + The name of the item. + + + + + The value of the item. + + + + + Initializes a new instance of the class. + + The text to display for the dropdown item. + The value for the dropdown item. + + + + The name of this item. + + + + + Gets the text. + + + + + Gets the value. + + + + + + + + + + The name of the item. + + + + + The value of the item. + + + + + Initializes a new instance of the class. + + The text to display for the dropdown item. + The value for the dropdown item. + + + + Gets the text. + + + + + Gets the value. + + + + + The name of this item. + + + + + VerticalGroup is used to gather properties together in a vertical group in the inspector. + This doesn't do much in and of itself, but in combination with other groups, such as it can be very useful. + + + The following example demonstrates how VerticalGroup can be used in conjunction with + + public class MyComponent : MonoBehaviour + { + [HorizontalGroup("Split")] + [VerticalGroup("Split/Left")] + public Vector3 Vector; + + [VerticalGroup("Split/Left")] + public GameObject First; + + [VerticalGroup("Split/Left")] + public GameObject Second; + + [VerticalGroup("Split/Right", PaddingTop = 18f)] + public int A; + + [VerticalGroup("Split/Right")] + public int B; + } + + + + + + + + + + + Space in pixels at the top of the group. + + + + + Space in pixels at the bottom of the group. + + + + + Groups properties vertically. + + The group ID. + The group order. + + + + Groups properties vertically. + GroupId: _DefaultVerticalGroup + + The group order. + + + + Combines properties that have been group vertically. + + The group attribute to combine with. + + + + Wrap is used on most primitive property, and allows for wrapping the value when it goes out of the defined range. + Use this when you want a value that goes around in circle, like for example an angle. + + + Currently unsigned primitives are not supported. + + + The following example show how Wrap is used on a property. + + public class MyComponent : MonoBehaviour + { + [Wrap(-100, 100)] + public float MyFloat; + } + + + + + + + The lowest value for the property. + + + + + The highest value for the property. + + + + + Wraps the value of the property round when the values goes out of range. + + The lowest value for the property. + The highest value for the property. + + + + Not yet documented. + + + + + Not yet documented. + + + + + Various built-in button sizes. + + + + + Small button size, fits well with properties in the inspector. + + + + + A larger button. + + + + + A very large button. + + + + + A gigantic button. Twice as big as Large + + + + + Various display modes for the dictionary to draw its items. + + + + + Draws all dictionary items in two columns. The left column contains all key values, the right column displays all values. + + + + + Draws each dictionary item in a box with the key in the header and the value inside the box. + Whether or not the box is expanded or collapsed by default, is determined by the + "Expand Foldout By Default" setting found in the preferences window "Tools > Odin > Inspector > Preferences > Drawers > Settings". + + + + + Draws each dictionary item in a collapsed foldout with the key in the header and the value inside the box. + + + + + Draws each dictionary item in an expanded foldout with the key in the header and the value inside the box. + + + + + When this attribute is added is added to another attribute, then attributes from that attribute + will also be added to the property in the attribute processing step. + + + + + Type of info message box. This enum matches Unity's MessageType enum which could not be used since it is located in the UnityEditor assembly. + + + + + Generic message box with no type. + + + + + Information message box. + + + + + Warning message box. + + + + + Error message box. + + + + + Editor modes for + + + + + + Draws only the editor GUI + + + + + Draws the editor GUI and the editor header. + + + + + Draws the editor GUI to the left, and a small editor preview to the right. + + + + + Draws a small editor preview without any GUI. + + + + + Draws a large editor preview without any GUI. + + + + + Draws the editor header and GUI to the left, and a small editor preview to the right. + + + + + How the InlineEditor attribute drawer should draw the object field. + + + + + Draws the object field in a box. + + + + + Draws the object field with a foldout. + + + + + Hides the object field unless it's null. + + + + + Hidden the object field also when the object is null. + + + + + Implement this interface to create custom matching + logic for search filtering in the inspector. + + + The following example shows how you might do this: + + public class MyCustomClass : ISearchFilterable + { + public bool SearchEnabled; + public string MyStr; + + public bool IsMatch(string searchString) + { + if (SearchEnabled) + { + return MyStr.Contains(searchString); + } + + return false; + } + } + + + + + + Any type implementing this interface will be considered to be validating itself using the implemented logic, as if a custom validator had been written for it. + + + + + Not yet documented. + + + + + Not yet documented. + + Not yet documented. + + + + Not yet documented. + + Not yet documented. + Not yet documented. + + + + How the square object field should be aligned. + + + + + + Left aligned. + + + + + Aligned to the center. + + + + + Right aligned. + + + + + The prefab kind returned by + + + + + None. + + + + + Instances of prefabs in scenes. + + + + + Instances of prefabs nested inside other prefabs. + + + + + Regular prefab assets. + + + + + Prefab variant assets. + + + + + Non-prefab component or gameobject instances in scenes. + + + + + Instances of regular prefabs, and prefab variants in scenes or nested in other prefabs. + + + + + Prefab assets and prefab variant assets. + + + + + Prefab Instances, as well as non-prefab instances. + + + + + All kinds + + + + + Options for filtering search. + + + + + Title alignment enum used by various attributes. + + + + + + + Title and subtitle left aligned. + + + + + Title and subtitle centered aligned. + + + + + Title and subtitle right aligned. + + + + + Title on the left, subtitle on the right. + + + + Specifies the types to include based on certain criteria. + + + Represents types that are not interfaces, abstracts, or generics. + +
+
diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Attributes.xml.meta b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Attributes.xml.meta new file mode 100644 index 00000000..ba9d6b68 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Attributes.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 47a84ebde4ec47fabb620b30cc7a096f +timeCreated: 1488828285 +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Editor.dll b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Editor.dll new file mode 100644 index 00000000..a81fb5bb Binary files /dev/null and b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Editor.dll differ diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Editor.dll.meta b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Editor.dll.meta new file mode 100644 index 00000000..57f5b0e0 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Editor.dll.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: a4865f1ab4504ed8a368670db22f409c +timeCreated: 1488828285 +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 0 + Exclude Linux: 1 + Exclude Linux64: 1 + Exclude LinuxUniversal: 1 + Exclude N3DS: 1 + Exclude OSXIntel: 1 + Exclude OSXIntel64: 1 + Exclude OSXUniversal: 1 + Exclude PS4: 1 + Exclude PSM: 1 + Exclude PSP2: 1 + Exclude SamsungTV: 1 + Exclude Tizen: 1 + Exclude WebGL: 1 + Exclude WiiU: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude WindowsStoreApps: 1 + Exclude XboxOne: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + Editor: + enabled: 1 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Editor.xml b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Editor.xml new file mode 100644 index 00000000..deec1dcf --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Editor.xml @@ -0,0 +1,11325 @@ + + + + Sirenix.OdinInspector.Editor + + + + + An ActionResolver resolves a string to an action, given an InspectorProperty instance to use as context. Call to get an instance of an ActionResolver. + Action resolvers are a globally extendable system that can be hooked into and modified or changed by creating and registering an . + See Odin's tutorials for details and examples of how to use ActionResolvers. + + + + + The context of this ActionResolver, containing all of its configurations and values it needs to function. For performance and simplicity reasons, this is a single very large struct that is passed around by ref to anything that needs it. + + + + + The delegate that executes the actual action. You should not call this manually, but instead call . + + + + + The current error message that the resolver has, or null if there is no error message. This is a shortcut for writing "resolver.Context.ErrorMessage". + + + + + Whether there is an error message at the moment. This is a shortcut for writing "resolver.Context.ErrorMessage != null". + + + + + Draws an error message box if there is an error, and does nothing if there is no error. + + + + + Executes the resolved action for a given selection index. + + The selection index to execute the action on. Defaults to 0. + + + + Executes the action for all selection indices. + + + + + Creates a new action resolver instance from a pre-built context struct. This is a more advanced use that requires you to + know how the context needs to be set up before action resolution happens. However, this allows you to do more advanced + things like adjust various context values before string resolution happens. + + The pre-built context that should be used to get a resolver. + + + + Creates a new action resolver instance for a given string. + + The property that is the context for the resolution to happen in. + The string that should be resolved to an action. + + + + Creates a new action resolver instance for a given string. + + The property that is the context for the resolution to happen in. + The string that should be resolved to an action. + The extra named args that this resolver has access to. Passing in a named arg that already exists will silently override the pre-existing named arg. + + + + Gets a nicely formatted string that lists all the errors in the given set of action resolvers. The returned value is null if there are no errors. + + + + + Gets a nicely formatted string that lists all the errors in the given set of action resolvers. The returned value is null if there are no errors. + + + + + Draws error boxes for all errors in the given action resolvers, or does nothing if there are no errors. This is equivalent to calling DrawError() on all resolvers passed to this method. + + + + + Draws error boxes for all errors in the given action resolvers, or does nothing if there are no errors. This is equivalent to calling DrawError() on all resolvers passed to this method. + + + + + This struct contains all of an ActionResolver's configurations and values it needs to function. For performance and simplicity reasons, this is a single very large struct that lives on an ActionResolver instance and is passed around by ref to anything that needs it. + + + + + The property that *provides* the context for the action resolution. This is the instance that was passed to the resolver when it was created. Note that this is different from , which is based on this value, but almost always isn't the same InspectorProperty instance. + + + + + The error message, if a valid action resolution wasn't found, or if creation of the action resolver failed because was invalid, or if the action was executed but threw an exception. (In this last case, will be true.) + + + + + The named values that are available to the action resolver. Use this field only to get and set named values - once the ValueResolver has been created, new named values will have no effect. + + + + + This will be true if is not null and the message was caused by an exception thrown by code invoked during execution of the resolved action. + + + + + Whether exceptions thrown during action execution should be logged to the console. + + + + + The string that is resolved to perform an action. + + + + + Whether the action resolver should sync ref parameters of invoked methods with named values. If this is true, then if a ref or out parameter value is changed during action execution, the named value associated with that parameter will also be changed to the same value. + + + + + Whether this context has been resolved. + + + + + The type that is the parent of the action resolution, ie, the type that is the context. This is the same as .ValueEntry.TypeOfValue. + + + + + The property that *is* the context for the action resolution. This is not the instance that was passed to the resolver when it was created, but this value is based on that instance. This is the property that provides the actual context - for example, if is for a member of a type - or for an element in a collection contained by a member - this value will be the parent property for the type that contains that member. Only if is the tree's root property is the same as . + + + + + Gets the parent value which provides the context of the resolver. + + The selection index of the parent value to get. + + + + Sets the parent value which provides the context of the resolver. + + The selection index of the parent value to set. + The value to set. + + + + Adds the default named values of "property" and "value" to the context's named values. + This method is usually automatically invoked when a resolver is created, so there + is no need to invoke it manually. + + + + + A color palette. + + + + + Name of the color palette. + + + + + The colors. + + + + + Whether to show the alpha channel. + + + + + Add, Edit or remove custom color palettes used by the . + + You can modify the configuration in the Odin Preferences window found in 'Tools -> Odin Inspector -> Preferences -> Drawers -> Color Palettes', + or by locating the configuration file stored as a serialized object in the Sirenix folder under 'Odin Inspector/Config/Editor/ColorPaletteManager'. + + + + + + Specify the amount of spacing between each color in a color palette. + + + + + Specify the width of each color in a color palette. If StretchPalette is set to true, this will become the min-width. + + + + + If true, all color in a color palette is stretch so that the entire color-palette area is filled. + + + + + If true, a toolbar with the name of the color palette is shown above each color palette. + + + + + Gives you the list of all custom color palettes. + Remember to call UnityEditor.EditorUtility.SetDirty(ColorPaletteManager.Instance) after modifying the list. + + + + + Editor Only Mode Utility. + + + + + Gaither all necessary information about the editor only state. + + + + + Disables Editor Only Mode. + + + + + Enables editor only mode. + + + + + Checks to see whether Editor Only Mode is enabled. + + + + + Checks to see whether Odin Inspector is installed in Source Code mode. + + + + + Contains general configuration for all Odin drawers. + + You can modify the configuration in the Odin Preferences window found in 'Tools -> Odin Inspector -> Preferences -> Drawers -> General', + or by locating the configuration file stored as a serialized object in the Sirenix folder under 'Odin Inspector/Config/Editor/GeneralDrawerConfig'. + + + + + + Specify whether or not the script selector above components should be drawn. + + + + + Specify whether or not the script selector above components should be drawn. + + + + + Specify whether or not the warning for properties that do not support prefab modifications should be shown in the inspector. + + + + + Specify whether or not the warning for properties that do not support prefab modifications should be shown in the inspector. + + + + + Specifies the maximum depth to which a property can draw itself recursively before the system refuses to draw it any deeper. + + + + + If set to true, most foldouts throughout the inspector will be expanded by default. + + + + + If set to true, buttons will show the result values from invoking them in the inspector by default. + + + + + Specify the animation speed for most foldouts throughout the inspector. + + + + + Specify the shaking duration for most shaking animations throughout the inspector. + + + + + Specify the animation speed for + + + + + When true the component labels, for vector fields, will be hidden when the field is too narrow. + + + + + Specify how the Quaternion struct should be shown in the inspector. + + + + + Gets or sets a value indicating whether [use improved enum drop down]. + + + + + Gets or sets a value indicating whether [use improved enum drop down]. + + + + + Specify whether or not a list should hide the foldout triangle when the list is empty. + + + + + Specifies whether a list should hide the foldout triangle when the list is empty. + + + + + Specify whether or not lists should hide the paging buttons when the list is collapsed. + + + + + Specify whether or not lists should hide the paging buttons when there is only one page. + + + + + Specify the number of elements drawn per page. + + + + + Specify whether or not lists should be expanded or collapsed by default. + + + + + Specify whether or not to include a button which expands the list, showing all pages at once. + + + + + Specify whether or not lists should show item count. + + + + + Specify whether or not lists should show item count. + + + + + Specify the color of even list elements when in the dark skin. + + + + + Specify the color of odd list elements when in the dark skin. + + + + + Specify the color of even list elements when in the light skin. + + + + + Specify the color of odd list elements when in the light skin. + + + + + Gets or sets the default size of the preview object field. + + + + + Gets or sets the default alignment of the preview object field. + + + + + Gets or sets which types should be drawn by default by the preview object field. + + + + + Resets all settings to default. + + + + + Configurations for Odin DLLs import settings. + + + + + Gets or sets a value indicating whether or not Odin should automatically configure the import settings of its DLLs in a preprocess build step. + Keep in mind that this feature is only supported by Unity version 5.6 and up. + + + + + Gets a value indicating whether or not automatic configuration of Odin's DLL import settings is supported by the current Unity version. + + + + + + Tell Odin which types should be drawn or should not be drawn by Odin. + + + You can modify which types should be drawn by Odin in the Preferences window found in 'Tools -> Odin Inspector -> Preferences -> Editor Types', + or by locating the configuration file stored as a serialized object in the Sirenix folder under 'Odin Inspector/Config/Editor/InspectorConfig'. + + + + + + Whether Odin is enabled in the inspector or not. + + + + + InspectorDefaultEditors is a bitmask used to tell which types should have an Odin Editor generated. + + + + + The config which contains configuration data for which types Odin should draw in the inspector. + + + + + Updates Unity with the current Odin editor configuration. + + + + + InspectorDefaultEditors is a bitmask used to tell which types should have an Odin Editor generated. + + + + + + Excludes all types. + + + + + UserTypes includes all custom user scripts that are not located in an editor or plugin folder. + + + + + PluginTypes includes all types located in the plugins folder and are not located in an editor folder. + + + + + UnityTypes includes all types depended on UnityEngine and from UnityEngine, except editor, plugin and user types. + + + + + OtherTypes include all other types that are not depended on UnityEngine or UnityEditor. + + + + + Contains configuration data for which types Odin should draw in the inspector. + + + Note that this class supports assigning arbitrary editor types to inspect any Unity object type. The Editor Types GUI in preferences simply does not, as of now, support assigning editors of any other type than . However, the API is open to further customization. + When an editor is generated for a type, a new editor type is added to the GeneratedOdinEditors assembly, which is derived from the assigned editor type - in most cases, . + You can check if an editor is compatible using . + + . + . + + + + The type binder that the uses to bind types to names, and names to types. + This is usually an instance of . + + + + + Resets the drawing configuration to the default values. + + + + + Gets a list of all drawn types that have entries in the drawing config. + + + + + Forces the config's internal drawer type to value type lookup cache to rebuild itself. + + + + + Clears the editor type entry for the given drawer, so it will be set to Unity's default. + + The drawn type to clear the editor for. + drawnType is null + + + + Assigns a given editor to draw a given type. + + The drawn type to assign an editor type for. + The editor type to assign. When generating editors, a type derived from this editor will be created and set to draw the given drawn type. + drawnType + The type " + editorType.GetNiceName() + " is not a valid base editor for type " + drawnType.GetNiceName() + ". Check criteria using . + + + + Determines whether an editor value has been assigned for a given drawn type. + + The drawn type to check. + drawnType is null + + + + Gets which editor type would draw the given type. If the type has not been assigned a custom editor type in the config, the default editor type is returned using . + + The drawn type to get an editor type for. + The editor that would draw the given type. + drawnType is null + + + + Gets the default editor that this type would have, if no custom editor was set for this type in particular. This is calculated using the value of . + + The drawn type to get the default editor for. + The editor that would draw this type by default, or null, if there is no default Odin-defined editor for the drawn type. + drawnType is null + + + + Checks whether the given editor can be assigned to draw any type using the class. + + Type of the editor to check. + True if the editor is valid, otherwise false + + + + Checks whether the given editor can be assigned to draw a given type using the class. + This method checks the attribute on the type for whether the given type is compatible. + + Type of the editor to check. + Type of the drawn value to check. If this parameter is null, the drawn type is not checked for compatibility with the editor type; only the editor type itself is checked for validity. + True if the editor is valid, otherwise false + editorType + + + + Gets the type that an editor draws, by extracting it from the editor's attribute, if it is declared. + This method returns null for abstract editor types, as those can never draw anything. + + Type of the editor. + Whether the editor in question is also an editor for types derived from the given type. + + editorType + + + + A type that indicates that a drawer is missing. + + + + + Draws an instance, and contains methods getting all types that should be drawn by Odin. + Note that this class keeps a lot of static state, and is only intended to draw the instance of that exists in the singleton asset. If used to draw other instances, odd behaviour may occur. + + . + . + + + + Determines whether Odin is capable of creating a custom editor for a given type. + + + + + Gets an array of all assigned editor types, and the types they have to draw. + + + + + Draws the property. + + + + + Installed Odin Inspector Version Info. + + + + + Gets the name of the current running version of Odin Inspector. + + + + + Gets the current running version of Odin Inspector. + + + + + Whether the current version of Odin is an enterprise version. + + + + + Contains information about an editor type which is assigned to draw a certain type in the inspector. + This class uses the instance to bind types to names, and names to types. + + . + . + . + + + + A default, empty value. + + + + + The name of the type to be drawn. + + + + + The name of the editor type. + + + + + Initializes a new instance of the struct. + + The drawn type. + drawnType is null + + + + Initializes a new instance of the struct. + + The drawn type. + The editor type. + drawnType is null + + + + Determines whether the specified is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Determines whether the specified , is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Implements the operator ==. + + The x. + The y. + + The result of the operator. + + + + + Implements the operator !=. + + The x. + The y. + + The result of the operator. + + + + + A contextual value attached to an , mapped to a key, contained in a . + + + + + The contained value. + + + + + Creates a new PropertyContext. + + + + + Performs an explicit conversion from to . + + The context. + + The result of the conversion. + + + + + Returns a that represents this instance, of the format ": Value.ToString()". + + + A that represents this instance. + + + + + Contains a context for an , which offers the ability to address persistent values by key across several editor GUI frames. + Use this in drawers to store contextual editor-only values such as the state of a foldout. + + + + + Initializes a new instance of the class. + + The property. + property + + + + Gets a global context value for a given key, using a given delegate to generate a default value if the context doesn't already exist. + Global contexts are not associated with any one specific drawer, and so are shared across all drawers for this property. + + The type of the context value to get. + The key of the context value to get. + A delegate for generating a default value. + The found context. + + + + Gets a global context value for a given key, using a given default value if the context doesn't already exist. + Global contexts are not associated with any one specific drawer, and so are shared across all drawers for this property. + + The type of the context value to get. + The key of the context value to get. + The default value to set if the context value doesn't exist yet. + The found context. + + + + Gets a global context value for a given key, and creates a new instance of as a default value if the context doesn't already exist. + Global contexts are not associated with any one specific drawer, and so are shared across all drawers for this property. + + The type of the context value to get. + The key of the context value to get. + The found context. + + + + Gets a object and creates a object for it. + + The type of the value of the context. + The instance of the drawer. + The key for the context. + The default value for the context. + + + + Gets a object and creates a object for it. + Returns true when the is first created. Otherwise false. + + The type of the value of the context. + The instance of the drawer. + The key for the context. + The object. + Returns true when the is first created. Otherwise false. + + + + Swaps context values with a given . + + The context to swap with. + + + + An can implement this interface to indicate that it defines right-click context menu items for properties that it draws. + + + + + Method that is invoked when a user has right-clicked a property, and the context menu is being built. The method is invoked in order of drawer priority. + + The property that has been right-clicked on. + The generic menu instance that is being built. Add items to this. + + + + A polymorphic alias for getting and setting the values of an . + + The type of the owner. + The type of the value. + The type of the property owner. + The type of the property value. + + + + Gets the type of the owner. + + + + + Gets the type of the value. + + + + + Whether the value is readonly. + + + + + Initializes a new instance of the class. + + The information. + info + + + + Gets the value from a given weakly typed owner. + + The weakly typed owner. + The found value. + + + + Gets the value from a given owner. + + The owner. + owner is null + + + + Sets the weakly typed value on a given weakly typed owner. + + The owner. + The value. + + + + Sets the value on a given owner. + + The owner. + The value. + + + + Responsible for getting and setting values on properties. + + The type of the owner. + The type of the value. + + + + + Whether the value is readonly. + + + + + Gets the type of the owner. + + + + + Gets the type of the value. + + + + + Initializes a new instance of the class. + + The field member to represent. + if set to true [is readonly]. + + + + Initializes a new instance of the class. + + The getter. + The setter. + getter + + + + Initializes a new instance of the class. + + The getter. + The setter. + getter + + + + Gets the value from a given owner. + + The owner. + The found value. + owner is null + + + + Gets the value from a given weakly typed owner. + + The weakly typed owner. + The found value. + + + + Sets the weakly typed value on a given weakly typed owner. + + The owner. + The value. + + + + Sets the value on a given owner. + + The owner. + The value. + + + + Checks whether the allocated has data associated with it. + + The index of the to check. + true if the has data associated with it; otherwise false. + + + + Gets the data associated with the at the given ; this is the second parameter assigned in the method. + + The index of the to retrieve the associated data from. + The associated data. + + + + Gets the data associated with the at the given ; this is the second parameter assigned in the method. + + The index of the to retrieve the associated data from. + The expected associated data type. + The associated data. + + + + Gets the indentation set for the at the given . + + The of the to retrieve the indentation for. + The indentation for the . + The indentation is set using during and . + + + + Creates a representing all the visible 's combined. + + The created . + + + + Allocates an in the view, with the option to associate a given with it. + + + + Ensure is called before calling this, and ensure is called after you're done with + + + + Commit a vertical drop using DragAndDropState. + Center on an empty group inserts INTO that group. + Top/Bottom on any item inserts as a SIBLING in the parent container. + Returns true if the model changed. + + + + + Handles the window's linux-like drag behaviour. + + Are we currently dragging (provided by the calling window) + Where did the drag start (provided by the calling window) + The window to move + A passive control id to make sure the window keeps getting events while dragging (provided by the calling window) + A bool so the calling window can update its "isDragging" variable and a Vector2 so the calling window can update its "dragStartPosition" variable + + + + + + Does not guarantee stability. + + + Temporary. + This implementation will get refactored. + + + Temporary. + This implementation will get refactored. + + + + Draws a regular Unity ObjectField, but supports labels being nulls, and also adds a small button that will open the object in a new inspector window. + + Position and size of the field. + The label to use, or null if no label should be used. + The Unity object. + The Unity object type. This supports inheritance. + Whether to allow scene objects. + Determines if the Field is read-only. + Will be used for setting and updating the value, this provides a more consistent way to the handle changes. + If a property is assigned through the parameters, the return value should not be used for setting the , the drawer will handle that. + + + + Draws a regular Unity ObjectField, but supports labels being nulls, and also adds a small button that will open the object in a new inspector window. + + Position and size of the field. + The label to use, or null if no label should be used. + The Unity object. + The Unity object type. This supports inheritance. + Whether to allow scene objects. + Determines if the Field is read-only. + Will be used for setting and updating the value, this provides a more consistent way to the handle changes. + If a property is assigned through the parameters, the return value should not be used for setting the , the drawer will handle that. + + + + TODO + + + + + + + + + + + + + + + + If a property is assigned through the parameters, the return value should not be used for setting the , the drawer will handle that. + + + + TODO + + + + + + + + + + + + + + + + If a property is assigned through the parameters, the return value should not be used for setting the , the drawer will handle that. + + + + Contains a set of Unique IDs used for various parts of Odin that don't rely on ControlIds as the ID identifier for OdinObjectSelector. + + + + + Handles instantiating different versions of the Type Selector depending on the context. + + This handler only handles shared constructors between the two versions, for obsolete or unique constructors use the desired selector. + + + + Contains meta-data information about a property in the inspector, that can be used to create an actual property instance. + + + + + The name of the property. + + + + + Gets a value indicating whether this InspectorPropertyInfo has any backing members. + + + + + Gets a value indicating whether this InspectorPropertyInfo has only a single backing member. + + + + + The member info of the property. If the property has many member infos, such as if it is a group property, the first member info of is returned. + + + + + Indicates which type of property it is. + + + + + The serialization backend for this property. + + + + + The type on which this property is declared. + + + + + The base type of the value which this property represents. If there is no value, this will be null. + + + + + Whether this property is editable or not. + + + + + All member infos of the property. There will only be more than one member if it is an . + + + + + The order value of this property. Properties are (by convention) ordered by ascending order, IE, lower order values are shown first in the inspector. The final actual ordering of properties is decided upon by the property resolver. + + + + + The attributes associated with this property. + + + + + Whether this property only exists as a Unity , and has no associated managed member to represent it. + This case requires some special one-off custom behaviour in a few places. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Gets the first attribute of a given type on this property. + + + + + Gets the first attribute of a given type on this property, which is not contained in a given hashset. + + The attributes to exclude. + + + + Gets all attributes of a given type on the property. + + + + + The s of all the individual properties in this group. + + + + + Gets the property's method delegate, if there is one. Note that this is null if a method property is backed by an actual method member. + + + + + Gets all s for a given type. + + The parent property. + The type to get infos for. + if set to true members that are serialized by Odin will be included. + + + + Gets an aliased version of a member, with the declaring type name included in the member name, so that there are no conflicts with private fields and properties with the same name in different classes in the same inheritance hierarchy. + + + + + Represents a property in the inspector, and provides the hub for all functionality related to that property. + + + + + Gets the property which is the ultimate root of this property's serialization. + + + + + The name of the property. + + + + + The nice name of the property, usually as converted by . + + + + + The cached label of the property, usually containing . + + + + + The full Odin path of the property. To get the Unity property path, see . + + + + + The child index of this property. + + + + + Gets the resolver for this property's children. + + + + + The current recursive draw depth, incremented for each time that the property has caused itself to be drawn recursively. + Note that this is the current recursion level, not the total amount of recursions so far this frame. + + + + + The amount of times that the property has been drawn so far this frame. + + + + + How deep in the drawer chain the property currently is, in the current drawing session as determined by . + + + + + Whether this property supports having prefab modifications applied or not. + + + + + Gets an immutable list of the components attached to the property. + + + + + Gets an immutable list of processed attributes for the property. + + + + + Gets an array of the state updaters of the property. Don't change the contents of this array! + + + + + The value entry that represents the base value of this property. + + + + + The value entry that represents the strongly typed value of the property; this is possibly an alias entry in case of polymorphism. + + + + + The parent of the property. If null, this property is a root-level property in the . + + + + + The of this property. + + + + + The that this property exists in. + + + + + The children of this property. + + + + + The context container of this property. + + + + + The last rect that this property was drawn within. + + + + + The type on which this property is declared. This is the same as . + + + + + The parent values of this property, by selection index; this represents the values that 'own' this property, on which it is declared. + + + + + The full Unity property path of this property; note that this is merely a converted version of , and not necessarily a path to an actual Unity property. + In the case of Odin-serialized data, for example, no Unity properties will exist at this path. + + + + + The full path of this property as used by deep reflection, containing all the necessary information to find this property through reflection only. This is used as the path for prefab modifications. + + + + + The full path of this property as used by prefab modifications and the deep reflection system, containing all the necessary information to find this property through reflection only. + + + + + The PropertyState of the property at the current draw count index. + + + + + Gets the component of a given type on the property, or null if the property does not have a component of the given type. + + + + + Marks the property's serialization root values dirty if they are derived from UnityEngine.Object. + + + + + Records the property's serialization root for undo to prepare for undoable changes, with a custom string that includes the property path and Unity object name. If a message is specified, it is included in the custom undo string. + + + + + Gets the first attribute of a given type on this property. + + + + + Gets the first attribute of a given type on this property, which is not contained in a given hashset. + + The attributes to exclude. + + + + Gets all attributes of a given type on the property. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Draws this property in the inspector. + + + + + Draws this property in the inspector with a given default label. This default label may be overridden by attributes on the drawn property. + + + + + Push a draw session. This is used by and . + + + + + Increments the current drawer chain index. This is used by . + + + + + Pop a draw session. This is used by and . + + + + + Gets the next property in the , or null if none is found. + + Whether to include children or not. + Whether to only include visible properties. + + + + Finds the first parent property that matches a given predicate. + + + + + Finds the first child recursively, that matches a given predicate. + + + + + Updates the property. This method resets the temporary context, and updates the value entry and the property children. + + If true, the property will update regardless of whether it has already updated for the current . + + + + Populates a generic menu with items from all drawers for this property that implement . + + + + + Determines whether this property is the child of another property in the hierarchy. + + The property to check whether this property is the child of. + other is null + + + + Determines whether this property is a parent of another property in the hierarchy. + + The property to check whether this property is the parent of. + other is null + + + + Handles all prefab modifications that apply to the targets of a property tree, if any. This class determines which properties have modifications, what the modifications are, auto-applies modifications if the current instance values do not correspond to the prefab values, and also provides an API for modifying those modifications. + NOTE: This class is liable to see a lot of changes, as the prefab modification system is slated to be redesigned for increased extendability in the future. Do not depend overly on the current API. + + + + + The prefabs for each prefab instance represented by the property tree, if any. + + + + + Whether any of the values the property tree represents are prefab instances. + + + + + A prefab tree for the prefabs of this property tree's prefab instances, if any exist. + + + + + Gets the Unity PropertyModification for the property at this path, if there are any. + + The property path to get the modification for. + The index of the tree target to get the modification for. + Whether any children of the path have modifications registered. + + + + + Gets the Odin prefab modification type of a given property, if any. + + The property to check. + + + The prefab modification type of the property if it has one, otherwise null. + + + + + Registers a modification of type for a given property. + + The property to register a modification for. + Selection index of the target to register a modification for. + The modified list length. + + Property " + property.Path + " does not have a value entry; cannot register prefab modification to this property. + or + newLength cannot be negative! + + + + + Registers a modification of type for a given property. + + The property to register a modification for. + Selection index of the target to register a modification for. + Whether to force the change to be registered immediately, rather than at the end of frame. + Property " + property.Path + " does not have a value entry; cannot register prefab modification to this property. + + + + Calculates a delta between the current dictionary property and its prefab counterpart, and registers that delta as a modification. + + The property to register a modification for. + Selection index of the target. + Property " + property.Path + " does not have a value entry; cannot register prefab modification to this property. + + + + Adds a remove key modification to the dictionary modifications of a given property. + + The property to register a modification for. + Selection index of the target. + The key to be removed. + Property " + property.Path + " does not have a value entry; cannot register prefab modification to this property. + + + + Adds an add key modification to the dictionary modifications of a given property. + + The property to register a modification for. + Selection index of the target. + The key to be added. + Property " + property.Path + " does not have a value entry; cannot register prefab modification to this property. + + + + Removes all dictionary modifications on a property for a given dictionary key value. + + The property to remove a key modification for. + Selection index of the target. + The key to remove modifications for. + key + + + + Removes all prefab modifications of a given type on a given property. + + The property to remove modifications for. + Selection index of the target. + Type of the modification to remove. + + + + Gets all prefab modifications in this property tree for a given selection index. + + + + + + + Represents the children of an . + + + + + The that this instance handles children for. + + + + + Gets a child by index. This is an alias for . + + The index of the child to get. + The child at the given index. + + + + Gets a child by name. This is an alias for . + + The name of the child to get. + The child, if a child was found; otherwise, null. + + + + Gets a child by name. This is an alias for . + + The name of the child to get. + The child, if a child was found; otherwise, null. + + + + Initializes a new instance of the class. + + The property to handle children for. + property is null + + + + The number of children on the property. + + + + + Updates this instance of . + + + + + Gets a child by name. + + The name of the child to get. + The child, if a child was found; otherwise, null. + name + + + + Gets a child by name. + + The name of the child to get. + The child, if a child was found; otherwise, null. + name + + + + Gets a child by index. + + The index of the child to get. + + The child at the given index. + + The given index was out of range. + + + + Gets the path of the child at a given index. + + The index to get the path of. + The path of the child at the given index. + The given index was out of range. + + + + Returns an IEnumerable that recursively yields all children of the property, depth first. + + + + + Gets the property's already created children. If the child count is less than or equal to 10000, children are returned in order. If the count is larger than 10000, they are returned in no particular order. + + + + + Gets the enumerator. + + + + + Gets the enumerator. + + + + + This is a class for creating, getting and modifying a property's various states. An instance of this class always comes attached to an InspectorProperty. + See Odin's tutorials for more information about usage of the state system. + + + + + If set to true, all state changes for this property will be logged to the console. + + + + + Whether the property is visible in the inspector. + + + + + Whether the Visible state was true or not during the last layout event. + + + + + Whether the property is enabled in the inspector. + + + + + Whether the Enabled state was true or not during the last layout event. + + + + + Whether the property is expanded in the inspector. + + + + + Whether the Expanded state was true or not during the last layout event. + + + + + Creates a custom state with a given name. + + + + + + + + + Determines whether a state with the given key exists. + + The key to check. + True if the state exists, otherwise, false. + + + + Determines whether a state with the given key exists. + + The key to check. + If the state exists, this out parameter will be true if the state is persistent. + True if the state exists, otherwise, false. + + + + Determines whether a state with the given key exists. + + The key to check. + If the state exists, this out parameter will contain the type of value that the state contains. + True if the state exists, otherwise, false. + + + + Determines whether a state with the given key exists. + + The key to check. + If the state exists, this out parameter will be true if the state is persistent. + If the state exists, this out parameter will contain the type of value that the state contains. + True if the state exists, otherwise, false. + + + + Gets the value of a given state as an instance of type T. + + The type to get the state value as. An will be thrown if the state's value type cannot be assigned to T. + The key of the state to get. An will be thrown if a state with the given key does not exist. + The value of the state. + + + + Gets the value that a given state contained last layout as an instance of type T. + + The type to get the state value as. An will be thrown if the state's value type cannot be assigned to T. + The key of the state to get. An will be thrown if a state with the given key does not exist. + The value of the state during the last layout event. + + + + Sets the value of a given state to a given value. + + The type to set the state value as. An will be thrown if T cannot be assigned to the state's value type. + The key of the state to set the value of. An will be thrown if a state with the given key does not exist. + The value to set. + + + + Cleans the property state and prepares it for cached reuse of its containing PropertyTree. This will also reset the state. + + + + + Resets all states to their default values. Persistent states will be updated to their persistent cached value if one exists. + + + + + Represents a set of values of the same type as a tree of properties that can be drawn in the inspector, and provides an array of utilities for querying the tree of properties. + + + + + Delegate for on property value changed callback. + + + + + This will be replaced by an IMGUIDrawingComponent in patch 3.2. + + + + + The component providers that create components for each property in the tree. If you change this list after the tree has been used, you should call tree.RootProperty.RefreshSetup() to make the changes update properly throughout the tree. + + + + + The that this tree represents, if the tree was created for a . + + + + + The current update ID of the tree. This is incremented once, each update, and is used by to avoid updating multiple times in the same update round. + + + + + The type of the values that the property tree represents. + + + + + The actual values that the property tree represents. + + + + + The number of root properties in the tree. + + + + + The prefab modification handler of the tree. + + + + + Whether this property tree also represents members that are specially serialized by Odin. + + + + + Gets a value indicating whether or not to draw the mono script object field at the top of the property tree. + + + + + Gets a value indicating whether or not the PropertyTree is inspecting a static type. + + + + + The serialization backend used to determine how to draw this property tree. Set this to control. + + + + + Gets or sets the for the PropertyTree. + + + + + Gets or sets the for the PropertyTree. + + + + + Gets or sets the for the PropertyTree. + + + + + Gets or sets the for the PropertyTree. + + + + + An event that is invoked whenever an undo or a redo is performed in the inspector. + The advantage of using this event on a property tree instance instead of + is that this event will be desubscribed from + when the selection changes and the property + tree is no longer being used, allowing the GC to collect the property tree. + + + + + This event is invoked whenever the value of any property in the entire property tree is changed through the property system. + + + + + Creates a new for all target values of a . + + + + + Gets the root property of the tree. + + + + + Gets the secret root property of the tree, which hosts the property resolver used to resolve the "actual" root properties of the tree. + + + + + Registers that a given property is dirty and needs its changes to be applied at the end of the current frame. + + + + + Schedules a delegate to be invoked at the end of the current GUI frame. + + The action delegate to be delayed. + + + + Schedules a delegate to be invoked at the end of the next Repaint GUI frame. + + The action to be delayed. + + + + Enumerates over the properties of the tree. + + Whether to include children of the root properties or not. If set to true, every property in the entire tree will be enumerated. + Whether to only include visible properties. Properties whose parents are invisible are considered invisible. + + + + Gets the property at the given path. Note that this is the path found in , not the Unity path. + + The path of the property to get. + + + + Gets the property at the given path. Note that this is the path found in , not the Unity path. + + The path of the property to get. + + + + + Gets the property at the given Unity path. + + The Unity path of the property to get. + + + + Gets the property at the given Unity path. + + The Unity path of the property to get. + + + + + Gets the property at the given deep reflection path. + + The deep reflection path of the property to get. + + + + Gets the property at the given Odin prefab modification path. + + The prefab modification path of the property to get. + + + + Gets the property at the given Odin prefab modification path. + + The prefab modification path of the property to get. + + + + + Draw the property tree, and handles management of undo, as well as marking scenes and drawn assets dirty. + + This is a shorthand for calling + , + and . + . + + + + + + Draws a search bar for the property tree, and draws the search results if the search bar is used. + If this method returns true, the property tree should generally not be drawn normally afterwards. + Note that this method will throw exceptions if the property tree is not set up to be searchable; for that, see . + + True if the property tree is being searched and is currently drawing its search results, otherwise false. + + + + Gets a Unity property for the given Odin or Unity path. If there is no for this property tree, or no such property is found in the , a property will be emitted using . + + The Odin or Unity path to the property to get. + + + + Gets a Unity property for the given Odin or Unity path. If there is no for this property tree, or no such property is found in the , a property will be emitted using . + + The Odin or Unity path to the property to get. + The backing field of the Unity property. + + + + Checks whether a given object instance is referenced anywhere in the tree, and if it is, gives the path of the first time the object reference was encountered as an out parameter. + + The reference value to check. + The first found path of the object. + + + + Gets the number of references to a given object instance in this tree. + + + + + Updates all properties in the entire tree, and validates the prefab state of the tree, if applicable. + + + + + Replaces all occurrences of a value with another value, in the entire tree. + + The value to find all instances of. + The value to replace the found values with. + + + + Gets the root tree property at a given index. + + The index of the property to get. + + + + Invokes the actions that have been delayed using and . + + + + + Applies all changes made with properties to the inspected target tree values, and marks all changed Unity objects dirty. + + true if any values were changed, otherwise false + + + + Invokes the OnValidate method on the property tree's targets if they are derived from and have the method defined. + + + + + Registers an object reference to a given path; this is used to ensure that objects are always registered after having been encountered once. + + The referenced object. + The property that contains the reference. + + + + Creates a PropertyTree to inspect the static values of the given type. + + The type to inspect. + A PropertyTree instance for inspecting the type. + + + + Creates a new for a given target value. + + The target to create a tree for. + target is null + + + + Creates a new for a given target value. + + The target to create a tree for. + The serialization backend to use for the tree root. + target is null + + + + Creates a new for a set of given target values. + Note that the targets all need to be of the same type. + + The targets to create a tree for. + targets is null + + + + Creates a new for all target values of a . + + The serialized object to create a tree for. + serializedObject is null + + + + Creates a new for all target values of a . + + The serialized object to create a tree for. + serializedObject is null + The serialization backend to use for the tree root. + + + + Creates a new for a set of given target values. + Note that the targets all need to be of the same type. + + The targets to create a tree for. + + + + Creates a new for a set of given target values. + Note that the targets all need to be of the same type. + + The targets to create a tree for. + The serialization backend to use for the tree root. + + + + Creates a new for a set of given target values, represented by a given . + Note that the targets all need to be of the same type. + + The targets to create a tree for. + The serialized object to create a tree for. Note that the target values of the given must be the same values given in the targets parameter. + + + + Creates a new for a set of given target values, represented by a given . + Note that the targets all need to be of the same type. + + The targets to create a tree for. + The serialized object to create a tree for. Note that the target values of the given must be the same values given in the targets parameter. + The serialization backend to use for the tree root. + + + + Sets whether the property tree should be searchable or not, and allows the passing in of a custom SearchableAttribute instance to configure the search. + + Whether the tree should be set to be searchable or not. + If the tree is set to be searchable, then if this parameter is not null, it will be used to configure the property tree search. If the parameter is null, the SearchableAttribute on the tree's will be used. If that property has no such attribute, then default search settings will be applied. + + + + Represents a set of strongly typed values as a tree of properties that can be drawn in the inspector, and provides an array of utilities for querying the tree of properties. + This class also handles management of prefab modifications. + + + + + Gets the root property of the tree. + + + + + Gets the secret root property of the PropertyTree. + + + + + Gets the for the PropertyTree. + + + + + The current update ID of the tree. This is incremented once, each update, and is used by to avoid updating multiple times in the same update round. + + + + + The that this tree represents, if the tree was created for a . + + + + + The type of the values that the property tree represents. + + + + + The strongly types actual values that the property tree represents. + + + + + The weakly types actual values that the property tree represents. + + + + + The number of root properties in the tree. + + + + + Whether this property tree also represents members that are specially serialized by Odin. + + + + + Initializes a new instance of the class, inspecting only the target () type's static members. + + + + + Initializes a new instance of the class. + + The serialized object to represent. + + + + Initializes a new instance of the class. + + The targets to represent. + + + + Initializes a new instance of the class. + + The targets to represent. + The serialized object to represent. Note that the target values of the given must be the same values given in the targets parameter. + targets is null + + There must be at least one target. + or + A given target is a null value. + + + + + Initializes a new instance of the class. + + The targets to represent. + The serialized object to represent. Note that the target values of the given must be the same values given in the targets parameter. + The serialization backend to use for the tree root. + targets is null + + There must be at least one target. + or + A given target is a null value. + + + + + Applies all changes made with properties to the inspected target tree values. + + + true if any values were changed, otherwise false + + + + + Registers that a given property is dirty and needs its changes to be applied at the end of the current frame. + + + + + + + Updates all properties in the entire tree, and validates the prefab state of the tree, if applicable. + + + + + Checks whether a given object instance is referenced anywhere in the tree, and if it is, gives the path of the first time the object reference was encountered as an out parameter. + + The reference value to check. + The first found path of the object. + + + + Gets the number of references to a given object instance in this tree. + + + + + + Enumerates over the properties of the tree. WARNING: For tree that have large targets with lots of data, this may involve massive amounts of work as the full tree structure is resolved. USE THIS METHOD SPARINGLY AND ONLY WHEN ABSOLUTELY NECESSARY! + + Whether to include children of the root properties or not. If set to true, every property in the entire tree will be enumerated. + /// Whether to only include visible properties. Properties whose parents are invisible are considered invisible. + + + + Replaces all occurrences of a value with another value, in the entire tree. + + The value to find all instances of. + The value to replace the found values with. + + The value to replace with must either be null or be the same type as the value to replace (" + from.GetType().Name + "). + + + + Gets the root tree property at a given index. + + The index of the property to get. + + + + Schedules a delegate to be invoked at the end of the current GUI frame. + + The action delegate to be delayed. + action + + + + Schedules a delegate to be invoked at the end of the next Repaint GUI frame. + + The action to be delayed. + action + + + + Invokes the actions that have been delayed using and . + + + + + Enumeration describing the different types of properties that exist. + + + + + Property represents a value. + + + + + Property represents a method. + + + + + Property represents a named group of properties. + + + + + Enumeration for designating whether a has a special state,. + + + + + The value entry has no special state. + + + + + The property is a reference to another property. Get the path of the referenced property from . + + + + + The value entry is a null value. + + + + + The value entry has a primitive value conflict across selected indices. + A primitive value conflict is when primitive values, such a strings or floats, differ. + + + + + The value entry has a reference value conflict across selected indices. + A reference value conflict is when the types of reference type values differ, or when some values are null while others are not. + + + + + The value entry has a reference path conflict across selected indices. + A reference path conflict is when the property consists of references to many conflicting paths. Use to get paths to all referenced objects. + + + + + The value entry has a collection length conflict across selected indices. + A collection length conflict is when the property represents multiple parallel collections, and their lengths differ. + + + + + This attribute processor will take any attribute already applied to the property with the applied to, + and take all attributes applied to the attribute (except any ) and add to them to the property. + This allows for adding attributes to attributes in the property system. + + + + + Looks for attributes in the attributes list with a applied, and adds the attribute from those attributes to the property. + + The parent of the member. + The member that is being processed. + The list of attributes currently applied to the property. + + + + Finds all attributes attached to the specified member and adds to them to attribute list. + + + + + This attribute processor can only process for members. + + The property to process. + false. + + + + Finds all attributes attached to the specified member and adds to them to the attributes list. + + The parent property of the specified member. + The member to process attributes for. + The current attributes applied to the property. + + + + Attribute processor that can add, change and remove attributes from a property. + + + + + Instanciates an OdinAttributeProcessor instance of the specified type. + + The type of processor to instanciate. The type must inherit from . + A new instance of the specified type. + + + + Checks if the processor can process attributes for the specified member. + + The parent property of the member. + The member to be processed. + true if the processor can process for the specified member. Otherwise false. + + + + Checks if the processor can process attributes for the specified property. + + The property to process. + true if the processor can process attributes for the specified property. Otherwise false. + + + + Processes attributes for the specified member. + + The parent property of the specified member. + The member to process attributes for. + The current attributes applied to the property. + + + + Processes attributes for the specified property. + + The property to process attributes for. + The current attributes applied to the property. + + + + Attribute processor that can add, change and remove attributes from a property. + + + + + Find attributes attached to the type definition of a property and adds to them to attribute list. + + + + + This attribute processor can only process for properties. + + The parent of the specified member. + The member to process. + false. + + + + This attribute processor can only process for properties with an attached value entry. + + The property to process. + true if the specified property has a value entry. Otherwise false. + + + + Finds all attributes attached to the type and base types of the specified property value and adds them to the attribute list. + + The property to process. + The list of attributes for the property. + + + + Default implementation and the version that will be used when no other OdinAttributeProcessorLocator instance have been given to a PropertyTree. + This implementation will find all AttributeProcessor definitions not marked with the . + + + + + Singleton instance of the DefaultOdinAttributeProcessorLocator class. + + + + + Type search index used for matching to properties. + + + + + Gets a list of to process attributes for the specified child member of the parent property. + + The parent of the member. + Child member of the parent property. + List of to process attributes for the specified member. + + + + Gets a list of to process attributes for the specified property. + + The property to find attribute porcessors for. + List of to process attributes for the speicied member. + + + + Default implementation and the version that will be used by if no other instance have been specified. + + + + + Singleton instance of . + + + + + Gets an instance for the specified property. + + The property to get an instance for. + An instance of to resolver the specified property. + + + + Base class definition for OdinAttributeProcessorLocator. Responsible for finding and creating instances to process attributes for properties. + Default OdinAttributeProcessorLocator have been implemented as . + + + + + Gets a list of to process attributes for the specified child member of the parent property. + + The parent of the member. + Child member of the parent property. + List of to process attributes for the specified member. + + + + Gets a list of to process attributes for the specified property. + + The property to find attribute porcessors for. + List of to process attributes for the speicied member. + + + + Base class for locator of . Use for default implementation. + + + + + Gets an instance for the specified property. + + The property to get an instance for. + An instance of to resolver the specified property. + + + + Note: this interface may be temporary, and may eventually be substituted for a public-facing way of extending the prefab modification system. + + For now, it only exists to denote which internally defined resolvers support prefab modifications being set. + + + + + Marks an or as cacheable. + + + Only mark a processor as cacheable if it always produces the same attributes for the same properties in the same order. + Caching is applied only when all processors that run on a property are cacheable; if any running processor is not, the result will not be cached. + + + + + Contains information about a change that is going to occur/has occurred to a collection. + + + + + + Specifies the kinds of changes that can occur to collections. + + + + + Unknown collection change, the change was not specified by the invoking code. + + + + + The change is adding a value to the collection. Value and SelectionIndex will be set. + + + + + The change is inserting a value into the collection. Index, Value and SelectionIndex will be set. + + + + + The change is removing a value from the collection. Value and SelectionIndex will be set. + + + + + The change is removing a value at an index from the collection. Index and SelectionIndex will be set. + + + + + The change is clearing the collection. SelectionIndex will be set. + + + + + The change is removing a key from the collection. Key and SelectionIndex will be set. + + + + + The change is setting the value of a key in the collection. Key, Value and SelectionIndex will be set. + + + + + Class that describes the different possible serialization backends that a property can have, + and specifies the capabilities of each backend. + + + + + The property is serialized by Unity's polymorphic serialization backend via the [SerializeReference] attribute. Polymorphism, null values and cyclical references are supported. + + + + + The property is serialized by Unity's classic serialization backend. Polymorphism, null values and types such as are not supported. + + + + + The property is serialized by Odin. Polymorphism, null values and types such as are supported. + + + + + The property is not serialized by anything - possibly because it is a method, possibly because it is a field or property shown in the inspector without being serialized. + In the case of fields or properties, polymorphism, null values and types such as are supported, but will not be saved. + + + + + The property is not serialized by anything - possibly because it is a method, possibly because it is a field or property shown in the inspector without being serialized. + In the case of fields or properties, polymorphism, null values and types such as are supported, but will not be saved. + + + + + The property is serialized by Unity's classic serialization backend. Polymorphism, null values and types such as are not supported. + + + + + The property is serialized by Unity's polymorphic serialization backend via the [SerializeReference] attribute. Polymorphism, null values and cyclical references are supported. + + + + + The property is serialized by Odin. Polymorphism, null values and types such as are supported. + + + + + Gets the attribute that the OdinAttributeStateUpdater applies to. + + + + + Gets the strongly typed ValueEntry of the OdinAttributeStateUpdater's property. + + + + + Gets the strongly typed ValueEntry of the OdinValueStateUpdater's property. + + + + + Represents a weakly typed collection of values for a - one value per selected inspector target. + + + + + Whether the values have been changed since was last called. + + + + + Marks the value collection as being clean again. This is typically called at the end of the current GUI frame, during . + + + + + Marks the value collection as being dirty, regardless of any value changes. + + + + + Reverts the value collection to its origin values (found in ) from the last call, and marks the value collection as being clean again. + + + + + Force sets the value, ignoring whether it is editable or not. + Note that this will fail on list element value entries where is true on the parent value entry. + + The selection index of the value. + The value to be set. + + + + The original values of the value collection, such as they were immediately after the last call. + + + + + Represents a strongly typed collection of values for a - one value per selected inspector target. + + + + + Gets the value at the given selection index. + + + + + The number of values in the collection. + + + + + The original values of the value collection, such as they were immediately after the last call. + + + + + Force sets the value, ignoring whether it is editable or not. + Note that this will fail on list element value entries where is true on the parent value entry. + + The selection index of the value. + The value to be set. + + + + Represents the values of an , and contains utilities for querying the values' type and getting and setting them. + + + + + The number of parallel values this entry represents. This will always be exactly equal to the count of . + + + + + Whether this value entry is editable or not. + + + + + If this value entry has the override type , this is the path of the property it references. + + + + + The actual serialization backend for this value entry, possibly inherited from the serialization backend of the root property this entry is a child of. + Note that this is *not* always equal to . + + + + + The property whose values this value entry represents. + + + + + Provides access to the weakly typed values of this value entry. + + + + + Whether this value entry has been changed from its prefab counterpart. + + + + + Whether this value entry has had its list length changed from its prefab counterpart. + + + + + Whether this value entry has had its dictionary values changes from its prefab counterpart. + + + + + A weakly typed smart value that represents the first element of the value entry's value collection, but has "smart logic" for setting the value that detects relevant changes and applies them in parallel. + This lets you often just use the smart value instead of having to deal with the tedium of multiple parallel values. + + + + + The type from which this value entry comes. If this value entry represents a member value, this is the declaring type of the member. If the value entry represents a collection element, this is the type of the collection. + + + + + The most precise known contained type of the value entry. If polymorphism is in effect, this will be some type derived from . + + + + + The base type of the value entry. If this is value entry represents a member value, this is the type of the member. If the value entry represents a collection element, this is the element type of the collection. + + + + + The special state of the value entry. + + + + + Whether this value entry is an alias, or not. Value entry aliases are used to provide strongly typed value entries in the case of polymorphism. + + + + + The context container of this property. + + + + + Whether this type is marked as an atomic type using a . + + + + + An event that is invoked during , when any values have changed. + + + + + An event that is invoked during , when any child values have changed. + + + + + Updates the values contained in this value entry to the actual values in the target objects, and updates its state (override, type of value, etc.) accordingly. + + + + + Applies the changes made to this value entry to the target objects, and registers prefab modifications as necessary. + + True if any changes were made, otherwise, false. + + + + Checks whether the values in this value entry are equal to the values in another value entry. + Note, both value entries must have the same value type, and must represent values that are .NET value types. + + + + + Determines whether the value at the given selection index is different from the given prefab value, as is relevant for prefab modification checks. + If the value is a reference type, null and type difference is checked. If value is a value type, a comparer from is used. + This method is best ignored unless you know what you are doing. + + The value to check differences against. + The selection index to compare against. + + + + Represents the strongly typed values of an , and contains utilities for querying the values' type and getting and setting them. + + + + + Provides access to the strongly typed values of this value entry. + + + + + A strongly typed smart value that represents the first element of the value entry's value collection, but has "smart logic" for setting the value that detects relevant changes and applies them in parallel. + This lets you often just use the smart value instead of having to deal with the tedium of multiple parallel values. + + + + + Determines whether the value at the given selection index is different from the given prefab value, as is relevant for prefab modification checks. + If the value is a reference type, null and type difference is checked. If value is a value type, a comparer from is used. + This method is best ignored unless you know what you are doing. + + The value to check differences against. + The selection index to compare against. + + + + An internally used interface that is used by value entries during , that lets value entries force each other to set values directly to their target objects. + This interface should not be used by people who do not know what they are doing. + + + + + Sets the actual value of a value entry, for a given selection index. + + + + + An internally used interface that is used by value entries during , that lets value entries force each other to set values directly to their target objects. + This interface should not be used by people who do not know what they are doing. + + + + + Sets the actual value of a value entry, for a given selection index. + + + + + Represents a weakly typed collection of values for a - one value per selected inspector target. + + + + + The property whose values are represented. + + + + + Initializes a new instance of the class. + + The property to represent. + property is null + + + + Whether the values have been changed since was last called. + + + + + The number of values in the collection. + + + + + Gets a value indicating whether this instance is synchronized. + + + true if this instance is synchronized; otherwise, false. + + + + + Gets the synchronization root object. + + + The synchronization root object. + + + + + The original values of the (loosely typed) value collection, such as they were immediately after the last call. + + + + + Gets or sets the weakly typed at the specified index. + + + The value. + + The index to set. + + + + Gets an enumerator for the collection. + + + + + Marks the value collection as being clean again. This is typically called at the end of the current GUI frame, during . + + + + + Reverts the value collection to its origin values (found in ) from the last call, and marks the value collection as being clean again. + + + + + Determines whether the collection contains the specified value. + + The value. + + true if the collection contains the specified value; otherwise, false. + + + + + Copies the collection to an array. + + The array to copy to. + The index to copy from. + + + + Gets the index of the given value, or -1 if the value was not found. + + The value to get the index of. + The index of the given value, or -1 if the value was not found. + + + + Gets the weakly typed value at the given index. + + The index of the value to get. + The weakly typed value at the given index + + + + Sets the weakly typed value at the given index. + + The index to set the value of. + The value to set. + + + + Force sets the value, ignoring whether it is editable or not. + Note that this will fail on list element value entries where is true on the parent value entry. + + The selection index of the value. + The value to be set. + + + + Marks the value collection as being dirty, regardless of any value changes. + + + + + Represents a strongly typed collection of values for a - one value per selected inspector target. + + The element type of the collection. + + + + + Initializes a new instance of the class. + + The property. + The internal array. + The original array. + The internal atom array. + The original atom array. + + + + Whether the values have been changed since was last called. + + + + + The number of values in the collection. + + + + + Gets a value indicating whether this instance is synchronized. + + + true if this instance is synchronized; otherwise, false. + + + + + Gets the synchronization root object. + + + The synchronization root object. + + + + + The original values of the (loosely typed) value collection, such as they were immediately after the last call. + + + + + Gets or sets the at the specified index. + + + The . + + The index. + + + + + Gets an enumerator for the collection. + + + + + Marks the value collection as being clean again. This is typically called at the end of the current GUI frame, during . + + + + + Reverts the value collection to its origin values (found in ) from the last call, and marks the value collection as being clean again. + + + + + Copies the collection to an array. + + The array to copy to. + The index to copy from. + + + + Gets the weakly typed value at the given index. + + The index of the value to get. + + The weakly typed value at the given index + + + + + Sets the weakly typed value at the given index. + + The index to set the value of. + The value to set. + + + + Determines whether the collection contains the specified value. + + The value. + + true if the collection contains the specified value; otherwise, false. + + + + + Gets the index of the given value, or -1 if the value was not found. + + The value to get the index of. + + The index of the given value, or -1 if the value was not found. + + + + + Force sets the value, ignoring whether it is editable or not. + Note that this will fail on list element value entries where is true on the parent value entry. + + The selection index of the value. + The value to be set. + + + + Force sets the value, ignoring whether it is editable or not. + Note that this will fail on list element value entries where is true on the parent value entry. + + The selection index of the value. + The value to be set. + + + + + Marks the value collection as being dirty, regardless of any value changes. + + + + + Represents an alias for a strongly typed collection of values for a - one value per selected inspector target. + This class ensures that polymorphism works in the inspector, and can be strongly typed in applicable cases. + + The type of the aliased collection. + The polymorphic type of this collection, which is assignable to . + + + + + + Initializes a new instance of the class. + + The property. + The aliased collection. + Not yet documented. + Not yet documented. + aliasedCollection + + + + Whether the values have been changed since was last called. + + + + + The number of values in the collection. + + + + + Gets a value indicating whether this instance is synchronized. + + + true if this instance is synchronized; otherwise, false. + + + + + Gets the synchronization root object. + + + The synchronization root object. + + + + + The original values of the (loosely typed) value collection, such as they were immediately after the last call. + + + + + The original values of the value collection, such as they were immediately after the last call. + + + + + Gets or sets the at the specified index. + + + The . + + The index. + + + + + Gets an enumerator for the collection. + + + + + + Marks the value collection as being clean again. This is typically called at the end of the current GUI frame, during . + + + + + Reverts the value collection to its origin values (found in ) from the last call, and marks the value collection as being clean again. + + + + + Determines whether the collection contains the specified value. + + The value. + + true if the collection contains the specified value; otherwise, false. + + + + + Gets the index of the given value, or -1 if the value was not found. + + The value to get the index of. + + The index of the given value, or -1 if the value was not found. + + + + + Copies the collection to an array. + + The array to copy to. + The index to copy from. + + + + Gets the weakly typed value at the given index. + + The index of the value to get. + + The weakly typed value at the given index + + + + + Sets the weakly typed value at the given index. + + The index to set the value of. + The value to set. + + + + Force sets the value, ignoring whether it is editable or not. + Note that this will fail on list element value entries where is true on the parent value entry. + + The selection index of the value. + The value to be set. + + + + Force sets the value, ignoring whether it is editable or not. + Note that this will fail on list element value entries where is true on the parent value entry. + + The selection index of the value. + The value to be set. + + + + Marks the value collection as being dirty, regardless of any value changes. + + + + + Represents the values of an , and contains utilities for querying the values' type and getting and setting them. + + + + + + Delegate type used for the events and . + + + + + The nearest parent property that has a value. + That is, the property from which this value + entry will fetch its parentvalues from in order + to extract its own values. + + If is null, this is a root property. + + + + + Whether this value entry represents a boxed value type. + + + + + The number of parallel values this entry represents. This will always be exactly equal to the count of . + + + + + Whether this value entry is editable or not. + + + + + If this value entry has the override type , this is the path of the property it references. + + + + + The actual serialization backend for this value entry, possibly inherited from the serialization backend of the root property this entry is a child of. + Note that this is *not* always equal to . + + + + + The property whose values this value entry represents. + + + + + Provides access to the weakly typed values of this value entry. + + + + + Whether this value entry has been changed from its prefab counterpart. + + + + + Whether this value entry has had its list length changed from its prefab counterpart. + + + + + Whether this value entry has had its dictionary values changes from its prefab counterpart. + + + + + A weakly typed smart value that represents the first element of the value entry's value collection, but has "smart logic" for setting the value that detects relevant changes and applies them in parallel. + This lets you often just use the smart value instead of having to deal with the tedium of multiple parallel values. + + + + + The type from which this value entry comes. If this value entry represents a member value, this is the declaring type of the member. If the value entry represents a collection element, this is the type of the collection. + + + + + The most precise known contained type of the value entry. If polymorphism is in effect, this will be some type derived from . + + + + + The base type of the value entry. If this is value entry represents a member value, this is the type of the member. If the value entry represents a collection element, this is the element type of the collection. + + + + + The special state of the value entry. + + + + + Whether this value entry is an alias, or not. Value entry aliases are used to provide strongly typed value entries in the case of polymorphism. + + + + + The context container of this property. + + + + + Whether this type is marked as an atomic type using a . + + + + + An event that is invoked during , when any values have changed. + + + + + An event that is invoked during , when any child values have changed. + + + + + Updates the values contained in this value entry to the actual values in the target objects, and updates its state (override, type of value, etc.) accordingly. + + + + + Checks whether the values in this value entry are equal to the values in another value entry. + Note, both value entries must have the same value type, and must represent values that are .NET value types. + + + + + + + Applies the changes made to this value entry to the target objects, and registers prefab modifications as necessary. + + + True if any changes were made, otherwise, false. + + + + + Determines the value state of this value entry. + + + + + Determines what the most precise contained type is on this value entry. + + + + + Updates all values in this value entry from the target tree values. + + + + + Initializes this value entry. + + + + + Creates an alias value entry of a given type, for a given value entry. This is used to implement polymorphism in Odin. + + + + + Creates a value entry for a given property, of a given value type. Note that the created value entry is returned un-updated, and needs to have called on it before it can be used. + + + + + Determines whether the value at the given selection index is different from the given prefab value, as is relevant for prefab modification checks. + If the value is a reference type, null and type difference is checked. If value is a value type, a comparer from is used. + This method is best ignored unless you know what you are doing. + + The value to check differences against. + The selection index to compare against. + + + + Represents the values of an , and contains utilities for querying the values' type and getting and setting them. + + The type of the value. + + + + + An equality comparer for comparing values of type . This is gotten using . + + + + + Whether .is a primitive type; that is, the type is primitive, a string, or an enum. + + + + + Whether is a value type. + + + + + Whether is derived from . + + + + + Whether the type of the value is marked atomic. + + + + + If the type of the value is marked atomic, this an instance of an atom handler for the value type. + + + + + Initializes a new instance of the class. + + + + + Provides access to the weakly typed values of this value entry. + + + + + Provides access to the strongly typed values of this value entry. + + + + + Whether this type is marked as an atomic type using a . + + + + + A weakly typed smart value that represents the first element of the value entry's value collection, but has "smart logic" for setting the value that detects relevant changes and applies them in parallel. + This lets you often just use the smart value instead of having to deal with the tedium of multiple parallel values. + + + + + A strongly typed smart value that represents the first element of the value entry's value collection, but has "smart logic" for setting the value that detects relevant changes and applies them in parallel. + This lets you often just use the smart value instead of having to deal with the tedium of multiple parallel values. + + + + + An array containing the original values as they were at the beginning of frame. + + + + + An array containing the current modified set of values. + + + + + An array containing the current modified set of atomic values. + + + + + An array containing the original set of atomic values. + + + + + Initializes this value entry. + + + + + Sets the actual target tree value. + + + + + Checks whether the values in this value entry are equal to the values in another value entry. + Note, both value entries must have the same value type, and must represent values that are .NET value types. + + + + + Determines whether the value at the given selection index is different from the given prefab value, as is relevant for prefab modification checks. + If the value is a reference type, null and type difference is checked. If value is a value type, a comparer from is used. + This method is best ignored unless you know what you are doing. + + The value to check differences against. + The selection index to compare against. + + + + Determines whether the value at the given selection index is different from the given prefab value, as is relevant for prefab modification checks. + If the value is a reference type, null and type difference is checked. If value is a value type, a comparer from is used. + This method is best ignored unless you know what you are doing. + + The value to check differences against. + The selection index to compare against. + + + + Represents the values of an , and contains utilities for querying the values' type and getting and setting them. + + The type of the parent. + The type of the value. + + + + + The type from which this value entry comes. If this value entry represents a member value, this is the declaring type of the member. If the value entry represents a collection element, this is the type of the collection. + + + + + Determines what the most precise contained type is on this value entry. + + + + + Initializes this value entry. + + + + + Updates all values in this value entry from the target tree values. + + + + + Determines the value state of this value entry. + + + + + Applies the changes made to this value entry to the target objects, and registers prefab modifications as necessary. + + + True if any changes were made, otherwise, false. + + + + + Gets the parent value at the given index. + + + + + A polymorphic alias for a instance, used to implement strongly typed polymorphism in Odin. + + + + + The number of parallel values this entry represents. This will always be exactly equal to the count of . + + + + + Whether this value entry is editable or not. + + + + + If this value entry has the override type , this is the path of the property it references. + + + + + The actual serialization backend for this value entry, possibly inherited from the serialization backend of the root property this entry is a child of. + Note that this is *not* always equal to . + + + + + The property whose values this value entry represents. + + + + + Provides access to the weakly typed values of this value entry. + + + + + Whether this value entry has been changed from its prefab counterpart. + + + + + Whether this value entry has had its list length changed from its prefab counterpart. + + + + + Whether this value entry has had its dictionary values changes from its prefab counterpart. + + + + + A weakly typed smart value that represents the first element of the value entry's value collection, but has "smart logic" for setting the value that detects relevant changes and applies them in parallel. + This lets you often just use the smart value instead of having to deal with the tedium of multiple parallel values. + + + + + The type from which this value entry comes. If this value entry represents a member value, this is the declaring type of the member. If the value entry represents a collection element, this is the type of the collection. + + + + + The most precise known contained type of the value entry. If polymorphism is in effect, this will be some type derived from . + + + + + The base type of the value entry. If this is value entry represents a member value, this is the type of the member. If the value entry represents a collection element, this is the element type of the collection. + + + + + The generic value type of the value entry alias itself, IE, the PropertyValueEntryAlias implements the IPropertyValueEntry<TValue> interface - this member returns TValue regardless of the actual type of the backing objects. This is a performance shortcut to checking TValue using reflection, used internally by the property system to determine whether a value entry alias needs to be swapped out with an alias for a different type. + + + + + The special state of the value entry. + + + + + Whether this value entry is an alias, or not. Value entry aliases are used to provide strongly typed value entries in the case of polymorphism. + + + + + The context container of this property. + + + + + Whether this type is marked as an atomic type using a . + + + + + An event that is invoked during , when any values have changed. + + + + + An event that is invoked during , when any child values have changed. + + + + + Applies the changes made to this value entry to the target objects, and registers prefab modifications as necessary. + + + True if any changes were made, otherwise, false. + + + + + Updates the values contained in this value entry to the actual values in the target objects, and updates its state (override, type of value, etc.) accordingly. + + + + + Checks whether the values in this value entry are equal to the values in another value entry. + Note, both value entries must have the same value type, and must represent values that are .NET value types. + + + + + Sets the actual value of a value entry, for a given selection index. + + + + + Determines whether the value at the given selection index is different from the given prefab value, as is relevant for prefab modification checks. + If the value is a reference type, null and type difference is checked. If value is a value type, a comparer from is used. + This method is best ignored unless you know what you are doing. + + The value to check differences against. + The selection index to compare against. + + + + A polymorphic alias for a instance, used to implement strongly typed polymorphism in Odin. + + + + + Initializes a new instance of the class. + + The value entry to alias. + valueEntry is null + + + + Provides access to the strongly typed values of this value entry. + + + + + A strongly typed smart value that represents the first element of the value entry's value collection, but has "smart logic" for setting the value that detects relevant changes and applies them in parallel. + This lets you often just use the smart value instead of having to deal with the tedium of multiple parallel values. + + + + + A weakly typed smart value that represents the first element of the value entry's value collection, but has "smart logic" for setting the value that detects relevant changes and applies them in parallel. + This lets you often just use the smart value instead of having to deal with the tedium of multiple parallel values. + + + + + The number of parallel values this entry represents. This will always be exactly equal to the count of . + + + + + Whether this value entry is editable or not. + + + + + If this value entry has the override type , this is the path of the property it references. + + + + + The actual serialization backend for this value entry, possibly inherited from the serialization backend of the root property this entry is a child of. + Note that this is *not* always equal to . + + + + + The property whose values this value entry represents. + + + + + Provides access to the weakly typed values of this value entry. + + + + + Whether this value entry has been changed from its prefab counterpart. + + + + + Whether this value entry has had its list length changed from its prefab counterpart. + + + + + Whether this value entry has had its dictionary values changes from its prefab counterpart. + + + + + The type from which this value entry comes. If this value entry represents a member value, this is the declaring type of the member. If the value entry represents a collection element, this is the type of the collection. + + + + + The most precise known contained type of the value entry. If polymorphism is in effect, this will be some type derived from . + + + + + The base type of the value entry. If this is value entry represents a member value, this is the type of the member. If the value entry represents a collection element, this is the element type of the collection. + + + + + The generic value type of the value entry alias itself, IE, the PropertyValueEntryAlias implements the IPropertyValueEntry<TValue> interface - this member returns TValue regardless of the actual type of the backing objects. This is a performance shortcut to checking TValue using reflection, used internally by the property system to determine whether a value entry alias needs to be swapped out with an alias for a different type. + + + + + The special state of the value entry. + + + + + Whether this type is marked as an atomic type using a . + + + + + An event that is invoked during , when any values have changed. + + + + + An event that is invoked during , when any child values have changed. + + + + + Applies the changes made to this value entry to the target objects, and registers prefab modifications as necessary. + + + True if any changes were made, otherwise, false. + + + + + Updates the values contained in this value entry to the actual values in the target objects, and updates its state (override, type of value, etc.) accordingly. + + + + + Checks whether the values in this value entry are equal to the values in another value entry. + Note, both value entries must have the same value type, and must represent values that are .NET value types. + + + + + Sets the actual value of a value entry, for a given selection index. + + + + + Determines whether the value at the given selection index is different from the given prefab value, as is relevant for prefab modification checks. + If the value is a reference type, null and type difference is checked. If value is a value type, a comparer from is used. + This method is best ignored unless you know what you are doing. + + The value to check differences against. + The selection index to compare against. + + + + Determines whether the value at the given selection index is different from the given prefab value, as is relevant for prefab modification checks. + If the value is a reference type, null and type difference is checked. If value is a value type, a comparer from is used. + This method is best ignored unless you know what you are doing. + + The value to check differences against. + The selection index to compare against. + + + + Draws properties marked with . + Displays a configurable list of assets, where each item can be enabled or disabled. + + + + + + + + + + Draws the property. + + + + + Populates the generic menu for the property. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Initializes this instance. + + + + + Draws the property with GUILayout support. This method is called by DrawPropertyImplementation if the GUICallType is set to GUILayout, which is the default. + + + + + Odin drawer for . + + + + + Initializes the drawer. + + + + + Not yet documented. + + + + + Draws Color properties marked with . + + + + + Draws the property. + + + + + Draws Color properties marked with . + + + + + Draws the property. + + + + + Adds a generic menu option to properties marked with . + + + + + + + + Populates the generic menu for the property. + + + + + Draws the property. + + + + + Draws properties marked with . + + + + + + Draws char properties marked with . + + + + + Draws the property. + + + + + Draws string properties marked with . + + + + + Draws the property. + + + + + Draws sbyte properties marked with . + + + + + Draws the property. + + + + + Draws byte properties marked with . + + + + + Draws the property. + + + + + Draws short properties marked with . + + + + + Draws the property. + + + + + Draws ushort properties marked with . + + + + + Draws the property. + + + + + Draws int properties marked with . + + + + + Draws the property. + + + + + Draws uint properties marked with . + + + + + Draws the property. + + + + + Draws long properties marked with . + + + + + Draws the property. + + + + + Draws ulong properties marked with . + + + + + Draws the property. + + + + + Draws float properties marked with . + + + + + Draws the property. + + + + + Draws double properties marked with . + + + + + Draws the property. + + + + + Draws decimal properties marked with . + + + + + Draws the property. + + + + + Draws char properties marked with . + + + + + Draws the property. + + + + + Draws string properties marked with . + + + + + Draws the property. + + + + + Draws sbyte properties marked with . + + + + + Draws the property. + + + + + Draws byte properties marked with . + + + + + Draws the property. + + + + + Draws short properties marked with . + + + + + Draws the property. + + + + + Draws ushort properties marked with . + + + + + Draws the property. + + + + + Draws int properties marked with . + + + + + Draws the property. + + + + + Draws uint properties marked with . + + + + + Draws the property. + + + + + Draws long properties marked with . + + + + + Draws the property. + + + + + Draws ulong properties marked with . + + + + + Draws the property. + + + + + Draws float properties marked with . + + + + + Draws the property. + + + + + Draws double properties marked with . + + + + + Draws the property. + + + + + Draws decimal properties marked with . + + + + + Draws the property. + + + + + Draws properties marked with . + + + + + + + + + Initializes this instance. + + + + + Draws the property. + + + + + Draws properties marked with . + Calls the properties ToString method to get the string to draw. + + + + + + + + + + + Draws the property. + + + + + Draws members marked with . + + + + + Odin drawer for the . + + + + + Returns true if the drawer can draw the type. + + + + + Draws the property. + + + + + Draws an enum in a horizontal button group instead of a dropdown. + + + + + Returns true if the drawer can draw the type. + + + + + Draws the property. + + + + + Not yet documented. + + + + + Initializes the drawer. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Initializes the drawer. + + + + + Not yet documented. + + + + + Adds customs generic menu options. + + + + + Draws properties marked with . + This drawer sets the current GUI color, before calling the next drawer in the chain. + + + + + + + + + + Draws the property. + + + + + Draws properties marked with . + + + + + + + + + + Draws the property. + + + + + Draws properties marked with . + + + + + + + + + + Draws the property. + + + + + Draws properties marked with . + + + + + + Draws the property. + + + + + Draws properties marked with . + Draws an info box above the property. Error and warning info boxes can be tracked by Odin Scene Validator. + + + + + + + + + Draws the property. + + + + + Draws properties marked with + + + + + Draws the property. + + + + + Static GUI information reguarding the InlineEditor attribute. + + + + + Gets a value indicating how many InlineEditors we are currently in. + + + + + Draws properties marked with . + + + + + + + Initializes this instance. + + + + + Draws the property layout. + + The label. + + + + + + + Will set GUI.enabled to false during some cases, to avoid the Preview eating events when it really shouldn't. + + + + Drawer for the attribute. + + + + + Draws the property. + + + + + Draws properties marked with . + Creates a new GUIContent, with the provided label text, before calling further down in the drawer chain. + + + + + + + + + + + + Draws the attribute. + + + + + Draws properties marked with the . + + + + + + + + + + + + Draws the attribute. + + + + + Draws Vector2 properties marked with . + + + + + + + + + + + Draws string properties marked with . + This drawer only works for string fields, unlike . + + + + + + + + + + Draws the property. + + + + + Draws string properties marked with . + This drawer works for both string field and properties, unlike . + + + + + + + + + + Draws the property. + + + + + Draws a warning message for non-serialized properties that sports both the SerializeField and the ShowInInspector attribute. + + + + + Determines if the drawer can draw the property. + + The property to test. + true if the drawer can draw the property; otherwise false. + + + + Initializes the drawer. + + + + + Draws the warning message and calls the next drawer. + + The label for the property. + + + + + When first learning to use the Odin Inspector, it is common for people to misunderstand the OdinSerialize attribute, + and use it in places where it does not achive the deceired goal. + + + This drawer will display a warning message if the OdinSerialize attribute is potentially used in such cases. + + + + + + + Draws The Property. + + + + + Draws properties marked with . + + + + + + + + + + Draws properties marked with . + Calls the method, the attribute is either attached to, or the method that has been specified in the attribute, to allow for custom GUI drawing. + + + + + + + + + + Draws the property. + + + + + Draws properties marked with . + + + + + + + + + + Draws properties marked with as a square ObjectField which renders a preview for UnityEngine.Object types. + This object field also adds support for drag and drop, dragging an object to another square object field, swaps the values. + If you hold down control while letting go it will replace the value, And you can control + click the object field to quickly delete the value it holds. + + + + + Draws the property. + + + + + Common base implementation for progress bar attribute drawers. + + + + + + Initialized the drawer. + + + + + Draws the property. + + + + + Generic implementation of progress bar field drawing. + + + + + Converts the generic value to a double. + + The generic value to convert. + The generic value as a double. + + + + Draws values decorated with . + + + + + + + Draws a progress bar for a byte property. + + + + + Converts the generic value to a double. + + The generic value to convert. + The generic value as a double. + + + + Draws values decorated with . + + + + + + + Draws a progress bar for a sbyte property. + + + + + Converts the generic value to a double. + + The generic value to convert. + The generic value as a double. + + + + Draws values decorated with . + + + + + + + Draws a progress bar for a short property. + + + + + Converts the generic value to a double. + + The generic value to convert. + The generic value as a double. + + + + Draws values decorated with . + + + + + + + Draws a progress bar for a ushort property. + + + + + Converts the generic value to a double. + + The generic value to convert. + The generic value as a double. + + + + Draws values decorated with . + + + + + + + Draws a progress bar for an int property. + + + + + Converts the generic value to a double. + + The generic value to convert. + The generic value as a double. + + + + Draws values decorated with . + + + + + + + Draws a progress bar for a uint property. + + + + + Converts the generic value to a double. + + The generic value to convert. + The generic value as a double. + + + + Draws values decorated with . + + + + + + + Draws a progress bar for a long property. + + + + + Converts the generic value to a double. + + The generic value to convert. + The generic value as a double. + + + + Draws values decorated with . + + + + + + + Draws a progress bar for a ulong property. + + + + + Converts the generic value to a double. + + The generic value to convert. + The generic value as a double. + + + + Draws values decorated with . + + + + + + + Draws a progress bar for a float property. + + + + + Converts the generic value to a double. + + The generic value to convert. + The generic value as a double. + + + + Draws values decorated with . + + + + + + + Draws a progress bar for a double property. + + + + + Converts the generic value to a double. + + The generic value to convert. + The generic value as a double. + + + + Draws values decorated with . + + + + + + + Draws a progress bar for a decimal property. + + + + + Converts the generic value to a double. + + The generic value to convert. + The generic value as a double. + + + + Draws byte properties marked with . + + + + + + + + + + + Initialized the drawer. + + + + + Draws the property. + + + + + Draws double properties marked with . + + + + + + + + + + + Initialized the drawer. + + + + + Draws the property. + + + + + Draws float properties marked with . + + + + + + + + + + + Initialized the drawer. + + + + + Draws the property. + + + + + Draws decimal properties marked with . + + + + + Initialized the drawer. + + + + + Draws the property. + + + + + Draws short properties marked with . + + + + + + + + + + + Initialized the drawer. + + + + + Draws the property. + + + + + Draws int properties marked with . + + + + + + + + + + + Initialized the drawer. + + + + + Draws the property. + + + + + Draws long properties marked with . + + + + + + + + + + + Initialized the drawer. + + + + + Draws the property. + + + + + Draws sbyte properties marked with . + + + + + + + + + + + Initialized the drawer. + + + + + Draws the property. + + + + + Draws ushort properties marked with . + + + + + + + + + + + Initialized the drawer. + + + + + Draws the property. + + + + + Draws uint properties marked with . + + + + + + + + + + + Initialized the drawer. + + + + + Draws the property. + + + + + Draws ulong properties marked with . + + + + + + + + + + + Initialized the drawer. + + + + + Draws the property. + + + + + Draws a space for properties marked with the PropertySpace attribute. + + + + + Initializes this instance. + + + + + Draws the property. + + + + + Draws byte properties marked with . + + + + + + + + + + + Draws the property. + + + + + Draws double properties marked with . + + + + + + + + + + + Draws the property. + + + + + Draws float properties marked with . + + + + + + + + + + + Draws the property. + + + + + Draws decimal properties marked with . + + + + + Draws the property. + + + + + Draws short properties marked with . + + + + + + + + + + + Draws the property. + + + + + Draws int properties marked with . + + + + + + + + + + + Draws the property. + + + + + Draws long properties marked with . + + + + + + + + + + + Draws the property. + + + + + Draws sbyte properties marked with . + + + + + + + + + + + Draws the property. + + + + + Draws ushort properties marked with . + + + + + + + + + + + Draws the property. + + + + + Draws uint properties marked with . + + + + + + + + + + + Draws the property. + + + + + Draws ulong properties marked with . + + + + + + + + + + + Draws the property. + + + + + Show drawer chain attribute drawer. + + + + + Draws the property. + + + + + Drawer for the ShowPropertyResolver attribute. + + + + + + Draws properties marked with . + + + + + + Initializes this instance. + + + + + Draws the property. + + + + + Draws properties marked with . + + + + + + + + + Draws the property. + + + + + TextArea attribute drawer. + + + + + Draws the property in the Rect provided. This method does not support the GUILayout, and is only called by DrawPropertyImplementation if the GUICallType is set to Rect, which is not the default. + If the GUICallType is set to Rect, both GetRectHeight and DrawPropertyRect needs to be implemented. + If the GUICallType is set to GUILayout, implementing DrawPropertyLayout will suffice. + + The label. This can be null, so make sure your drawer supports that. + + + + Draws properties marked with . + + + + + + + Draws the property. + + + + + Draws properties marked with . + + + + + + Draws the property. + + + + + Draws properties marked with . + + + + + + Draws the property. + + + + + Draws properties marked with . + + + + + + Draws the property. + + + + + Draws properties marked with . + + + + + + Draws the property. + + + + + Draws properties marked with . + + + + + Initializes this instance. + + + + + Draws the property with GUILayout support. This method is called by DrawPropertyImplementation if the GUICallType is set to GUILayout, which is the default. + + + + + Draws all Unity DecoratorDrawers within prepend attribute drawers within Odin. + + + + + Initializes the class. + + + + + Draws the property. + + + + + Draws properties marked with . + + + + + Draws the property. + + + + + Initializes this instance. + + + + + Draws the property with GUILayout support. This method is called by DrawPropertyImplementation if the GUICallType is set to GUILayout, which is the default. + + + + + Draws Vector2Int properties marked with . + + + + + Initializes the drawer by resolving any optional references to members for min/max value. + + + + + Draws the property. + + + + + Vector2Int proprety drawer. + + + + + Draws the property. + + + + + Populates the generic menu for the property. + + + + + Vector3Int property drawer. + + + + + Draws the property. + + + + + Populates the generic menu for the property. + + + + + Draws all properties grouped together with the + + + + + + Initializes this instance. + + + + + Draws the property. + + + + + Draws all properties grouped together with the + + + + + + Draws the property. + + + + + Draws all properties grouped together with the + + + + + + Initializes this instance. + + + + + Draws the property. + + + + + Drawer for the + + + + + + Draws the property. + + + + + Drawer for the ResponsiveButtonGroupAttribute. + + + + + Draws the property with GUILayout support. + + + + + Draws all properties grouped together with the + + + + + + Draws the property. + + + + + Draws properties marked with . + + + + + + + Draws the property. + + + + + Draws all properties grouped together with the + + + + + + Draws the property. + + + + + Drawer for the + + + + + + Draws the property. + + + + + The default method drawer that draws most buttons. + + + + + Initializes this instance. + + + + + Draws the property layout. + + + + + Returns a value that indicates if this drawer can be used for the given property. + + + + + Evaluates all strings, enums and primitive types and ensures EditorGUI.showMixedValue is true if there are any value conflicts in the current selection. + + + + + Sets the drawer to only be evaluated on primitive types, strings and enums. + + + + + Draws the property. + + + + + Adds the right click area. + + + + + Adds the right click area. + + + + + Opens a context menu for any given property on right click. The context menu is populated by all relevant drawers that implements . + + + + + + Initializes the drawer. + + + + + Draws the property. + + + + + Draws all reference type properties, which has already been drawn elsewhere. This drawer adds an additional foldout to prevent infinite draw depth. + + + + + Prevents the drawer from being applied to UnityEngine.Object references since they are shown as an object field, and is not drawn in-line. + + + + + Draws the property. + + + + + Draws properties with a set. + + + + + Draws the property. + + + + + + When multiple objects are selected and inspected, this his drawer ensures UnityEditor.EditorGUI.showMixedValue + gets set to true if there are any conflicts in the selection for any given property. + Otherwise the next drawer is called. + + This drawer also implements and provides a right-click context menu item for resolving conflicts if any. + + + + + Draws the property. + + + + + Animation curve property drawer. + + + + + Bool property drawer. + + + + + Draws the property. + + + + + Byte property drawer. + + + + + Draws the property. + + + + + Char property drawer. + + + + + Draws the property. + + + + + Property drawer for anything that has a . + + + + + Initializes the drawer. + + + + + Draws the property. + + + + + Color32 property drawer. + + + + + Draws the property. + + + + + Color property drawer. + + + + + Draws the property. + + + + + Color palette property drawer. + + + + + Draws the property. + + + + + Drawer for composite properties. + + + + + Draws the property. + + + + + Decimal property drawer. + + + + + Draws the property. + + + + + Delegate property drawer. This drawer is rather simplistic for now, and will receive significant upgrades in the future. + + + + + See . + + + + + Draws the property. + + + + + Property drawer for . + + + + + Draws the property. + + + + + Double property drawer. + + + + + Draws the property. + + + + + Base class to derive from for value drawers that merely wish to cause a value to be drawn by Unity. + + + + + Draws the property. + + + + + Enum property drawer. + + + + + Returns true if the drawer can draw the type. + + + + + Draws the property. + + + + + Gradient property drawer. + + + + + Int property drawer. + + + + + Draws the property. + + + + + The GUIStyleState Drawer + + + + + + Initializes this instance. + + + + + Draws the property with GUILayout support. + + + + + Short property drawer. + + + + + Draws the property. + + + + + Int property drawer. + + + + + Draws the property. + + + + + Long property drawer. + + + + + Draws the property. + + + + + LayerMask property drawer. + + + + + Draws the property. + + + + + Property drawer for nullables. + + + + + Draws the property. + + + + + Quaternion property drawer. + + + + + Draws the property. + + + + + Populates the generic menu for the property. + + + + + SByte property drawer. + + + + + Draws the property. + + + + + Retrieves the index of a filtered item; if the collection is not filtered, it just returns the passed index. + + The index to find. + + + The index in the collection of the filtered item, + or the passed index if the collection is not filtered. + + + + This is thrown if it's unable to find the index in the original collection, + this indicates a discrepancy between the filtered collection and the original collection. + + + + + Float property drawer. + + + + + Draws the property. + + + + + String property drawer. + + + + + Draws the property. + + + + + The TableList attirbute drawer. + + + + + + Determines whether this instance [can draw attribute property] the specified property. + + + + + Initializes this instance. + + + + + Draws the property layout. + + + + + Base class for two-dimensional array drawers. + + + + + Override this method in order to define custom type constraints to specify whether or not a type should be drawn by the drawer. + Note that Odin's has full support for generic class constraints, so most often you can get away with not overriding CanDrawTypeFilter. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Draws the property. + + + + + This method gets called from DrawPropertyLayout right before the table and error message is drawn. + + + + + Compares the element. + + + + + Draws a table cell element. + + The rect. + The input value. + The output value. + + + + Draws the element. + + + + + Type property drawer + + + + + + Draws the property. + + + + + Ushort property drawer. + + + + + Draws the property. + + + + + Uint property drawer. + + + + + Draws the property. + + + + + Ulong property drawer. + + + + + Draws the property. + + + + + Unity event drawer. + + + + + Draws the property. + + + + + Unity object drawer. + + + + + Initializes this instance. + + + + + Draws the property. + + + + + Vector2 proprety drawer. + + + + + Draws the property. + + + + + Populates the generic menu for the property. + + + + + Vector3 property drawer. + + + + + Draws the property. + + + + + Populates the generic menu for the property. + + + + + Vector4 property drawer. + + + + + Draws the property. + + + + + Populates the generic menu for the property. + + + + + Draws properties marked with . + + + + + + + + + Draws the property. + + + + + Draws short properties marked with . + + + + + + Not yet documented. + + + + + Draws int properties marked with . + + + + + + Not yet documented. + + + + + Draws long properties marked with . + + + + + + Not yet documented. + + + + + Draws float properties marked with . + + + + + + Not yet documented. + + + + + Draws double properties marked with . + + + + + + Not yet documented. + + + + + Draws decimal properties marked with . + + + + + + Not yet documented. + + + + + Draws Vector2 properties marked with . + + + + + + Not yet documented. + + + + + Draws Vector3 properties marked with . + + + + + + Not yet documented. + + + + + Draws Vector4 properties marked with . + + + + + + Not yet documented. + + + + + Base drawer to inherit from to draw methods. + + + + + + Base class for attribute drawers. Use this class to create your own custom attribute drawers that will work for all types. + Alternatively you can derive from if you want to only support specific types. + + + + Odin supports the use of GUILayout and takes care of undo for you. It also takes care of multi-selection + in many simple cases. Check the manual for more information on handling multi-selection. + + + + Also note that Odin does not require that your custom attribute inherits from Unity's PropertyAttribute. + + + + The attribute that this drawer should be applied to. + + + Checkout the manual for more information. + + + + Example using the . + + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)] + public class CustomRangeAttribute : System.Attribute + { + public float Min; + public float Max; + + public CustomRangeAttribute(float min, float max) + { + this.Min = min; + this.Max = max; + } + } + + // Remember to wrap your custom attribute drawer within a #if UNITY_EDITOR condition, or locate the file inside an Editor folder. + + public sealed class CustomRangeAttributeDrawer : OdinAttributeDrawer<CustomRangeAttribute, float> + { + protected override void DrawPropertyLayout(GUIContent label) + { + this.ValueEntry.SmartValue = EditorGUILayout.Slider(label, this.ValueEntry.SmartValue, this.Attribute.Min, this.Attribute.Max); + } + } + + // Usage: + public class MyComponent : MonoBehaviour + { + [CustomRangeAttribute(0, 1)] + public float MyFloat; + } + + + + + Example using the . + + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)] + public class GUITintColorAttribute : System.Attribute + { + public Color Color; + + public GUITintColorAttribute(float r, float g, float b, float a = 1) + { + this.Color = new Color(r, g, b, a); + } + } + + // Remember to wrap your custom attribute drawer within a #if UNITY_EDITOR condition, or locate the file inside an Editor folder. + + public sealed class GUITintColorAttributeDrawer : OdinAttributeDrawer<GUITintColorAttribute> + { + protected override void DrawPropertyLayout(GUIContent label) + { + Color prevColor = GUI.color; + GUI.color *= this.Attribute.Color; + this.CallNextDrawer(label); + GUI.color = prevColor; + } + } + + // Usage: + public class MyComponent : MonoBehaviour + { + [GUITintColor(0, 1, 0)] + public float MyFloat; + } + + + + + + Odin uses multiple drawers to draw any given property, and the order in which these drawers are + called are defined using the . + Your custom drawer injects itself into this chain of drawers based on its . + If no is defined, a priority is generated automatically based on the type of the drawer. + Each drawer can ether choose to draw the property or not, or pass on the responsibility to the + next drawer by calling CallNextDrawer(), as the f attribute does in the example above. + + + + This means that there is no guarantee that your drawer will be called, sins other drawers + could have a higher priority than yours and choose not to call CallNextDrawer(). + + + + Note that Odin's has full support for generic class constraints, + and if that is not enough, you can also add additional type constraints by overriding CanDrawTypeFilter + + + + Also note that all custom property drawers needs to handle cases where the label provided by the DrawPropertyLayout is null, + otherwise exceptions will be thrown when in cases where the label is hidden. For instance when [HideLabel] is used, or the property is drawn within a list where labels are also not shown. + + + + [DrawerPriority(DrawerPriorityLevel.AttributePriority)] + public sealed class MyCustomAttributeDrawer<T> : OdinAttributeDrawer<MyCustomAttribute, T> where T : class + { + public override bool CanDrawTypeFilter(Type type) + { + return type != typeof(string); + } + + protected override void DrawPropertyLayout(GUIContent label) + { + // Draw property here. + } + } + + + + + + + + + + + + + + + + + + Gets the attribute that the OdinAttributeDrawer draws for. + + + + + Tells whether or not multiple attributes are allowed. + + + + + Draws the property with the given label. + Override this to implement your custom OdinAttributeDrawer. + + Optional label for the property. + + + + Tests if the drawer can draw for the specified property. + + The property to test. + true if the drawer can drawn the property. Otherwise false. + + + + Tests if the attribute drawer can draw for the specified property. + + The property to test. + true if the drawer can drawn the property. Otherwise false. + + + + + Base class for all type specific attribute drawers. For non-type specific attribute drawers see . + + + + Odin supports the use of GUILayout and takes care of undo for you. It also takes care of multi-selection + in many simple cases. Checkout the manual for more information on handling multi-selection. + + + + Also note that Odin does not require that your custom attribute inherits from Unity's PropertyAttribute. + + + + The attribute that this drawer should be applied to. + The type of the value the drawer should be drawing. Note that Odin's has full support for generic constraints. + + + Checkout the manual for more information. + + + + Example using the . + + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)] + public class CustomRangeAttribute : System.Attribute + { + public float Min; + public float Max; + + public CustomRangeAttribute(float min, float max) + { + this.Min = min; + this.Max = max; + } + } + + // Remember to wrap your custom attribute drawer within a #if UNITY_EDITOR condition, or locate the file inside an Editor folder. + + public sealed class CustomRangeAttributeDrawer : OdinAttributeDrawer<CustomRangeAttribute, float> + { + protected override void DrawPropertyLayout(GUIContent label) + { + this.ValueEntry.SmartValue = EditorGUILayout.Slider(label, this.ValueEntry.SmartValue, this.Attribute.Min, this.Attribute.Max); + } + } + + // Usage: + public class MyComponent : MonoBehaviour + { + [CustomRangeAttribute(0, 1)] + public float MyFloat; + } + + + + + Example using the . + + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false)] + public class GUITintColorAttribute : System.Attribute + { + public Color Color; + + public GUITintColorAttribute(float r, float g, float b, float a = 1) + { + this.Color = new Color(r, g, b, a); + } + } + + // Remember to wrap your custom attribute drawer within a #if UNITY_EDITOR condition, or locate the file inside an Editor folder. + + public sealed class GUITintColorAttributeDrawer : OdinAttributeDrawer<GUITintColorAttribute> + { + protected override void DrawPropertyLayout(GUIContent label) + { + Color prevColor = GUI.color; + GUI.color *= this.Attribute.Color; + this.CallNextDrawer(label); + GUI.color = prevColor; + } + } + + // Usage: + public class MyComponent : MonoBehaviour + { + [GUITintColor(0, 1, 0)] + public float MyFloat; + } + + + + + + Odin uses multiple drawers to draw any given property, and the order in which these drawers are + called is defined using the . + Your custom drawer injects itself into this chain of drawers based on its . + If no is defined, a priority is generated automatically based on the type of the drawer. + Each drawer can ether choose to draw the property or not, or pass on the responsibility to the + next drawer by calling CallNextDrawer(), as the GUITintColor attribute does in the example above. + + + + This means that there is no guarantee that your drawer will be called, since other drawers + could have a higher priority than yours and choose not to call CallNextDrawer(). + + + + Note that Odin's has full support for generic class constraints, + and if that is not enough, you can also add additional type constraints by overriding CanDrawTypeFilter + + + + Also note that all custom property drawers needs to handle cases where the label provided by the DrawPropertyLayout is null, + otherwise exceptions will be thrown when in cases where the label is hidden. For instance when [HideLabel] is used, or the property is drawn within a list where labels are also not shown. + + + + [DrawerPriority(DrawerPriorityLevel.AttributePriority)] + public class MyCustomAttributeDrawer<T> : OdinAttributeDrawer<MyCustomAttribute, T> where T : class + { + public override bool CanDrawTypeFilter(Type type) + { + return type != typeof(string); + } + + protected override void DrawPropertyLayout(GUIContent label) + { + // Draw property here. + } + } + + + + + + + + + + + + + + + + + + Gets the strongly typed ValueEntry of the OdinAttributeDrawer's property. + + + + + Draws the property with the given label. + Override this to implement your custom OdinAttributeDrawer. + + Optional label for the property. + + + + Tests if the drawer can draw for the specified property. + + The property to test. + true if the drawer can drawn the property. Otherwise false. + + + + Tests if the attribute drawer can draw for the specified property. + + The property to test. + true if the drawer can drawn the property. Otherwise false. + + + + + Base class for all Odin drawers. In order to create your own custom drawers you need to derive from one of the following drawers: + + + + + + + + Remember to provide your custom drawer with an in order for it to be located by the . + Drawers require a context, and are instantiated automatically by the . + Odin supports the use of GUILayout and takes care of undo for you. It also takes care of multi-selection in many simple cases. Checkout the manual for more information. + + + + + + + + + + + + + + + + + If true then this drawer will be skipped in the draw chain. Otherwise the drawer will be called as normal in the draw chain. + + + + + Gets a value indicating if the drawer has been initialized yet. + + + + + Gets the property this drawer draws for. + + + + + Override this method in order to define custom type constraints to specify whether or not a type should be drawn by the drawer. + Note that Odin's has full support for generic class constraints, so most often you can get away with not overriding CanDrawTypeFilter. + + The type. + + Returns true by default, unless overridden. + + + + + Initializes the drawer instance. + + + + + + Initializes the drawer instance. Override this to implement your own initialization logic. + + + + + Draws the property with a custom label. + + The label. Null is allow if you wish no label should be drawn. + + + + Draws the property with GUILayout support. + + The label. This can be null, so make sure your drawer supports that. + + + + Calls the next drawer in the draw chain. + + The label to pass on to the next drawer. + + + + Gets a value indicating if the drawer can draw for the specified property. + Override this to implement a custom property filter for your drawer. + + The property to test. + true if the drawer can draw for the property. Otherwise false. + + + + OdinDrawer extensions. + + + + + Gets a persistent value that will survive past multiple Unity Editor Application sessions. + The value is stored in the PersistentContextCache, which has a customizable max cache size. + + + + + Draws the default Odin inspector. + + + + + Draws the default Unity inspector. + + + + + Not yet documented. + + + + + Draws the property tree. + + + + + Called by Unity. + + + + + Called by Unity. + + + + + + Base class for all group drawers. Use this class to create your own custom group drawers. OdinGroupDrawer are used to group multiple properties together using an attribute. + + + + Note that all box group attributes needs to inherit from the + + + + Remember to provide your custom drawer with an + in order for it to be located by the . + + + + + + Checkout the manual for more information. + + + + + [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method, AllowMultiple = false, Inherited = true)] + public class MyBoxGroupAttribute : PropertyGroupAttribute + { + public MyBoxGroupAttribute(string group, float order = 0) : base(group, order) + { + } + } + + // Remember to wrap your custom group drawer within a #if UNITY_EDITOR condition, or locate the file inside an Editor folder. + + public class BoxGroupAttributeDrawer : OdinGroupDrawer<MyBoxGroupAttribute> + { + protected override void DrawPropertyGroupLayout(InspectorProperty property, MyBoxGroupAttribute attribute, GUIContent label) + { + GUILayout.BeginVertical("box"); + for (int i = 0; i < property.Children.Count; i++) + { + InspectorUtilities.DrawProperty(property.Children[i]); + } + GUILayout.EndVertical(); + } + } + + // Usage: + public class MyComponent : MonoBehaviour + { + [MyBoxGroup("MyGroup")] + public int A; + + [MyBoxGroup("MyGroup")] + public int B; + + [MyBoxGroup("MyGroup")] + public int C; + } + + + + + + + + + + + + + + + + + + Draws the property with GUILayout support. + + The label. This can be null, so make sure your drawer supports that. + + + + + Base class for all value drawers. Use this class to create your own custom drawers for any specific type. + + + + Remember to provide your custom drawer with an + in order for it to be located by the . + + + + Odin supports the use of GUILayout and takes care of undo for you. It also takes care of multi-selection + in many simple cases. Checkout the manual for more information on handling multi-selection. + + + + + Checkout the manual for more information. + + + + + public class MyCustomBaseType + { + + } + + public class MyCustomType : MyCustomBaseType + { + + } + + // Remember to wrap your custom attribute drawer within a #if UNITY_EDITOR condition, or locate the file inside an Editor folder. + + public sealed class MyCustomBaseTypeDrawer<T> : OdinValueDrawer<T> where T : MyCustomBaseType + { + protected override void DrawPropertyLayout(IPropertyValueEntry<T> entry, GUIContent label) + { + T value = entry.SmartValue; + // Draw your custom drawer here using GUILayout and EditorGUILAyout. + } + } + + // Usage: + // Both values will be drawn using the MyCustomBaseTypeDrawer + public class MyComponent : SerializedMonoBehaviour + { + public MyCustomBaseType A; + + public MyCustomType B; + } + + + + + + Odin uses multiple drawers to draw any given property, and the order in which these drawers are + called are defined using the . + Your custom drawer injects itself into this chain of drawers based on its . + If no is defined, a priority is generated automatically based on the type of the drawer. + Each drawer can ether choose to draw the property or not, or pass on the responsibility to the + next drawer by calling CallNextDrawer(). An example of this is provided in the documentation for . + + + + This means that there is no guarantee that your drawer will be called, sins other drawers + could have a higher priority than yours and choose not to call CallNextDrawer(). + + + + To avoid this, you can tell Odin, that your drawer is a PrependDecorator or an AppendDecorator drawer (see ) as shown in the example shows below. + Prepend and append decorators are always drawn and are also ordered by the . + + + + Note that Odin's have full support for generic class constraints, + and if that is not enough, you can also add additional type constraints by overriding CanDrawTypeFilter(Type type). + + + + Also note that all custom property drawers needs to handle cases where the label provided by the DrawPropertyLayout is null, + otherwise exceptions will be thrown when in cases where the label is hidden. For instance when [HideLabel] is used, or the property is drawn within a list where labels are also not shown. + + + + // [OdinDrawer(OdinDrawerBehaviour.DrawProperty)] // default + // [OdinDrawer(OdinDrawerBehaviour.AppendDecorator)] + [OdinDrawer(OdinDrawerBehaviour.PrependDecorator)] + [DrawerPriority(DrawerPriorityLevel.AttributePriority)] + public sealed class MyCustomTypeDrawer<T> : OdinValueDrawer<T> where T : MyCustomType + { + public override bool CanDrawTypeFilter(Type type) + { + return type != typeof(SomeType); + } + + protected override void DrawPropertyLayout(IPropertyValueEntry<T> entry, GUIContent label) + { + T value = entry.SmartValue; + // Draw property here. + } + } + + + + + + + + + + + + + + + + + + + The value entry of the property. + + + + + Draws the property with GUILayout support. + + The label. This can be null, so make sure your drawer supports that. + + + + Gets a value indicating if the drawer can draw for the specified property. + + The property to test. + true if the drawer can draw for the property. Otherwise false. + + + + Gets a value indicating if the drawer can draw for the specified property. + Override this to implement a custom property filter for your drawer. + + The property to test. + true if the drawer can draw for the property. Otherwise false. + + + + Unity property drawer for abstract types. + + + + + Initializes the property drawer. + + + + + Draws the property. + + + + + Property drawer for primitive composite properties. + + + + + Draws the property. + + + + + Draws the property field. + + + + + Unity property attribute drawer. + + + + + Initializes the drawer. + + + + + Draws the proprety. + + + + + Unity property drawer. + + + + + Initializes the property drawer. + + + + + Draws the property. + + + + + Descripes an attribute example. + + + + + The type of the example object. + + + + + The name of the example. + + + + + The description of the example. + + + + + Raw code of the example. + + + + + The example declared as a Unity component. + + + + + Sorting value of the example. Examples with lower order values should come before examples with higher order values. + + + + + Preview object of the example. + + + + + Some drawers don't want to have its GUI disabled, even if the property is read-only or a ReadOnly attribute is defined on the property. + Use this attribute on any drawer to force GUI being enabled in these cases. + + + + + [AllowGUIEnabledForReadonly] + public sealed class SomeDrawerDrawer<T> : OdinValueDrawer<T> where T : class + { + } + + + + + + Extension method for List<Attribute> + + + + + Determines whether the list contains a specific attribute type. + + The type of attribute. + The attribute list. + + true if the specified attribute list has attribute; otherwise, false. + + + + + Adds a new instance of the given type of attribute if it's not in the list. + + The type of attribute. + The attribute list. + + + + + Gets the first instance of an attribute of the given type in the list. + + The type of attribute. + The attribute list. + + + + + Adds a new instance of the attribute to the list. + + The type of attribute. + The attribute list. + + + + + Removes all instances of the given type in the list. + + The type of attribute. + The attribute list. + + + + + + DrawerPriority is used in conjunction with + to specify the priority of any given drawer. It consists of 3 components: + Super, Wrapper, Value, where Super is the most significant component, + and Standard is the least significant component. + + + + + + + + Auto priority is defined by setting all of the components to zero. + If no is defined on a drawer, it will default to AutoPriority. + + + + + The standard priority. Mostly used by s. + + + + + The attribute priority. Mostly used by s. + + + + + The wrapper priority. Mostly used by drawers used to decorate properties. + + + + + The super priority. Mostly used by drawers that wants to wrap the entire property but don't draw the actual property. + These drawers typically don't draw the property itself, and calls CallNextDrawer. + + + + + The value priority. Mostly used by s and s. + + + + + The wrapper priority. Mostly used by drawers used to decorate properties. + + + + + The super priority. Mostly used by drawers that wants to wrap the entire property but don't draw the actual property. + These drawers typically don't draw the property itself, and calls CallNextDrawer. + + + + + Initializes a new instance of the struct. + + The priority. + + + + Initializes a new instance of the struct. + + + The super priority. Mostly used by drawers that wants to wrap the entire property but don't draw the actual property. + These drawers typically don't draw the property itself, and calls CallNextDrawer. + The wrapper priority. Mostly used by drawers used to decorate properties. + The value priority. Mostly used by s and s. + + + + Implements the operator >. + + The LHS. + The RHS. + + The result of the operator. + + + + + Implements the operator <. + + The LHS. + The RHS. + + The result of the operator. + + + + + Implements the operator <=. + + The LHS. + The RHS. + + The result of the operator. + + + + + Implements the operator >=. + + The LHS. + The RHS. + + The result of the operator. + + + + + Implements the operator +. + + The LHS. + The RHS. + + The result of the operator. + + + + + Implements the operator -. + + The LHS. + The RHS. + + The result of the operator. + + + + + Implements the operator ==. + + The LHS. + The RHS. + + The result of the operator. + + + + + Implements the operator !=. + + The LHS. + The RHS. + + The result of the operator. + + + + + Gets the priority level. + + + + + Returns a that represents this instance. + + + A that represents this instance. + + + + + Returns a that represents this instance. + + The format. + + A that represents this instance. + + + + + Determines whether the specified , is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Equals the specified other. + + The other. + + + + + Compares to. + + The other. + + + + + DrawerPriority is used on inspector drawers and indicates the priority of the drawer. + Use this to make your custom drawer to come before or after other drawers, and potentially hide other drawers. + + + The following example shows how DrawerPriority could be apply to a value drawer. + + [DrawerPriority(DrawerPriorityLevel.ValuePriority)] + + public sealed class MyIntDrawer : InspectorValuePropertyDrawer<int> + { + // ... + } + + + + The following example shows how DrawerPriority is used to mark a custom int drawer as a high priority drawer. + + [DrawerPriority(1, 0, 0)] + + public sealed class MySpecialIntDrawer : InspectorValuePropertyDrawer<int> + { + // ... + } + + + + + + + + The priority of the drawer. + + + + + Indicates the priority of an inspector drawer. + + Option for priority for the inspector drawer. + + + + Indicates the priority of an inspector drawer. + + + The super priority. Mostly used by drawers that wants to wrap the entire property but don't draw the actual property. + These drawers typically don't draw the property itself, and calls CallNextDrawer. + The wrapper priority. Mostly used by drawers used to decorate properties. + The value priority. Mostly used by s and s. + + + + + DrawerPriorityLevel is used in conjunction with . + + + + + + + + Auto priority is defined by setting all of the components to zero. + If no is defined on a drawer, it will default to AutoPriority. + + + + + The value priority. Mostly used by s. + + + + + The attribute priority. Mostly used by s. + + + + + The wrapper priority. Mostly used by drawers used to decorate properties. + + + + + The super priority. Mostly used by drawers that wants to wrap the entire property but don't draw the actual property. + These drawers typically don't draw the property itself, and calls CallNextDrawer. + + + + + Odin has its own implementations for these attribute drawers; never use Unity's. + + + + + Gets the priority of a given drawer type. + + + + + Base class for emitted MonoBehaviour-derived types that have been created by the . + + + + + The field that backs the value of this MonoBehaviour. + + + + + Sets the value contained in this scriptable object. + + + + + Gets the value contained in this scriptable object. + + + + + Strongly typed base class for emitted MonoBehaviour-derived types that have been created by the . + + + + + Sets the value contained in this scriptable object. + + + + + Gets the value contained in this scriptable object. + + + + + Sets the value contained in this scriptable object. + + + + + Gets the value contained in this scriptable object. + + + + + Base class for emitted ScriptableObject-derived types that have been created by the . + + + + + The field that backs the value of this scriptable object. + + + + + Sets the value contained in this scriptable object. + + + + + Gets the value contained in this scriptable object. + + + + + Strongly typed base class for emitted scriptable object types that have been created by the . + + + + + Sets the value contained in this scriptable object. + + + + + Gets the value contained in this scriptable object. + + + + + Sets the value contained in this scriptable object. + + + + + Gets the value contained in this scriptable object. + + + + + Unwraps TargetInvocationException and TypeInitializationException + + + + + This class fixes Unity's about window, by invoking "UnityEditor.VisualStudioIntegration.UnityVSSupport.GetAboutWindowLabel" before any dynamic assemblies have been defined. + This is because dynamic assemblies in the current AppDomain break that method, and Unity's about window depends on it. + + + + + + If you mark any of Unity's assemblies with the [AssemblyVersion] attribute to get a rolling assembly + version that changes sometimes (or all the time), Odin's hardcoded assembly references to user types + will break. + + + To fix this case, and all other cases of references to wrongly versioned Unity types not being resolved, + we overload the app domain's type resolution and resolve Unity user assemblies properly regardless of + version. + + + + + + This class fixes a bug where Unity's Undo.RecordObject does not mark ScriptableObjects dirty when + a change is recorded for them. It does this by subscribing to the Undo.postprocessModifications + event, and marking all modified ScriptableObjects dirty manually. + + + + + Specifies hows any given drawer should drawer the property. + Changing this behavior, also changes which methods should be overridden in the drawer. + + + + + + + + + GUILayout enabled the use of GUILayout, EditorGUILayout and + + + + + Draws the property using Unity's GUI, and EditorGUI. + + + + + Helper class to get values from InspectorProperties. This class is deprecated and fully replaced by . + + + + + If any error occurred while looking for members, it will be stored here. + + + + + Gets the referenced member information. + + + + + Gets the value. + + + + + Gets all values from all targets. + + + + + Provides a variety of miscellaneous utilities widely used in the inspector. + + + + + Converts an Odin property path to a deep reflection path. + + + + + Converts an Odin property path (without groups included) into a Unity property path. + + + + + Prepares a property tree for drawing, and handles management of undo, as well as marking scenes and drawn assets dirty. + + The tree to be drawn. + Whether to register undo commands for the changes made to the tree. This can only be set to true if the tree has a to represent. + tree is null + + + + Ends drawing a property tree, and handles management of undo, as well as marking scenes and drawn assets dirty. + + The tree. + + + + Draws all properties in a given property tree; must be wrapped by a and . + + The tree to be drawn. + + + + Draws a property in the inspector using a given label. + + + + + Odin property system exception. + + + + + Initializes a new instance of OdinPropertyException. + + The message for the exception. + An inner exception. + + + + Custom types used by the can choose to implement the ITemporaryContext + interface in order to be notified when the context gets reset. + + + + + Called by when the context gets reset. + + + + + Used by all InspectorProperty to tell Odin how to set or get a value on any given property. + + + + + Whether the value is readonly. + + + + + Gets the type of the owner. + + + + + Gets the type of the value. + + + + + Sets the weakly typed value on a given weakly typed owner. + + The owner. + The value. + + + + Gets the value from a given weakly typed owner. + + The weakly typed owner. + The found value. + + + + Used by all to tell Odin how to set or get a value on any given property. + + + + + Sets the value on a given owner. + + The owner. + The value. + + + + Gets the value from a given owner. + + The owner. + + + + The content padding + + + + + Draws the menu tree. + + + + + Gets the value selected value. + + + + + Invokes BuildMenuTree. + + + + + Use this attribute to prevent a type from being included in Odin systems. + The attribute can be applied to Odin drawers, Odin property resolvers and Odin attribute processor types. + + + + + When creating custom property drawers with or etc, + an OdinDrawerAttribute must be defined on the custom drawer class itself in order to specify that the drawer is meant to be included in the inspector. + If no OdinDrawerAttribute is defined, the will ignore your drawer. + + + Checkout the manual for more information. + + + + // Specify that this drawer must be included in the inspector; without this, it will not be drawn + public class MyCustomTypeDrawer<T> : OdinValueDrawer<T> where T : MyCustomBaseType + { + protected override void DrawPropertyLayout(IPropertyValueEntry<T> entry, GUIContent label) + { + T value = entry.SmartValue; + // Draw property here. + + // Optionally, call the next drawer in line. + this.CallNextDrawer(entry, label); + } + } + + + + + + + + + + + + Initializes a new instance of the class. + + + + + Priority for and types. + + + + + Priority of the resolver. + + + + + Initializes a new instance of the class. + + The higher the priority, the earlier it will be processed. + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Sirenix preferences window. + + + + + Opens the Odin inspector preferences window. + + + + + Opens the Odin inspector preferences window. + + + + + This class has been made fully obsolete, and has been replaced by . + It was a helper class to handle strings for labels and other similar purposes. + + + + + If any error occurred while looking for members, it will be stored here. + + + + + Obsolete. Use other constructor. + + + + + Obsolete. Use other constructor. + + + + + Creates a StringMemberHelper to get a display string. + + Inspector property to get string from. + The input string. If the first character is a '$', then StringMemberHelper will look for a member string field, property or method, and will try to parse it as an expression if it starts with '@'. + + + + Creates a StringMemberHelper to get a display string. + + Inspector property to get string from. + The input string. If the first character is a '$', then StringMemberHelper will look for a member string field, property or method, and will try to parse it as an expression if it starts with '@'./// The input string. If the first character is a '$', then StringMemberHelper will look for a member string field, property or method. + + + + Gets a value indicating whether or not the string is retrived from a from a member. + + + + + Gets the type of the object. + + + + + Gets the string from the StringMemberHelper. + Only updates the string buffer in Layout events. + + The property entry, to get the instance reference from. + The current display string. + + + + Gets the string from the StringMemberHelper. + Only updates the string buffer in Layout events. + + The property, to get the instance reference from. + The current string. + + + + Gets the string from the StringMemberHelper. + Only updates the string buffer in Layout events. + + The instance, for evt. member references. + The current string. + + + + Gets the string from the StringMemberHelper. + + The property entry, to get the instance reference from. + The current string. + + + + Gets the string from the StringMemberHelper. + + The property, to get the instance reference from. + The current string. + + + + Gets the string from the StringMemberHelper. + + The instance, for evt. member references. + The current string. + + + + To safely change anything in the type cache, you must be holding this lock. + + + + + + + + + This is checked using . + + + + + Gets a unique key for any given property within a drawer. + + + + + public class MyCustomTypeDrawer<T> : OdinValueDrawer<T> where T : MyCustomBaseType + { + protected override void DrawPropertyLayout(IPropertyValueEntry<T> entry, GUIContent label) + { + var isToggled = entry.Context(this, "toggled", false); + isToggled.Value = SirenixEditorGUI.Label(isToggled.Value, label); + if (SirenixEditorGUI.BeginFadeGroup(UniqueDrawerKey.Create(entry, this), isToggled.Value)) + { + EditorGUI.indentLevel++; + this.CallNextDrawer(entry.Property, null); + EditorGUI.indentLevel--; + } + SirenixEditorGUI.EndFadeGroup(); + } + } + + + + + + Gets a unique key for any given property within a drawer. + + The property entry. + The drawer. + + + + + Gets a unique key for any given property within a drawer. + + The property. + The drawer. + + + + + Checks if two keys are identical. + + The other key. + + + + Checks if two keys are identical. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Provides utilities for emitting ScriptableObject and MonoBehaviour-derived types with specific property names and types, and providing instances of with those names and types. + + + + + A handle for a set of emitted Unity objects. When disposed (or collected by the GC) this handle will queue the emitted object instances for destruction. + + + + + The unity property to represent. + + + + + The Unity objects to represent. + + + + + Initializes a new instance of the class. + + The unity property to represent. + The objects to represent. + + + + Finalizes an instance of the class. + + + + + Creates an emitted MonoBehaviour-based . + + Name of the field to emit. + Type of the value to create a property for. + The target count of the tree to create a property for. + The game object that the MonoBehaviour of the property is located on. + + fieldName is null + or + valueType is null + + Target count must be equal to or higher than 1. + + + + Creates an emitted ScriptableObject-based . + + Name of the field to emit. + Type of the value to create a property for. + The target count of the tree to create a property for. + + fieldName is null + or + valueType is null + + Target count must be equal to or higher than 1. + + + + Base class for creating editor windows using Odin. + + + + public class SomeWindow : OdinEditorWindow + { + [MenuItem("My Game/Some Window")] + private static void OpenWindow() + { + GetWindow<SomeWindow>().Show(); + } + + [Button(ButtonSizes.Large)] + public void SomeButton() { } + + [TableList] + public SomeType[] SomeTableData; + } + + + + + public class DrawSomeSingletonInAnEditorWindow : OdinEditorWindow + { + [MenuItem("My Game/Some Window")] + private static void OpenWindow() + { + GetWindow<DrawSomeSingletonInAnEditorWindow>().Show(); + } + + protected override object GetTarget() + { + return MySingleton.Instance; + } + } + + + + + private void InspectObjectInWindow() + { + OdinEditorWindow.InspectObject(someObject); + } + + private void InspectObjectInDropDownWithAutoHeight() + { + var btnRect = GUIHelper.GetCurrentLayoutRect(); + OdinEditorWindow.InspectObjectInDropDown(someObject, btnRect, btnRect.width); + } + + private void InspectObjectInDropDown() + { + var btnRect = GUIHelper.GetCurrentLayoutRect(); + OdinEditorWindow.InspectObjectInDropDown(someObject, btnRect, new Vector2(btnRect.width, 100)); + } + + private void InspectObjectInACenteredWindow() + { + var window = OdinEditorWindow.InspectObject(someObject); + window.position = GUIHelper.GetEditorWindowRect().AlignCenter(270, 200); + } + + private void OtherStuffYouCanDo() + { + var window = OdinEditorWindow.InspectObject(this.someObject); + + window.position = GUIHelper.GetEditorWindowRect().AlignCenter(270, 200); + window.titleContent = new GUIContent("Custom title", EditorIcons.RulerRect.Active); + window.OnClose += () => Debug.Log("Window Closed"); + window.OnBeginGUI += () => GUILayout.Label("-----------"); + window.OnEndGUI += () => GUILayout.Label("-----------"); + } + + + + + + + Occurs when the window is closed. + + + + + Occurs at the beginning the OnGUI method. + + + + + Occurs at the end the OnGUI method. + + + + + Gets the label width to be used. Values between 0 and 1 are treated as percentages, and values above as pixels. + + + + + Gets or sets the window padding. x = left, y = right, z = top, w = bottom. + + + + + Gets a value indicating whether the window should draw a scroll view. + + + + + Gets a value indicating whether the window should draw a Unity editor preview, if possible. + + + + + Gets the default preview height for Unity editors. + + + + + Gets the target which which the window is supposed to draw. By default it simply returns the editor window instance itself. By default, this method is called by (). + + + + + Gets the targets to be drawn by the editor window. By default this simply yield returns the method. + + + + + At the start of each OnGUI event when in the Layout event, the GetTargets() method is called and cached into a list which you can access from here. + + + + + + Pops up an editor window for the given object in a drop-down window which closes when it loses its focus. + This particular overload uses a few frames to calculate the height of the content before showing the window with a height that matches its content. + + Protip: You can subscribe to OnClose if you want to know when that occurs. + + + + + Measures the GUILayout content height and adjusts the window height accordingly. + Note that this feature becomes pointless if any layout group expands vertically. + + The max height of the window. + When the window height expands below the screen bounds, it will move the window + upwards when needed, enabling this will move it back down when the window height is decreased. + + + + + Pops up an editor window for the given object in a drop-down window which closes when it loses its focus. + + Protip: You can subscribe to OnClose if you want to know when that occurs. + + + + + + Pops up an editor window for the given object in a drop-down window which closes when it loses its focus. + + Protip: You can subscribe to OnClose if you want to know when that occurs. + + + + + + Pops up an editor window for the given object in a drop-down window which closes when it loses its focus. + + Protip: You can subscribe to OnClose if you want to know when that occurs. + + + + + + Pops up an editor window for the given object in a drop-down window which closes when it loses its focus. + + Protip: You can subscribe to OnClose if you want to know when that occurs. + + + + + + Pops up an editor window for the given object in a drop-down window which closes when it loses its focus. + + Protip: You can subscribe to OnClose if you want to know when that occurs. + + + + + + Pops up an editor window for the given object in a drop-down window which closes when it loses its focus. + + Protip: You can subscribe to OnClose if you want to know when that occurs. + + + + + Pops up an editor window for the given object. + + + + + Inspects the object using an existing OdinEditorWindow. + + + + + Creates an editor window instance for the specified object, without opening the window. + + + + + Creates an editor window instance for the specified object, without opening the window. + + + + + The Odin property tree drawn. + + + + + Draws the Odin Editor Window. + + + + + Calls DrawEditor(index) for each of the currently drawing targets. + + + + + Initialize get called by OnEnable and by OnGUI after assembly reloads + which often happens when you recompile or enter and exit play mode. + + + + + Called when the window is enabled. Remember to call base.OnEnable(); + + + + + Draws the editor for the this.CurrentDrawingTargets[index]. + + + + + Uses the method to draw a preview for the this.CurrentDrawingTargets[index]. + + + + + Called when the window is destroyed. Remember to call base.OnDestroy(); + + + + + Called before starting to draw all editors for the . + + + + + Called after all editors for the has been drawn. + + + + + See ISerializationCallbackReceiver.OnBeforeSerialize for documentation on how to use this method. + + + + + Implement this method to receive a callback after unity serialized your object. + + + + + Draws an editor window with a menu tree. + + + + public class OdinMenuEditorWindowExample : OdinMenuEditorWindow + { + [SerializeField, HideLabel] + private SomeData someData = new SomeData(); + + protected override OdinMenuTree BuildMenuTree() + { + OdinMenuTree tree = new OdinMenuTree(supportsMultiSelect: true) + { + { "Home", this, EditorIcons.House }, // draws the someDataField in this case. + { "Odin Settings", null, SdfIconType.GearFill }, + { "Odin Settings/Color Palettes", ColorPaletteManager.Instance, EditorIcons.EyeDropper }, + { "Odin Settings/AOT Generation", AOTGenerationConfig.Instance, EditorIcons.SmartPhone }, + { "Camera current", Camera.current }, + { "Some Class", this.someData } + }; + + tree.AddAllAssetsAtPath("More Odin Settings", SirenixAssetPaths.OdinEditorConfigsPath, typeof(ScriptableObject), true) + .AddThumbnailIcons(); + + tree.AddAssetAtPath("Odin Getting Started", SirenixAssetPaths.SirenixPluginPath + "Getting Started With Odin.asset"); + + var customMenuItem = new OdinMenuItem(tree, "Menu Style", tree.DefaultMenuStyle); + tree.MenuItems.Insert(2, customMenuItem); + + tree.Add("Menu/Items/Are/Created/As/Needed", new GUIContent()); + tree.Add("Menu/Items/Are/Created", new GUIContent("And can be overridden")); + + // As you can see, Odin provides a few ways to quickly add editors / objects to your menu tree. + // The API also gives you full control over the selection, etc.. + // Make sure to check out the API Documentation for OdinMenuEditorWindow, OdinMenuTree and OdinMenuItem for more information on what you can do! + + return tree; + } + } + + + + + + + + + + + + + Called when the window is destroyed. Remember to call base.OnDestroy(); + + + + + Builds the menu tree. + + + + + Gets or sets the width of the menu. + + + + + Gets a value indicating whether the menu is resizable. + + + + + Gets the menu tree. + + + + + Gets or sets a value indicating whether to draw the menu search bar. + + + + + Gets or sets the custom search function. + + + + + Forces the menu tree rebuild. + + + + + Tries to select the menu item with the specified object. + + + + + Draws the menu tree selection. + + + + + Draws the Odin Editor Window. + + + + + The method that draws the menu. + + + + + A menu item that represents one or more objects. + + + + + + + + + + The default toggled state + + + + + Initializes a new instance of the class. + + The Odin menu tree instance the menu item belongs to. + The name of the menu item. + The instance the value item represents. + + + + Occurs right after the menu item is done drawing, and right before mouse input is handles so you can take control of that. + + + + + Occurs when the user has right-clicked the menu item. + + + + + Gets the child menu items. + + + The child menu items. + + + + + Gets the index location of the menu item. + + + + + Gets or sets a value indicating whether the menu item is visible. + Not that setting this to false will not hide its children as well. For that see use Toggled. + + + + + Gets or sets the icon that is used when the menu item is not selected. + + + + + Gets or sets the icon that is used when the menu item is selected. + + + + + Gets a value indicating whether this instance is selected. + + + + + Determines whether this instance is selectable. + + + + + Determines whether this instance is enabled. + + + + + Gets the menu tree instance. + + + + + Gets or sets the raw menu item name. + + + + + Gets or sets the search string used when searching for menu items. + + + + + Gets the next visual menu item. + + + + + Gets the next selectable visual menu item. + + + + + Gets the parent menu item. + + + + + Gets the previous visual menu item. + + + + + Gets the previous selectable visual menu item. + + + + + Gets the drawn rect. + + + + + Gets the drawn label rect. + + + + + Gets or sets the style. If null is specified, then the menu trees DefaultMenuStyle is used. + + + + + Deselects this instance. + + + + + Selects the specified add to selection. + + + + + Gets the child menu items recursive in a DFS. + + Whether to include it self in the collection. + + + + Gets the child menu items recursive in a DFS. + + Whether to include it self in the collection. + Whether to include the root. + + + + Gets the full menu item path. + + + + + Gets the first object of the + + + + + Gets the object instances the menu item represents + + + + + Sets the object instance + + + + + Sets the object instances + + + + + Gets or sets the value the menu item represents. + + + + + Gets a nice menu item name. If the raw name value is null or a dollar sign, then the name is retrieved from the object itself via ToString(). + + + + + Gets or sets a value indicating whether this is toggled / expanded. This value tries it best to be persistent. + + + + + Gets or sets the icon getter. + + + + + Draws this menu item followed by all of its child menu items + + The indent level. + + + + Draws the menu item with the specified indent level. + + + + + Override this to add custom GUI to the menu items. + This is called right after the menu item is done drawing, and right before mouse input is handles so you can take control of that. + + + + + Handles the mouse events. + + The rect. + The triangle rect. + + + + The style settings used by . + + A nice trick to style your menu is to add the tree.DefaultMenuStyle to the tree itself, + and style it live. Once you are happy, you can hit the Copy CSharp Snippet button, + remove the style from the menu tree, and paste the style directly into your code. + + + + + + + + + + + Gets or sets the default selected style. + + + + + Gets or sets the selected label style. + + + + + The height of the menu item. + + + + + The global offset of the menu item content + + + + + The vertical offset of the menu item label + + + + + The number of pixels to indent per level indent level. + + + + + The size of the icon. + + + + + The size of the icon. + + + + + The transparency of icons when the menu item is not selected. + + + + + The padding between the icon and other content. + + + + + Whether to draw the a foldout triangle for menu items with children. + + + + + The size of the foldout triangle icon. + + + + + The padding between the foldout triangle icon and other content. + + + + + Whether or not to align the triangle left or right of the content. + If right, then the icon is pushed all the way to the right at a fixed position ignoring the indent level. + + + + + Whether to draw borders between menu items. + + + + + The horizontal border padding. + + + + + The border alpha. + + + + + The background color for when a menu item is selected. + + + + + The background color for when a menu item is selected. + + + + + The background color for when a menu item is selected. + + + + + The background color for when a menu item is selected. + + + + + The background color for when a menu item is selected. + + + + + The background color for when a menu item is selected. + + + + + Sets the height of the menu item. + + + + + Sets the global offset of the menu item content + + + + + Sets the number of pixels to indent per level indent level. + + + + + Sets the size of the icon. + + + + + Sets the size of the icon. + + + + + Sets the transparency of icons when the menu item is not selected. + + + + + Sets the padding between the icon and other content. + + + + + Sets whether to draw the a foldout triangle for menu items with children. + + + + + Sets the size of the foldout triangle icon. + + + + + Sets the padding between the foldout triangle icon and other content. + + + + + Sets whether or not to align the triangle left or right of the content. + If right, then the icon is pushed all the way to the right at a fixed position ignoring the indent level. + + + + + Sets whether to draw borders between menu items. + + + + + Sets the border alpha. + + + + + Sets the border alpha. + + + + + Sets the background color for when a menu item is selected. + + + + + Sets the background color for when a menu item is selected. + + + + + Creates and returns an instance of a menu style that makes it look like Unity's project window. + + + + + OdinMenuTree provides a tree of s, and helps with selection, inserting menu items into the tree, and can handle keyboard navigation for you. + + + + OdinMenuTree tree = new OdinMenuTree(supportsMultiSelect: true) + { + { "Home", this, EditorIcons.House }, + { "Odin Settings", null, SdfIconType.GearFill }, + { "Odin Settings/Color Palettes", ColorPaletteManager.Instance, EditorIcons.EyeDropper }, + { "Odin Settings/AOT Generation", AOTGenerationConfig.Instance, EditorIcons.SmartPhone }, + { "Camera current", Camera.current }, + { "Some Class", this.someData } + }; + + tree.AddAllAssetsAtPath("Some Menu Item", "Some Asset Path", typeof(ScriptableObject), true) + .AddThumbnailIcons(); + + tree.AddAssetAtPath("Some Second Menu Item", "SomeAssetPath/SomeAssetFile.asset"); + + var customMenuItem = new OdinMenuItem(tree, "Menu Style", tree.DefaultMenuStyle); + tree.MenuItems.Insert(2, customMenuItem); + + tree.Add("Menu/Items/Are/Created/As/Needed", new GUIContent()); + tree.Add("Menu/Items/Are/Created", new GUIContent("And can be overridden")); + + OdinMenuTrees are typically used with s but is made to work perfectly fine on its own for other use cases. + OdinMenuItems can be inherited and and customized to fit your needs. + + // Draw stuff + someTree.DrawMenuTree(); + // Draw stuff + someTree.HandleKeybaordMenuNavigation(); + + + + + + + + + + + Gets the currently active menu tree. + + + + + Gets the selection. + + + + + Gets the root menu items. + + + + + Gets the root menu item. + + + + + If true, all indent levels will be ignored, and all menu items with IsVisible == true will be drawn. + + + + + Adds a menu item with the specified object instance at the the specified path. + + Returns all menu items created in order to add the menu item at the specified path. + + + + Adds a menu item with the specified object instance and icon at the the specified path. + + Returns all menu items created in order to add the menu item at the specified path. + + + + Adds a menu item with the specified object instance and icon at the the specified path. + + Returns all menu items created in order to add the menu item at the specified path. + + + + Adds a menu item with the specified object instance and icon at the the specified path. + + Returns all menu items created in order to add the menu item at the specified path. + + + + Adds a menu item with the specified object instance and icon at the the specified path. + + Returns all menu items created in order to add the menu item at the specified path. + + + + Adds a collection of objects to the menu tree and returns all menu items created in random order. + + + + + Adds a collection of objects to the menu tree and returns all menu items created in random order. + + + + + Gets or sets the default menu item style from Config.DefaultStyle. + + + + + Gets or sets the default drawing configuration. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + if set to true [supports multi select]. + + + + Initializes a new instance of the class. + + if set to true [supports multi select]. + The default menu item style. + + + + Initializes a new instance of the class. + + + + + Sets the focus to the . + + + + + Scrolls to the specified menu item. + + + + + Enumerates the tree with a DFS. + + if set to true then the invisible root menu item is included. + + + + Enumerates the tree with a DFS. + + The predicate. + if set to true then the invisible root menu item is included. + + + + Enumerates the tree with a DFS. + + + + + Draws the menu tree recursively. + + + + + Marks the dirty. This will cause a tree.UpdateTree() in the beginning of the next Layout frame. + + + + + Indicates that the layout has changed and needs to be recomputed. + This is used when is enabled. + + + + + Draws the search toolbar. + + + + + Updates the menu tree. This method is usually called automatically when needed. + + + + + Handles the keyboard menu navigation. Call this at the end of your GUI scope, to prevent the menu tree from stealing input events from other text fields. + + Returns true, if anything was changed via the keyboard. + + + + Handles the keyboard menu navigation. Call this at the end of your GUI scope, to prevent the menu tree from stealing input events from other text fields. + + Returns true, if anything was changed via the keyboard. + + + + The config used by OdinMenuTree to specify which features of the Menu Tree should be used when drawing. + + + + + Gets or sets the default menu item style. + + + + + The automatic scroll on selection changed. True by default. + + + + + Whether to draw the tree in a scrollable view. True by default. + + + + + Whether to handle keyboard navigation after it's done drawing. True by default. + + + + + Whether to draw a searchbar above the menu tree. True by default. + + + + + Whether to the menu items expanded state should be cached. True by default. + + + + + Whether to automatically set focus on the search bar when the tree is drawn for the first time. True by default. + + + + + Whether to select menu items on mouse down, or on click. False by default. + + + + + The scroll-view position. + + + + + The search term. + + + + + The height of the search toolbar. + + + + + Will only handle layouting when there has been a hierarchical change (such as an item being expanded or collapsed). + + + This expects every item to have the same height specified in the style (). + This means no custom layouting is supported with this on. + + + + + Gets or sets the search function. Null by default. + + + + + By default, the MenuTree.Selection is confirmed when menu items are double clicked, + Set this to false if you don't want that behaviour. + + + + + By default, the MenuTree.Selection is confirmed when menu items are double clicked, + Set this to false if you don't want that behaviour. + + + + + Class with utility methods for s and s. + + + + OdinMenuTree tree = new OdinMenuTree(); + tree.AddAllAssetsAtPath("Some Menu Item", "Some Asset Path", typeof(ScriptableObject), true) + .AddThumbnailIcons(); + tree.AddAssetAtPath("Some Second Menu Item", "SomeAssetPath/SomeAssetFile.asset"); + // etc... + + + + + + + + + + + Adds the menu item at the specified menu item path and populates the result list with all menu items created in order to add the menuItem at the specified path. + + The tree instance. + The result list. + The menu item path. + The menu item. + + + + Adds the menu item at specified menu item path, and returns all menu items created in order to add the menuItem at the specified path. + + The tree. + The menu item path. + The menu item. + Returns all menu items created in order to add the menu item at the specified menu item path. + + + + Gets the menu item at the specified path, returns null non was found. + + + + + Adds all asset instances from the specified path and type into a single at the specified menu item path, and returns all menu items created in order to add the menuItem at the specified path.. + + The tree. + The menu item path. + The asset folder path. + The type of objects. + Whether to search for assets in subdirectories as well. + Returns all menu items created in order to add the menu item at the specified menu item path. + + + + Adds all assets at the specified path. Each asset found gets its own menu item inside the specified menu item path. + + The tree. + The menu item path. + The asset folder path. + The type. + Whether to search for assets in subdirectories as well. + If true, sub-directories in the assetFolderPath will no longer get its own sub-menu item at the specified menu item path. + Returns all menu items created in order to add the menu item at the specified menu item path. + + + + Adds all assets at the specified path. Each asset found gets its own menu item inside the specified menu item path. + + The tree. + The menu item path. + The asset folder path. + Whether to search for assets in subdirectories as well. + If true, sub-directories in the assetFolderPath will no longer get its own sub-menu item at the specified menu item path. + Returns all menu items created in order to add the menu item at the specified menu item path. + + + + Adds the asset at the specified menu item path and returns all menu items created in order to end up at the specified menu path. + + The tree. + The menu item path. + The asset path. + Returns all menu items created in order to add the menu item at the specified menu item path. + + + + Adds the asset at the specified menu item path and returns all menu items created in order to end up at the specified menu path. + + The tree. + The menu item path. + The asset path. + The type. + Returns all menu items created in order to add the menu item at the specified menu item path. + + + + Sorts the entire tree of menu items recursively by name with respects to numbers. + + + + + Sorts the collection of menu items recursively by name with respects to numbers. This is a stable sort, meaning that equivalently ordered items will remain in the same order as they start. + + + + + Sorts the collection of menu items recursively using a given custom comparison. This is a stable sort, meaning that equivalently ordered items will remain in the same order as they start. + + + + + Adds the specified object at the specified menu item path and returns all menu items created in order to end up at the specified menu path. + + The tree. + The menu path. + The object instance. + Set this to true if you want Odin serialzied members such as dictionaries and generics to be shown as well. + Returns all menu items created in order to add the menu item at the specified menu item path. + + + + Assigns the specified icon to all menu items in the collection with the specified ObjectInstanceType. + + + + + Assigns the specified icon to all menu items in the collection with the specified ObjectInstanceType. + + + + + Assigns the specified icon to all menu items in the collection. + + + + + Assigns the specified icon to all menu items in the collection. + + + + + Assigns the specified icon to the last menu item in the collection. + + + + + Assigns the specified icon to the last menu item in the collection. + + + + + Assigns the specified icon to the last menu item in the collection. + + + + + Assigns the specified icon to the last menu item in the collection. + + + + + Assigns the specified icon to the last menu item in the collection. + + + + + Assigns the specified icon to all menu items in the collection. + + + + + Assigns the specified icon to all menu items in the collection. + + + + + Assigns the specified icon to all menu items in the collection. + + + + + Assigns the asset mini thumbnail as an icon to all menu items in the collection. If the menu items object is null then a Unity folder icon is assigned. + + + + + Assigns the asset mini thumbnail as an icon to all menu items in the collection. If the menu items object is null then a Unity folder icon is assigned. + + + + + Constants which describe the type of change that was made to the OdinMenuTrees's Selection + + + + + + A menu item was removed. + + + + + A menu item was selected. + + + + + The selection was cleared. + + + + + Handles the selection of a Odin Menu Tree with support for multi selection. + + + + + + + + + + Initializes a new instance of the class. + + if set to true [supports multi select]. + + + + Occurs whenever the selection has changed. + + + + + Occurs whenever the selection has changed. + + + + + Usually occurs whenever the user hits return, or double click a menu item. + + + + + Gets the count. + + + + + Gets the first selected value, returns null if non is selected. + + + + + Gets all selected values. + + + + + Gets or sets a value indicating whether multi selection is supported. + + + + + Gets the at the specified index. + + + + + Adds a menu item to the selection. If the menu item is already selected, then the item is pushed to the bottom of the selection list. + If multi selection is off, then the previous selected menu item is removed first. + Adding a item to the selection triggers . + + The item. + + + + Clears the selection and triggers . + + + + + Determines whether an OdinMenuItem is selected. + + + + + Copies all the elements of the current array to the specified array starting at the specified destination array index. + + + + + Gets the enumerator. + + + + + Searches for the specified menu item and returns the index location. + + + + + Removes the specified menu item and triggers . + + + + + Removes the menu item at the specified index and triggers . + + + + + Triggers OnSelectionConfirmed. + + + + + A feature-rich enum selector with support for flag enums. + + + + KeyCode someEnumValue; + + [OnInspectorGUI] + void OnInspectorGUI() + { + // Use the selector manually. See the documentation for OdinSelector for more information. + if (GUILayout.Button("Open Enum Selector")) + { + EnumSelector<KeyCode> selector = new EnumSelector<KeyCode>(); + selector.SetSelection(this.someEnumValue); + selector.SelectionConfirmed += selection => this.someEnumValue = selection.FirstOrDefault(); + selector.ShowInPopup(); // Returns the Odin Editor Window instance, in case you want to mess around with that as well. + } + + // Draw an enum dropdown field which uses the EnumSelector popup: + this.someEnumValue = EnumSelector<KeyCode>.DrawEnumField(new GUIContent("My Label"), this.someEnumValue); + } + + // All Odin Selectors can be rendered anywhere with Odin. This includes the EnumSelector. + EnumSelector<KeyCode> inlineSelector; + + [ShowInInspector] + EnumSelector<KeyCode> InlineSelector + { + get { return this.inlineSelector ?? (this.inlineSelector = new EnumSelector<KeyCode>()); } + set { } + } + + + + + + + + + + + + By default, the enum type will be drawn as the title for the selector. No title will be drawn if the string is null or empty. + + + + + Gets a value indicating whether this instance is flag enum. + + + + + Initializes a new instance of the class. + + + + + Populates the tree with all enum values. + + + + + When ShowInPopup is called, without a specified window width, this method gets called. + Here you can calculate and give a good default width for the popup. + The default implementation returns 0, which will let the popup window determine the width itself. This is usually a fixed value. + + + + + Gets the currently selected enum value. + + + + + Selects an enum. + + + + + Draws an enum selector field using the enum selector. + + + + + Draws an enum selector field using the enum selector. + + + + + Draws an enum selector field using the enum selector. + + + + + Draws an enum selector field using the enum selector. + + + + + In simple one-off use cases, making a custom OdinSelector might not be needed, as the GenericSelecor + can be populated with anything and customized a great deal. + + + + SomeType someValue; + + [OnInspectorGUI] + void OnInspectorGUI() + { + if (GUILayout.Button("Open Generic Selector Popup")) + { + List<SomeType> source = ...; + GenericSelector<SomeType> selector = new GenericSelector<SomeType>("Title", false, x => x.Path, source); + selector.SetSelection(this.someValue); + selector.SelectionTree.Config.DrawSearchToolbar = false; + selector.SelectionTree.DefaultMenuStyle.Height = 22; + selector.SelectionConfirmed += selection => this.someValue = selection.FirstOrDefault() + var window = selector.ShowInPopup(); + window.OnEndGUI += () => { EditorGUILayout.HelpBox("A quick way of injecting custom GUI to the editor window popup instance.", MessageType.Info); }; + window.OnClose += selector.SelectionTree.Selection.ConfirmSelection; // Confirm selection when window clses. + } + } + + + + + + + + + + + + Gets or sets a value indicating whether [flattened tree]. + + + + + Gets or sets a value indicating whether [checkbox toggle]. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Gets the title. No title will be drawn if the string is null or empty. + + + + + Draws the selection tree. This gets drawn using the OnInspectorGUI attribute. + + + + + Builds the selection tree. + + + + + Used in to associate name to a value in the GenericSelector. + + + + + + The value. + + + + + The name. + + + + + Initializes a new instance of the struct. + + + + + If the + + + + + OdinSelectors is an abstract base class that combines OdinMenuTrees and OdinEditorWindows to help making feature-rich selectors and popup selectors. + + + + public class MySelector : OdinSelector<SomeType> + { + private readonly List<SomeType> source; + private readonly bool supportsMultiSelect; + + public MySelector(List<SomeType> source, bool supportsMultiSelect) + { + this.source = source; + this.supportsMultiSelect = supportsMultiSelect; + } + + protected override void BuildSelectionTree(OdinMenuTree tree) + { + tree.Config.DrawSearchToolbar = true; + tree.Selection.SupportsMultiSelect = this.supportsMultiSelect; + + tree.Add("Defaults/None", null); + tree.Add("Defaults/A", new SomeType()); + tree.Add("Defaults/B", new SomeType()); + + tree.AddRange(this.source, x => x.Path, x => x.SomeTexture); + } + + [OnInspectorGUI] + private void DrawInfoAboutSelectedItem() + { + SomeType selected = this.GetCurrentSelection().FirstOrDefault(); + + if (selected != null) + { + GUILayout.Label("Name: " + selected.Name); + GUILayout.Label("Data: " + selected.Data); + } + } + } + + Usage: + + void OnGUI() + { + if (GUILayout.Button("Open My Selector")) + { + List<SomeType> source = this.GetListOfThingsToSelectFrom(); + MySelector selector = new MySelector(source, false); + + selector.SetSelection(this.someValue); + + selector.SelectionCancelled += () => { }; // Occurs when the popup window is closed, and no slection was confirmed. + selector.SelectionChanged += col => { }; + selector.SelectionConfirmed += col => this.someValue = col.FirstOrDefault(); + + selector.ShowInPopup(); // Returns the Odin Editor Window instance, in case you want to mess around with that as well. + } + } + + // All Odin Selectors can be rendered anywhere with Odin. + [ShowInInspector] + MySelector inlineSelector; + + + + + + + + + + + + If true, a confirm selection button will be drawn in the title-bar. + + + + + Enables the single click to select. + + + + + Occurs when the window is closed, and no slection was confirmed. + + + + + Occurs when the menuTrees selection is changed and IsValidSelection returns true. + + + + + Occurs when the menuTrees selection is confirmed and IsValidSelection returns true. + + + + + Gets the selection menu tree. + + + + + Gets the title. No title will be drawn if the string is null or empty. + + + + + Gets the current selection from the menu tree whether it's valid or not. + + + + + Determines whether the specified collection is a valid collection. + If false, the SlectionChanged and SelectionConfirm events will not be called. + By default, this returns true if the collection contains one or more items. + + + + + Sets the selection. + + + + + Sets the selection. + + + + + Opens up the selector instance in a popup at the specified rect position. + The width of the popup is determined by DefaultWindowWidth, and the height is automatically calculated. + + + + + Opens up the selector instance in a popup at the specified rect position. + + + + + Opens up the selector instance in a popup at the specified rect position. + + + + + The mouse position is used as the position for the window. + Opens up the selector instance in a popup at the specified position. + + + + + Opens up the selector instance in a popup at the specified position. + + + + + Opens up the selector instance in a popup at the specified rect position. + + + + + Opens up the selector instance in a popup at the specified position. + The width of the popup is determined by DefaultWindowWidth, and the height is automatically calculated. + + + + + Opens up the selector instance in a popup with the specified width and height. + The mouse position is used as the position for the window. + + + + + Builds the selection tree. + + + + + When ShowInPopup is called, without a specifed window width, this methods gets called. + Here you can calculate and give a good default width for the popup. + The default implementation returns 0, which will let the popup window determain the width itself. This is usually a fixed value. + + + + + Triggers the selection changed event, but only if the current selection is valid. + + + + + Draw the selecotr manually. + + + + + Draws the selection tree. This gets drawn using the OnInspectorGUI attribute. + + + + + Draws dropwdown field, that creates and binds the selector to the dropdown field. + + + + + Draws dropwdown field, that creates and binds the selector to the dropdown field. + + + + + Draws dropwdown field, that creates and binds the selector to the dropdown field. + + + + + Draws dropwdown field, that creates and binds the selector to the dropdown field. + + + + + Draws dropwdown field, that creates and binds the selector to the dropdown field. + + + + + Draws dropwdown field, that creates and binds the selector to the dropdown field. + + + + + Draws dropwdown field, that creates and binds the selector to the dropdown field. + + + + + Draws dropwdown field, that creates and binds the selector to the dropdown field. + + + + + Builds the selection tree. + + + + + 450 + + + + + Sets the selected types. + + + + The favorite state *after* toggling. + + + + Opens the Visual Designer for the specified . + + The type to display and customize in the Visual Designer. + + The opened , or null if the window could not be opened. + + + + + Opens the Visual Designer for the specified object instance. + + The object instance to display and customize in the Visual Designer. + + The opened , or null if the window could not be opened or the instance was null. + + + + + Opens the Visual Designer for the specified . + + The property to display and customize in the Visual Designer. + + The opened , or null if the window could not be opened. + + + + + The that was used in the last 'Show' call. + + + + + The key to identify who called the selector. + + + + + The id to identify who called the selector. + + + + + The current selected object. + + + + + True if is used; otherwise false. + + + + + The type of the value used in the last 'Show' call. + + + + + The base type of the value used in the last 'Show' call. + + + + + Shows a selector. + + The key used to identify who called the selector; this can be null. + The ID used to identify who called the selector; this can be 0. + The current value selected. + The base type of the 'value'. + Determines if scene objects are allowed. + Determines if null values are allowed. + The position where the selector should appear. + Thrown if the selector was opened for a case that it didn't expect. + + Either '' or '' must be set, but both can also be set for more consistent results. + + + + + Shows a selector. + + The key used to identify who called the selector; this can be null. + The ID used to identify who called the selector; this can be 0. + + Used to provide values for all parameters in the full declaration of this method. + It also allows for customization of various stages of the selector with attributes. + This also sets the . + + Determines if the default Unity Object Selector should be the one to appear. + Thrown if the selector was opened for a case that it didn't expect. + + Either '' or '' must be set, but both can also be set for more consistent results. + + + + + Shows a selector. + + The position where the selector should appear; can be . + The key used to identify who called the selector; this can be null. + The ID used to identify who called the selector; this can be 0. + + Used to provide values for all parameters in the full declaration of this method. + It also allows for customization of various stages of the selector with attributes. + This also sets the . + + Determines if the default Unity Object Selector should be the one to appear. + Thrown if the selector was opened for a case that it didn't expect. + + Either '' or '' must be set, but both can also be set for more consistent results. + + + + + Shows a selector. + + The key used to identify who called the selector; this can be null. + The ID used to identify who called the selector; this can be 0. + The current value selected. + The base type of the 'value'. + Determines if scene objects are allowed. + Determines if null values are allowed. + Used for various stages of the selector that can be customized with attributes. This also sets the . + Determines if the default Unity Object Selector should be the one to appear. + Thrown if the selector was opened for a case that it didn't expect. + + Either '' or '' must be set, but both can also be set for more consistent results. + + + + + Shows a selector. + + The key used to identify who called the selector; this can be null. + The ID used to identify who called the selector; this can be 0. + The current value selected. + The type of the 'value'. + The base type of the 'value'. + Determines if scene objects are allowed. + Determines if null values are allowed. + Used for various stages of the selector that can be customized with attributes. This also sets the . + Determines if the default Unity Object Selector should be the one to appear. + Thrown if the selector was opened for a case that it didn't expect. + + Either '' or '' must be set, but both can also be set for more consistent results. + + + + + Shows a selector. + + The position where the selector should appear; can be . + The key used to identify who called the selector; this can be null. + The ID used to identify who called the selector; this can be 0. + The current value selected. + The base type of the 'value'. + Determines if scene objects are allowed. + Determines if null values are allowed. + Used for various stages of the selector that can be customized with attributes. This also sets the . + Determines if the default Unity Object Selector should be the one to appear. + Thrown if the selector was opened for a case that it didn't expect. + + Either '' or '' must be set, but both can also be set for more consistent results. + + + + + Shows a selector. + + The position where the selector should appear; can be . + The key used to identify who called the selector; this can be null. + The ID used to identify who called the selector; this can be 0. + The current value selected. + The type of the 'value'. + The base type of the 'value'. + Determines if scene objects are allowed. + Determines if null values are allowed. + Used for various stages of the selector that can be customized with attributes. This also sets the . + Determines if the default Unity Object Selector should be the one to appear. + Thrown if the selector was opened for a case that it didn't expect. + + Either '' or '' must be set, but both can also be set for more consistent results. + + + + + If the object was changed since the last time this method was called, it returns the changed object (); otherwise, it returns the provided value. + + The current value; the value to return if no change has occurred. + The key to identify who showed the current selector. + The ID to identify who showed the current selector. + The type of object to expect as a return value. + if it was marked as changed, otherwise . + + + + Checks if the selector's object is ready to be claimed. + + The key to identify who showed the current selector. + The ID to identify who showed the current selector. + true if the selector's object () is ready to be claimed; otherwise, false. + + + + Determines whether the specified and combination match the currently open selectors. + + The key to match. + The ID to match. + true if the combination is a match; otherwise, false. + + + + Claims the current . + + The if it is ready to be claimed; otherwise, NULL with an accompanying error message. + + + + Claims the current and copies a specified amount () of instances of the . + + The number of instances to copy. + + An array of copies, where element 0 is always the original value, + if the is ready to be claimed; otherwise, NULL with an accompanying error message. + + + + + Claims the current and, if ready, assigns it to the specified . + If the is not ready to be claimed, an error message will be logged. + + The to assign the to. + + + + Context that persists across reloading and restarting Unity. + + + + + Time stamp for when the persistent context value was last used. + Used for purging unused context. + + + + + Instatiates a persistent context. + + + + + Updates the time stamp to now. + + + + + Context that persists across reloading and restarting Unity. + + The type of the context value. + + + + The value of the context. + + + + + Creates a new persistent context object. + + + + + Formats a string with the time stamp, and the value. + + + + + Helper class that provides a local copy of a . + When the local value is changed, it also changed the global value, but the global value does not change the local value. + + The type of the context value. + + + + The value of the context. + Changing this value, also changes the global context value, but the global value does not change the local value. + + + + + Creates a local context object for the provided global context. + + The global context object. + + + + Updates the local value to the current global value. + + + + + Provides context objects that still persist when Unity reloads or is restarted. + + + + + Gets a GlobalPersistentContext object for the specified key. + + The type of the first key. + The type of the value stored in the context object. + The first key. + The default value, used for when the context object is first created. + + + + Gets a GlobalPersistentContext object for the specified keys. + + The type of the first key. + The type of the second key. + The type of the value stored in the context object. + The first key. + The second key. + The default value, used for when the context object is first created. + + + + Gets a GlobalPersistentContext object for the specified keys. + + The type of the first key. + The type of the second key. + The type of the third key. + The type of the value stored in the context object. + The first key. + The second key. + The third key. + The default value, used for when the context object is first created. + + + + Gets a GlobalPersistentContext object for the specified keys. + + The type of the first key. + The type of the second key. + The type of the third key. + The type of the fourth key. + The type of the value stored in the context object. + The first key. + The second key. + The third key. + The fourth key. + The default value, used for when the context object is first created. + + + + Gets a GlobalPersistentContext object for the specified keys. + + The type of the first key. + The type of the second key. + The type of the third key. + The type of the fourth key. + The type of the fifth key. + The type of the value stored in the context object. + The first key. + The second key. + The third key. + The fourth key. + The fifth key. + The default value, used for when the context object is first created. + + + + Gets a GlobalPersistentContext object for the specified key. + Returns true when the context is first created. Otherwise false. + + The type of the first key. + The type of the value stored in the context object. + The first key. + The persistent context object. + Returns true when the context is first created. Otherwise false. + + + + Gets a GlobalPersistentContext object for the specified keys. + Returns true when the context is first created. Otherwise false. + + The type of the first key. + The type of the second key. + The type of the value stored in the context object. + The first key. + The second key. + The persistent context object. + Returns true when the context is first created. Otherwise false. + + + + Gets a GlobalPersistentContext object for the specified keys. + Returns true when the context is first created. Otherwise false. + + The type of the first key. + The type of the second key. + The type of the third key. + The type of the value stored in the context object. + The first key. + The second key. + The third key. + The persistent context object. + Returns true when the context is first created. Otherwise false. + + + + Gets a GlobalPersistentContext object for the specified keys. + Returns true when the context is first created. Otherwise false. + + The type of the first key. + The type of the second key. + The type of the third key. + The type of the fourth key. + The type of the value stored in the context object. + The first key. + The second key. + The third key. + The fourth key. + The persistent context object. + Returns true when the context is first created. Otherwise false. + + + + Gets a GlobalPersistentContext object for the specified keys. + Returns true when the context is first created. Otherwise false. + + The type of the first key. + The type of the second key. + The type of the third key. + The type of the fourth key. + The type of the fifth key. + The type of the value stored in the context object. + The first key. + The second key. + The third key. + The fourth key. + The fifth key. + The persistent context object. + Returns true when the context is first created. Otherwise false. + + + + Gets a LocalPersistentContext object for the specified key. + + The type of the first key. + The type of the value stored in the context object. + The first key. + The default value, used for when the context object is first created. + + + + Gets a LocalPersistentContext object for the specified keys. + + The type of the first key. + The type of the second key. + The type of the value stored in the context object. + The first key. + The second key. + The default value, used for when the context object is first created. + + + + Gets a LocalPersistentContext object for the specified keys. + + The type of the first key. + The type of the second key. + The type of the third key. + The type of the value stored in the context object. + The first key. + The second key. + The third key. + The default value, used for when the context object is first created. + + + + Gets a LocalPersistentContext object for the specified keys. + + The type of the first key. + The type of the second key. + The type of the third key. + The type of the fourth key. + The type of the value stored in the context object. + The first key. + The second key. + The third key. + The fourth key. + The default value, used for when the context object is first created. + + + + Gets a LocalPersistentContext object for the specified keys. + + The type of the first key. + The type of the second key. + The type of the third key. + The type of the fourth key. + The type of the fifth key. + The type of the value stored in the context object. + The first key. + The second key. + The third key. + The fourth key. + The fifth key. + The default value, used for when the context object is first created. + + + + Gets a LocalPersistentContext object for the specified key. + Returns true when the context is first created. Otherwise false. + + The type of the first key. + The type of the value stored in the context object. + The first key. + The persistent context object. + Returns true when the context is first created. Otherwise false. + + + + Gets a LocalPersistentContext object for the specified keys. + Returns true when the context is first created. Otherwise false. + + The type of the first key. + The type of the second key. + The type of the value stored in the context object. + The first key. + The second key. + The persistent context object. + Returns true when the context is first created. Otherwise false. + + + + Gets a LocalPersistentContext object for the specified keys. + Returns true when the context is first created. Otherwise false. + + The type of the first key. + The type of the second key. + The type of the third key. + The type of the value stored in the context object. + The first key. + The second key. + The third key. + The persistent context object. + Returns true when the context is first created. Otherwise false. + + + + Gets a LocalPersistentContext object for the specified keys. + Returns true when the context is first created. Otherwise false. + + The type of the first key. + The type of the second key. + The type of the third key. + The type of the fourth key. + The type of the value stored in the context object. + The first key. + The second key. + The third key. + The fourth key. + The persistent context object. + Returns true when the context is first created. Otherwise false. + + + + Gets a LocalPersistentContext object for the specified keys. + Returns true when the context is first created. Otherwise false. + + The type of the first key. + The type of the second key. + The type of the third key. + The type of the fourth key. + The type of the fifth key. + The type of the value stored in the context object. + The first key. + The second key. + The third key. + The fourth key. + The fifth key. + The persistent context object. + Returns true when the context is first created. Otherwise false. + + + + Persistent Context cache object. + + + + + Estimated cache size in bytes. + + + + + The current number of context entries in the cache. + + + + + If true then persistent context is disabled entirely. + + + + + If true the context will be saved to a file in the temp directory. + + + + + The max size of the cache in bytes. + + + + + Delete the persistent cache file. + + + + + Put this attribute on a validator class to prevent the ValidatorDrawer from running that validator in the inspector. + Typically you would use this for a validation-related attribute that has its own, complex custom drawer that should + handle the validation and error/warning drawing while the inspector is being drawn, but still needs a validator to + run for the project validation scans. + + + + + Apply this to an assembly to register validators for the validation system. + This enables locating of all relevant validator types very quickly. + + + + + + Use to initialize an empty . + + + + + This attribute can be placed on an assembly to register a value resolver creator that should be queried when a value resolver is being created. + + + + + This attribute can be placed on an assembly to register a value resolver creator that should be queried when a value resolver is being created. + + The resolver + + + + + A ValueResolver resolves a string to a value of a given type, given an InspectorProperty instance to use as context. Call to get an instance of a ValueResolver. + Value resolvers are a globally extendable system that can be hooked into and modified or changed by creating and registering a . + See Odin's tutorials for details and examples of how to use ValueResolvers. + + + + + The context of this ValueResolver, containing all of its configurations and values it needs to function. For performance and simplicity reasons, this is a single very large struct that is passed around by ref to anything that needs it. + + + + + The current error message that the resolver has, or null if there is no error message. This is a shortcut for writing "resolver.Context.ErrorMessage". + + + + + Whether there is an error message at the moment. This is a shortcut for writing "resolver.Context.ErrorMessage != null". + + + + + The type of value that this resolver instance is supposed to get. + + + + + Gets a value from the value resolver in a weakly typed manner. + + The selection index at which to get the value, in the case of multi-selection. Defaults to 0. + The value that was gotten. + + + + Draws an error message box if there is an error, and does nothing if there is no error. + + + + + Creates a new value resolver instance from a pre-built context struct, in a weakly typed fashion, though the result + is the same as using a strongly typed generic overload. This is a more advanced use that requires you to + know how the context needs to be set up before value resolution happens. However, this allows you to do more advanced + things like adjust various context values before string resolution happens. + + The pre-built context that should be used to get a resolver. + + + + Creates a new value resolver instance from a pre-built context struct. This is a more advanced use that requires you to + know how the context needs to be set up before value resolution happens. However, this allows you to do more advanced + things like adjust various context values before string resolution happens. + + The pre-built context that should be used to get a resolver. + + + + Creates a new value resolver instance in a weakly typed fashion, though the result is the same as using a strongly typed generic overload. + This is useful when you don't know at compile time which type you want to resolve. + + The type of value that the new resolver should resolve. + The property that is the context for the resolution to happen in. + The string that should be resolved to a value. + + + + Creates a new value resolver instance in a weakly typed fashion, though the result is the same as using a strongly typed generic overload. + This is useful when you don't know at compile time which type you want to resolve. + + The type of value that the new resolver should resolve. + The property that is the context for the resolution to happen in. + The string that should be resolved to a value. + The extra named args that this resolver has access to. Passing in a named arg that already exists will silently override the pre-existing named arg. + + + + Creates a new value resolver instance. + + The type of value that the new resolver should resolve. + The property that is the context for the resolution to happen in. + The string that should be resolved to a value. + + + + Creates a new value resolver instance. + + The type of value that the new resolver should resolve. + The property that is the context for the resolution to happen in. + The string that should be resolved to a value. + The extra named args that this resolver has access to. Passing in a named arg that already exists will silently override the pre-existing named arg. + + + + Creates a new value resolver instance in a weakly typed fashion, though the result is the same as using a strongly typed generic overload. + This is useful when you don't know at compile time which type you want to resolve. + + The type of value that the new resolver should resolve. + The property that is the context for the resolution to happen in. + The string that should be resolved to a value. + The value that the resolver should return if the string cannot be resolved to anything, or if there is an error in creating a resolver, or if resolution itself throws an exception. + + + + Creates a new value resolver instance in a weakly typed fashion, though the result is the same as using a strongly typed generic overload. + This is useful when you don't know at compile time which type you want to resolve. + + The type of value that the new resolver should resolve. + The property that is the context for the resolution to happen in. + The string that should be resolved to a value. + The value that the resolver should return if the string cannot be resolved to anything, or if there is an error in creating a resolver, or if resolution itself throws an exception. + The extra named args that this resolver has access to. Passing in a named arg that already exists will silently override the pre-existing named arg. + + + + Creates a new value resolver instance meant to resolve a string value in particular. This is a shorthand for creating a string resolver that has the resolved string as a fallback value. + This special case will get you the behaviour where, if you pass in a string that is not meant to be resolved in a special way, the value resolver will just pass you that string back as the result value. + + The property that is the context for the resolution to happen in. + The string that should be resolved to a value. + + + + Creates a new value resolver instance meant to resolve a string value in particular. This is a shorthand for creating a string resolver that has the resolved string as a fallback value. + This special case will get you the behaviour where, if you pass in a string that is not meant to be resolved in a special way, the value resolver will just pass you that string back as the result value. + + The property that is the context for the resolution to happen in. + The string that should be resolved to a value. + The extra named args that this resolver has access to. Passing in a named arg that already exists will silently override the pre-existing named arg. + + + + Creates a new value resolver instance. + + The type of value that the new resolver should resolve. + The property that is the context for the resolution to happen in. + The string that should be resolved to a value. + The value that the resolver should return if the string cannot be resolved to anything, or if there is an error in creating a resolver, or if resolution itself throws an exception. + + + + Creates a new value resolver instance. + + The type of value that the new resolver should resolve. + The property that is the context for the resolution to happen in. + The string that should be resolved to a value. + The value that the resolver should return if the string cannot be resolved to anything, or if there is an error in creating a resolver, or if resolution itself throws an exception. + The extra named args that this resolver has access to. Passing in a named arg that already exists will silently override the pre-existing named arg. + + + + Gets a nicely formatted string that lists all the errors in the given set of value resolvers. The returned value is null if there are no errors. + + + + + Gets a nicely formatted string that lists all the errors in the given set of value resolvers. The returned value is null if there are no errors. + + + + + Draws error boxes for all errors in the given value resolvers, or does nothing if there are no errors. This is equivalent to calling DrawError() on all resolvers passed to this method. + + + + + Draws error boxes for all errors in the given value resolvers, or does nothing if there are no errors. This is equivalent to calling DrawError() on all resolvers passed to this method. + + + + + A ValueResolver resolves a string to a value of a given type, given an InspectorProperty instance to use as context. Call to get an instance of a ValueResolver. + Value resolvers are a globally extendable system that can be hooked into and modified or changed by creating and registering a . + See Odin's tutorials for details and examples of how to use ValueResolvers. + + + + + The delegate that does the actual value resolution. You should not call this manually, but instead call . + + + + + The type of value that this resolver instance is supposed to get. Always equal to typeof(). + + + + + Gets a value from the value resolver. + + The selection index at which to get the value, in the case of multi-selection. Defaults to 0. + The value that was gotten. + + + + Gets a value from the value resolver in a weakly typed manner. + + The selection index at which to get the value, in the case of multi-selection. Defaults to 0. + The value that was gotten. + + + + This struct contains all of a ValueResolver's configurations and values it needs to function. For performance and simplicity reasons, this is a single very large struct that lives on a ValueResolver instance and is passed around by ref to anything that needs it. + + + + + The property that *provides* the context for the value resolution. This is the instance that was passed to the resolver when it was created. Note that this is different from , which is based on this value, but almost always isn't the same InspectorProperty instance. + + + + + The error message, if a valid value resolution wasn't found, or if creation of the value resolver failed because was invalid, or if value resolution was run but threw an exception. (In this last case, will be true.) + + + + + The named values that are available to the value resolver. Use this field only to get and set named values - once the ValueResolver has been created, new named values will have no effect. + + + + + This is the fallback value that the value resolver will return if there is an error or failed resolution for any reason. + + + + + Whether there is a fallback value. This boolean exists because then null is also a valid fallback value. This boolean will always be true if an overload is used that takes a fallback value parameter. + + + + + This will be true if is not null and the message was caused by an exception thrown by code invoked during an actual value resolution. + + + + + Whether exceptions thrown during value resolution should be logged to the console. + + + + + The type of value that the resolver is resolving. + + + + + The string that is resolved to get a value. + + + + + Whether the value resolver should sync ref parameters of invoked methods with named values. If this is true, then if a ref or out parameter value is changed during value resolution, the named value associated with that parameter will also be changed to the same value. + + + + + Whether this context has been resolved. + + + + + The type that is the parent of the value resolution, ie, the type that is the context. This is the same as .ValueEntry.TypeOfValue. + + + + + The property that *is* the context for the value resolution. This is not the instance that was passed to the resolver when it was created, but this value is based on that instance. This is the property that provides the actual context - for example, if is for a member of a type - or for an element in a collection contained by a member - this value will be the parent property for the type that contains that member. Only if is the tree's root property is the same as . + + + + + Gets the parent value which provides the context of the resolver. + + The selection index of the parent value to get. + + + + Sets the parent value which provides the context of the resolver. + + The selection index of the parent value to set. + The value to set. + + + + Adds the default named values of "property" and "value" to the context's named values. + This method is usually automatically invoked when a resolver is created, so there + is no need to invoke it manually. + + + + + Opens a window which displays a list of all icons available from . + + + + + Opens a window which displays a list of all icons available from . + + + + + Builds the selection tree. + + + + + Gets a texture of an odin bg symbol. + + + + + Adds menu items to the Unity Editor, draws the About window, and the preference window found under Edit > Preferences > Odin Inspector. + + + + + Access the StaticInspectorWindow from Tools > Odin > Inspector > Static Inspector. + + + + + Member filter for access modifiers. + + + + + include public members. + + + + + Include Non-public members. + + + + + Include both public and non-public members. + + + + + Member filter for member types. + + + + + No members included. + + + + + Include field members. + + + + + Include property members. + + + + + Include method members. + + + + + Include group members. + + + + + Include members from the base types. + + + + + Include members marked with the Obsolete attribute. + + + + + Include all members except members marked with the Obsolete attribute. + + + + + Shows the window. + + + + + Opens a new static inspector window for the given type. + + + + + Draws the Odin Editor Window. + + + + + Draws the editor for the this.CurrentDrawingTargets[index]. + + + + + Contains references to UnityEngine.Networking types. These types have been removed in Unity 2019+, and thus may be null. + + + + + Contains configuration for generating an assembly that provides increased AOT support in Odin. + + + + + + Whether to automatically scan the project and generate an AOT dll, right before builds. This will only affect platforms that are in the list. + + + **This will only work on Unity 5.6 and higher!** + + + + + + Whether to automatically delete the generated AOT dll after a build has completed. + + + + + A list of platforms to automatically scan the project and generate an AOT dll for, right before builds. This will do nothing unless is true. + + + + + The path to the AOT folder that the AOT .dll and linker file is created in, relative to the current project folder. + + + + + Scans the entire project for types to support AOT serialization for. + + + + + Generates an AOT DLL, using the current configuration of the AOTGenerationConfig instance. + + + + + Defines the ODIN_INSPECTOR symbol. + + + + + The Odin Inspector Serialization Debugger Window. + + + + + + Opens the Serialization Debugger Window with the last debugged type. + + + + + Opens the Serialization Debugger Window and debugs the given type. + + The type to debug serialization of. + + + + Initializes the Serialization Debugger Window. + + + + diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Editor.xml.meta b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Editor.xml.meta new file mode 100644 index 00000000..9015656c --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.OdinInspector.Editor.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a4865f1ab4504ed8a368670db22f096f +timeCreated: 1488828285 +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Reflection.Editor.dll b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Reflection.Editor.dll new file mode 100644 index 00000000..391b34bd Binary files /dev/null and b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Reflection.Editor.dll differ diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Reflection.Editor.dll.meta b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Reflection.Editor.dll.meta new file mode 100644 index 00000000..5c91f298 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Reflection.Editor.dll.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 61824742f78323c439d83403f8272d41 +timeCreated: 1488828285 +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 0 + Exclude Linux: 1 + Exclude Linux64: 1 + Exclude LinuxUniversal: 1 + Exclude N3DS: 1 + Exclude OSXIntel: 1 + Exclude OSXIntel64: 1 + Exclude OSXUniversal: 1 + Exclude PS4: 1 + Exclude PSM: 1 + Exclude PSP2: 1 + Exclude SamsungTV: 1 + Exclude Tizen: 1 + Exclude WebGL: 1 + Exclude WiiU: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude WindowsStoreApps: 1 + Exclude XboxOne: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + Editor: + enabled: 1 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.Config.dll b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.Config.dll new file mode 100644 index 00000000..7d41c66a Binary files /dev/null and b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.Config.dll differ diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.Config.dll.meta b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.Config.dll.meta new file mode 100644 index 00000000..cc2b4d36 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.Config.dll.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 74721b9f0af448f5ae2e91102a1a5edd +timeCreated: 1488828285 +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 1 + settings: + Exclude Android: 0 + Exclude Editor: 0 + Exclude Linux: 0 + Exclude Linux64: 0 + Exclude LinuxUniversal: 0 + Exclude N3DS: 0 + Exclude OSXIntel: 0 + Exclude OSXIntel64: 0 + Exclude OSXUniversal: 0 + Exclude PS4: 0 + Exclude PSM: 0 + Exclude PSP2: 0 + Exclude SamsungTV: 0 + Exclude Tizen: 0 + Exclude WebGL: 0 + Exclude WiiU: 0 + Exclude Win: 0 + Exclude Win64: 0 + Exclude WindowsStoreApps: 0 + Exclude XboxOne: 0 + Exclude iOS: 0 + Exclude tvOS: 0 + Editor: + enabled: 0 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.Config.xml b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.Config.xml new file mode 100644 index 00000000..f9e16abb --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.Config.xml @@ -0,0 +1,202 @@ + + + + Sirenix.Serialization.Config + + + + + A helper class for quickly and easily defining custom loggers. + + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Specifies a data format to read and write in. + + + + + A custom packed binary format. This format is most efficient and almost allocation-free, + but its serialized data is not human-readable. + + + + + A JSON format compliant with the json specification found at "http://www.json.org/". + + This format has rather sluggish performance and allocates frightening amounts of string garbage. + + + + + A format that does not serialize to a byte stream, but to a list of data nodes in memory + which can then be serialized by Unity. + + This format is highly inefficient, and is primarily used for ensuring that Unity assets + are mergeable by individual values when saved in Unity's text format. This makes + serialized values more robust and data recovery easier in case of issues. + + This format is *not* recommended for use in builds. + + + + + Defines default loggers for serialization and deserialization. This class and all of its loggers are thread safe. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + The policy for handling errors during serialization and deserialization. + + + + + Attempts will be made to recover from errors and continue serialization. Data may become invalid. + + + + + Exceptions will be thrown when errors are logged. + + + + + Exceptions will be thrown when warnings or errors are logged. + + + + + Not yet documented. + + + + + Text for the cautionary serialization warning shown in the inspector. + + + + + Text for the hide button for the cautionary serialization warning shown in the inspector. + + + + + Text for the hide button for the cautionary prefab warning shown in the inspector. + + + + + Whether the user has chosen to hide the cautionary serialization warning. + + + + + Whether the user has chosen to hide the warning messages related to the OdinSerialize attribute. + + + + + Whether the user has chosen to hide the warning messages related to the SerializeField and ShowInInspector attributes on non-serialized members. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Implements methods for logging warnings, errors and exceptions during serialization and deserialization. + + + + + Logs a warning. + + The warning to log. + + + + Logs an error. + + The error to log. + + + + Logs an exception. + + The exception to log. + + + + The policy for which level of logging to do during serialization and deserialization. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.Config.xml.meta b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.Config.xml.meta new file mode 100644 index 00000000..4334acc8 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.Config.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 74721b9f0af448f5ae2e91102a1a096f +timeCreated: 1488828285 +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.dll b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.dll new file mode 100644 index 00000000..26e7a4b3 Binary files /dev/null and b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.dll differ diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.dll.meta b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.dll.meta new file mode 100644 index 00000000..063427be --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.dll.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 5f3147f7af4c49739579b966c458f5e4 +timeCreated: 1488828285 +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 0 + Exclude Linux: 1 + Exclude Linux64: 1 + Exclude LinuxUniversal: 1 + Exclude N3DS: 1 + Exclude OSXIntel: 1 + Exclude OSXIntel64: 1 + Exclude OSXUniversal: 1 + Exclude PS4: 1 + Exclude PSM: 1 + Exclude PSP2: 1 + Exclude SamsungTV: 1 + Exclude Tizen: 1 + Exclude WebGL: 1 + Exclude WiiU: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude WindowsStoreApps: 1 + Exclude XboxOne: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + Editor: + enabled: 1 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.xml b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.xml new file mode 100644 index 00000000..84808d2b --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.xml @@ -0,0 +1,9864 @@ + + + + Sirenix.Serialization + + + + + Provides basic functionality and overridable abstract methods for implementing a data reader. + + If you inherit this class, it is VERY IMPORTANT that you implement each abstract method to the *exact* specifications the documentation specifies. + + + + + + + Initializes a new instance of the class. + + The base stream of the reader. + The deserialization context to use. + The stream or context is null. + Cannot read from stream. + + + + Gets the current node id. If this is less than zero, the current node has no id. + + + The current node id. + + + + + Gets the current node depth. In other words, the current count of the node stack. + + + The current node depth. + + + + + Gets the name of the current node. + + + The name of the current node. + + + + + Gets or sets the base stream of the reader. + + + The base stream of the reader. + + value + Cannot read from stream + + + + Gets the deserialization context. + + + The deserialization context. + + + + + Tries to enter a node. This will succeed if the next entry is an . + + This call MUST (eventually) be followed by a corresponding call to + + This call will change the values of the , , and properties to the correct values for the current node. + + The type of the node. This value will be null if there was no metadata, or if the reader's serialization binder failed to resolve the type name. + true if entering a node succeeded, otherwise false + + + + Exits the current node. This method will keep skipping entries using until an is reached, or the end of the stream is reached. + + This call MUST have been preceded by a corresponding call to . + + This call will change the values of the , , and to the correct values for the node that was prior to the current node. + + true if the method exited a node, false if it reached the end of the stream. + + + + Tries to enters an array node. This will succeed if the next entry is an . + + This call MUST (eventually) be followed by a corresponding call to + + This call will change the values of the , , and properties to the correct values for the current array node. + + The length of the array that was entered. + true if an array was entered, otherwise false + + + + Exits the closest array. This method will keep skipping entries using until an is reached, or the end of the stream is reached. + + This call MUST have been preceded by a corresponding call to . + + This call will change the values of the , , and to the correct values for the node that was prior to the exited array node. + + true if the method exited an array, false if it reached the end of the stream. + + + + Reads a primitive array value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The element type of the primitive array. Valid element types can be determined using . + The resulting primitive array. + true if reading a primitive array succeeded, otherwise false + + + + Peeks ahead and returns the type of the next entry in the stream. + + The name of the next entry, if it has one. + The type of the next entry. + + + + Reads an internal reference id. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The internal reference id. + true if reading the value succeeded, otherwise false + + + + Reads an external reference index. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The external reference index. + true if reading the value succeeded, otherwise false + + + + Reads an external reference guid. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The external reference guid. + true if reading the value succeeded, otherwise false + + + + Reads an external reference string. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The external reference string. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an . + + If the string of the entry is longer than 1 character, the first character of the string will be taken as the result. + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an or an . + + If the stored integer or floating point value is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an or an . + + If the stored integer or floating point value is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an or an . + + If the stored integer or floating point value is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a null value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + true if reading the value succeeded, otherwise false + + + + Skips the next entry value, unless it is an or an . If the next entry value is an or an , all of its contents will be processed, deserialized and registered in the deserialization context, so that internal reference values are not lost to entries further down the stream. + + + + + Disposes all resources and streams kept by the data reader. + + + + + Tells the reader that a new serialization session is about to begin, and that it should clear all cached values left over from any prior serialization sessions. + This method is only relevant when the same reader is used to deserialize several different, unrelated values. + + + + + Gets a dump of the data being read by the writer. The format of this dump varies, but should be useful for debugging purposes. + + + + + Peeks the current entry. + + The peeked entry. + + + + Consumes the current entry, and reads to the next one. + + The next entry. + + + + Implements functionality that is shared by both data readers and data writers. + + + + + Gets or sets the context's or writer's serialization binder. + + + The reader's or writer's serialization binder. + + + + + Gets a value indicating whether the reader or writer is in an array node. + + + true if the reader or writer is in an array node; otherwise, false. + + + + + Gets the current node depth. In other words, the current count of the node stack. + + + The current node depth. + + + + + Gets the current nodes array. The amount of nodes contained in it is stored in the property. The remainder of the array's length is buffer space. + + + The current node array. + + + + + Gets the current node, or if there is no current node. + + + The current node. + + + + + Pushes a node onto the node stack. + + The node to push. + + + + Pushes a node with the given name, id and type onto the node stack. + + The name of the node. + The id of the node. + The type of the node. + + + + Pushes an array node onto the node stack. This uses values from the current node to provide extra info about the array node. + + + + + Pops the current node off of the node stack. + + The name of the node to pop. + + There are no nodes to pop. + or + Tried to pop node with given name, but the current node's name was different. + + + + + Pops the current node if the current node is an array node. + + + + + Provides basic functionality and overridable abstract methods for implementing a data writer. + + If you inherit this class, it is VERY IMPORTANT that you implement each abstract method to the *exact* specifications the documentation specifies. + + + + + + + Initializes a new instance of the class. + + The base stream of the writer. + The serialization context to use. + The stream or context is null. + Cannot write to the stream. + + + + Gets or sets the base stream of the writer. + + + The base stream of the writer. + + value + Cannot write to stream + + + + Gets the serialization context. + + + The serialization context. + + + + + Flushes everything that has been written so far to the writer's base stream. + + + + + Writes the beginning of a reference node. + + This call MUST eventually be followed by a corresponding call to , with the same name. + + The name of the reference node. + The type of the reference node. If null, no type metadata will be written. + The id of the reference node. This id is acquired by calling . + + + + Begins a struct/value type node. This is essentially the same as a reference node, except it has no internal reference id. + + This call MUST eventually be followed by a corresponding call to , with the same name. + + The name of the struct node. + The type of the struct node. If null, no type metadata will be written. + + + + Ends the current node with the given name. If the current node has another name, an is thrown. + + The name of the node to end. This has to be the name of the current node. + + + + Begins an array node of the given length. + + The length of the array to come. + + + + Ends the current array node, if the current node is an array node. + + + + + Writes a primitive array to the stream. + + The element type of the primitive array. Valid element types can be determined using . + The primitive array to write. + + + + Writes a null value to the stream. + + The name of the value. If this is null, no name will be written. + + + + Writes an internal reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an external index reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an external guid reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an external string reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Disposes all resources and streams kept by the data writer. + + + + + Tells the writer that a new serialization session is about to begin, and that it should clear all cached values left over from any prior serialization sessions. + This method is only relevant when the same writer is used to serialize several different, unrelated values. + + + + + Gets a dump of the data currently written by the writer. The format of this dump varies, but should be useful for debugging purposes. + + + + + Reads data from a stream that has been written by a . + + + + + + Initializes a new instance of the class. + + The base stream of the reader. + The deserialization context to use. + + + + Disposes all resources kept by the data reader, except the stream, which can be reused later. + + + + + Peeks ahead and returns the type of the next entry in the stream. + + The name of the next entry, if it has one. + + The type of the next entry. + + + + + Tries to enters an array node. This will succeed if the next entry is an . + + This call MUST (eventually) be followed by a corresponding call to + This call will change the values of the , , and properties to the correct values for the current array node. + + The length of the array that was entered. + + true if an array was entered, otherwise false + + + + + Tries to enter a node. This will succeed if the next entry is an . + + This call MUST (eventually) be followed by a corresponding call to + This call will change the values of the , , and properties to the correct values for the current node. + + The type of the node. This value will be null if there was no metadata, or if the reader's serialization binder failed to resolve the type name. + + true if entering a node succeeded, otherwise false + + + + + Exits the closest array. This method will keep skipping entries using until an is reached, or the end of the stream is reached. + + This call MUST have been preceded by a corresponding call to . + + This call will change the values of the , , and to the correct values for the node that was prior to the exited array node. + + + true if the method exited an array, false if it reached the end of the stream. + + + + + Exits the current node. This method will keep skipping entries using until an is reached, or the end of the stream is reached. + + This call MUST have been preceded by a corresponding call to . + + This call will change the values of the , , and to the correct values for the node that was prior to the current node. + + + true if the method exited a node, false if it reached the end of the stream. + + + + + Reads a primitive array value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The element type of the primitive array. Valid element types can be determined using . + The resulting primitive array. + + true if reading a primitive array succeeded, otherwise false + + Type + typeof(T).Name + is not a valid primitive array type. + + + + Reads a value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an . + + If the string of the entry is longer than 1 character, the first character of the string will be taken as the result. + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an or an . + + If the stored integer or floating point value is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an or an . + + If the stored integer or floating point value is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an or an . + + If the stored integer or floating point value is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads an external reference guid. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The external reference guid. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads an external reference index. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The external reference index. + + true if reading the value succeeded, otherwise false + + + + + Reads an external reference string. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The external reference string. + + true if reading the value succeeded, otherwise false + + + + + Reads a null value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + + true if reading the value succeeded, otherwise false + + + + + Reads an internal reference id. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The internal reference id. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Tells the reader that a new serialization session is about to begin, and that it should clear all cached values left over from any prior serialization sessions. + This method is only relevant when the same reader is used to deserialize several different, unrelated values. + + + + + Peeks the current entry. + + The peeked entry. + + + + Consumes the current entry, and reads to the next one. + + The next entry. + + + + Writes data to a stream that can be read by a . + + + + + + Initializes a new instance of the class. + + The base stream of the writer. + The serialization context to use. + + + + Begins an array node of the given length. + + The length of the array to come. + + + + Writes the beginning of a reference node. + + This call MUST eventually be followed by a corresponding call to , with the same name. + + The name of the reference node. + The type of the reference node. If null, no type metadata will be written. + The id of the reference node. This id is acquired by calling . + + + + Begins a struct/value type node. This is essentially the same as a reference node, except it has no internal reference id. + + This call MUST eventually be followed by a corresponding call to , with the same name. + + The name of the struct node. + The type of the struct node. If null, no type metadata will be written. + + + + Disposes all resources kept by the data writer, except the stream, which can be reused later. + + + + + Ends the current array node, if the current node is an array node. + + + + + Ends the current node with the given name. If the current node has another name, an is thrown. + + The name of the node to end. This has to be the name of the current node. + + + + Writes a primitive array to the stream. + + The element type of the primitive array. Valid element types can be determined using . + The primitive array to write. + Type + typeof(T).Name + is not a valid primitive array type. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an external guid reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an external index reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an external string reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a null value to the stream. + + The name of the value. If this is null, no name will be written. + + + + Writes an internal reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Tells the writer that a new serialization session is about to begin, and that it should clear all cached values left over from any prior serialization sessions. + This method is only relevant when the same writer is used to serialize several different, unrelated values. + + + + + Entry types in the binary format written by . + + + + + An invalid entry. + + + + + Entry denoting a named start of a reference node. + + + + + Entry denoting an unnamed start of a reference node. + + + + + Entry denoting a named start of a struct node. + + + + + Entry denoting an unnamed start of a struct node. + + + + + Entry denoting an end of node. + + + + + Entry denoting the start of an array. + + + + + Entry denoting the end of an array. + + + + + Entry denoting a primitive array. + + + + + Entry denoting a named internal reference. + + + + + Entry denoting an unnamed internal reference. + + + + + Entry denoting a named external reference by index. + + + + + Entry denoting an unnamed external reference by index. + + + + + Entry denoting a named external reference by guid. + + + + + Entry denoting an unnamed external reference by guid. + + + + + Entry denoting a named sbyte. + + + + + Entry denoting an unnamed sbyte. + + + + + Entry denoting a named byte. + + + + + Entry denoting an unnamed byte. + + + + + Entry denoting a named short. + + + + + Entry denoting an unnamed short. + + + + + Entry denoting a named ushort. + + + + + Entry denoting an unnamed ushort. + + + + + Entry denoting a named int. + + + + + Entry denoting an unnamed int. + + + + + Entry denoting a named uint. + + + + + Entry denoting an unnamed uint. + + + + + Entry denoting a named long. + + + + + Entry denoting an unnamed long. + + + + + Entry denoting a named ulong. + + + + + Entry denoting an unnamed ulong. + + + + + Entry denoting a named float. + + + + + Entry denoting an unnamed float. + + + + + Entry denoting a named double. + + + + + Entry denoting an unnamed double. + + + + + Entry denoting a named decimal. + + + + + Entry denoting an unnamed decimal. + + + + + Entry denoting a named char. + + + + + Entry denoting an unnamed char. + + + + + Entry denoting a named string. + + + + + Entry denoting an unnamed string. + + + + + Entry denoting a named guid. + + + + + Entry denoting an unnamed guid. + + + + + Entry denoting a named boolean. + + + + + Entry denoting an unnamed boolean. + + + + + Entry denoting a named null. + + + + + Entry denoting an unnamed null. + + + + + Entry denoting a type name. + + + + + Entry denoting a type id. + + + + + Entry denoting that the end of the stream has been reached. + + + + + Entry denoting a named external reference by string. + + + + + Entry denoting an unnamed external reference by string. + + + + + Provides a set of methods for reading data stored in a format written by a corresponding class. + + If you implement this interface, it is VERY IMPORTANT that you implement each method to the *exact* specifications the documentation specifies. + + It is strongly recommended to inherit from the class if you wish to implement a new data reader. + + + + + + Gets or sets the reader's serialization binder. + + + The reader's serialization binder. + + + + + Gets or sets the base stream of the reader. + + + The base stream of the reader. + + + + + Gets a value indicating whether the reader is in an array node. + + + true if the reader is in an array node; otherwise, false. + + + + + Gets the name of the current node. + + + The name of the current node. + + + + + Gets the current node id. If this is less than zero, the current node has no id. + + + The current node id. + + + + + Gets the current node depth. In other words, the current count of the node stack. + + + The current node depth. + + + + + Gets the deserialization context. + + + The deserialization context. + + + + + Gets a dump of the data being read by the writer. The format of this dump varies, but should be useful for debugging purposes. + + + + + Tries to enter a node. This will succeed if the next entry is an . + + This call MUST (eventually) be followed by a corresponding call to + + This call will change the values of the , , and properties to the correct values for the current node. + + The type of the node. This value will be null if there was no metadata, or if the reader's serialization binder failed to resolve the type name. + true if entering a node succeeded, otherwise false + + + + Exits the current node. This method will keep skipping entries using until an is reached, or the end of the stream is reached. + + This call MUST have been preceded by a corresponding call to . + + This call will change the values of the , , and to the correct values for the node that was prior to the current node. + + true if the method exited a node, false if it reached the end of the stream. + + + + Tries to enters an array node. This will succeed if the next entry is an . + + This call MUST (eventually) be followed by a corresponding call to + + This call will change the values of the , , and properties to the correct values for the current array node. + + The length of the array that was entered. + true if an array was entered, otherwise false + + + + Exits the closest array. This method will keep skipping entries using until an is reached, or the end of the stream is reached. + + This call MUST have been preceded by a corresponding call to . + + This call will change the values of the , , and to the correct values for the node that was prior to the exited array node. + + true if the method exited an array, false if it reached the end of the stream. + + + + Reads a primitive array value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The element type of the primitive array. Valid element types can be determined using . + The resulting primitive array. + true if reading a primitive array succeeded, otherwise false + + + + Peeks ahead and returns the type of the next entry in the stream. + + The name of the next entry, if it has one. + The type of the next entry. + + + + Reads an internal reference id. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The internal reference id. + true if reading the value succeeded, otherwise false + + + + Reads an external reference index. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The external reference index. + true if reading the value succeeded, otherwise false + + + + Reads an external reference guid. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The external reference guid. + true if reading the value succeeded, otherwise false + + + + Reads an external reference string. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The external reference string. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an . + + If the string of the entry is longer than 1 character, the first character of the string will be taken as the result. + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an or an . + + If the stored integer or floating point value is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an or an . + + If the stored integer or floating point value is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an or an . + + If the stored integer or floating point value is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + true if reading the value succeeded, otherwise false + + + + Reads a null value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + true if reading the value succeeded, otherwise false + + + + Skips the next entry value, unless it is an or an . If the next entry value is an or an , all of its contents will be processed, deserialized and registered in the deserialization context, so that internal reference values are not lost to entries further down the stream. + + + + + Tells the reader that a new serialization session is about to begin, and that it should clear all cached values left over from any prior serialization sessions. + This method is only relevant when the same reader is used to deserialize several different, unrelated values. + + + + + Provides a set of methods for reading data stored in a format that can be read by a corresponding class. + + If you implement this interface, it is VERY IMPORTANT that you implement each method to the *exact* specifications the documentation specifies. + + It is strongly recommended to inherit from the class if you wish to implement a new data writer. + + + + + + Gets or sets the reader's serialization binder. + + + The reader's serialization binder. + + + + + Gets or sets the base stream of the writer. + + + The base stream of the writer. + + + + + Gets a value indicating whether the writer is in an array node. + + + true if the writer is in an array node; otherwise, false. + + + + + Gets the serialization context. + + + The serialization context. + + + + + Gets a dump of the data currently written by the writer. The format of this dump varies, but should be useful for debugging purposes. + + + + + Flushes everything that has been written so far to the writer's base stream. + + + + + Writes the beginning of a reference node. + + This call MUST eventually be followed by a corresponding call to , with the same name. + + The name of the reference node. + The type of the reference node. If null, no type metadata will be written. + The id of the reference node. This id is acquired by calling . + + + + Begins a struct/value type node. This is essentially the same as a reference node, except it has no internal reference id. + + This call MUST eventually be followed by a corresponding call to , with the same name. + + The name of the struct node. + The type of the struct node. If null, no type metadata will be written. + + + + Ends the current node with the given name. If the current node has another name, an is thrown. + + The name of the node to end. This has to be the name of the current node. + + + + Begins an array node of the given length. + + The length of the array to come. + + + + Ends the current array node, if the current node is an array node. + + + + + Writes a primitive array to the stream. + + The element type of the primitive array. Valid element types can be determined using . + The primitive array to write. + + + + Writes a null value to the stream. + + The name of the value. If this is null, no name will be written. + + + + Writes an internal reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an external index reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an external guid reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an external string reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Tells the writer that a new serialization session is about to begin, and that it should clear all cached values left over from any prior serialization sessions. + This method is only relevant when the same writer is used to serialize several different, unrelated values. + + + + + Contains various string constants used by the , and classes. + + + + + The named of a node id entry. + + + + + The name of a type entry. + + + + + The name of a regular array length entry. + + + + + The name of a primitive array length entry. + + + + + The name of a regular array content entry. + + + + + The name of a primitive array content entry. + + + + + The beginning of the content of an internal reference entry. + + + + + The beginning of the content of an external reference by index entry. + + + + + The beginning of the content of an external reference by guid entry. + + + + + The beginning of the content of an external reference by string entry. This is an old entry using an invalid data format where the ref string is dumped inline without escaping. + + + + + The beginning of the content of an external reference by string entry. This is a new entry using the valid format where the ref string is written as an escaped string. + + + + + Reads json data from a stream that has been written by a . + + + + + + Initializes a new instance of the class. + + The base stream of the reader. + The deserialization context to use. + + + + Gets or sets the base stream of the reader. + + + The base stream of the reader. + + + + + Disposes all resources kept by the data reader, except the stream, which can be reused later. + + + + + Peeks ahead and returns the type of the next entry in the stream. + + The name of the next entry, if it has one. + + The type of the next entry. + + + + + Tries to enter a node. This will succeed if the next entry is an . + + This call MUST (eventually) be followed by a corresponding call to + This call will change the values of the , , and properties to the correct values for the current node. + + The type of the node. This value will be null if there was no metadata, or if the reader's serialization binder failed to resolve the type name. + + true if entering a node succeeded, otherwise false + + + + + Exits the current node. This method will keep skipping entries using until an is reached, or the end of the stream is reached. + + This call MUST have been preceded by a corresponding call to . + + This call will change the values of the , , and to the correct values for the node that was prior to the current node. + + + true if the method exited a node, false if it reached the end of the stream. + + + + + Tries to enters an array node. This will succeed if the next entry is an . + + This call MUST (eventually) be followed by a corresponding call to + This call will change the values of the , , and properties to the correct values for the current array node. + + The length of the array that was entered. + + true if an array was entered, otherwise false + + + + + Exits the closest array. This method will keep skipping entries using until an is reached, or the end of the stream is reached. + + This call MUST have been preceded by a corresponding call to . + + This call will change the values of the , , and to the correct values for the node that was prior to the exited array node. + + + true if the method exited an array, false if it reached the end of the stream. + + + + + Reads a primitive array value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The element type of the primitive array. Valid element types can be determined using . + The resulting primitive array. + + true if reading a primitive array succeeded, otherwise false + + Type + typeof(T).Name + is not a valid primitive array type. + + + + Reads a value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads an internal reference id. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The internal reference id. + + true if reading the value succeeded, otherwise false + + + + + Reads an external reference index. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The external reference index. + + true if reading the value succeeded, otherwise false + + + + + Reads an external reference guid. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The external reference guid. + + true if reading the value succeeded, otherwise false + + + + + Reads an external reference string. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The external reference string. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an . + + If the string of the entry is longer than 1 character, the first character of the string will be taken as the result. + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads an value. This call will succeed if the next entry is an . + + If the value of the stored integer is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an or an . + + If the stored integer or floating point value is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an or an . + + If the stored integer or floating point value is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a value. This call will succeed if the next entry is an or an . + + If the stored integer or floating point value is smaller than or larger than , the result will be default(). + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The value that has been read. + + true if reading the value succeeded, otherwise false + + + + + Reads a null value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + + true if reading the value succeeded, otherwise false + + + + + Tells the reader that a new serialization session is about to begin, and that it should clear all cached values left over from any prior serialization sessions. + This method is only relevant when the same reader is used to deserialize several different, unrelated values. + + + + + Peeks the current entry. + + The peeked entry. + + + + Consumes the current entry, and reads to the next one. + + The next entry. + + + + Writes json data to a stream that can be read by a . + + + + + + Initializes a new instance of the class. + + The base stream of the writer. + The serialization context to use.> + Whether the json should be packed, or formatted as human-readable. + + + + Gets or sets a value indicating whether the json should be packed, or formatted as human-readable. + + + true if the json should be formatted as human-readable; otherwise, false. + + + + + Whether to enable an optimization that ensures any given type name is only written once into the json stream, and thereafter kept track of by ID. + + + + + Enable the "just started" flag, causing the writer to start a new "base" json object container. + + + + + Flushes everything that has been written so far to the writer's base stream. + + + + + Writes the beginning of a reference node. + + This call MUST eventually be followed by a corresponding call to , with the same name. + + The name of the reference node. + The type of the reference node. If null, no type metadata will be written. + The id of the reference node. This id is acquired by calling . + + + + Begins a struct/value type node. This is essentially the same as a reference node, except it has no internal reference id. + + This call MUST eventually be followed by a corresponding call to , with the same name. + + The name of the struct node. + The type of the struct node. If null, no type metadata will be written. + + + + Ends the current node with the given name. If the current node has another name, an is thrown. + + The name of the node to end. This has to be the name of the current node. + + + + Begins an array node of the given length. + + The length of the array to come. + + + + Ends the current array node, if the current node is an array node. + + + + + Writes a primitive array to the stream. + + The element type of the primitive array. Valid element types can be determined using . + The primitive array to write. + Type + typeof(T).Name + is not a valid primitive array type. + array + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a null value to the stream. + + The name of the value. If this is null, no name will be written. + + + + Writes an internal reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes a value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an external index reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an external guid reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an external string reference to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Writes an value to the stream. + + The name of the value. If this is null, no name will be written. + The value to write. + + + + Disposes all resources kept by the data writer, except the stream, which can be reused later. + + + + + Tells the writer that a new serialization session is about to begin, and that it should clear all cached values left over from any prior serialization sessions. + This method is only relevant when the same writer is used to serialize several different, unrelated values. + + + + + Parses json entries from a stream. + + + + + + The current deserialization context used by the text reader. + + + + + Initializes a new instance of the class. + + The stream to parse from. + The deserialization context to use. + The stream is null. + Cannot read from the stream. + + + + Resets the reader instance's currently peeked char and emergency playback queue. + + + + + Disposes all resources kept by the text reader, except the stream, which can be reused later. + + + + + Reads to (but not past) the beginning of the next json entry, and returns the entry name, contents and type. + + The name of the entry that was parsed. + The content of the entry that was parsed. + The type of the entry that was parsed. + + + + A serialization node as used by the format. + + + + + The name of the node. + + + + + The entry type of the node. + + + + + The data contained in the node. Depending on the entry type and name, as well as nodes encountered prior to this one, the format can vary wildly. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Tries to enters an array node. This will succeed if the next entry is an . + + This call MUST (eventually) be followed by a corresponding call to + This call will change the values of the , , and properties to the correct values for the current array node. + + The length of the array that was entered. + + true if an array was entered, otherwise false + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Reads a primitive array value. This call will succeed if the next entry is an . + + If the call fails (and returns false), it will skip the current entry value, unless that entry is an or an . + + The element type of the primitive array. Valid element types can be determined using . + The resulting primitive array. + + true if reading a primitive array succeeded, otherwise false + + Type + typeof(T).Name + is not a valid primitive array type. + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Peeks the current entry. + + The peeked entry. + + + + Consumes the current entry, and reads to the next one. + + The next entry. + + + + Shared config class for and . + + + + + The string to use to separate node id's from their names. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Begins an array node of the given length. + + The length of the array to come. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Utility class for locating and caching formatters for all non-primitive types. + + + + + Editor-only event that fires whenever an emittable formatter has been located. + This event is used by the AOT formatter pre-emitter to locate types that need to have formatters pre-emitted. + + + + + Editor-only event that fires whenever a formatter has been located. + + + + + This event is invoked before everything else when a formatter is being resolved for a given type. If any invoked delegate returns a valid formatter, that formatter is used and the resolve process stops there. + + This can be used to hook into and extend the serialization system's formatter resolution logic. + + + + + Gets a formatter for the type . + + The type to get a formatter for. + The serialization policy to use if a formatter has to be emitted. If null, is used. + + A formatter for the type . + + + + + Gets a formatter for a given type. + + The type to get a formatter for. + The serialization policy to use if a formatter has to be emitted. If null, is used. + + A formatter for the given type. + + The type argument is null. + + + + Gets a formatter for a given type. + + The type to get a formatter for. + The serialization policy to use if a formatter has to be emitted. If null, is used. + Whether to allow the use of weak fallback formatters which do not implement the strongly typed , but which conversely do not need to have had AOT support generated. + + A formatter for the given type. + + The type argument is null. + + + + Formatter for all non-primitive one-dimensional arrays. + + The element type of the formatted array. + + + + + Returns null. + + + A null value. + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Custom formatter for the type . + + + + + + Returns null. + + + A null value. + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Provides common functionality for serializing and deserializing values of type , and provides automatic support for the following common serialization conventions: + + , , , , and . + + The type which can be serialized and deserialized by the formatter. + + + + + The on serializing callbacks for type . + + + + + The on serialized callbacks for type . + + + + + The on deserializing callbacks for type . + + + + + The on deserialized callbacks for type . + + + + + Whether the serialized value is a value type. + + + + + Gets the type that the formatter can serialize. + + + The type that the formatter can serialize. + + + + + Serializes a value using a specified . + + The value to serialize. + The writer to use. + + + + Deserializes a value using a specified . + + The reader to use. + + The deserialized value. + + + + + Deserializes a value of type using a specified . + + The reader to use. + + The deserialized value. + + + + + Serializes a value of type using a specified . + + The value to serialize. + The writer to use. + + + + Get an uninitialized object of type . WARNING: If you override this and return null, the object's ID will not be automatically registered and its OnDeserializing callbacks will not be automatically called, before deserialization begins. + You will have to call and immediately after creating the object yourself during deserialization. + + An uninitialized object of type . + + + + Registers the given object reference in the deserialization context. + + NOTE that this method only does anything if is not a value type. + + The value to register. + The reader which is currently being used. + + + + Invokes all methods on the object with the [OnDeserializing] attribute. + + WARNING: This method will not be called automatically if you override GetUninitializedObject and return null! You will have to call it manually after having created the object instance during deserialization. + + The value to invoke the callbacks on. + The deserialization context. + + + + Invokes all methods on the object with the [OnDeserializing] attribute. + + WARNING: This method will not be called automatically if you override GetUninitializedObject and return null! You will have to call it manually after having created the object instance during deserialization. + + The value to invoke the callbacks on. + The deserialization context. + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Provides common functionality for serializing and deserializing weakly typed values of a given type, and provides automatic support for the following common serialization conventions: + + , , , , and . + + + + + + Serializes a value using a specified . + + The value to serialize. + The writer to use. + + + + Deserializes a value using a specified . + + The reader to use. + + The deserialized value. + + + + + Registers the given object reference in the deserialization context. + + NOTE that this method only does anything if is not a value type. + + The value to register. + The reader which is currently being used. + + + + Invokes all methods on the object with the [OnDeserializing] attribute. + + WARNING: This method will not be called automatically if you override GetUninitializedObject and return null! You will have to call it manually after having created the object instance during deserialization. + + The value to invoke the callbacks on. + The deserialization context. + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Formatter for all delegate types. + + This formatter can handle anything but delegates for dynamic methods. + + + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Get an uninitialized object of type . WARNING: If you override this and return null, the object's ID will not be automatically registered and its OnDeserializing callbacks will not be automatically called, before deserialization begins. + You will have to call and immediately after creating the object yourself during deserialization. + + + An uninitialized object of type . + + + + + Emergency hack class to support serialization of types derived from dictionary + + + + + Returns null. + + + A value of null. + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Custom generic formatter for the generic type definition . + + The type of the dictionary key. + The type of the dictionary value. + + + + + Creates a new instance of . + + + + + Returns null. + + + A value of null. + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Custom Odin serialization formatter for . + + Type of primary key. + Type of secondary key. + Type of value. + + + + Creates a new instance of . + + + + + Returns null. + + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides an easy way of implementing custom formatters. + + The type which can be serialized and deserialized by the formatter. + + + + Reads through all entries in the current node one at a time, and calls for each entry. + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Calls directly. + + The value to serialize. + The writer to serialize with. + + + + Reads a data entry into the value denoted by the entry name. + + The value to read into. + The name of the entry. + The type of the entry. + The reader currently used for deserialization. + + + + Write the serialized values of a value of type . + + The value to serialize. + The writer currently used for serialization. + + + + Indicates that this formatter type has been emitted. Never put this on a type! + + + + + A formatter for empty types. It writes no data, and skips all data that is to be read, deserializing a "default" value. + + + + + Skips the entry to read. + + + + + Does nothing at all. + + + + + Utility class for emitting formatters using the namespace. + + NOTE: Some platforms do not support emitting. Check whether you can emit on the current platform using . + + + + + Used for generating unique formatter helper type names. + + + + + The name of the pre-generated assembly that contains pre-emitted formatters for use on AOT platforms where emitting is not supported. Note that this assembly is not always present. + + + + + The name of the runtime-generated assembly that contains runtime-emitted formatters for use on non-AOT platforms where emitting is supported. Note that this assembly is not always present. + + + + + Base type for all AOT-emitted formatters. + + + + + Shortcut class that makes it easier to emit empty AOT formatters. + + + + + Skips the entry to read. + + + + + Does nothing at all. + + + + + Gets an emitted formatter for a given type. + + NOTE: Some platforms do not support emitting. On such platforms, this method logs an error and returns null. Check whether you can emit on the current platform using . + + The type to emit a formatter for. + The serialization policy to use to determine which members the emitted formatter should serialize. If null, is used. + The type of the emitted formatter. + The type argument is null. + + + + Emits a formatter for a given type into a given module builder, using a given serialization policy to determine which members to serialize. + + Type to create a formatter for. + The module builder to emit a formatter into. + The serialization policy to use for creating the formatter. + The fully constructed, emitted formatter type. + + + + Utility class for the class. + + + + + Determines whether the specified type can be formatted by a . + + The following criteria are checked: type implements , type is not abstract, type is not a generic type definition, type is not an interface, type has a public parameterless constructor. + + The collection type to check. + The element type of the collection. + true if the type can be formatted by a , otherwise false + The type argument is null. + + + + Formatter for all eligible types that implement the interface , and which have no other formatters specified. + + Eligibility for formatting by this class is determined by the method. + + The type of the collection. + The type of the element. + + + + Creates a new instance of . + + + + + Gets a new object of type . + + + A new object of type . + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Gets a new object of type . + + + A new object of type . + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Custom generic formatter for the generic type definition . + + The element type of the formatted list. + + + + + Returns null. + + + A null value. + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Returns null. + + + A null value. + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Serializes and deserializes a given type. + + NOTE that if you are implementing a custom formatter and registering it using the , it is not enough to implement - you have to implement . + + + + + Gets the type that the formatter can serialize. + + + The type that the formatter can serialize. + + + + + Serializes a value using a specified . + + The value to serialize. + The writer to use. + + + + Deserializes a value using a specified . + + The reader to use. + + The deserialized value. + + + + + Serializes and deserializes a given type T. + + The type which can be serialized and deserialized by the formatter. + + + + Serializes a value of type using a specified . + + The value to serialize. + The writer to use. + + + + Deserializes a value of type using a specified . + + The reader to use. + + The deserialized value. + + + + + Custom generic formatter for the generic type definition . + + The type of the key. + The type of the value. + + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Custom generic formatter for the generic type definition . + + The element type of the formatted list. + + + + + Returns null. + + + A null value. + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Custom formatter for MethodInfo, since Unity Mono's MethodInfo ISerializable implementation will often crash if the method no longer exists upon deserialization. + + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Get an uninitialized object of type . WARNING: If you override this and return null, the object's ID will not be automatically registered and its OnDeserializing callbacks will not be automatically called, before deserialization begins. + You will have to call and immediately after creating the object yourself during deserialization. + + + An uninitialized object of type . + + + + + Minimal baseline formatter. Doesn't come with all the bells and whistles of any of the other BaseFormatter classes. + Common serialization conventions aren't automatically supported, and common deserialization callbacks are not automatically invoked. + + The type which can be serialized and deserialized by the formatter. + + + + Whether the serialized value is a value type. + + + + + Gets the type that the formatter can serialize. + + + The type that the formatter can serialize. + + + + + Deserializes a value of type using a specified . + + The reader to use. + + The deserialized value. + + + + + Serializes a value of type using a specified . + + The value to serialize. + The writer to use. + + + + Serializes a value using a specified . + + The value to serialize. + The writer to use. + + + + Deserializes a value using a specified . + + The reader to use. + + The deserialized value. + + + + + Get an uninitialized object of type . WARNING: If you override this and return null, the object's ID will not be automatically registered. + You will have to call immediately after creating the object yourself during deserialization. + + An uninitialized object of type . + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Registers the given object reference in the deserialization context. + + NOTE that this method only does anything if is not a value type. + + The value to register. + The reader which is currently being used. + + + + Whether the serialized value is a value type. + + + + + Gets the type that the formatter can serialize. + + + The type that the formatter can serialize. + + + + + Get an uninitialized object of type . WARNING: If you override this and return null, the object's ID will not be automatically registered. + You will have to call immediately after creating the object yourself during deserialization. + + An uninitialized object of type . + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Registers the given object reference in the deserialization context. + + NOTE that this method only does anything if the serialized type is not a value type. + + The value to register. + The reader which is currently being used. + + + + Formatter for all arrays with more than one dimension. + + The type of the formatted array. + The element type of the formatted array. + + + + + Returns null. + + + A null value. + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Returns null. + + + A null value. + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Formatter for all types. + + The type that is nullable. + + + + + Creates a new instance of . + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Formatter for all primitive one-dimensional arrays. + + The element type of the formatted array. This type must be an eligible primitive array type, as determined by . + + + + + Returns null. + + + A null value. + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Returns null. + + + A null value. + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom generic formatter for the generic type definition . + + The element type of the formatted queue. + + + + + Returns null. + + + A null value. + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Final fallback formatter for all types which have no other formatters. This formatter relies on reflection to work, and is thus comparatively slow and creates more garbage than a custom formatter. + + The type which can be serialized and deserialized by the formatter. + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Formatter for types that implement the interface. + + + + + + + Calls on the value to deserialize. + + + + + Calls on the value to deserialize. + + + + + Calls on the value to deserialize. + + + + + Calls on the value to deserialize. + + + + + Formatter for all types that implement the ISerializable interface. + + The type which can be serialized and deserialized by the formatter. + + + + + Get an uninitialized object of type . WARNING: If you override this and return null, the object's ID will not be automatically registered and its OnDeserializing callbacks will not be automatically called, before deserialization begins. + You will have to call and immediately after creating the object yourself during deserialization. + + + An uninitialized object of type . + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Creates and reads into a instance using a given reader and context. + + The reader to use. + + The which was read. + + + + + Writes the given using the given writer. + + The to write. + The writer to use. + + + + Get an uninitialized object of type . WARNING: If you override this and return null, the object's ID will not be automatically registered and its OnDeserializing callbacks will not be automatically called, before deserialization begins. + You will have to call and immediately after creating the object yourself during deserialization. + + + An uninitialized object of type . + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Custom generic formatter for the generic type definition and types derived from it. + + The element type of the formatted stack. + + + + + Returns null. + + + A null value. + + + + + Provides the actual implementation for deserializing a value of type . + + The uninitialized value to serialize into. This value will have been created earlier using . + The reader to deserialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Provides the actual implementation for serializing a value of type . + + The value to serialize. + The writer to serialize with. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Formatter for the type which uses the reader/writer's to bind types. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Returns null. + + null. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + + Applying this attribute to a type indicates that in the case where, when expecting to deserialize an instance of the type + or any of its derived types, but encountering an incompatible, uncastable type in the data being read, the serializer + should attempt to deserialize an instance of the expected type using the stored, possibly invalid data. + + + This is equivalent to the option, expect type-specific instead + of global. + + + + + + Use this attribute to specify that a type that implements the + interface should *always* format itself regardless of other formatters being specified. + + This means that the interface will be used to format all types derived from the type that + is decorated with this attribute, regardless of custom formatters for the derived types. + + + + + + This class gathers info about the current architecture for the purpose of determinining + the unaligned read/write capabilities that we have to work with. + + + + + This will be false on some ARM architectures, such as ARMv7. + In these cases, we will have to perform slower but safer int-by-int read/writes of data. + + Since this value will never change at runtime, performance hits from checking this + everywhere should hopefully be negligible, since branch prediction from speculative + execution will always predict it correctly. + + + + + Provides a way of claiming and releasing cached array buffers. + + The element type of the array to buffer. + + + + + Gets the total element count of the buffered array. This will always be a power of two. + + + The total element count of the buffered array. + + Cannot access a buffer while it is freed. + + + + Gets the buffered array. + + + The buffered array. + + Cannot access a buffer while it is freed. + + + + Gets a value indicating whether this buffer is free. + + + true if this buffer is free; otherwise, false. + + + + + Claims a buffer with the specified minimum capacity. Note: buffers always have a capacity equal to or larger than 256. + + The minimum capacity. + A buffer which has a capacity equal to or larger than the specified minimum capacity. + Requested size of buffer must be larger than 0. + + + + Frees the specified buffer. + + The buffer to free. + The buffer argument is null. + + + + Frees this buffer. + + + + + Frees this buffer. + + + + + Attribute indicating that a class which implements the interface somewhere in its hierarchy is a custom formatter for the type T. + + + + + + The priority of the formatter. Of all the available custom formatters, the formatter with the highest priority is always chosen. + + + + + Initializes a new instance of the class with priority 0. + + + + + Initializes a new instance of the class. + + The priority of the formatter. Of all the available custom formatters, the formatter with the highest priority is always chosen. + + + + Attribute indicating that a generic type definition class which implements the interface somewhere in its hierarchy is a custom formatter for *any variation* of the generic type definition T. + + The formatter's generic type parameters are mapped onto the serialized type's generic type parameters. + + For example, implements , where T is . + + + + + + The generic type definition of the serialized type. + + + + + Initializes a new instance of the class. + + The generic type definition of the serialized type. + The priority of the formatter. Of all the available custom formatters, the formatter with the highest priority is always chosen. + was null. + The type given in is not a generic type definition. + + + + Helper class for quickly and easily implementing the interface. + + + + + Initializes a new instance of the class. + + The policy ID. + if set to true non serializable types will be allowed. + The delegate to use for determining whether members should be serialized. + + The id argument or the shouldSerializeFunc argument was null. + + + + + Gets the identifier of the policy. This can be stored in the serialization metadata, so the policy used to serialize it can be recovered without knowing the policy at runtime. This ID should preferably be unique. + + + The identifier of the policy. + + + + + Gets a value indicating whether to allow non serializable types. (Types which are not decorated with .) + + + true if serializable types are allowed; otherwise, false. + + + + + Gets a value indicating whether a given should be serialized or not. + + The member to check. + + true if the given member should be serialized, otherwise, false. + + + + + An attribute that lets you help the DefaultSerializationBinder bind type names to types. This is useful if you're renaming a type, + that would result in data loss, and what to specify the new type name to avoid loss of data. + + + + + [assembly: OdinSerializer.BindTypeNameToType("Namespace.OldTypeName", typeof(Namespace.NewTypeName))] + //[assembly: OdinSerializer.BindTypeNameToType("Namespace.OldTypeName, OldFullAssemblyName", typeof(Namespace.NewTypeName))] + + namespace Namespace + { + public class SomeComponent : SerializedMonoBehaviour + { + public IInterface test; // Contains an instance of OldTypeName; + } + + public interface IInterface { } + + public class NewTypeName : IInterface { } + + //public class OldTypeName : IInterface { } + } + + + + + + Initializes a new instance of the class. + + Old old full type name. If it's moved to new a new assembly you must specify the old assembly name as well. See example code in the documentation. + The new type. + + + + Provides a default, catch-all implementation. This binder only includes assembly names, without versions and tokens, in order to increase compatibility. + + + + + + + Bind a type to a name. + + The type to bind. + The debug context to log to. + + The name that the type has been bound to. + + The type argument is null. + + + + Determines whether the specified type name is mapped. + + + + + Binds a name to type. + + The name of the type to bind. + The debug context to log to. + + The type that the name has been bound to, or null if the type could not be resolved. + + The typeName argument is null. + + + + The context of a given deserialization session. This class maintains all internal and external references during deserialization. + + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The streaming context to use. + + + + Initializes a new instance of the class. + + The formatter converter to use. + + + + Initializes a new instance of the class. + + The streaming context to use. + The formatter converter to use. + The formatterConverter parameter is null. + + + + Gets or sets the context's type binder. + + + The context's serialization binder. + + + + + Gets or sets the string reference resolver. + + + The string reference resolver. + + + + + Gets or sets the Guid reference resolver. + + + The Guid reference resolver. + + + + + Gets or sets the index reference resolver. + + + The index reference resolver. + + + + + Gets the streaming context. + + + The streaming context. + + + + + Gets the formatter converter. + + + The formatter converter. + + + + + Gets or sets the serialization configuration. + + + The serialization configuration. + + + + + Registers an internal reference to a given id. + + The id to register the reference with. + The reference to register. + + + + Gets an internal reference from a given id, or null if the id has not been registered. + + The id of the reference to get. + An internal reference from a given id, or null if the id has not been registered. + + + + Gets an external object reference by index, or null if the index could not be resolved. + + The index to resolve. + An external object reference by the given index, or null if the index could not be resolved. + + + + Gets an external object reference by guid, or null if the guid could not be resolved. + + The guid to resolve. + An external object reference by the given guid, or null if the guid could not be resolved. + + + + Gets an external object reference by an id string, or null if the id string could not be resolved. + + The id string to resolve. + An external object reference by an id string, or null if the id string could not be resolved. + + + + Resets the deserialization context completely to baseline status, as if its constructor has just been called. + This allows complete reuse of a deserialization context, with all of its internal reference buffers. + + + + + An entry type which is part of a stream being read by a . + + + + + Could not parse entry. + + + + + Entry is a primitive value of type string or char. + + + + + Entry is a primitive value of type guid. + + + + + Entry is a primitive value of type sbyte, byte, short, ushort, int, uint, long or ulong. + + + + + Entry is a primitive value of type float, double or decimal. + + + + + Entry is a primitive boolean value. + + + + + Entry is a null value. + + + + + Entry marks the start of a node, IE, a complex type that contains values of its own. + + + + + Entry marks the end of a node, IE, a complex type that contains values of its own. + + + + + Entry contains an ID that is a reference to a node defined previously in the stream. + + + + + Entry contains the index of an external object in the DeserializationContext. + + + + + Entry contains the guid of an external object in the DeserializationContext. + + + + + Entry marks the start of an array. + + + + + Entry marks the end of an array. + + + + + Entry marks a primitive array. + + + + + Entry indicating that the reader has reached the end of the data stream. + + + + + Entry contains the string id of an external object in the DeserializationContext. + + + + + + Causes Odin's inspector to completely ignore a given member, preventing it from even being included in an Odin PropertyTree, + and such will not cause any performance hits in the inspector. + + Note that Odin can still serialize an excluded member - it is merely ignored in the inspector itself. + + + + + Provides an array of utility methods which are commonly used by serialization formatters. + + + + + Gets a map of all serializable members on the given type. This will also properly map names extracted from and to their corresponding members. + + The type to get a map for. + The serialization policy to use. If null, is used. + A map of all serializable members on the given type. + + + + Gets an array of all serializable members on the given type. + + The type to get serializable members for. + The serialization policy to use. If null, is used. + An array of all serializable members on the given type. + + + + Creates a fake Unity null value of a given type, for the given -derived owning type. + + Unity uses these kinds of values to indicate missing object references. + + Type of the null value. + Type of the owning value. This is the value which changes the which you get. + A fake Unity null value of a given type. + The nullType or owningType parameter is null. + + The type given in the nullType parameter is not a Unity object. + or + The type given in the owningType parameter is not a Unity object. + + + + + Determines whether a given type is a primitive type to the serialization system. + + The following criteria are checked: type.IsPrimitive or type.IsEnum, or type is a , or . + + The type to check. + true if the given type is a primitive type; otherwise, false. + + + + Determines whether a given type is a primitive array type. Namely, arrays with primitive array types as elements are primitive arrays. + + The following types are primitive array types: , , , , , , , , , , , , and . + + The type to check. + true if the given type is a primitive array type; otherwise, false. + + + + Gets the type contained in the given . Currently only and is supported. + + The to get the contained type of. + The type contained in the given . + Can't get the contained type of the given type. + + + + Gets the value contained in a given . Currently only and is supported. + + The to get the value of. + The instance to get the value from. + The value contained in the given . + Can't get the value of the given type. + + + + Sets the value of a given MemberInfo. Currently only and is supported. + + The to set the value of. + The object to set the value on. + The value to set. + + Property has no setter + or + Can't set the value of the given type. + + + + + Gets an aliased version of a member, with the declaring type name included in the member name, so that there are no conflicts with private fields and properties with the same name in different classes in the same inheritance hierarchy. + + Marked internal in Odin because this method MUST NOT BE CALLED FROM ODIN'S INSPECTOR CODE. + Odin has its own version of this, and there must be no conflict. These aliases must not be + mixed into Odin's own. Use InspectorPropertyInfoUtility.GetPrivateMemberAlias instead. + + + + + Resolves external guid references to reference objects during serialization and deserialization. + + + + + Gets or sets the next resolver in the chain. + + + The next resolver in the chain. + + + + + Tries to resolve a reference from a given Guid. + + The Guid to resolve. + The resolved value. + true if the value was resolved; otherwise, false. + + + + Determines whether this resolver can reference the specified value with a Guid. + + The value to check. + The Guid which references the value. + true if the value can be referenced; otherwise, false. + + + + Resolves external index references to reference objects during serialization and deserialization. + + + + + Tries to resolve the given reference index to a reference value. + + The index to resolve. + The resolved value. + true if the index could be resolved to a value, otherwise false. + + + + Determines whether the specified value can be referenced externally via this resolver. + + The value to reference. + The index of the resolved value, if it can be referenced. + true if the reference can be resolved, otherwise false. + + + + Resolves external strings references to reference objects during serialization and deserialization. + + + + + Gets or sets the next resolver in the chain. + + + The next resolver in the chain. + + + + + Tries to resolve a reference from a given Guid. + + The to resolve. + The resolved value. + true if the value was resolved; otherwise, false. + + + + Determines whether this resolver can reference the specified value with a string. + + The value to check. + The string which references the value. + true if the value can be referenced; otherwise, false. + + + + Specifies that a type is capable of serializing itself using an and an + . + + The deserialized type instance will be created without a constructor call using the + + method if it is a reference type, otherwise it will be created using default(type). + + Use to specify that a class which implements this + interface should *always* format itself regardless of other formatters being specified. + + + + + Serializes the instance's data using the given writer. + + + + + Deserializes data into the instance using the given reader. + + + + + Defines which members to serialize and deserialize when there aren't any custom formatters for a type. + Usually, it governs the behaviour of the and classes. + + + + + Gets the identifier of the policy. This can be stored in the serialization metadata, so the policy used to serialize can be recovered upon deserialization without knowing the policy ahead of time. This ID should preferably be unique. + + + The identifier of the policy. + + + + + Gets a value indicating whether to allow non serializable types. (Types which are not decorated with .) + + + true if serializable types are allowed; otherwise, false. + + + + + Gets a value indicating whether a given should be serialized or not. + + The member to check. + true if the given member should be serialized, otherwise, false. + + + + Contains information about a node during deserialization and serialization. + + + + + An empty node. + + + + + The name of the node. + + + + + The id of the node, or -1 if the node has no id. + + + + + The type of the node, or null if the node has no type metadata. + + + + + Whether the node is an array or not. + + + + + Whether the node is an empty node. + + + + + Initializes a new instance of the struct. + + The name of the node. + The id of the node. + The type of the node. + If set to true the node is an array node. + + + + Implements the operator == between and . + + The first . + The second . + + true if the nodes were equal; otherwise, false. + + + + + Implements the operator != between and . + + The first . + The second . + + true if the nodes were not equal; otherwise, false. + + + + + Determines whether the specified , is equal to this instance. + + The to compare with this instance. + + true if the specified is equal to this instance; otherwise, false. + + + + + Returns a hash code for this instance. + + + A hash code for this instance, suitable for use in hashing algorithms and data structures like a hash table. + + + + + Indicates that an instance field or auto-property should be serialized by Odin. + + + + + + An Odin-serialized prefab modification, containing all the information necessary to apply the modification. + + + + + The type of modification to be made. + + + + + The deep reflection path at which to make the modification. + + + + + A list of all deep reflection paths in the target object where the value referenced by this modification was also located. + + + + + The modified value to set. + + + + + The new list length to set. + + + + + The dictionary keys to add. + + + + + The dictionary keys to remove. + + + + + Applies the modification to the given Object. + + + + + Types of prefab modification that can be applied. + + + + + A value has been changed at a given path. + + + + + A list length has been changed at a given path. + + + + + A dictionary has been changed at a given path. + + + + + Indicates that an instance field or auto-property was previously serialized with a different name, so that values serialized with the old name will be properly deserialized into this member. + + This does the same as Unity's FormerlySerializedAs attribute, except it can also be applied to properties. + + + + + + The former name. + + + + + Initializes a new instance of the class. + + The former name. + + + + Corresponds to the .NET class, but works only with buffers and so never allocates garbage. + + This class always writes and reads bytes in a little endian format, regardless of system architecture. + + + + + Converts a byte array into a hexadecimal string. + + + + + Converts a hexadecimal string into a byte array. + + + + + Reads two bytes from a buffer and converts them into a value. + + The buffer to read from. + The index to start reading at. + The converted value. + + + + Reads two bytes from a buffer and converts them into a value. + + The buffer to read from. + The index to start reading at. + The converted value. + + + + Reads four bytes from a buffer and converts them into an value. + + The buffer to read from. + The index to start reading at. + The converted value. + + + + Reads four bytes from a buffer and converts them into an value. + + The buffer to read from. + The index to start reading at. + The converted value. + + + + Reads eight bytes from a buffer and converts them into a value. + + The buffer to read from. + The index to start reading at. + The converted value. + + + + Reads eight bytes from a buffer and converts them into an value. + + The buffer to read from. + The index to start reading at. + The converted value. + + + + Reads four bytes from a buffer and converts them into an value. + + The buffer to read from. + The index to start reading at. + The converted value. + + + + Reads eight bytes from a buffer and converts them into an value. + + The buffer to read from. + The index to start reading at. + The converted value. + + + + Reads sixteen bytes from a buffer and converts them into a value. + + The buffer to read from. + The index to start reading at. + The converted value. + + + + Reads sixteen bytes from a buffer and converts them into a value. + + The buffer to read from. + The index to start reading at. + The converted value. + + + + Turns a value into two bytes and writes those bytes to a given buffer. + + The buffer to write to. + The index to start writing at. + The value to write. + + + + Turns an value into two bytes and writes those bytes to a given buffer. + + The buffer to write to. + The index to start writing at. + The value to write. + + + + Turns an value into four bytes and writes those bytes to a given buffer. + + The buffer to write to. + The index to start writing at. + The value to write. + + + + Turns an value into four bytes and writes those bytes to a given buffer. + + The buffer to write to. + The index to start writing at. + The value to write. + + + + Turns a value into eight bytes and writes those bytes to a given buffer. + + The buffer to write to. + The index to start writing at. + The value to write. + + + + Turns an value into eight bytes and writes those bytes to a given buffer. + + The buffer to write to. + The index to start writing at. + The value to write. + + + + Turns a value into four bytes and writes those bytes to a given buffer. + + The buffer to write to. + The index to start writing at. + The value to write. + + + + Turns a value into eight bytes and writes those bytes to a given buffer. + + The buffer to write to. + The index to start writing at. + The value to write. + + + + Turns a value into sixteen bytes and writes those bytes to a given buffer. + + The buffer to write to. + The index to start writing at. + The value to write. + + + + Turns a value into sixteen bytes and writes those bytes to a given buffer. + + The buffer to write to. + The index to start writing at. + The value to write. + + + + An exception thrown when the serialization system has encountered an issue so severe that serialization is being aborted. If this exception is caught in the serialization system somewhere, it should be rethrown. + + + + + Initializes a new instance of the class. + + The message. + + + + Initializes a new instance of the class. + + The message. + The inner exception. + + + + Defines the configuration during serialization and deserialization. This class is thread-safe. + + + + + Initializes a new instance of the class. + + + + + + Setting this member to true indicates that in the case where, when expecting to deserialize an instance of a certain type, + but encountering an incompatible, uncastable type in the data being read, the serializer should attempt to deserialize an + instance of the expected type using the stored, possibly invalid data. + + + This is equivalent to applying the attribute, except global + instead of specific to a single type. Note that if this member is set to false, individual types may still be deserialized + with invalid data if they are decorated with the attribute. + + + + + + Gets or sets the serialization policy. This value is never null; if set to null, it will default to . + + + The serialization policy. + + + + + Gets or sets the debug context. This value is never null; if set to null, a new default instance of will be created upon the next get. + + + The debug context. + + + + + Resets the configuration to a default configuration, as if the constructor had just been called. + + + + + Defines a context for debugging and logging during serialization and deserialization. This class is thread-safe. + + + + + The logger to use for logging messages. + + + + + The logging policy to use. + + + + + The error handling policy to use. + + + + + Log a warning. Depending on the logging policy and error handling policy, this message may be suppressed or result in an exception being thrown. + + + + + Log an error. Depending on the logging policy and error handling policy, this message may be suppressed or result in an exception being thrown. + + + + + Log an exception. Depending on the logging policy and error handling policy, this message may be suppressed or result in an exception being thrown. + + + + + The context of a given serialization session. This class maintains all internal and external references during serialization. + + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The streaming context to use. + + + + Initializes a new instance of the class. + + The formatter converter to use. + + + + Initializes a new instance of the class. + + The streaming context to use. + The formatter converter to use. + The formatterConverter parameter is null. + + + + Gets or sets the context's type binder. + + + The context's serialization binder. + + + + + Gets the streaming context. + + + The streaming context. + + + + + Gets the formatter converter. + + + The formatter converter. + + + + + Gets or sets the index reference resolver. + + + The index reference resolver. + + + + + Gets or sets the string reference resolver. + + + The string reference resolver. + + + + + Gets or sets the Guid reference resolver. + + + The Guid reference resolver. + + + + + Gets or sets the serialization configuration. + + + The serialization configuration. + + + + + Tries to get the id of an internally referenced object. + + The reference to get the id of. + The id that was found, or -1 if no id was found. + true if a reference was found, otherwise false. + + + + Tries to register an internal reference. Returns true if the reference was registered, otherwise, false when the reference has already been registered. + + The reference to register. + The id of the registered reference. + true if the reference was registered, otherwise, false when the reference has already been registered. + + + + Tries to register an external index reference. + + The object to reference. + The index of the referenced object. + true if the object could be referenced by index; otherwise, false. + + + + Tries to register an external guid reference. + + The object to reference. + The guid of the referenced object. + true if the object could be referenced by guid; otherwise, false. + + + + Tries to register an external string reference. + + The object to reference. + The id string of the referenced object. + true if the object could be referenced by string; otherwise, false. + + + + Resets the context's internal reference map. + + + + + Resets the serialization context completely to baseline status, as if its constructor has just been called. + This allows complete reuse of a serialization context, with all of its internal reference buffers. + + + + + Contains a set of default implementations of the interface. + + NOTE: Policies are not necessarily compatible with each other in intuitive ways. + Data serialized with the policy + will for example fail to deserialize auto-properties with , + even if only strict data is needed. + It is best to ensure that you always use the same policy for serialization and deserialization. + + This class and all of its policies are thread-safe. + + + + + Tries to get a serialization policy by its id, in case a serialization graph has the policy used for serialization stored by name. + + + + + All fields not marked with are serialized. If a field is marked with both and , then the field will be serialized. + + + + + Public fields, as well as fields or auto-properties marked with or and not marked with , are serialized. + + There are two exceptions: + 1) All fields in tuples, as well as in private nested types marked as compiler generated (e.g. lambda capture classes) are also serialized. + 2) Virtual auto-properties are never serialized. Note that properties specified by an implemented interface are automatically marked virtual by the compiler. + + + + + Only fields and auto-properties marked with or and not marked with are serialized. + + There are two exceptions: + 1) All fields in private nested types marked as compiler generated (e.g. lambda capture classes) are also serialized. + 2) Virtual auto-properties are never serialized. Note that properties specified by an implemented interface are automatically marked virtual by the compiler. + + + + + Provides an array of utility wrapper methods for easy serialization and deserialization of objects of any type. + + + + + Creates an for a given format. + + The stream to write to. + The serialization context to use. + The format to write. + + An for a given format. + + + + + + Creates an for a given format. + + The stream to read from. + The deserialization context to use. + The format to read. + + An for a given format. + + + + + + Serializes the given value using the given writer. + + The value to serialize. + The writer to use. + + + + Serializes the given value, using the given writer. + + The value to serialize. + The writer to use. + A list of the Unity objects which were referenced during serialization. + + + + Serializes the given value using the given writer. + + The type of the value to serialize. + The value to serialize. + The writer to use. + + + + Serializes the given value, using the given writer. + + The type of the value to serialize. + The value to serialize. + The writer to use. + A list of the Unity objects which were referenced during serialization. + + + + Serializes the given value to a given stream in the specified format. + + The value to serialize. + The stream to serialize to. + The format to serialize in. + The context. + + + + Serializes the given value to a given stream in the specified format. + + The value to serialize. + The stream to serialize to. + The format to serialize in. + A list of the Unity objects which were referenced during serialization. + The context. + + + + Serializes the given value to a given stream in the specified format. + + The type of the value to serialize. + The value to serialize. + The stream to serialize to. + The format to serialize in. + The context. + + + + Serializes the given value to a given stream in the specified format. + + The type of the value to serialize. + The value to serialize. + The stream to serialize to. + The format to serialize in. + A list of the Unity objects which were referenced during serialization. + The context. + + + + Serializes the given value using the specified format, and returns the result as a byte array. + + The value to serialize. + The format to use. + The context. + A byte array containing the serialized value. + + + + Serializes the given value using the specified format, and returns the result as a byte array. + + The value to serialize. + The format to use. + A list of the Unity objects which were referenced during serialization. + A byte array containing the serialized value. + + + + Serializes the given value using the specified format, and returns the result as a byte array. + + The type of the value to serialize. + The value to serialize. + The format to use. + The context to use. + A byte array containing the serialized value. + + + + Serializes the given value using the specified format and returns the result as a byte array. + + The type of the value to serialize. + The value to serialize. + The format to use. + A list of the Unity objects which were referenced during serialization. + The context to use. + A byte array containing the serialized value. + + + + Deserializes a value from the given reader. This might fail with primitive values, as they don't come with metadata. + + The reader to use. + The deserialized value. + + + + Deserializes a value from the given reader, using the given list of Unity objects for external index reference resolution. This might fail with primitive values, as they don't come with type metadata. + + The reader to use. + The list of Unity objects to use for external index reference resolution. + + The deserialized value. + + + + + Deserializes a value from the given reader. + + The type to deserialize. + The reader to use. + The deserialized value. + + + + Deserializes a value of a given type from the given reader, using the given list of Unity objects for external index reference resolution. + + The type to deserialize. + The reader to use. + The list of Unity objects to use for external index reference resolution. + + The deserialized value. + + + + + Deserializes a value from the given stream in the given format. This might fail with primitive values, as they don't come with type metadata. + + The reader to use. + The format to read. + The context. + + The deserialized value. + + + + + Deserializes a value from the given stream in the given format, using the given list of Unity objects for external index reference resolution. This might fail with primitive values, as they don't come with type metadata. + + The stream to read from. + The format to read. + The list of Unity objects to use for external index reference resolution. + The context. + + The deserialized value. + + + + + Deserializes a value of a given type from the given stream in the given format. + + The type to deserialize. + The stream to read from. + The format to read. + The context. + + The deserialized value. + + + + + Deserializes a value of a given type from the given stream in the given format, using the given list of Unity objects for external index reference resolution. + + The type to deserialize. + The stream to read from. + The format to read. + The list of Unity objects to use for external index reference resolution. + The context. + + The deserialized value. + + + + + Deserializes a value from the given byte array in the given format. This might fail with primitive values, as they don't come with type metadata. + + The bytes to deserialize from. + The format to read. + The context. + + The deserialized value. + + + + + Deserializes a value from the given byte array in the given format, using the given list of Unity objects for external index reference resolution. This might fail with primitive values, as they don't come with type metadata. + + The bytes to deserialize from. + The format to read. + The list of Unity objects to use for external index reference resolution. + + The deserialized value. + + + + + Deserializes a value of a given type from the given byte array in the given format. + + The type to deserialize. + The bytes to deserialize from. + The format to read. + The context to use. + + The deserialized value. + + + + + Deserializes a value of a given type from the given byte array in the given format, using the given list of Unity objects for external index reference resolution. + + The type to deserialize. + The bytes to deserialize from. + The format to read. + The list of Unity objects to use for external index reference resolution. + The context to use. + + The deserialized value. + + + + + Creates a deep copy of an object. Returns null if null. All Unity objects references will remain the same - they will not get copied. + Similarly, strings are not copied, nor are reflection types such as System.Type, or types derived from System.Reflection.MemberInfo, + System.Reflection.Assembly or System.Reflection.Module. + + + + + Binds types to strings during serialization, and strings to types during deserialization. + + + + + Provides a default, catch-all implementation. This binder only includes assembly names, without versions and tokens, in order to increase compatibility. + + + + + Bind a type to a name. + + The type to bind. + The debug context to log to. + The name that the type has been bound to. + + + + Binds a name to a type. + + The name of the type to bind. + The debug context to log to. + The type that the name has been bound to, or null if the type could not be resolved. + + + + Determines whether the specified type name is mapped. + + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for all complex types; IE, types which are not primitives as determined by the method. + + The type which the can serialize and deserialize. + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for all enums. + + The type of the enum to serialize and deserialize. + + + + + Reads an enum value of type . + + The reader to use. + + The value which has been read. + + + + + Writes an enum value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializes and deserializes a given type, and wraps serialization and deserialization with all the proper calls to free formatters from tedious boilerplate. + + Whenever serializing or deserializing anything, it is *strongly recommended* to use to get a proper wrapping serializer for that type. + + NOTE: This class should NOT be inherited from; it is hard-coded into the system. + + To extend the serialization system, instead create custom formatters, which are used by the class. + + + + + Editor-only event that fires whenever a serializer serializes a type. + + + + + Fires the event. + + + + + Gets a for the given value. If the value is null, it will be treated as a value of type . + + The value to get a for. + A for the given value. + + + + Gets a for type T. + + The type to get a for. + A for type T. + + + + Gets a for the given type. + + The type to get a for. + A for the given type. + The type argument is null. + + + + Reads a value weakly, casting it into object. Use this method if you don't know what type you're going to be working with at compile time. + + The reader to use. + The value which has been read. + + + + Writes a weakly typed value. Use this method if you don't know what type you're going to be working with at compile time. + + The value to write. + The writer to use. + + + + Writes a weakly typed value with a given name. Use this method if you don't know what type you're going to be working with at compile time. + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializes and deserializes the type , and wraps serialization and deserialization with all the proper calls to free formatters from tedious boilerplate. + + Whenever serializing or deserializing anything, it is *strongly recommended* to use to get a proper wrapping serializer for that type. + + NOTE: This class should NOT be inherited from; it is hard-coded into the system. + + To extend the serialization system, instead create custom formatters, which are used by the class. + + The type which the can serialize and deserialize. + + + + Reads a value of type weakly, casting it into object. Use this method if you don't know what type you're going to be working with at compile time. + + The reader to use. + + The value which has been read. + + + + + Writes a weakly typed value of type with a given name. Use this method if you don't know what type you're going to be working with at compile time. + + The name of the value to write. + The value to write. + The writer to use. + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The value to write. + The writer to use. + + + + Writes a value of type with a given name. + + The name of the value to write. + The value to write. + The writer to use. + + + + Fires the event with the T generic argument of the serializer. + + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Serializer for the type. + + + + + + Reads a value of type . + + The reader to use. + + The value which has been read. + + + + + Writes a value of type . + + The name of the value to write. + The value to write. + The writer to use. + + + + Scans the project's build scenes and resources, plus their dependencies, for serialized types to support. Progress bars are shown during the scan. + + The serialized types to support. + Whether to scan the project's build scenes. + Whether to scan all the project's asset bundles. + Whether to scan the project's preloaded assets. + Whether to scan the project's resources. + An optional list of the resource paths to scan. Only has an effect if the scanResources argument is true. All the resources will be scanned if null. + true if the scan succeeded, false if the scan failed or was cancelled + + + + Generates an AOT DLL, using the given parameters. + + + + + Not yet documented. + + Not yet documented. + + + + Not yet documented. + + + + + Not yet documented. + + Not yet documented. + Not yet documented. + + + + Not yet documented. + + Not yet documented. + Not yet documented. + + + + Not yet documented. + + Not yet documented. + Not yet documented. + Not yet documented. + + + + Provides utility methods for handling dictionary keys in the prefab modification system. + + + + + A smart comparer for dictionary keys, that uses the most appropriate available comparison method for the given key types. + + + + + Not yet documented. + + Not yet documented. + Not yet documented. + Not yet documented. + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Gets the provider identifier. + + + + + Gets the path string from key. + + The key. + + + + Gets the key from path string. + + The path string. + + + + Compares the specified x. + + The x. + The y. + + + + Not yet documented. + + + + + Gets the path string from key. + + The key. + + + + Gets the key from path string. + + The path string. + + + + Compares the specified x. + + The x. + The y. + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Dictionary key path provider for + + + + + Custom formatter for the type. + + + + + + Returns null. + + + A null value. + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + + Custom formatter for the type. + This serializes nothing and always deserializes null, + and only exists to ensure that no coroutine instances + are ever created by the serialization system, since they + will in almost all cases be invalid instances. + + + Invalid coroutine instances crash Unity instantly when + they are garbage collected. + + + + + + Gets the type that the formatter can serialize. + + + The type that the formatter can serialize. + + + + + Returns null. + + + + + Returns null. + + + + + Does nothing. + + + + + Does nothing. + + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom generic formatter for the , , and types. + + The type of UnityEvent that this formatter can serialize and deserialize. + + + + + Get an uninitialized object of type . + + + An uninitialized object of type . + + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Custom formatter for the type. + + + + + + Reads into the specified value using the specified reader. + + The value to read into. + The reader to use. + + + + Writes from the specified value using the specified writer. + + The value to write from. + The writer to use. + + + + Indicates that an Odin-serialized Unity object controls its own serialization format. Every time it is serialized, it will be asked which format to use. + + + + + Gets the format to use for serialization. + + + + + Indicates that an Odin-serialized Unity object provides its own serialization policy rather than using the default policy. + + Note that THE VALUES RETURNED BY THIS INTERFACE WILL OVERRIDE THE PARAMETERS PASSED TO and . + + + + + Indicates that an Odin-serialized Unity object supports prefab serialization. + + + + + Gets or sets the serialization data of the object. + + + + + Unity serialized data struct that contains all data needed by Odin serialization. + + + + + The name of the field. + + + + + The name of the field. + + + + + The name of the field. + + + + + The data format used by the serializer. This field will be automatically set to the format specified in the global serialization config + when the Unity object gets serialized, unless the Unity object implements the interface. + + + + + The serialized data when serializing with the Binray format. + + + + + All serialized Unity references. + + + + + Whether the object contains any serialized data. + + + + + Gets a value indicating whether the struct contains any data. + If this is false, then it could mean that Unity has not yet deserialized the struct. + + + + + The serialized data when serializing with the JSON format. + + + + + The reference to the prefab this is only populated in prefab scene instances. + + + + + All serialized Unity references. + + + + + All Odin serialized prefab modifications. + + + + + The serialized data when serializing with the Nodes format. + + + + + Resets all data. + + + + + Resolves external index references to Unity objects. + + + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class with a list of Unity objects. + + The referenced Unity objects. + + + + Gets the currently referenced Unity objects. + + A list of the currently referenced Unity objects. + + + + Sets the referenced Unity objects of the resolver to a given list, or a new list if the value is null. + + The referenced Unity objects to set, or null if a new list is required. + + + + Determines whether the specified value can be referenced externally via this resolver. + + The value to reference. + The index of the resolved value, if it can be referenced. + + true if the reference can be resolved, otherwise false. + + + + + Tries to resolve the given reference index to a reference value. + + The index to resolve. + The resolved value. + + true if the index could be resolved to a value, otherwise false. + + + + + Resets this instance. + + + + + Utility class which initializes the Sirenix serialization system to be compatible with Unity. + + + + + Initializes the Sirenix serialization system to be compatible with Unity. + + + + + Provides an array of utility wrapper methods for easy serialization and deserialization of Unity objects of any type. + Note that, during serialization, it is always assumed that we are running on Unity's main thread. Deserialization can + happen on any thread, and all API's interacting with deserialization are thread-safe. + + Note that setting the IndexReferenceResolver on contexts passed into methods on this class will have no effect, as it will always + be set to a UnityReferenceResolver. + + + + + From the new scriptable build pipeline package + + + + + Note: it is assumed that code calling this is holding the DeserializePrefabCaches_LOCK lock, and will continue to hold it while the returned hashset is being modified + + + + + Whether to always force editor mode serialization. This member only exists in the editor. + + + + + Not yet documented. + + + + + Checks whether Odin will serialize a given member. + + The member to check. + Whether to allow serialization of members that will also be serialized by Unity. + The policy that Odin should be using for serialization of the given member. If this parameter is null, it defaults to . + True if Odin will serialize the member, otherwise false. + + + + Guesses whether or not Unity will serialize a given member. This is not completely accurate. + + The member to check. + True if it is guessed that Unity will serialize the member, otherwise false. + The parameter is null. + + + + Guesses whether or not Unity will serialize a given type. This is not completely accurate. + + The type to check. + True if it is guessed that Unity will serialize the type, otherwise false. + The parameter is null. + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Creates an object with default values initialized in the style of Unity; strings will be "", classes will be instantiated recursively with default values, and so on. + + + + + In 2020.1, Unity changed EditorApplication.delayCall from a field to an event, meaning + we now have to use reflection to access it consistently across all versions of Unity. + + + + + FieldInfo method extensions. + + + + + Determines whether the specified field is an alias. + + The field to check. + + true if the specified field is an alias; otherwise, false. + + + + + Returns the original, backing field of an alias field if the field is an alias. + + The field to check. + /// if set to true an exception will be thrown if the field is not aliased. + + The field was not aliased; this only occurs if throwOnNotAliased is true. + + + + Garbage free enumerator methods. + + + + + Garbage free enumerator for lists. + + + + + Garbage free enumerator for dictionaries. + + + + + Garbage free enumator for dictionary values. + + + + + Garbage free enumerator for hashsets. + + + + + List iterator. + + + + + Creates a list iterator. + + + + + Gets the enumerator. + + + + + Gets the current value. + + + + + Moves to the next value. + + + + + Disposes the iterator. + + + + + Hashset iterator. + + + + + Creates a hashset iterator. + + + + + Gets the enumerator. + + + + + Gets the current value. + + + + + Moves to the next value. + + + + + Disposes the iterator. + + + + + Dictionary iterator. + + + + + Creates a dictionary iterator. + + + + + Gets the enumerator. + + + + + Gets the current value. + + + + + Moves to the next value. + + + + + Disposes the iterator. + + + + + Dictionary value iterator. + + + + + Creates a dictionary value iterator. + + + + + Gets the enumerator. + + + + + Gets the current value. + + + + + Moves to the next value. + + + + + Disposes the iterator. + + + + + Various LinQ extensions. + + + + + Perform an action on each item. + + The source. + The action to perform. + + + + Perform an action on each item. + + The source. + The action to perform. + + + + Add a collection to the end of another collection. + + The collection. + The collection to append. + + + + MemberInfo method extensions. + + + + + Returns true if the attribute whose type is specified by the generic argument is defined on this member + + + + + Returns true if the attribute whose type is specified by the generic argument is defined on this member + + + + + Returns the first found custom attribute of type T on this member + Returns null if none was found + + + + + Returns the first found non-inherited custom attribute of type T on this member + Returns null if none was found + + + + + Gets all attributes of the specified generic type. + + The member. + + + + Gets all attributes of the specified generic type. + + The member. + If true, specifies to also search the ancestors of element for custom attributes. + + + + Gets all attribute instances defined on a MemeberInfo. + + The member. + + + + Gets all attribute instances on a MemberInfo. + + The member. + If true, specifies to also search the ancestors of element for custom attributes. + + + + If this member is a method, returns the full method name (name + params) otherwise the member name paskal splitted + + + + + Determines whether a FieldInfo, PropertyInfo or MethodInfo is static. + + The member. + + true if the specified member is static; otherwise, false. + + + + + + Determines whether the specified member is an alias. + + The member to check. + + true if the specified member is an alias; otherwise, false. + + + + + Returns the original, backing member of an alias member if the member is an alias. + + The member to check. + /// if set to true an exception will be thrown if the member is not aliased. + + The member was not aliased; this only occurs if throwOnNotAliased is true. + + + + Various extensions for MethodInfo. + + + + + Returns the specified method's full name "methodName(argType1 arg1, argType2 arg2, etc)" + Uses the specified gauntlet to replaces type names, ex: "int" instead of "Int32" + + + + + Returns a string representing the passed method parameters names. Ex "int num, float damage, Transform target" + + + + + Returns the specified method's full name. + + + + + Tests if a method is an extension method. + + + + + Determines whether the specified method is an alias. + + The method to check. + + true if the specified method is an alias; otherwise, false. + + + + + Returns the original, backing method of an alias method if the method is an alias. + + The method to check. + /// if set to true an exception will be thrown if the method is not aliased. + + The method was not aliased; this only occurs if throwOnNotAliased is true. + + + + Determines the type of operator. + + + + + + The == operator. + + + + + The != operator. + + + + + The + operator. + + + + + The - operator. + + + + + The * operator. + + + + + The / operator. + + + + + The < operator. + + + + + The > operator. + + + + + The <= operator. + + + + + The >= operator. + + + + + The % operator. + + + + + The >> operator. + + + + + The << operator. + + + + + The & operator. + + + + + The | operator. + + + + + The ^ operator. + + + + + The ~ operator. + + + + + The && operator. + + + + + The || operator. + + + + + The ! operator. + + + + + DirectoryInfo method extensions. + + + + + Determines whether the directory has a given directory in its hierarchy of children. + + The parent directory. + The sub directory. + + + + PropertyInfo method extensions. + + + + + Determines whether a property is an auto property with a usable getter and setter. + + + + + Determines whether the specified property is an alias. + + The property to check. + + true if the specified property is an alias; otherwise, false. + + + + + Returns the original, backing property of an alias property if the property is an alias. + + The property to check. + /// if set to true an exception will be thrown if the property is not aliased. + + The property was not aliased; this only occurs if throwOnNotAliased is true. + + + + String method extensions. + + + + + Eg MY_INT_VALUE => MyIntValue + + + + + Returns true if this string is null, empty, or contains only whitespace. + + The string to check. + true if this string is null, empty, or contains only whitespace; otherwise, false. + + + + Type method extensions. + + + + + Type name alias lookup. + TypeNameAlternatives["Single"] will give you "float", "UInt16" will give you "ushort", "Boolean[]" will give you "bool[]" etc.. + + + + + Checks whether a given string is a valid CSharp identifier name. This also checks full type names including namespaces. + + The identifier to check. + + + + Determines whether a type can be casted to another type. + + From. + To. + if set to true an implicit or explicit operator must be defined on the given type. + + + + If a type can be casted to another type, this provides a function to manually convert the type. + + From. + To. + if set to true an implicit or explicit operator must be defined on the given type. + + + + If a type can be casted to another type, this provides a function to manually convert the type. + + if set to true an implicit or explicit operator must be defined on the given type. + + + + If a type can be casted to another type, this provides the method info of the method in charge of converting the type. + + From. + To. + if set to true an implicit or explicit operator must be defined on the given type. + + + + Gets an equality comparer delegate used to compare the equality of values of a given type. In order, this will be: + + 1. The == operator, if one is defined on the type. + 2. A delegate that uses , if the type implements that interface. + 3. .NET's own + + + Note that in the special case of the type , a special equality comparer is returned that only checks whether all the Quaternion components are equal. + This is because, by default, Quaternion's equality operator is broken when operating on invalid quaternions; "default(Quaternion) == default(Quaternion)" evaluates to false, and this causes a multitude of problems. + Special delegates are also returned for float and double, that consider float.NaN to be equal to float.NaN, and double.NaN to be equal to double.NaN. + + + + + Gets the first attribute of type T. Returns null in the no attribute of type T was found. + + The type. + If true, specifies to also search the ancestors of element for custom attributes. + + + + Determines whether a type implements or inherits from another type. + + The type. + To. + + + + Determines whether a type implements an open generic interface or class such as IList<> or List<>. + + Type of the candidate. + Type of the open generic type. + + + + + Determines whether a type implements an open generic interface such as IList<>. + + Type of the candidate. + Type of the open generic interface. + + Type " + openGenericInterfaceType.Name + " is not a generic type definition and an interface. + + + + Determines whether a type implements an open generic class such as List<>. + + Type of the candidate. + Type of the open generic interface. + + + + Gets the generic arguments of an inherited open generic class or interface. + + Type of the candidate. + The open generic type to get the arguments of. + + + + Gets the generic arguments of an inherited open generic class. + + Type of the candidate. + Type of the open generic class. + + + + Gets the generic arguments of an inherited open generic interface. + + Type of the candidate. + Type of the open generic interface. + + + + Gets the MethodInfo of a specific operator kind, with the given left and right operands. This overload is *far* faster than any of the other GetOperatorMethod implementations, and should be used whenever possible. + + + + + Gets the MethodInfo of a specific operator type. + + + + + Gets the MethodInfo of a specific operator type. + + + + + Gets all members from a given type, including members from all base types if the flag isn't set. + + + + + Gets all members from a given type, including members from all base types. + + + + + Gets all members of a specific type from a type, including members from all base types, if the flag isn't set. + + + + + Gets the generic type definition of an open generic base type. + + + + + Gets the generic type definition of an open generic base type. + + + + + Returns a lazy enumerable of all the base types of this type including interfaces and classes + + + + + Returns a lazy enumerable of all the base classes of this type + + + + + Used to filter out unwanted type names. Ex "int" instead of "Int32" + + + + + Returns a nicely formatted name of a type. + + + + + Returns a nicely formatted full name of a type. + + + + + Gets the name of the compilable nice. + + The type. + + + + Gets the full name of the compilable nice. + + The type. + + + + Returns the first found custom attribute of type T on this type + Returns null if none was found + + + + + Returns the first found non-inherited custom attribute of type T on this type + Returns null if none was found + + + + + Gets all attributes of type T. + + The type. + + + + Gets all attributes of type T. + + The type + If true, specifies to also search the ancestors of element for custom attributes. + + + + Returns true if the attribute whose type is specified by the generic argument is defined on this type + + + + + Returns true if the attribute whose type is specified by the generic argument is defined on this type + + + + + Determines whether a type inherits or implements another type. Also include support for open generic base types such as List<>. + + + + + + Determines whether a type inherits or implements another type. Also include support for open generic base types such as List<>. + + + + + + + Gets the number of base types between given type and baseType. + + + + + Determines whether a method has the specified parameter types. + + + + + FieldInfo will return the fieldType, propertyInfo the PropertyType, MethodInfo the return type and EventInfo will return the EventHandlerType. + + The MemberInfo. + + + + Gets the value contained in a given . Currently only and is supported. + + The to get the value of. + The instance to get the value from. + The value contained in the given . + Can't get the value of the given type. + + + + Sets the value of a given MemberInfo. Currently only and is supported. + + The to set the value of. + The object to set the value on. + The value to set. + + Property has no setter + or + Can't set the value of the given type. + + + + + Tries to infer a set of valid generic parameters for a generic type definition, given a subset of known parameters. + + The generic type definition to attempt to infer parameters for. + The inferred parameters, if inferral was successful. + The known parameters to infer from. + True if the parameters could be inferred, otherwise, false. + + genericTypeDefinition is null + or + knownParameters is null + + The genericTypeDefinition parameter must be a generic type definition. + + + + Checks whether an array of types satisfy the constraints of a given generic type definition. + If this method returns true, the given parameters can be safely used with with the given generic type definition. + + The generic type definition to check. + The parameters to check validity for. + + genericType is null + or + types is null + + The genericType parameter must be a generic type definition. + + + + Checks whether an array of types satisfy the constraints of a given generic method definition. + If this method returns true, the given parameters can be safely used with with the given generic method definition. + + The generic method definition to check. + The parameters to check validity for. + + genericType is null + or + types is null + + The genericMethod parameter must be a generic method definition. + + + + Before calling this method we must ALWAYS hold a lock on the GenericConstraintsSatisfaction_LOCK object, as that is an implicit assumption it works with. + + + + + Not yet documented. + + + + + Formats a string with the specified generic parameter constraints on any given type. Example output: where T : class + + + + + Determines whether a generic type contains the specified generic argument constraints. + + The type. + The generic argument types. + + + + Determines whether a type is a fully constructed generic type. + + + + + Determines whether a type is nullable by ensuring the type is neither a PrimitiveType, ValueType or an Enum. + + + + + Gets the enum bitmask in a ulong. + + enumType + + + + Extends various Unity classes. + + + + + Determines whether a Unity object is null or "fake null", + without ever calling Unity's own equality operators. + This method is useful for checking if a Unity object is + null, destroyed or missing at times when it is not allowed + to call Unity's own equality operators, for example when + not running on the main thread. + + The Unity object to check. + True if the object is null, missing or destroyed; otherwise false. + + + + Defines how an assembly's import settings should be configured. + + + + + Include the assembly in the build, but not in the editor. + + + + + Include the assembly in the editor, but not in the build. + + + + + Include the assembly in both the build and in the editor. + + + + + Exclude the assembly from both the build and from the editor. + + + + + Utility for correctly setting import on OdinSerializer assemblies based on platform and scripting backend. + + + + + All valid Unity BuildTarget platforms. + + + + + All valid Unity BuildTarget platforms that support Just In Time compilation. + + + + + All scripting backends that support JIT. + + + + + All API compatibility levels that support JIT. + + + + + Set the import settings on the assembly. + + The path to the assembly to configure import settings from. + The import settings to configure for the assembly at the path. + + + + Set the import settings on the assembly. + + The path to the assembly to configure import settings from. + Indicates if the assembly should be included in the build. + Indicates if the assembly should be included in the Unity editor. + + + + Gets the current scripting backend for the build from the Unity editor. This method is Unity version independent. + + + + + + Gets the current API compatibility level from the Unity Editor. This method is Unity version independent. + + + + + + Gets a value that indicates if the specified platform supports JIT. + + The platform to test. + true if the platform supports JIT; otherwise false. + + + + Gets a value that indicates if the specified scripting backend supports JIT. + + The backend to test. + true if the backend supports JIT; otherwise false. + + + + Gets a value that indicates if the specified api level supports JIT. + + The api level to test. + true if the api level supports JIT; otherwise false. + + + + Gets a value that indicates if the specified build settings supports JIT. + + The platform build setting. + The scripting backend build settting. + The api level build setting. + true if the build settings supports JIT; otherwise false. + + + + Provides an easy way of claiming and freeing cached values of any non-abstract reference type with a public parameterless constructor. + + Cached types which implement the interface will receive notifications when they are claimed and freed. + + Only one thread should be holding a given cache instance at a time if is implemented, since the invocation of + is not thread safe, IE, weird stuff might happen if multiple different threads are trying to free + the same cache instance at the same time. This will practically never happen unless you're doing really strange stuff, but the case is documented here. + + The type which is cached. + + + + + Gets or sets the maximum size of the cache. This value can never go beneath 1. + + + The maximum size of the cache. + + + + + The cached value. + + + + + Gets a value indicating whether this cached value is free. + + + true if this cached value is free; otherwise, false. + + + + + Claims a cached value of type . + + A cached value of type . + + + + Releases a cached value. + + The cached value to release. + The cached value to release is null. + + + + Performs an implicit conversion from to . + + The cache to convert. + + The result of the conversion. + + + + + Releases this cached value. + + + + + Releases this cached value. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Provides utilities for using the namespace. + + This class is due for refactoring. Use at your own peril. + + + + + Gets a value indicating whether emitting is supported on the current platform. + + + true if the current platform can emit; otherwise, false. + + + + + Creates a delegate which gets the value of a field. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The type of the field to get a value from. + The instance describing the field to create a getter for. + A delegate which gets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which gets the value of a field. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The instance describing the field to create a getter for. + A delegate which gets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which sets the value of a field. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + The type of the field to set a value to. + The instance describing the field to create a setter for. + A delegate which sets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which sets the value of a field. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + The instance describing the field to create a setter for. + A delegate which sets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which gets the value of a field. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The type of the instance to get a value from. + The type of the field to get a value from. + The instance describing the field to create a getter for. + A delegate which gets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which gets the value of a field from a weakly typed instance of a given type. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The type of the field to get a value from. + The of the instance to get a value from. + The instance describing the field to create a getter for. + A delegate which gets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which gets the weakly typed value of a field from a weakly typed instance of a given type. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The of the instance to get a value from. + The instance describing the field to create a getter for. + A delegate which gets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which sets the value of a field. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + The type of the instance to set a value on. + The type of the field to set a value to. + The instance describing the field to create a setter for. + A delegate which sets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which sets the value of a field on a weakly typed instance of a given type. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + The type of the field to set a value to. + Type of the instance. + The instance describing the field to create a setter for. + + A delegate which sets the value of the given field. + + The fieldInfo parameter is null. + Field cannot be static. + + + + Creates a delegate which sets the weakly typed value of a field on a weakly typed instance of a given type. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + Type of the instance. + The instance describing the field to create a setter for. + + A delegate which sets the value of the given field. + + The fieldInfo parameter is null. + Field cannot be static. + + + + Creates a delegate which gets the weakly typed value of a field from a weakly typed instance of a given type. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The of the instance to get a value from. + The instance describing the field to create a getter for. + A delegate which gets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which sets the weakly typed value of a property on a weakly typed instance of a given type. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + Type of the instance. + The instance describing the property to create a setter for. + + A delegate which sets the value of the given field. + + The fieldInfo parameter is null. + Property cannot be static. + + + + Creates a delegate which sets the value of a property. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + The type of the property to set a value to. + The instance describing the property to create a setter for. + A delegate which sets the value of the given property. + The propertyInfo parameter is null. + + + + Creates a delegate which gets the value of a property. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The type of the property to get a value from. + The instance describing the property to create a getter for. + A delegate which gets the value of the given property. + The propertyInfo parameter is null. + + + + Creates a delegate which sets the value of a property. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + The type of the instance to set a value on. + The type of the property to set a value to. + The instance describing the property to create a setter for. + A delegate which sets the value of the given property. + The propertyInfo parameter is null. + + + + Creates a delegate which gets the value of a property. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The type of the instance to get a value from. + The type of the property to get a value from. + The instance describing the property to create a getter for. + A delegate which gets the value of the given property. + The propertyInfo parameter is null. + + + + Creates a fast delegate method which calls a given parameterless instance method and returns the result. + + The type of the class which the method is on. + The type which is returned by the given method info. + The method info instance which is used. + A delegate which calls the method and returns the result, except it's hundreds of times faster than MethodInfo.Invoke. + + + + Creates a fast delegate method which calls a given parameterless static method. + + The method info instance which is used. + A delegate which calls the method and returns the result, except it's hundreds of times faster than MethodInfo.Invoke. + + + + Creates a fast delegate method which calls a given parameterless weakly typed instance method. + + The method info instance which is used. + A delegate which calls the method and returns the result, except it's hundreds of times faster than MethodInfo.Invoke. + + + + Not yet documented. + + + + + Creates a fast delegate method which calls a given weakly typed instance method with one argument and returns a value. + + The type of the result. + The type of the first argument. + The method info instance which is used. + + A delegate which calls the method and returns the result, except it's hundreds of times faster than MethodInfo.Invoke. + + methodInfo + + Given method ' + methodInfo.Name + ' is static when it has to be an instance method. + or + Given method ' + methodInfo.Name + ' must return type + typeof(TResult) + . + or + Given method ' + methodInfo.Name + ' must have exactly one parameter. + or + The first parameter of the method ' + methodInfo.Name + ' must be of type + typeof(TArg1) + . + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Creates a fast delegate method which calls a given parameterless instance method on a reference type. + + The type of the class which the method is on. + The method info instance which is used. + A delegate which calls the method and returns the result, except it's hundreds of times faster than MethodInfo.Invoke. + + + + Creates a fast delegate method which calls a given instance method with a given argument on a reference type. + + The type of the class which the method is on. + The type of the argument with which to call the method. + The method info instance which is used. + A delegate which calls the method and returns the result, except it's hundreds of times faster than MethodInfo.Invoke. + + + + Creates a fast delegate method which calls a given parameterless instance method. + + The type of the class which the method is on. + The method info instance which is used. + A delegate which calls the method and returns the result, except it's hundreds of times faster than MethodInfo.Invoke. + + + + Creates a fast delegate method which calls a given instance method with a given argument on a struct type. + + The type of the class which the method is on. + The type of the argument with which to call the method. + The method info instance which is used. + A delegate which calls the method and returns the result, except it's hundreds of times faster than MethodInfo.Invoke. + + + + Compares types by reference before comparing them using the default type equality operator. + This can constitute a *significant* speedup when used as the comparer for dictionaries. + + + + + + This class encapsulates common combinations. + + + + + Search criteria encompassing all public and non-public members, including base members. + Note that you also need to specify either the Instance or Static flag. + + + + + Search criteria encompassing all public instance members, including base members. + + + + + Search criteria encompassing all non-public instance members, including base members. + + + + + Search criteria encompassing all public and non-public instance members, including base members. + + + + + Search criteria encompassing all public static members, including base members. + + + + + Search criteria encompassing all non-public static members, including base members. + + + + + Search criteria encompassing all public and non-public static members, including base members. + + + + + Search criteria encompassing all public instance members, excluding base members. + + + + + Search criteria encompassing all non-public instance members, excluding base members. + + + + + Search criteria encompassing all public and non-public instance members, excluding base members. + + + + + Search criteria encompassing all public static members, excluding base members. + + + + + Search criteria encompassing all non-public static members, excluding base members. + + + + + Search criteria encompassing all public and non-public static members, excluding base members. + + + + + Search criteria encompassing all members, including base and static members. + + + + + Search criteria encompassing all members (public and non-public, instance and static), including base members. + + + + + Provides notification callbacks for values that are cached using the class. + + + + + Called when the cached value is freed. + + + + + Called when the cached value is claimed. + + + + + Interface for immutable list. + + + + + Interface for generic immutable list. + + + + + Index accessor. + + + + + Immutable list wraps another list, and allows for reading the inner list, without the ability to change it. + + + + + Creates an immutable list around another list. + + + + + Number of items in the list. + + + + + Immutable list cannot be changed directly, so it's size is always fixed. + + + + + Immutable list are always readonly. + + + + + Returns true if the inner list is synchronized. + + + + + Gets the sync root object. + + + + + Index accessor. + + Index. + + + + Returns true if the item is contained in the list. + + The item's value. + + + + Copy the list to an array, + + Target array. + Index. + + + + Copy the list to an array, + + Target array. + Index. + + + + Gets an enumerator. + + + + + Get the index of a value. + + The item's value. + + + + Immutable list cannot be edited. + + Index. + + + + Immutable list cannot be edited. + + Index. + Item. + + + + Immutable list cannot be edited. + + Item. + + + + Immutable list cannot be edited. + + + + + Immutable list cannot be edited. + + Item. + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Immutable list wraps another list, and allows for reading the inner list, without the ability to change it. + + + + + Creates an immutable list around another list. + + + + + Number of items in the list. + + + + + Immutable list are always readonly. + + + + + Index accessor. + + Index. + + + + Returns true if the item is contained in the list. + + + + + Copies the list to an array. + + + + + Gets an enumerator. + + + + + Gets the index of an item. + + + + + Provides a methods of representing imaginary fields which are unique to serialization. + + We aggregate the FieldInfo associated with this member and return a mangled form of the name. + + + + + + The default fake name separator string. + + + + + Initializes a new instance of the class. + + The field to alias. + The name prefix to use. + + + + Initializes a new instance of the class. + + The field to alias. + The name prefix to use. + The separator string to use. + + + + Gets the aliased field. + + + The aliased field. + + + + + Gets the module in which the type that declares the member represented by the current is defined. + + + + + Gets a value that identifies a metadata element. + + + + + Gets the name of the current member. + + + + + Gets the class that declares this member. + + + + + Gets the class object that was used to obtain this instance of MemberInfo. + + + + + Gets the type of the field. + + + The type of the field. + + + + + Gets a RuntimeFieldHandle, which is a handle to the internal metadata representation of a field. + + + + + Gets the attributes. + + + The attributes. + + + + + When overridden in a derived class, returns an array of all custom attributes applied to this member. + + True to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + An array that contains all the custom attributes applied to this member, or an array with zero elements if no attributes are defined. + + + + + When overridden in a derived class, returns an array of custom attributes applied to this member and identified by . + + The type of attribute to search for. Only attributes that are assignable to this type are returned. + True to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + An array of custom attributes applied to this member, or an array with zero elements if no attributes assignable to have been applied. + + + + + When overridden in a derived class, indicates whether one or more attributes of the specified type or of its derived types is applied to this member. + + The type of custom attribute to search for. The search includes derived types. + True to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + True if one or more instances of or any of its derived types is applied to this member; otherwise, false. + + + + + Gets the value of the field. + + The object instance to get the value from. + The value of the field. + + + + When overridden in a derived class, sets the value of the field supported by the given object. + + The object whose field value will be set. + The value to assign to the field. + A field of Binder that specifies the type of binding that is desired (for example, Binder.CreateInstance or Binder.ExactBinding). + A set of properties that enables the binding, coercion of argument types, and invocation of members through reflection. If is null, then Binder.DefaultBinding is used. + The software preferences of a particular culture. + + + + Provides a methods of representing aliased methods. + + In this case, what we're representing is a method on a parent class with the same name. + + We aggregate the MethodInfo associated with this member and return a mangled form of the name. + The name that we return is "parentname+methodName". + + + + + + The default fake name separator string. + + + + + Initializes a new instance of the class. + + The method to alias. + The name prefix to use. + + + + Initializes a new instance of the class. + + The method to alias. + The name prefix to use. + The separator string to use. + + + + Gets the aliased method. + + + The aliased method. + + + + + Gets the custom attributes for the return type. + + + + + Gets a handle to the internal metadata representation of a method. + + + + + Gets the attributes associated with this method. + + + + + Gets the class that declares this member. + + + + + Gets the name of the current member. + + + + + Gets the class object that was used to obtain this instance of MemberInfo. + + + + + When overridden in a derived class, returns the MethodInfo object for the method on the direct or indirect base class in which the method represented by this instance was first declared. + + + A MethodInfo object for the first implementation of this method. + + + + + When overridden in a derived class, returns an array of all custom attributes applied to this member. + + true to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + An array that contains all the custom attributes applied to this member, or an array with zero elements if no attributes are defined. + + + + + When overridden in a derived class, returns an array of custom attributes applied to this member and identified by . + + The type of attribute to search for. Only attributes that are assignable to this type are returned. + true to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + An array of custom attributes applied to this member, or an array with zero elements if no attributes assignable to have been applied. + + + + + When overridden in a derived class, returns the flags. + + + The MethodImplAttributes flags. + + + + + When overridden in a derived class, gets the parameters of the specified method or constructor. + + + An array of type ParameterInfo containing information that matches the signature of the method (or constructor) reflected by this MethodBase instance. + + + + + When overridden in a derived class, invokes the reflected method or constructor with the given parameters. + + The object on which to invoke the method or constructor. If a method is static, this argument is ignored. If a constructor is static, this argument must be null or an instance of the class that defines the constructor. + A bitmask that is a combination of 0 or more bit flags from . If is null, this parameter is assigned the value ; thus, whatever you pass in is ignored. + An object that enables the binding, coercion of argument types, invocation of members, and retrieval of MemberInfo objects via reflection. If is null, the default binder is used. + An argument list for the invoked method or constructor. This is an array of objects with the same number, order, and type as the parameters of the method or constructor to be invoked. If there are no parameters, this should be null.If the method or constructor represented by this instance takes a ByRef parameter, there is no special attribute required for that parameter in order to invoke the method or constructor using this function. Any object in this array that is not explicitly initialized with a value will contain the default value for that object type. For reference-type elements, this value is null. For value-type elements, this value is 0, 0.0, or false, depending on the specific element type. + An instance of CultureInfo used to govern the coercion of types. If this is null, the CultureInfo for the current thread is used. (This is necessary to convert a String that represents 1000 to a Double value, for example, since 1000 is represented differently by different cultures.) + + An Object containing the return value of the invoked method, or null in the case of a constructor, or null if the method's return type is void. Before calling the method or constructor, Invoke checks to see if the user has access permission and verifies that the parameters are valid.CautionElements of the array that represent parameters declared with the ref or out keyword may also be modified. + + + + + When overridden in a derived class, indicates whether one or more attributes of the specified type or of its derived types is applied to this member. + + The type of custom attribute to search for. The search includes derived types. + true to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + true if one or more instances of or any of its derived types is applied to this member; otherwise, false. + + + + + Provides a methods of representing imaginary properties which are unique to serialization. + + We aggregate the PropertyInfo associated with this member and return a mangled form of the name. + + + + + + The default fake name separator string. + + + + + Initializes a new instance of the class. + + The property to alias. + The name prefix to use. + + + + Initializes a new instance of the class. + + The property to alias. + The name prefix to use. + The separator string to use. + + + + The backing PropertyInfo that is being aliased. + + + + + Gets the module in which the type that declares the member represented by the current is defined. + + + + + Gets a value that identifies a metadata element. + + + + + Gets the name of the current member. + + + + + Gets the class that declares this member. + + + + + Gets the class object that was used to obtain this instance of MemberInfo. + + + + + Gets the type of the property. + + + The type of the property. + + + + + Gets the attributes. + + + The attributes. + + + + + Gets a value indicating whether this instance can read. + + + true if this instance can read; otherwise, false. + + + + + Gets a value indicating whether this instance can write. + + + true if this instance can write; otherwise, false. + + + + + When overridden in a derived class, returns an array of all custom attributes applied to this member. + + True to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + An array that contains all the custom attributes applied to this member, or an array with zero elements if no attributes are defined. + + + + + When overridden in a derived class, returns an array of custom attributes applied to this member and identified by . + + The type of attribute to search for. Only attributes that are assignable to this type are returned. + True to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + An array of custom attributes applied to this member, or an array with zero elements if no attributes assignable to have been applied. + + + + + When overridden in a derived class, indicates whether one or more attributes of the specified type or of its derived types is applied to this member. + + The type of custom attribute to search for. The search includes derived types. + True to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + True if one or more instances of or any of its derived types is applied to this member; otherwise, false. + + + + + Returns an array whose elements reflect the public and, if specified, non-public get, set, and other accessors of the property reflected by the current instance. + + Indicates whether non-public methods should be returned in the MethodInfo array. true if non-public methods are to be included; otherwise, false. + + An array of objects whose elements reflect the get, set, and other accessors of the property reflected by the current instance. If is true, this array contains public and non-public get, set, and other accessors. If is false, this array contains only public get, set, and other accessors. If no accessors with the specified visibility are found, this method returns an array with zero (0) elements. + + + + + When overridden in a derived class, returns the public or non-public get accessor for this property. + + Indicates whether a non-public get accessor should be returned. true if a non-public accessor is to be returned; otherwise, false. + + A MethodInfo object representing the get accessor for this property, if is true. Returns null if is false and the get accessor is non-public, or if is true but no get accessors exist. + + + + + Gets the index parameters of the property. + + The index parameters of the property. + + + + When overridden in a derived class, returns the set accessor for this property. + + Indicates whether the accessor should be returned if it is non-public. true if a non-public accessor is to be returned; otherwise, false. + + Value Condition A object representing the Set method for this property. The set accessor is public.-or- is true and the set accessor is non-public. null is true, but the property is read-only.-or- is false and the set accessor is non-public.-or- There is no set accessor. + + + + + Gets the value of the property on the given instance. + + The object to invoke the getter on. + The to invoke with. + The binder to use. + The indices to use. + The culture to use. + The value of the property on the given instance. + + + + Sets the value of the property on the given instance. + + The object to set the value on. + The value to set. + The to invoke with. + The binder to use. + The indices to use. + The culture to use. + + + + Compares objects by reference only, ignoring equality operators completely. This is used by the property tree reference dictionaries to keep track of references. + + + + + A default, cached instance of this generic variant of the reference equality comparer. + + + + + Returns true if the object references are equal. + + + + + Returns the result of the object's own GetHashCode method. + + + + + Utility class indicating current Unity version. + + + + + Tests current Unity version is equal or greater. + + Minimum major version. + Minimum minor version. + true if the current Unity version is greater. Otherwise false. + + + + The current Unity version major. + + + + + The current Unity version minor. + + + + + Contains utilities for performing common unsafe operations. + + + + + Blindly creates an array of structs from an array of bytes via direct memory copy/blit. + + + + + Blindly creates an array of structs from an array of bytes via direct memory copy/blit. + + + + + Blindly copies an array of structs into an array of bytes via direct memory copy/blit. + + + + + Blindly copies an array of structs into an array of bytes via direct memory copy/blit. + + + + + Creates a new string from the contents of a given byte buffer. + + + + + Writes the contents of a string into a given byte buffer. + + + + + Blindly mem-copies a given number of bytes from the memory location of one object to another. WARNING: This method is ridiculously dangerous. Only use if you know what you're doing. + + + + + A Unity Behaviour which is serialized by the Sirenix serialization system. + + + + + Invoked after deserialization has taken place. + + + + + Invoked before serialization has taken place. + + + + + A Unity Component which is serialized by the Sirenix serialization system. + + + + + Invoked after deserialization has taken place. + + + + + Invoked before serialization has taken place. + + + + + A Unity MonoBehaviour which is serialized by the Sirenix serialization system. + + + + + Invoked after deserialization has taken place. + + + + + Invoked before serialization has taken place. + + + + + A Unity ScriptableObject which is serialized by the Sirenix serialization system. + + + + + Invoked after deserialization has taken place. + + + + + Invoked before serialization has taken place. + + + + + A Unity StateMachineBehaviour which is serialized by the Sirenix serialization system. + + + + + Invoked after deserialization has taken place. + + + + + Invoked before serialization has taken place. + + + + + A Unity ScriptableObject which is serialized by the Sirenix serialization system. + + + + + Invoked after deserialization has taken place. + + + + + Invoked before serialization has taken place. + + + + diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.xml.meta b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.xml.meta new file mode 100644 index 00000000..dc046e81 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Serialization.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5f3147f7af4c49739579b966c458096f +timeCreated: 1488828285 +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.Editor.dll b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.Editor.dll new file mode 100644 index 00000000..0ce3c3fe Binary files /dev/null and b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.Editor.dll differ diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.Editor.dll.meta b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.Editor.dll.meta new file mode 100644 index 00000000..66668bbb --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.Editor.dll.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 5c65184932ff4fd48a343e2360256baf +timeCreated: 1488828285 +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 0 + Exclude Linux: 1 + Exclude Linux64: 1 + Exclude LinuxUniversal: 1 + Exclude N3DS: 1 + Exclude OSXIntel: 1 + Exclude OSXIntel64: 1 + Exclude OSXUniversal: 1 + Exclude PS4: 1 + Exclude PSM: 1 + Exclude PSP2: 1 + Exclude SamsungTV: 1 + Exclude Tizen: 1 + Exclude WebGL: 1 + Exclude WiiU: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude WindowsStoreApps: 1 + Exclude XboxOne: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + Editor: + enabled: 1 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.Editor.xml b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.Editor.xml new file mode 100644 index 00000000..4df1dd2f --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.Editor.xml @@ -0,0 +1,9833 @@ + + + + Sirenix.Utilities.Editor + + + + + Icon for using in editor GUI. + + + + + Gets the raw input icon texture. + + + + + Gets the icon's highlighted texture. + + + + + Gets the icon's active texture. + + + + + Gets the icon's inactive texture. + + + + + Gets a GUIContent object with the active texture. + + + + + Gets a GUIContent object with the inactive texture. + + + + + Gets a GUIContent object with the highlighted texture. + + + + + Draws the icon in a square rect, with a custom shader that makes the icon look better when down-scaled. + This also handles mouseover effects, and linier color spacing. + + + + + Draws the icon in a square rect, with a custom shader that makes the icon look better when down-scaled. + This also handles mouseover effects, and linier color spacing. + + + + + Draws the icon in a square rect, with a custom shader that makes the icon look better when down-scaled. + This also handles mouseover effects, and linier color spacing. + + + + + Collection of EditorIcons for use in GUI drawing. + + + + + Gets an icon of an airplane symbol. + + + + + Gets an icon of an alert circle symbol. + + + + + Gets an icon of an alert triangle symbol. + + + + + Gets an icon of an arrow down symbol. + + + + + Gets an icon of an arrow left symbol. + + + + + Gets an icon of an arrow right symbol. + + + + + Gets an icon of an arrow up symbol. + + + + + Gets an icon of a bell symbol. + + + + + Gets an icon of a car symbol. + + + + + Gets an icon of a char1 symbol. + + + + + Gets an icon of a char2 symbol. + + + + + Gets an icon of a char3 symbol. + + + + + Gets an icon of a char graph symbol. + + + + + Gets an icon of a checkmark symbol. + + + + + Gets an icon of a clock symbol. + + + + + Gets an icon of a clouds symbol. + + + + + Gets an icon of a clouds rainy symbol. + + + + + Gets an icon of a clouds rainy sunny symbol. + + + + + Gets an icon of a clouds rainy thunder symbol. + + + + + Gets an icon of a clouds thunder symbol. + + + + + Gets an icon of a crosshair symbol. + + + + + Gets an icon of a cut symbol. + + + + + Gets an icon of a day calendar symbol. + + + + + Gets an icon of a download symbol. + + + + + Gets an icon of an eject symbol. + + + + + Gets an icon of an eye dropper symbol. + + + + + Gets an icon of a female symbol. + + + + + Gets an icon of a file symbol. + + + + + Gets an icon of a file cabinet symbol. + + + + + Gets an icon of a finnish banner symbol. + + + + + Gets an icon of a flag symbol. + + + + + Gets an icon of a flag finnish symbol. + + + + + Gets an icon of a folder symbol. + + + + + Gets an icon of a folder back symbol. + + + + + Gets an icon of a gKey symbol. + + + + + Gets an icon of a globe symbol. + + + + + Gets an icon of a grid blocks symbol. + + + + + Gets an icon of a grid image text symbol. + + + + + Gets an icon of a grid image text list symbol. + + + + + Gets an icon of a grid layout symbol. + + + + + Gets an icon of a hamburger menu symbol. + + + + + Gets an icon of a house symbol. + + + + + Gets an icon of an image symbol. + + + + + Gets an icon of an image collection symbol. + + + + + Gets an icon of an info symbol. + + + + + Gets an icon of a letter symbol. + + + + + Gets an icon of a light bulb symbol. + + + + + Gets an icon of a link symbol. + + + + + Gets an icon of a list symbol. + + + + + Gets an icon of a loading bar symbol. + + + + + Gets an icon of a lock locked symbol. + + + + + Gets an icon of a lock unlocked symbol. + + + + + Gets an icon of a lock unlocked symbol. Obsolete; use the correctly spelled LockUnlocked instead. + + + + + Gets an icon of a magnifying glass symbol. + + + + + Gets an icon of a male symbol. + + + + + Gets an icon of a marker symbol. + + + + + Gets an icon of a maximize symbol. + + + + + Gets an icon of a microphone symbol. + + + + + Gets an icon of a minimize symbol. + + + + + Gets an icon of a minus symbol. + + + + + Gets an icon of a mobile phone symbol. + + + + + Gets an icon of a money symbol. + + + + + Gets an icon of a move symbol. + + + + + Gets an icon of a multi user symbol. + + + + + Gets an icon of a next symbol. + + + + + Gets an icon of a pacman ghost symbol. + + + + + Gets an icon of a paperclip symbol. + + + + + Gets an icon of a pause symbol. + + + + + Gets an icon of a pen symbol. + + + + + Gets an icon of a pen add symbol. + + + + + Gets an icon of a pen minus symbol. + + + + + Gets an icon of a play symbol. + + + + + Gets an icon of a plus symbol. + + + + + Gets an icon of a podium symbol. + + + + + Gets an icon of a previous symbol. + + + + + Gets an icon of a reception signal symbol. + + + + + Gets an icon of a redo symbol. + + + + + Gets an icon of a refresh symbol. + + + + + Gets an icon of a rotate symbol. + + + + + Gets an icon of a ruler symbol. + + + + + Gets an icon of a ruler rect symbol. + + + + + Gets an icon of a settings cog symbol. + + + + + Gets an icon of a shopping basket symbol. + + + + + Gets an icon of a shopping cart symbol. + + + + + Gets an icon of a single user symbol. + + + + + Gets an icon of a smart phone symbol. + + + + + Gets an icon of a sound symbol. + + + + + Gets an icon of a speech bubble round symbol. + + + + + Gets an icon of a speech bubble square symbol. + + + + + Gets an icon of a speech bubbles round symbol. + + + + + Gets an icon of a speech bubbles square symbol. + + + + + Gets an icon of a star pointer symbol. + + + + + Gets an icon of a stop symbol. + + + + + Gets an icon of a stretch symbol. + + + + + Gets an icon of a table symbol. + + + + + Gets an icon of a tag symbol. + + + + + Gets an icon of a test tube symbol. + + + + + Gets an icon of a timer symbol. + + + + + Gets an icon of a traffic stop light symbol. + + + + + Gets an icon of a transparent symbol. + + + + + Gets an icon of a tree symbol. + + + + + Gets an icon of a triangle down symbol. + + + + + Gets an icon of a triangle left symbol. + + + + + Gets an icon of a triangle right symbol. + + + + + Gets an icon of a triangle up symbol. + + + + + Gets an icon of an undo symbol. + + + + + Gets an icon of an upload symbol. + + + + + Gets an icon of a wifi signal symbol. + + + + + Gets an icon of an x symbol. + + + + + Gets a texture of a test inconclusive symbol. + + + + + Gets a texture of a test failed symbol. + + + + + Gets a texture of a test normal symbol. + + + + + Gets a texture of a test passed symbol. + + + + + Gets a texture of a console info icon symbol. + + + + + Gets a texture of a console warnicon symbol. + + + + + Gets a texture of a console error icon symbol. + + + + + Gets a texture of an odin inspector logo symbol. + + + + + Gets a texture of a scene asset icon symbol. + + + + + Gets an icon representing a GameObject. + + + + + Gets an icon of a unity info icon. + + + + + Gets an icon of a unity warning icon. + + + + + Gets an icon of a unity error icon. + + + + + Gets an icon of a unity folder. + + + + + Gets the dark mode version of the ObjectFieldButton texture. + + + + + Gets the light mode version of the ObjectFieldButton texture. + + + + + Gets the ObjectFieldButton texture based on the current active theme. + + + + + Lazy loading Editor Icon. + + + + + Loads an EditorIcon from the spritesheet. + + + + + Gets the icon's highlight texture. + + + + + Gets the icon's active texture. + + + + + Gets the icon's inactive texture. + + + + + Not yet documented. + + + + + Gets a texture of an odin logo symbol. + + + + + Gets a texture of an odin inspector logo symbol. + + + + + Gets a texture of an odin serializer logo symbol. + + + + + Gets a texture of an odin validator logo symbol. + + + + + Gets a texture of an odin validator black symbol. + + + + + Utility for parsing and emitting expression delegates. + + + + + The time that the expression cache waits to clear expressions + since the last time they have been used. + + + + Parses an expression and tries to emit a delegate method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted delegate if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and tries to emit a delegate method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + The parameters of the expression delegate. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted delegate if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and tries to emit a delegate method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + The parameters of the expression delegate. + The names of the expression's parameters, for use with the named parameter syntax. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted delegate if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and tries to emit a delegate method. + The expression to parse. + The emit context. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted delegate if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and tries to emit a delegate of the specified type. + The expression to parse. + The emit context. + The type of the delegate to emit. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted delegate if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionFunc method. + The expression to parse. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionFunc if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionFunc method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionFunc if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionFunc method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionFunc if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionFunc method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionFunc if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionFunc method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionFunc if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionFunc method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionFunc if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionFunc method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionFunc if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionFunc method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionFunc if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionFunc method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionFunc if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionFunc method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionFunc if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionAction method. + The expression to parse. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionAction if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionAction method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionAction if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionAction method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionAction if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionAction method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionAction if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionAction method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionAction if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionAction method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionAction if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionAction method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionAction if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionAction method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionAction if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionAction method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionAction if the expression is compiled successfully. Otherwise, null. + + + Parses an expression and emits an ExpressionAction method. + The expression to parse. + Indicates if the expression should be static instead of instanced. + The context type for the execution of the expression. + Output for any errors that may occur. + If true then error message will be formatted with color tags. Otherwise, the error message will be formatted with text only. + Returns the emitted ExpressionAction if the expression is compiled successfully. Otherwise, null. + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + This class is due to undergo refactoring. Use the new DragAndDropUtilities instead. + + + + + + This class is due to undergo refactoring. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Drag and drop utilities for both Unity and non-unity objects. + + + + + Gets the position from where the last drag started from in screen space. + + + + + Gets the delta position between the currrent mouse position and where the last drag originated from. + + + + + Gets the hovering accepted drop zone ID. + + + + + Gets a value indicating whether an instance is currently being dragged. + + + + + Gets the currently dragging identifier. + + + + + Gets the current hovering drop zone identifier. + + + + + Gets a more percistent id for drag and drop. + + + + + Draws a objectpicker button in the given rect. This one is designed to look good on top of DrawDropZone(). + + + + + Draws a objectpicker butter, in the given rect. This one is designed to look good on top of DrawDropZone(). + + + + + Draws the graphics for a DropZone. + + + + + Draws the graphics for a DropZone. + + + + + A draggable zone for both Unity and non-unity objects. + + + + + A draggable zone for both Unity and non-unity objects. + + + + + A drop zone area for both Unity and non-unity objects. + + + + + A drop zone area for bot Unity and non-unity objects. + + + + + A drop zone area for bot Unity and non-unity objects. + + + + + A drop zone area for bot Unity and non-unity objects. + + + + + A drop zone area for bot Unity and non-unity objects. + + + + + A drop zone area for bot Unity and non-unity objects. + + + + + A drop zone area for bot Unity and non-unity objects. + + + + + A drop zone area for bot Unity and non-unity objects. + + + + + Disalloweds the drop area for next drag zone. Follow this function call by a DragZone. + + + + + A draggable zone for both Unity and non-unity objects. + + + + + A draggable zone for both Unity and non-unity objects. + + + + + A draggable zone for both Unity and non-unity objects. + + + + + A draggable zone for both Unity and non-unity objects. + + + + + This class is due to undergo refactoring. + + + + + This class is due to undergo refactoring. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + This class is due to undergo refactoring. + + + + + This class is due to undergo refactoring. + + + + + Collection of extension methods for . + + + + + Returns true when the users mouse is hovering over the specified + + The . + The to check. + true if the mouse is over the specified otherwise false. + + + + Returns true when the user presses the specified mouse button. + + The . + The mouse button the user has to press. + If true then the method will call on the event. + true on mouse down events with the specified button. Otherwise false. + + + + Returns true when the user clicks a rect with the mouse. + + The event. + The rect the user can click on. + The button the user has to press. + If true then the method will call on the event. + true on mouse down events with the specified button. Otherwise false. + + + + Returns true when the user releases the specified mouse button. + + The . + The mouse button the user has to release. + If true then the method will call on the event. + true on mouse up events, with the specified button. Otherwise false. + + + + Returns true when the user releases the specified mouse button over the specified rect. + + The . + The rect the user has to release the mouse button over. + The mouse button the user has to release. + If true then the method will call on the event. + true on mouse up events, with the specified button and over the specified rect. Otherwise false. + + + + Returns true when the user left clicks a rect. + + The . + The rect the user can click. + If true then the method will call on the event. + true on left click events, on the specified rect. Otherwise false. + + + + Returns true when the user right clicks a rect. + + The . + The rect the user can right click. + If true then the method will call on the event. + true on context click events, on the specified rect. Otherwise false. + + + + Returns true when the user presses the specified key. + + The . + The key the user has to press. + If true then the method will call on the event. + true on key down events with the specified key code. Otherwise false. + + + + Returns true when the user releases the specified key. + + The . + The key the user has to release. + If true then the method will call on the event. + true on key up events with the specified key code. Otherwise false. + + + + Returns true whene the user moves or drags the mouse. + + The . + If true then the method will call on the event. + true on mouse move or mouse drag events. Otherwise false. + + + + Returns true when the user hovers the mouse over the specified rect. + + The . + The rect the user can hover. + true on any event where the mouse is hovering the specified rect. Otherwise false. + + + + Returns true on repaint events. + + The . + true on repaint events. Otherwise false. + + + + Returns true on layout events. + + The . + true on layout events. Otherwise false. + + + + Returns true on the specified event. + + The . + The required event type. + true on the specified event. Otherwise false. + + + + Collection of extension methods for . + + + + + Removes all menu items with a given name from the GenericMenu. + + The GenericMenu to remove items from. + The name of the items to remove. + True if any items were removed, otherwise false. + + + + Replaces the first found menu item with a given name with a new menu item, or if no such element is found, adds a new one. + + The GenericMenu to replace items in. + The name of the items to remove. + The func to replace or add. + The on value to set the new menu item with. + True if an item was replaced, otherwise false. + + + + Replaces the first found menu item with a given name with a new menu item, or if no such element is found, adds a new one. + + The GenericMenu to replace items in. + The name of the items to remove. + The on value to set the new menu item with. + The func to replace or add. + The user data. + + True if an item was replaced, otherwise false. + + + + + Emitted wrapper for the internal "UnityEngine.GUIClip" class. + + + + + Not yet documented. + + + + + Gets the top most clipped rect. + + + + + Gets the visible rect. + + + + + Gets the top rect. + + + + + Unclips the specified position. + + The position. + + + + + Unclips the specified rect. + + The rect. + + + + + This class is due to undergo refactoring. + + + + + The value. + + + + + Performs an implicit conversion from to . + + + + + Various helper function for GUI. + + + + + Gets the bold default font. + + + + + An alternative to GUI.FocusControl(null), which does not take focus away from the current GUI.Window. + + + + + Whether the inspector is currently in the progress of drawing a dictionary key. + + + + + Hides the following draw calls. Remember to call when done. + + + + + Unhides the following draw calls after having called . + + + + + Determines whether the specified EditorWindow is docked. + + The editor window. + true if the editor window is docked. Otherwise false. + + + + Not yet documented. + + + + + Opens a new inspector window for the specified object. + + The unity object. + unityObj + + + + Gets or sets a value indicating whether labels are currently bold. + + + true if this instance is bold label; otherwise, false. + + + + + Gets the size of the current window border. + + + The size of the current window border. + + + + + Gets the editor screen point offset. + + + The editor screen point offset. + + + + + Gets the current editor gui context width. Only set these if you know what it does. + Setting this has been removed. Use PushContextWidth and PopContextWidth instead. + + + + + Unity EditorGUIUtility.labelWidth only works reliablly in Repaint events. + BetterLabelWidth does a better job at giving you the correct LabelWidth in non-repaint events. + + + + + Odin will set this for you whenever an Odin property tree is drawn. + But if you're using BetterLabelWidth and BetterContextWidth without Odin, then + you need to set BetterContextWidth in the beginning of each GUIEvent. + + + + + Gets the current indent amount. + + + The current indent amount. + + + + + Gets the mouse screen position. + + + The mouse screen position. + + + + + Gets the current editor window. + + + The current editor window. + + + + + Gets a value indicating whether the current editor window is focused. + + + true if the current window has focus. Otherwise, false. + + + + + Gets the ID of the current editor window. + + + The ID of the current editor window. + + + + + Gets a value indicating whether a repaint has been requested. + + + true if repaint has been requested. Otherwise false. + + + + + Gets or sets the actual EditorGUIUtility.LabelWidth, regardless of the current hierarchy mode or context width. + + + + + Requests a repaint. + + + + + Calls , if the is not NULL. + + + + + Requests a repaint. + + + + + Begins the layout measuring. Remember to end with . + + + + + Begins the layout measuring. Remember to end with . + + + + + Ends the layout measuring started by + + The measured rect. + + + + Ends the layout measuring started by + + The measured rect. + + + + Gets the current layout rect. + + The current layout rect. + + + + Gets the current layout rect. + + The current layout rect. + + + + Gets the playmode color tint. + + The playmode color tint. + + + + Pushes a context width to the context width stack. + Remember to pop the value again with . + + The width to push. + + + + Pops a value pushed by . + + + + + Pushes a color to the GUI color stack. Remember to pop the color with . + + The color to push the GUI color.. + if set to true blend with alpha. + + + + Takes a screenshot of the GUI within the specified rect. + + The rect. + The screenshot as a render texture. + + + + Pops the GUI color pushed by . + + + + + Pushes a state to the GUI enabled stack. Remember to pop the state with . + + If set to true GUI will be enabled. Otherwise GUI will be disabled. + + + + Pops the GUI enabled pushed by + + + + + Pushes a state to the IsDrawingDictionaryKey stack. Remember to pop the state with . + + + + + Pops the state pushed by + + + + + Pushes the hierarchy mode to the stack. Remember to pop the state with . + + The hierachy mode state to push. + Changing hierachy mode also changes how label-widths are calcualted. By default, we try to keep the current label width. + + + + Pops the hierarchy mode pushed by . + + + + + Pushes bold label state to the stack. Remember to pop with . + + Value indicating if labels should be bold or not. + + + + Pops the bold label state pushed by . + + + + + Pushes the indent level to the stack. Remember to pop with . + + The indent level to push. + + + + Pops the indent level pushed by . + + + + + Pushes the content color to the stack. Remember to pop with . + + The content color to push.. + If set to true blend with alpha. + + + + Pops the content color pushed by . + + + + + Pushes the label color to the stack. Remember to pop with . + + The label color to push. + + + + Pops the label color pushed by . + + + + + Pushes the GUI position offset to the stack. Remember to pop with . + + The GUI offset. + + + + Pops the GUI position offset pushed by . + + + + + Pushes a GUI matrix to the stack. Remember to pop with . + + The GUI matrix to push. + + + + Pops the GUI matrix pushed by . + + + + + Ignores input on following GUI calls. Remember to end with . + + + + + Ends the ignore input started by . + + + + + Pushes the event type to the stack. Remember to pop with . + + The type of event to push. + + + + Pops the event type pushed by . + + + + + Pushes the width to the editor GUI label width to the stack. Remmeber to Pop with . + + The editor GUI label width to push. + + + + Pops editor gui label widths pushed by . + + + + + Pushes the value to the responsive vector component fields stack. Remeber to pop with . + + + + + Pops responsive vector component fields value pushed by . + + + + + Pushes the value to the fade group duration stack. Remeber to pop with . + + + + + Pops fade group duration value pushed by . + + + + + Pushes the value to the tab page slide animation duration stack. Remember to pop with . + + + + + + Pops tab page slide animation duration value pushed by . + + + + + Clears the repaint request. + + + + + Gets a temporary value context. + + The type of the config value. + The key for the config. + The name of the config. + GUIConfig for the specified key and name. + + + + Gets a temporary value context. + + The type of the value. + The key for the config. + The ID for the config. + GUIConfig for the specified key and ID. + + + + Gets a temporary value context. + + The type of the value. + The primary key. + The secondary key. + GUIConfig for the specified primary and secondary key. + + + + Gets a temporary value context. + + The type of the value. + The key for the context. + GUIConfig for the specified key. + + + + Gets a temporary nullable value context. + + Key for context. + Name for the context. + + + + Gets a temporary nullable value context. + + Key for context. + Id of the context. + + + + Gets a temporary nullable value context. + + Primary key for the context. + Secondary key for the context. + + + + Gets a temporary nullable value context. + + Key for the context. + + + + Gets a temporary context. + + Key for the context. + Name for the context. + Default value of the context. + + + + Gets a temporary context. + + Key for the context. + Id for the context. + Default value of the context. + + + + Gets a temporary context. + + Primary key for the context. + Secondary key for the context. + Default value of the context. + + + + Gets a temporary context. + + Key for the context. + Default value of the context. + + + + Gets a temporary GUIContent with the specified text. + + The text for the GUIContent. + Temporary GUIContent instance. + + + + Gets a temporary GUIContent with the specified text and tooltip. + + The text for the GUIContent. + The tooltip for the GUIContent. + Temporary GUIContent instance. + + + + Gets a temporary GUIContent with the specified image and tooltip. + + The image for the GUIContent. + The tooltip for the GUIContent. + Temporary GUIContent instance. + + + + Gets a temporary GUIContent with the specified text, image and tooltip. + + The text for the GUIContent. + The image for the GUIContent. + The tooltip for the GUIContent. + Temporary GUIContent instance. + + + + Indents the rect by the current indent amount. + + The rect to indent. + Indented rect. + + + + Indents the rect by the current indent amount. + + The rect to indent. + + + + Repaints the EditorWindow if a repaint has been requested. + + The window to repaint. + + + + Repaints the editor if a repaint has been requested. If the currently rendering window is not an InspectorWindow, Repaint() will be called on the current window as well. + + The editor to repaint. + + + + Gets the best thumbnail icon given the provided arguments provided. + + + + + + + + + Gets a preview texture for the provided object. + + + + + + + Measures the size of a given , if it would be presented with this . + + The to present the as. + The to measure. + A consisting of the width () & height (), as the size of the in GUI-space. + + + + Measures the height of a given , if it would be presented with this . + + The to present the as. + The to measure. + The width of the area the is being presented in. + The height of the . + + + + Measures the width of a given , if it would be presented with this . + + The to present the as. + The to measure. + The width of the . + + + + Measures the width of a given , if it would be presented with this . + + The to present the as. + The to measure. + The width of the . + + + + Measures the min- & max width of a given , if it would be presented with this . + + The to present the as. + The to measure. + The minimum width of the . + The maximum width of the . + The min- & max width of the , as out parameters. + + + + A helper class to control paging of n number of elements in various situations. + + + + + Disables the paging, and show all elements. + + + + + Initializes a new instance of the class. + + + + + Updates all values based on and . + + + Call update right before using and in your for loop. + + The total number of elements to apply paging for. + + + + Gets or sets a value indicating whether this instance is enabled. + + + true if this instance is enabled; otherwise, false. + + + + + Gets a value indicating whether this instance is on the frist page. + + + true if this instance is on frist page; otherwise, false. + + + + + Gets a value indicating whether this instance is on the last page. + + + true if this instance is on last page; otherwise, false. + + + + + Gets or sets the number of items per page. + + + The number of items pr page. + + + + + Gets or sets the current page. + + + The current page. + + + + + Gets the start index. + + + The start index. + + + + + Gets the end index. + + + The end index. + + + + + Gets or sets the page count. + + + The page count. + + + + + Gets the total number of elements. + Use to change the value. + + + + + Draws right-aligned toolbar paging buttons. + + + + + The GUITabGroup is a utility class to draw animated tab groups. + + + + var tabGroup = SirenixEditorGUI.CreateAnimatedTabGroup(someKey); + // Register your tabs before starting BeginGroup. + var tab1 = tabGroup.RegisterTab("tab 1"); + var tab2 = tabGroup.RegisterTab("tab 2"); + + tabGroup.BeginGroup(drawToolbar: true); + { + if (tab1.BeginPage()) + { + // Draw GUI for the first tab page; + } + tab1.EndPage(); + + if (tab2.BeginPage()) + { + // Draw GUI for the second tab page; + } + tab2.EndPage(); + } + tabGroup.EndGroup(); + + // Control the animation speed. + tabGroup.AnimationSpeed = 0.2f; + + // If true, the tab group will have the height equal to the biggest page. Otherwise the tab group will animate in height as well when changing page. + tabGroup.FixedHeight = true; + + // You can change page by calling: + tabGroup.GoToNextPage(); + tabGroup.GoToPreviousPage(); + + + + + + + The animation speed + + + + + Gets the outer rect of the entire tab group. + + + + + The inner rect of the current tab page. + + + + + If true, the tab group will have the height equal to the biggest page. Otherwise the tab group will animate in height as well when changing page. + + + Sets the current page. + + The page to switch to. + + + + Gets the current page. + + + + + Gets the t. + + + + + The height of the tab buttons. + + + + + Registers the tab. + + + + + Begins the group. + + if set to true a tool-bar for changing pages is drawn. + The style. + + + + Ends the group. + + + + + Goes to page. + + + + + Goes to next page. + + + + + Goes to previous page. + + + + + A Utility class for creating tables in Unity's editor GUI. + A table can either be created from scratch using new GUITable(xCount,yCount), or created using one of the static GUITable.Create overloads. + See the online documentation, for examples and more information. + + + Creating a matrix table for a two-dimentional array. + + private GUITable table; + + private void Init() + { + bool[,] boolArr = new bool[20,20]; + + this.table = GUITable.Create( + twoDimArray: boolArr, + drawElement: (rect, x, y) => boolArr[x, y] = EditorGUI.Toggle(rect, boolArr[x, y]), + horizontalLabel: "Optional Horizontal Label", // horizontalLabel is optional and can be null. + columnLabels: (rect, x) => GUI.Label(rect, x.ToString()), // columnLabels is optional and can be null. + verticalLabel: "Optional Vertical Label", // verticalLabel is optional and can be null. + rowLabels: (rect, x) => GUI.Label(rect, x.ToString()) // rowLabels is optional and can be null. + ); + } + + private void OnGUI() + { + this.table.DrawTable(); + } + + + + Creating a table for a list. + + private GUITable table; + + private void Init() + { + Listt<SomeClasst> someList = new List<SomeClass>() { new SomeClass(), new SomeClass(), new SomeClass() }; + + this.table = GUITable.Create(someList, "Optional Title", + new GUITableColumn() + { + ColumnTitle = "A", + OnGUI = (rect, i) => someList[i].A = EditorGUI.TextField(rect, someList[i].A), + Width = 200, + MinWidth = 100, + }, + new GUITableColumn() + { + ColumnTitle = "B", + OnGUI = (rect, i) => someList[i].B = EditorGUI.IntField(rect, someList[i].B), + Resizable = false, + }, + new GUITableColumn() + { + ColumnTitle = "C", + OnGUI = (rect, i) => someList[i].C = EditorGUI.IntField(rect, someList[i].C), + SpanColumnTitle = true, + } + ); + } + + private void OnGUI() + { + this.table.DrawTable(); + } + + private class SomeClass + { + public string A; + public int B; + public int C; + public int D; + } + + + + Styling a cell. + Each has two events, OnGUI and OnGUIStyle. OnGUIStyle is called right before OnGUI, but only in repaint events. + + guiTable[x,y].GUIStyle += rect => EditorGUI.DrawRect(rect, Color.red); + + + + Row and column span. + A cell will span and cover all neighbour cells that are null. + + // Span horizontally: + guiTable[x - 2,y] = null; + guiTable[x - 1,y] = null; + guiTable[x,y].SpanX = true; + guiTable[x + 1,y] = null; + + // Span vertically: + guiTable[x,y - 2] = null; + guiTable[x,y - 1] = null; + guiTable[x,y].SpanY = true; + guiTable[x,y + 1] = null; + + + + + + + + The row count. + + + + + The column count. + + + + + The Table Rect. + + + + + Whether to respect the current GUI indent level. + + + + + Gets or sets a from the . + + + + + Initializes a new instance of the class. + + + + + Draws the table. + + + + + Recaluclates cell and column sizes in the next frame. + + + + + Recalculates the layout for the entire table. + This method gets called whenever the table is initialized, resized or adjusted. If you are manipulating + the width or height of individual table cells, remember to call this method when you're done. + + + + + Creates a table. + + + + + Creates a table. + + + + + Creates a table. + + + + + Creates a table. + + + + + A cell of a + + + + + The minimum width. + + + + + The width of the cell. Default is width is 0. + The width the column is determained by the widest cell in the column. + Width = 0 = auto. + + + + + The height of the cell. Default is height is 22. + The height the column is determained by the tallest cell in the row. + + + + + If true, the cell will expand vertically, covering all neighbour null cells. + + + + + If true, the cell will expand horizontally, covering all neighbour null cells. + + + + + The table column index. + + + + + The table row index. + + + + + The GUI style + + + + + Gets the rect. + + + + + GUITableColumns used creating a table list using GUITable.Create(). + + + + + + + Draws a cell at the given row index for this column. + + + + + The column title text. If there are is columns with a title, there we not be rendered an additional table row for column titles. + + + + + The minimum with of the column. + + + + + The width of the Column. + 0 = auto, and is also the default. + + + + + If true, the column becomes resiziable. + Default is true. + + + + + If true, the column title cell, will span horizontally to neighbour columns, which column titles are null. + Default is false. + + + + + Whether to draw a draw scroll view. + + + + + The number of pixels before a scroll view appears. + + + + + The maximum scroll view height. + + + + + The scroll position + + + + + The cell style + + + + + Gets the rect containing all rows. + + + + + Gets the first visible row index. + + + + + Gets the last visible row index. + + + + + Gets the outer rect. The height of this <= .height. + + + + + Gets the row rect. + + + + + Begins the table. + + + + + Begins the column. + + + + + Begins the cell. + + + + + Ends the cell. + + + + + Ends the column. + + + + + Ends the table. + + + + + A tab page created by . + + + + + + Begins the page. + + + + + Ends the page. + + + + Temporary. + This implementation will get refactored. + + + + How the square object field should be aligned. + + + + + + Left aligned. + + + + + Centered. + + + + + Right aligned. + + + + + Configuration for progress bar fields. + + + + + The height of the progress bar field. Default 12 pixel. + + + + + The foreground color of the progress bar field. + + + + + The background color of the progress bar field. + + + + + If true the progress bar field will draw a label ontop to show the current value. + + + + + Alignment of the progress bar field overlay. + + + + + Default configuration. + + + + + Creates a copy of the configuration. + + The configuration to copy. + + + + Creates a progress bar configuration. + + The height of the progress bar. + The foreground color of the progress bar. + The background color of the progress bar. + If true there will be drawn a overlay on top of the field. + The alignment of the text overlay. + + + + Draw mode of quaternion fields. + + + + + + + Draw the quaterion as euler angles. + + + + + Draw the quaterion in as an angle and an axis. + + + + + Draw the quaternion as raw x, y, z and w values. + + + + Initializes the and creates a permanent ID for the Control. + If you create this on a such as , + make sure to initialize this during OnEnable to ensure it gets initialized correctly. + + + + Field drawing functions for various types. + + + + + The width of the X, Y and Z labels in structs. + + + + + When true the component labels, for vector fields, will be hidden when the field is too narrow. + + + + + Draws a regular Unity ObjectField, but supports labels being nulls, and also adds a small button that will open the object in a new inspector window. + + Position and size of the field. + The label to use, or null if no label should be used. + The Unity object. + The Unity object type. This supports inheritance. + Wheather or not to allow scene objects. + + + + Draws a regular Unity ObjectField, but supports labels being nulls, and also adds a small button that will open the object in a new inspector window. + + Position and size of the field. + The label to use, or null if no label should be used. + The Unity object. + The Unity object type. This supports inheritance. + Wheather or not to allow scene objects. + + + + Draws a regular Unity ObjectField, but supports labels being nulls, and also adds a small button that will open the object in a new inspector window. + + Position and size of the field. + The Unity object. + The Unity object type. This supports inheritance. + Wheather or not to allow scene objects. + + + + Draws a regular Unity ObjectField, but supports labels being nulls, and also adds a small button that will open the object in a new inspector window. + + The label to use, or null if no label should be used. + The Unity object. + The Unity object type. This supports inheritance. + Wheather or not to allow scene objects. + Layout options. + + + + Draws a regular Unity ObjectField, but supports labels being nulls, and also adds a small button that will open the object in a new inspector window. + + The label to use, or null if no label should be used. + The Unity object. + The Unity object type. This supports inheritance. + Wheather or not to allow scene objects. + Layout options. + + + + Draws a regular Unity ObjectField, but supports labels being nulls, and also adds a small button that will open the object in a new inspector window. + + The Unity object. + The Unity object type. This supports inheritance. + Wheather or not to allow scene objects. + Layout options. + + + + Draws a square ObjectField which renders a preview for UnityEngine.Object types. + This object field also adds support for drag and drop, dragging an object to another square object field, swaps the values. + If you hold down control while letting go it will replace the value, And you can control + click the object field to quickly delete the value it holds. + + + + + Draws a square ObjectField which renders a preview for UnityEngine.Object types. + This object field also adds support for drag and drop, dragging an object to another square object field, swaps the values. + If you hold down control while letting go it will replace the value, And you can control + click the object field to quickly delete the value it holds. + + + + + Draws a square ObjectField which renders a preview for UnityEngine.Object types. + This object field also adds support for drag and drop, dragging an object to another square object field, swaps the values. + If you hold down control while letting go it will replace the value, And you can control + click the object field to quickly delete the value it holds. + + + + + Draws a square ObjectField which renders a preview for UnityEngine.Object types. + This object field also adds support for drag and drop, dragging an object to another square object field, swaps the values. + If you hold down control while letting go it will replace the value, And you can control + click the object field to quickly delete the value it holds. + + + + + Draws a square ObjectField which renders a preview for UnityEngine.Object types. + This object field also adds support for drag and drop, dragging an object to another square object field, swaps the values. + If you hold down control while letting go it will replace the value, And you can control + click the object field to quickly delete the value it holds. + + + + + Draws a square ObjectField which renders a preview for UnityEngine.Object types. + This object field also adds support for drag and drop, dragging an object to another square object field, swaps the values. + If you hold down control while letting go it will replace the value, And you can control + click the object field to quickly delete the value it holds. + + Position and size of the field. + The label to use, or null if no label should be used. + The Unity object. + The Unity object type. This supports inheritance. + Wheather or not to allow scene objects. + How the square object field should be aligned. + + + + Draws a square ObjectField which renders a preview for UnityEngine.Object types. + This object field also adds support for drag and drop, dragging an object to another square object field, swaps the values. + If you hold down control while letting go it will replace the value, And you can control + click the object field to quickly delete the value it holds. + + Position and size of the field. + The label to use, or null if no label should be used. + The Unity object. + The Texture to be used as the preview. + The Unity object type. This supports inheritance. + Wheather or not to allow scene objects. + How the square object field should be aligned. + + + + Draws a square ObjectField which renders a preview for UnityEngine.Object types. + This object field also adds support for drag and drop, dragging an object to another square object field, swaps the values. + If you hold down control while letting go it will replace the value, And you can control + click the object field to quickly delete the value it holds. + + Position and size of the field. + The label to use, or null if no label should be used. + The Unity object. + The Unity object type. This supports inheritance. + Wheather or not to allow scene objects. + How the square object field should be aligned. + + + + Draws a square ObjectField which renders a preview for UnityEngine.Object types. + This object field also adds support for drag and drop, dragging an object to another square object field, swaps the values. + If you hold down control while letting go it will replace the value, And you can control + click the object field to quickly delete the value it holds. + + Position and size of the field. + The Unity object. + The Unity object type. This supports inheritance. + Wheather or not to allow scene objects. + How the square object field should be aligned. + + + + Draws a square ObjectField which renders a preview for UnityEngine.Object types. + This object field also adds support for drag and drop, dragging an object to another square object field, swaps the values. + If you hold down control while letting go it will replace the value, And you can control + click the object field to quickly delete the value it holds. + + The label to use, or null if no label should be used. + The Unity object. + The Unity object type. This supports inheritance. + Wheather or not to allow scene objects. + The height or size of the square object field. + How the square object field should be aligned. + + + + Draws a square ObjectField which renders a preview for UnityEngine.Object types. + This object field also adds support for drag and drop, dragging an object to another square object field, swaps the values. + If you hold down control while letting go it will replace the value, And you can control + click the object field to quickly delete the value it holds. + + The label to use, or null if no label should be used. + The Unity object. + The texture to be used as the preview. + The Unity object type. This supports inheritance. + Wheather or not to allow scene objects. + The height or size of the square object field. + How the square object field should be aligned. + + + + Draws a square ObjectField which renders a preview for UnityEngine.Object types. + This object field also adds support for drag and drop, dragging an object to another square object field, swaps the values. + If you hold down control while letting go it will replace the value, And you can control + click the object field to quickly delete the value it holds. + + The label to use, or null if no label should be used. + The Unity object. + The Unity object type. This supports inheritance. + Wheather or not to allow scene objects. + The height or size of the square object field. + How the square object field should be aligned. + + + + Draws a square ObjectField which renders a preview for UnityEngine.Object types. + This object field also adds support for drag and drop, dragging an object to another square object field, swaps the values. + If you hold down control while letting go it will replace the value, And you can control + click the object field to quickly delete the value it holds. + + The Unity object. + The Unity object type. This supports inheritance. + Wheather or not to allow scene objects. + The height or size of the square object field. + How the square object field should be aligned. + + + + Draws a polymorphic ObjectField. + + The label to use, or null if no label should be used. + The value. + The object type. This supports inheritance. + Wheather or not to allow scene objects. + Layout options. + + + + Draws a polymorphic ObjectField. + + The label to use, or null if no label should be used. + The value. + The object type. This supports inheritance. + The title to be shown in the object picker. + Wheather or not to allow scene objects. + Layout options. + + + + Draws a polymorphic ObjectField. + + + + + Draws a polymorphic ObjectField. + + + + + Draws a polymorphic ObjectField. + + The label to use, or null if no label should be used. + The value. + The object type. This supports inheritance. + Wheather or not to allow scene objects. + Layout options. + + + + Draws a polymorphic ObjectField. + + The value. + The object type. This supports inheritance. + Wheather or not to allow scene objects. + Layout options. + + + + Draws a polymorphic ObjectField. + + The value. + The object type. This supports inheritance. + The title to be shown in the object picker. + Wheather or not to allow scene objects. + Layout options. + + + + Draws a field for a layer mask. + + Position and size of the field. + The label to use, or null if no label should be used. + The layer mask to draw. + + + + Draws a field for a layer mask. + + Position and size of the field. + The label to use, or null if no label should be used. + The layer mask to draw. + + + + Draws a field for a layer mask. + + Position and size of the field. + The layer mask to draw. + + + + Draws a field for a layer mask. + + The label to use, or null if no label should be used. + The layer mask to draw. + Layout options. + + + + Draws a field for a layer mask. + + The label to use, or null if no label should be used. + The layer mask to draw. + Layout options. + + + + Draws a field for a layer mask. + + The layer mask to draw. + Layout options. + + + + Draws a Guid field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a Guid field. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a Guid field. + + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a Guid field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a Guid field. + + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a Guid field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws an int field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws an int field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws an int field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws an int field. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws an int field. + + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws an int field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws an int field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws an int field. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a delayed int field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a delayed int field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a delayed int field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a delayed int field. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a delayed int field. + + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a delayed int field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a delayed int field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a delayed int field. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a range field for ints. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Minimum value. + Maximum value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a range field for ints. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Minimum value. + Maximum value. + Value assigned to the field. + + + + Draws a range field for ints. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Minimum value. + Maximum value. + Value assigned to the field. + + + + Draws a range field for ints. + + Position and size of the field. + Current value. + Minimum value. + Maximum value. + Value assigned to the field. + + + + Drwas a range field for ints. + + Label of field. Set to null for no label. + Current value. + Minimum value. + Maximum value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a range field for ints. + + Label of field. Set to null for no label. + Current value. + Minimum value. + Maximum value. + Layout options. + Value assigned to the field. + + + + Draws a range field for ints. + + Label of field. Set to null for no label. + Current value. + Minimum value. + Maximum value. + Layout options. + Value assigned to the field. + + + + Draws a range field for ints. + + Current value. + Minimum value. + Maximum value. + Layout options. + Value assigned to the field. + + + + Draws a colored progress bar field. + + Position and size of the field. + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + The configuration for the progress bar field. + Optional text for label to be drawn ontop of the progress bar. This value is only used if the DrawValueLabel option is enabled in the ProgressBarConfig. + + + + Draws a colored progress bar field. + + Position and size of the field. + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + The configuration for the progress bar field. + + + + Draws a colored progress bar field. + + Position and size of the field. + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + The configuration for the progress bar field. + + + + Draws a colored progress bar field. + + Position and size of the field. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + The configuration for the progress bar field. + + + + Draws a colored progress bar field. + + Position and size of the field. + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + + + + Draws a colored progress bar field. + + Position and size of the field. + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + + + + Draws a colored progress bar field. + + Position and size of the field. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + + + + Draws a colored progress bar field. + + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + The configuration for the progress bar field. + Layout options. + + + + Draws a colored progress bar field. + + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + The configuration for the progress bar field. + Layout options. + + + + Draws a colored progress bar field. + + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + The configuration for the progress bar field. + Layout options. + + + + Draws a colored progress bar field. + + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + Layout options. + + + + Draws a colored progress bar field. + + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + Layout options. + + + + Draws a colored progress bar field. + + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + Layout options. + + + + Draws a colored segmented progress bar field. + + Position and size of the field. + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + The configuration for the progress bar field. + Optional text for label to be drawn ontop of the progress bar. This value is only used if the DrawValueLabel option is enabled in the ProgressBarConfig. + + + + Draws a colored segmented progress bar field. + + Position and size of the field. + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + The configuration for the progress bar field. + + + + Draws a colored segmented progress bar field. + + Position and size of the field. + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + The configuration for the progress bar field. + + + + Draws a colored segmented progress bar field. + + Position and size of the field. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + The configuration for the progress bar field. + + + + Draws a colored segmented progress bar field. + + Position and size of the field. + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + + + + Draws a colored segmented progress bar field. + + Position and size of the field. + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + + + + Draws a colored segmented progress bar field. + + Position and size of the field. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + + + + Draws a colored segmented progress bar field. + + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + The configuration for the progress bar field. + Layout options. + + + + Draws a colored segmented progress bar field. + + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + The configuration for the progress bar field. + Layout options. + + + + Draws a colored segmented progress bar field. + + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + The configuration for the progress bar field. + Layout options. + + + + Draws a colored segmented progress bar field. + + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + Layout options. + + + + Draws a colored segmented progress bar field. + + The label to use, or null if no label should be used. + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + Layout options. + + + + Draws a colored segmented progress bar field. + + The current value of the progress bar. + The left hand side value of the progress bar. + The right hand side value of the progress bar. + Layout options. + + + + Draws an overlay on top of a progress bar field. + + The rect used to draw the progress bar field with. (Minus the Rect for the prefix label, if any.) + The label to draw ontop of the progress bar field. + The relative value of the progress bar, from 0 to 1. + The configuration used to draw the progress bar field. + + + + Draws an overlay on top of a progress bar field. + + The rect used to draw the progress bar field with. (Minus the Rect for the prefix label, if any.) + The label to draw ontop of the progress bar field. + The relative value of the progress bar, from 0 to 1. + The configuration used to draw the progress bar field. + + + + Draws an long field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws an long field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws an long field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws an long field. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws an long field. + + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws an long field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws an long field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws an long field. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a delayed long field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a delayed long field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a delayed long field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a delayed long field. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a delayed long field. + + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a delayed long field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a delayed long field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a delayed long field. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a float field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a float field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a float field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a float field. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a float field. + + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a float field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a float field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a float field. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a delayed float field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a delayed float field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a delayed float field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a delayed float field. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a delayed float field. + + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a delayed float field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a delayed float field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a delayed float field. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a range field for floats. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Minimum value. + Maximum value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a range field for floats. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Minimum value. + Maximum value. + Value assigned to the field. + + + + Draws a range field for floats. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Minimum value. + Maximum value. + Value assigned to the field. + + + + Draws a range field for floats. + + Position and size of the field. + Current value. + Minimum value. + Maximum value. + Value assigned to the field. + + + + Draws a range field for floats. + + Label of field. Set to null for no label. + Current value. + Minimum value. + Maximum value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a range field for floats. + + Label of field. Set to null for no label. + Current value. + Minimum value. + Maximum value. + Layout options. + Value assigned to the field. + + + + Draws a range field for floats. + + Label of field. Set to null for no label. + Current value. + Minimum value. + Maximum value. + Layout options. + Value assigned to the field. + + + + Draws a range field for floats. + + Current value. + Minimum value. + Maximum value. + Layout options. + Value assigned to the field. + + + + Draws a double field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a double field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a double field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a double field. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a double field. + + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a double field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a double field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a double field. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a delayed double field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a delayed double field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a delayed double field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a delayed double field. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a delayed double field. + + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a delayed double field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a delayed double field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a delayed double field. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a decimal field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a decimal field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a decimal field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a decimal field. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a decimal field. + + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a decimal field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a decimal field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a decimal field. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a text field for strings. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a text field for strings. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a text field for strings. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a text field for strings. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a text field for strings. + + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a text field for strings. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a text field for strings. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a text field for strings. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a delayed text field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a delayed text field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a delayed text field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a delayed text field. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a delayed text field. + + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a delayed text field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a delayed text field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a delayed text field. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a field that lets the user select a path to a file. + + Position and size of the field. + Label of field. Set to null for no label. + The current value. + A parent path the path needs to be relative to. Use null for Unity project directory. + Comma separated list of allowed file extensions. Use null to allow any file extension. + If true the path will be absolute. Otherwise the path will be relative to parentPath or to the Unity project directory. + If true the path will be enforced to use backslashes. Otherwise the path will be enforced to use forward slashes. + If true the file path will include the file's extension. + A path to a file. + + + + Draws a field that lets the user select a path to a file. + + Position and size of the field. + The current value. + A parent path the path needs to be relative to. Use null for Unity project directory. + Comma separated list of allowed file extensions. Use null to allow any file extension. + If true the path will be absolute. Otherwise the path will be relative to parentPath or to the Unity project directory. + If true the path will be enforced to use backslashes. Otherwise the path will be enforced to use forward slashes. + If true the file path will include the file's extension. + A path to a file. + + + + Draws a field that lets the user select a path to a file. + + Label of field. Set to null for no label. + The current value. + A parent path the path needs to be relative to. Use null for Unity project directory. + Comma separated list of allowed file extensions. Use null to allow any file extension. + If true the path will be absolute. Otherwise the path will be relative to parentPath or to the Unity project directory. + If true the path will be enforced to use backslashes. Otherwise the path will be enforced to use forward slashes. + Layout options. + A path to a file. + + + + Draws a field that lets the user select a path to a file. + + Label of field. Set to null for no label. + The current value. + A parent path the path needs to be relative to. Use null for Unity project directory. + Comma separated list of allowed file extensions. Use null to allow any file extension. + If true the path will be absolute. Otherwise the path will be relative to parentPath or to the Unity project directory. + If true the path will be enforced to use backslashes. Otherwise the path will be enforced to use forward slashes. + Layout options. + If true the file path will include the file's extension. + A path to a file. + + + + Draws a field that lets the user select a path to a file. + + The current value. + A parent path the path needs to be relative to. Use null for Unity project directory. + Comma separated list of allowed file extensions. Use null to allow any file extension. + If true the path will be absolute. Otherwise the path will be relative to parentPath or to the Unity project directory. + If true the path will be enforced to use backslashes. Otherwise the path will be enforced to use forward slashes. + Layout options. + If true the file path will include the file's extension. + A path to a file. + + + + Draws a field that lets the user select a path to a file. + + The current value. + A parent path the path needs to be relative to. Use null for Unity project directory. + Comma separated list of allowed file extensions. Use null to allow any file extension. + If true the path will be absolute. Otherwise the path will be relative to parentPath or to the Unity project directory. + If true the path will be enforced to use backslashes. Otherwise the path will be enforced to use forward slashes. + Layout options. + A path to a file. + + + + Draws a field that lets the user select a path to a folder. + + Position and size of the field. + Label of field. Set to null for no label. + The current value. + A parent path the path needs to be relative to. Use null for Unity project directory. + If true the path will be absolute. Otherwise the path will be relative to parentPath or to the Unity project directory. + If true the path will be enforced to use backslashes. Otherwise the path will be enforced to use forward slashes. + A path to a folder. + + + + Draws a field that lets the user select a path to a folder. + + Position and size of the field. + The current value. + A parent path the path needs to be relative to. Use null for Unity project directory. + If true the path will be absolute. Otherwise the path will be relative to parentPath or to the Unity project directory. + If true the path will be enforced to use backslashes. Otherwise the path will be enforced to use forward slashes. + A path to a folder. + + + + Draws a field that lets the user select a path to a folder. + + Label of field. Set to null for no label. + The current value. + A parent path the path needs to be relative to. Use null for Unity project directory. + If true the path will be absolute. Otherwise the path will be relative to parentPath or to the Unity project directory. + If true the path will be enforced to use backslashes. Otherwise the path will be enforced to use forward slashes. + Layout options. + A path to a folder. + + + + Draws a field that lets the user select a path to a folder. + + The current value. + A parent path the path needs to be relative to. Use null for Unity project directory. + If true the path will be absolute. Otherwise the path will be relative to parentPath or to the Unity project directory. + If true the path will be enforced to use backslashes. Otherwise the path will be enforced to use forward slashes. + Layout options. + A path to a folder. + + + + Draws a prefix label for a vector field, that implements label dragging. + + + + + Draws a prefix label for a vector field, that implements label dragging. + + The position and total size of the field. + The label content. If null this function does nothing. + The value for the vector field. + The vector scaled by label dragging. + + + + Draws a prefix label for a vector field, that implements label dragging. + + The position and total size of the field. + The label content. If null this function does nothing. + The value for the vector field. + The vector scaled by label dragging. + + + + Draws a prefix label for a vector field, that implements label dragging. + + The label content. If null this function does nothing. + The value for the vector field. + The vector scaled by label dragging. + + + + Draws a prefix label for a vector field, that implements label dragging. + + The label content. If null this function does nothing. + The value for the vector field. + The vector scaled by label dragging. + + + + Draws a Vector2 field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a Vector2 field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a Vector2 field. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a Vector2 field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a Vector2 field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a Vector2 field. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a Vector3 field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a Vector3 field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a Vector3 field. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a Vector3 field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a Vector3 field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a Vector3 field. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a Vector4 field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a Vector4 field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a Vector4 field. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a Vector4 field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a Vector4 field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a Vector4 field. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a Color field. + + Position and size of the field. + Label of field. Set to null for no label. + + Value assigned to the field. + + + + Draws a Color field. + + Position and size of the field. + Label of field. Set to null for no label. + + Value assigned to the field. + + + + Draws a Color field. + + Position and size of the field. + + Value assigned to the field. + + + + Draws a Color field. + + Label of field. Set to null for no label. + + Layout options. + Value assigned to the field. + + + + Draws a Color field. + + Label of field. Set to null for no label. + + Layout options. + Value assigned to the field. + + + + Draws a Color field. + + + Layout options. + Value assigned to the field. + + + + Draws a slider for setting two values between a min and a max limit. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + The min and max limit for the value. + Show fields for min and max value. + A Vector2 with X set as min value, and Y to set as max value. + + + + Draws a slider for setting two values between a min and a max limit. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + The min and max limit for the value. + Show fields for min and max value. + A Vector2 with X set as min value, and Y to set as max value. + + + + Draws a slider for setting two values between a min and a max limit. + + Position and size of the field. + Current value. + The min and max limit for the value. + Show fields for min and max value. + A Vector2 with X set as min value, and Y to set as max value. + + + + Draws a slider for setting two values between a min and a max limit. + + Label of field. Set to null for no label. + Current value. + The min and max limit for the value. + Show fields for min and max value. + Layout options. + A Vector2 with X set as min value, and Y to set as max value. + + + + Draws a slider for setting two values between a min and a max limit. + + Label of field. Set to null for no label. + Current value. + The min and max limit for the value. + Show fields for min and max value. + Layout options. + A Vector2 with X set as min value, and Y to set as max value. + + + + Draws a slider for setting two values between a min and a max limit. + + Current value. + The min and max limit for the value. + Show fields for min and max value. + Layout options. + A Vector2 with X set as min value, and Y to set as max value. + + + + Draws a slider for setting two values between a min and a max limit. + + Position and size of the field. + Label of field. Set to null for no label. + Current min value. + Current max value. + The min limit for the value. + The max limit for the value. + Show fields for min and max value. + + + + Draws a slider for setting two values between a min and a max limit. + + Position and size of the field. + Label of field. Set to null for no label. + Current min value. + Current max value. + The min limit for the value. + The max limit for the value. + Show fields for min and max value. + + + + Draws a slider for setting two values between a min and a max limit. + + Position and size of the field. + Current min value. + Current max value. + The min limit for the value. + The max limit for the value. + Show fields for min and max value. + + + + Draws a slider for setting two values between a min and a max limit. + + Label of field. Set to null for no label. + Current min value. + Current max value. + The min limit for the value. + The max limit for the value. + Show fields for min and max value. + Layout options. + + + + Draws a slider for setting two values between a min and a max limit. + + Label of field. Set to null for no label. + Current min value. + Current max value. + The min limit for the value. + The max limit for the value. + Show fields for min and max value. + Layout options. + + + + Draws a slider for setting two values between a min and a max limit. + + Current min value. + Current max value. + The min limit for the value. + The max limit for the value. + Show fields for min and max value. + Layout options. + + + + Draws a rotation field for a quaternion. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Draw mode for rotation field. + Value assigned to the field. + + + + Draws a rotation field for a quaternion. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Draw mode for rotation field. + Value assigned to the field. + + + + Draws a rotation field for a quaternion. + + Position and size of the field. + Current value. + Draw mode for rotation field. + Value assigned to the field. + + + + Draws a rotation field for a quaternion. + + Label of field. Set to null for no label. + Current value. + Draw mode for rotation field. + Layout options. + Value assigned to the field. + + + + Draws a rotation field for a quaternion. + + Label of field. Set to null for no label. + Current value. + Draw mode for rotation field. + Layout options. + Value assigned to the field. + + + + Draws a rotation field for a quaternion. + + Current value. + Draw mode for rotation field. + Layout options. + Value assigned to the field. + + + + Draws an euler field for a quaternion. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws an euler field for a quaternion. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws an euler field for a quaternion. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws an euler field for a quaternion. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws an euler field for a quaternion. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws an euler field for a quaternion. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws an angle axis field for a quaternion. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws an angle axis field for a quaternion. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws an angle axis field for a quaternion. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws an angle axis field for a quaternion. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws an angle axis field for a quaternion. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws an angle axis field for a quaternion. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a quaternion field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a quaternion field. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a quaternion field. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a quaternion field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a quaternion field. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a quaternion field. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a dropdown. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Names of selectable items. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a dropdown. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Names of selectable items. + Value assigned to the field. + + + + Draws a dropdown. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Names of selectable items. + Value assigned to the field. + + + + Draws a dropdown. + + Position and size of the field. + Current value. + Names of selectable items. + Value assigned to the field. + + + + Draws a dropdown. + + Label of field. Set to null for no label. + Current value. + Names of selectable items. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a dropdown. + + Label of field. Set to null for no label. + Current value. + Names of selectable items. + Layout options. + Value assigned to the field. + + + + Draws a dropdown. + + Label of field. Set to null for no label. + Current value. + Names of selectable items. + Layout options. + Value assigned to the field. + + + + Draws a dropdown. + + Current value. + Names of selectable items. + Layout options. + Value assigned to the field. + + + + Draws a generic dropdown. + + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Selectable items. + Value assigned to the field. + + + + Draws a generic dropdown. + + + Label of field. Set to null for no label. + Current value. + Selectable items. + Value assigned to the field. + + + + Draws a generic dropdown. + + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Selectable items. + Names of selectable items. If null ToString() will be used instead. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a generic dropdown. + + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + + Names of selectable items. If null ToString() will be used instead. + Value assigned to the field. + + + + Draws a generic dropdown. + + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + + Names of selectable items. If null ToString() will be used instead. + Value assigned to the field. + + + + Draws a generic dropdown. + + + Position and size of the field. + Current value. + + Names of selectable items. If null ToString() will be used instead. + Value assigned to the field. + + + + Draws a generic dropdown. + + + Label of field. Set to null for no label. + Current value. + + Names of selectable items. If null ToString() will be used instead. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a generic dropdown. + + + Label of field. Set to null for no label. + Current value. + + Names of selectable items. If null ToString() will be used instead. + Layout options. + Value assigned to the field. + + + + Draws a generic dropdown. + + + Label of field. Set to null for no label. + Current value. + + Names of selectable items. If null ToString() will be used instead. + Layout options. + Value assigned to the field. + + + + Draws a generic dropdown. + + + Current value. + + Names of selectable items. If null ToString() will be used instead. + Layout options. + Value assigned to the field. + + + + Draws a dropdown for an enum or an enum mask. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a dropdown for an enum or an enum mask. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a dropdown for an enum or an enum mask. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a dropdown for an enum or an enum mask. + + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a dropdown for an enum or an enum mask. + + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a dropdown for an enum or an enum mask. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a dropdown for an enum or an enum mask. + + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a dropdown for an enum or an enum mask. + + Current value. + Layout options. + Value assigned to the field. + + + + Draws a dropdown. + + + Position and size of the field. + Label of field. Set to null for no label. + Current selection. + Avaible items in the dropdown. + If true then the user can select multiple items. Otherwise the user can only select one item. + true when the user has changed the selection. Otherwise false. + + + + Draws a dropdown. + + + Position and size of the field. + Label of field. Set to null for no label. + Current selection. + Avaible items in the dropdown. + If true then the user can select multiple items. Otherwise the user can only select one item. + true when the user has changed the selection. Otherwise false. + + + + Draws a dropdown. + + + Position and size of the field. + Current selection. + Avaible items in the dropdown. + If true then the user can select multiple items. Otherwise the user can only select one item. + true when the user has changed the selection. Otherwise false. + + + + Draws a dropdown. + + + Label of field. Set to null for no label. + Current selection. + Avaible items in the dropdown. + If true then the user can select multiple items. Otherwise the user can only select one item. + Layout options. + true when the user has changed the selection. Otherwise false. + + + + Draws a dropdown. + + + Label of field. Set to null for no label. + Current selection. + Avaible items in the dropdown. + If true then the user can select multiple items. Otherwise the user can only select one item. + Layout options. + true when the user has changed the selection. Otherwise false. + + + + Draws a dropdown. + + + Current selection. + Avaible items in the dropdown. + If true then the user can select multiple items. Otherwise the user can only select one item. + Layout options. + true when the user has changed the selection. Otherwise false. + + + + Draws a decimal field that supports Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a decimal field that supports Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a decimal field that supports Odin expressions. + + Context for expression support. + Position and size of the field. + Current value. + Value assigned to the field. + + + + Draws a decimal field that supports Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a decimal field that supports Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a decimal field that supports Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a decimal field that supports Odin expressions. + + Context for expression support. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a double field that supports Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a double field that supports Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a double field that supports Odin expressions. + + Context for expression support. + Current value. + Value assigned to the field. + + + + Draws a double field that supports Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a double field that supports Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a double field that supports Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a double field that supports Odin expressions. + + Context for expression support. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a float field that supports Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a float field that supports Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a float field that supports Odin expressions. + + Context for expression support. + Current value. + Value assigned to the field. + + + + Draws a float field that supports Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a float field that supports Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a float field that supports Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a float field that supports Odin expressions. + + Context for expression support. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a long field that supports Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a long field that supports Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a long field that supports Odin expressions. + + Context for expression support. + Current value. + Value assigned to the field. + + + + Draws a long field that supports Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a long field that supports Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a long field that supports Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a long field that supports Odin expressions. + + Context for expression support. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a int field that supports Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a int field that supports Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + Value assigned to the field. + + + + Draws a int field that supports Odin expressions. + + Context for expression support. + Current value. + Value assigned to the field. + + + + Draws a int field that supports Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a int field that supports Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a int field that supports Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a int field that supports Odin expressions. + + Context for expression support. + Current value. + Layout options. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions and Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions and Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions and Odin expressions. + + Context for expression support. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions and Odin expressions. + + Context for expression support. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions and Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions and Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions and Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions and Odin expressions. + + Context for expression support. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions. + + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions. + + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a decimal field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a double field that supports unit conversions and Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a double field that supports unit conversions and Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a double field that supports unit conversions and Odin expressions. + + Context for expression support. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a double field that supports unit conversions and Odin expressions. + + Context for expression support. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a double field that supports unit conversions and Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a double field that supports unit conversions and Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a double field that supports unit conversions and Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a double field that supports unit conversions and Odin expressions. + + Context for expression support. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a float field that supports unit conversions and Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a float field that supports unit conversions and Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a float field that supports unit conversions and Odin expressions. + + Context for expression support. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a float field that supports unit conversions and Odin expressions. + + Context for expression support. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a float field that supports unit conversions and Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a float field that supports unit conversions and Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a float field that supports unit conversions and Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a float field that supports unit conversions and Odin expressions. + + Context for expression support. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a float field that supports unit conversions. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a float field that supports unit conversions. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a float field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a float field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a float field that supports unit conversions. + + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a float field that supports unit conversions. + + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a float field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a float field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a double field that supports unit conversions. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a double field that supports unit conversions. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a double field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a double field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a double field that supports unit conversions. + + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a double field that supports unit conversions. + + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a double field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a double field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a long field that supports unit conversions and Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a long field that supports unit conversions and Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a long field that supports unit conversions and Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a long field that supports unit conversions and Odin expressions. + + Context for expression support. + Position and size of the field. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a long field that supports unit conversions and Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a long field that supports unit conversions and Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a long field that supports unit conversions and Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + + Draws a long field that supports unit conversions. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a long field that supports unit conversions. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a long field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a long field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a long field that supports unit conversions. + + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a long field that supports unit conversions. + + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a long field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a long field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a int field that supports unit conversions and Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a int field that supports unit conversions and Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a int field that supports unit conversions and Odin expressions. + + Context for expression support. + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a int field that supports unit conversions and Odin expressions. + + Context for expression support. + Position and size of the field. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a int field that supports unit conversions and Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a int field that supports unit conversions and Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a int field that supports unit conversions and Odin expressions. + + Context for expression support. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + + Draws a int field that supports unit conversions. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a int field that supports unit conversions. + + Position and size of the field. + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a int field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a int field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Value assigned to the field. + + + + Draws a int field that supports unit conversions. + + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a int field that supports unit conversions. + + Label of field. Set to null for no label. + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a int field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a int field that supports unit conversions. + + Current value. + UnitInfo of the value and return value. Must have same UnitCategory as displayUnitInfo. + UnitInfo of the displayed value in the field, converted from baseUnitInfo. Must have same UnitCategory as baseUnitInfo. + Layout options. + Value assigned to the field. + + + + Draws a dropdown field for enum masks. + + Position and size of the field. + Label of field. Set to null for no label. + Current selection. + GUIStyle for drawing the field. Set to null for default. + Value assigned to the field. + + + + Draws a dropdown field for enum masks. + + Position and size of the field. + Label of field. Set to null for no label. + Current selection. + Value assigned to the field. + + + + Draws a dropdown field for enum masks. + + Position and size of the field. + Label of field. Set to null for no label. + Current selection. + Value assigned to the field. + + + + Draws a dropdown field for enum masks. + + Position and size of the field. + Current selection. + Value assigned to the field. + + + + Draws a dropdown field for enum masks. + + Label of field. Set to null for no label. + Current selection. + GUIStyle for drawing the field. Set to null for default. + Layout options. + Value assigned to the field. + + + + Draws a dropdown field for enum masks. + + Label of field. Set to null for no label. + Current selection. + Layout options. + Value assigned to the field. + + + + Draws a dropdown field for enum masks. + + Label of field. Set to null for no label. + Current selection. + Layout options. + Value assigned to the field. + + + + Draws a dropdown field for enum masks. + + Current selection. + Layout options. + Value assigned to the field. + + + + Wrapper for Unity's ExpressionEvaluator. It was moved from UnityEditor to UnityEngine in version 2023 and + that *should* have been automatically fixed by the AssemblyUpdater, but that broke for one reason or another. + + + + + Type containing the necessary components to use C# expressions in fields. + + + // Creating and using a context with for a static type. + FieldExpressionContext context = FieldExpressionContext.StaticExpression(typeof(MyStaticType)); + + SirenixEditorFields.SmartIntField(context, ...); + + + // Creating and using a context with an instanced type. + FieldExpressionContext context = FieldExpressionContext.InstanceContext(myInstance); + + SirenixEditorFields.SmartIntField(context, ...); + + + // Creating and using context with an InspectorProperty, for example, in a custom Odin drawer. + FieldExpressionContext context = property.ToFieldExpressionContext(); + + SirenixEditorFields.SmartIntField(context, ...); + + + + + Target instance for field expressions. + + + + + Target type for expressions. + + + + + Indicates if the expressions targets a static type or not. + + + + + Creates an expression context that targets nothing. Expressions are still possible, but no members can be accessed, and only static method can be called. + + FieldExpresionContext target targets nothing. + + + + Creates an expression context that targets the provided instance. Expression can access members of the instance. + + The instance for the context to target. + FieldExpressionContext that targets an instance. + Throws if instance is null. + + + + Creates an expression context that targets the provided type. Only static members can be accessed. + + The type to target. + FieldExpressionContext that targets a static type. + Throws if type is null. + + + + Collection of various editor GUI functions. + + + + + The mixed value dash character, to show when something has mixed values; + + + + + Default fade group animation duration. + + + + + Tab page slide animation duration. + + + + + Shaking animation duration. + + + + + Expand foldouts by default. + + + + + Show buttons results by default. + + + + + Draws a GUI field for objects. + + The rect to draw the field in. + The label of the field. + The value of the field. + The object type for the field. + If set to true then allow scene objects to be assigned to the field. + If set to true the field is readonly. + The object assigned to the field. + + + + Draws an GUI field for objects. + + The label for the field. + The value of the field. + The object type for the field. + If set to true then allow scene objects to be assigned to the field. + If set to true the field is readonly. + The object assigned to the field. + + + + Draws a GUI field for objects. + + The key for the field. + The type. + The label for the field. + The current value for the field. + If set to true then allow scene objects to be assigned to the field. + + The object assigned to the field. + + + + + Draws a nicely formatted title with an optinal sub-title and horizontal ruler. + + + + + Draws a GUI color field. + + The rect to draw the field in. + The color of the field. + If set to true then use alpha in the preview. + If set to true then show alpha bar in the preview. + The color assigned to the field. + + + + Draws a warning message box. + + + Also triggers a warning during validation checks done by + + The message. + If set to true the message box will be wide. + + + + Draws a thick horizontal seperator. + + + + + Draws a thick horizontal seperator. + + + + + Draws a thick horizontal seperator. + + + + + Draws a thick horizontal seperator. + + + + + Draws a horizontal line seperator. + + + + + Draws a vertical line seperator. + + + + + Draws an error message box. + + + Also triggers an error during validation checks done by + + The message. + If set to true the message box will be wide. + + + + Draws a info message box. + + The message. + If set to true the message box will be wide. + + + + Draws a message box. + + The message. + If set to true the message box will be wide. + + + + Draws a message box. + + The message. + Type of the message. + If set to true the message box will be wide. + + + + Draws a message box. + + The message. + Type of the message. + The style. + If set to true the message box will be wide. + + + + Draws a message box. + + The message. + Type of the message. + The style. + If set to true the message box will be wide. + + + + Draws a message box. + + The message. + Type of the message. + The style of the message box. + If set to true the message box will be wide. + + + + Draws a message box with a configurable font size. + + The message. + Type of the message. + The font size of the text. This also affects the size of the icon. + + + + Draws a message box with a configurable font size. + + The message. + The SDF icon to draw next to the message. + The color of the SDF icon. + The font size of the text. This also affects the size of the icon. + The action to be invoked if the message box is right-clicked. + + + + Draws a message box that can be expanded to show more details. + + The message of the message box. + The detailed message of the message box. + Type of the message box. + If set to true the detailed message is hidden. + If set to true the message box will be wide. + State of isFolded. + + + + Draws a message box that can be expanded to show more details. + + The message of the message box. + The detailed message of the message box. + Type of the message box. + If set to true the detailed message is hidden. + The font size of the text. This also affects the size of the icon. + State of isFolded. + + + + Draws a message box with the specified icon. + + The message to be displayed. + The icon to be displayed. + The color of the icon. + The style of the message box. + The action to be invoked if the message box is right-clicked. + + + + Draws a horizontal line separator. + + Width of the line. + + + + Draws a horizontal line separator. + + The color of the line. + The size of the line. + + + + Draws a vertical line separator. + + Width of the line. + + + + Draws a vertical line separator. + + The color of the line. + Width of the line. + + + + Draws a GUI button with an icon. + + The editor icon for the button. + The width of the button. + The height of the button. + The tooltip of the button. + true if the button was pressed. Otherwise false. + + + + Draws a GUI button with an icon. + + The editor icon for the button. + The GUI style for the button. + The width of the button. + The height of the button. + The tooltip of the button. + true if the button was pressed. Otherwise false. + + + + Draws a GUI button with an icon. + + The rect to draw the button in. + The editor icon for the button. + true if the button was pressed. Otherwise false. + + + + Draws a GUI button with an icon. + + The rect to draw the button in. + The editor icon for the button. + The tooltip of the button. + true if the button was pressed. Otherwise false. + + + + Draws a GUI button with an icon. + + The rect to draw the button in. + The editor icon for the button. + The GUI style for the button. + The tooltip of the button. + true if the button was pressed. Otherwise false. + + + + Draws a GUI button with an icon. + + The rect to draw the button in. + The icon texture. + The tooltip for the button. + true when the button is pressed. + + + + Draws a GUI button with an icon. + + The rect to draw the button in. + The icon texture. + Style for the button. + The tooltip for the button. + true when the button is pressed. + + + + Draws a GUI button with an icon. + + The icon texture. + Width of the button in pixels. + Height of the button in pixels. + The tooltip for the button. + true when the button is pressed. + + + + Draws a GUI button with an icon. + + The icon texture. + Style for the button. + Width of the button in pixels. + Height of the button in pixels. + The tooltip for the button. + true when the button is pressed. + + + + Draws a repeating icon button. + + The icon for the button. + true while the button is active. Otherwise false. + + + + Draws a repeating icon button. + + The icon for the button. + The size. + true while the button is active. Otherwise false. + + + + Draws a repeating icon button. + + The icon for the button. + The width of the button. + The height of the button. + true while the button is active. Otherwise false. + + + + Draws a SDF icon button. + + The button's label. + The button's height. + The button's icon. + The button's icon alignment. ButtonIconAlignment.LeftOfText by default. + The button's style. + + + + + Draws a SDF icon button. + + The button's label. + The button's height. + The button's icon. + The button's icon alignment. ButtonIconAlignment.LeftOfText by default. + The button's style. + + + + + Draws a SDF icon button. + + The button's label. + The button's height. + The button's icon. + The button's icon alignment. ButtonIconAlignment.LeftOfText by default. + The button's style. + + + + + Draws a SDF icon button. + + The button's label. + The button's height. + The button's icon. + The button's icon alignment. ButtonIconAlignment.LeftOfText by default. + The button's style. + + + + + Draws a SDF icon button. + + The button's rect. + The button's label. + The button's icon. + The button's icon alignment. ButtonIconAlignment.LeftOfText by default. + The button's style. + + + + + Draws a SDF icon button. + + The button's rect. + The button's icon. + The button's icon alignment. ButtonIconAlignment.LeftOfText by default. + The button's style. + + + + + Draws a SDF icon button. + + The button's rect. + The button's icon. + The button's style. + + + + + Draws a SDF icon button. + + The button's rect. + The button's label. + The button's icon. + The button's icon alignment. ButtonIconAlignment.LeftOfText by default. + The button's style. + + + + + Draws a SDF icon button. + + The button's rect. + The button's label. + The button's icon. + The button's icon alignment. ButtonIconAlignment.LeftOfText by default. + The button's style. + + + + + Draws a SDF icon button. + + The button's rect. + The button's label. + The button's icon. + The button's icon alignment. ButtonIconAlignment.LeftOfText by default. + The button's style. + + + + + Draws a colored SDF icon button. + + The button's rect. + The button's label. + The button's background color. + The button's text color. + The button's icon. + The button's icon alignment. ButtonIconAlignment.LeftOfText by default. + The button's style. + + + + + Draws a colored SDF icon button. + + The button's rect. + The button's label. + The button's background color. + The button's text color. + The button's icon. + The button's icon alignment. ButtonIconAlignment.LeftOfText by default. + The button's style. + + + + + Calculates the minimum needed space for a SDF icon button where the label is still visible. + + The label of the SDF icon button. + The height of the SDF icon button. + The minimum width of the SDF icon button. + + + + Draws a toolbar icon button. + + The icon for the button. + If true, the button clickable while GUI.enabled == false. + + true if the button was pressed. Otherwise false. + + + + + Draws a toolbar icon button. + + The icon for the button. + If true, the button clickable while GUI.enabled == false. + + true if the button was pressed. Otherwise false. + + + + + Draws a toolbar icon button. + + The GUI content for the button. + Whether the button state is selected or not + true if the button was pressed. Otherwise false. + + + + Draws a toolbar icon button. + + The label for the button. + Whether the button state is selected or not + true if the button was pressed. Otherwise false. + + + + Draws a toolbar toggle. + + Current state of the toggle. + The icon for the toggle. + The state of the toggle. + + + + Draws a toolbar toggle. + + Current state of the toggle. + The icon for the toggle. + The state of the toggle. + + + + Draws a toolbar toggle. + + Current state of the toggle. + The GUI content for the button. + The state of the toggle. + + + + Draws a toolbar toggle. + + Current state of the toggle. + The text for the toggle. + The state of the toggle. + + + + Draws a toolbar tab. + + If true the tab will be the active tab. + Name for the tab. + State of isActive. + + + + Draws a toolbar tab. + + If true the tab will be the active tab. + Label for the tab. + State of isActive. + + + + Draws a solid color rectangle. + + The rect. + The color. + If true applies the user's playmdoe tint to the rect in playmode. + + + + Draws a solid color rectangle. + + The width. + The height. + The color. + If true applies the user's playmdoe tint to the rect in playmode. + The rect created. + + + + Draws borders around a rect. + + The rect. + The width of the border on all sides. + If true applies the user's playmdoe tint to the rect in playmode. + + + + Draws borders around a rect. + + The rect. + The width of the border on all sides. + The color of the border. + If true applies the user's playmdoe tint to the rect in playmode. + + + + Draws borders around a rect. + + The rect. + The left size. + The right size. + The top size. + The bottom size. + If true applies the user's playmdoe tint to the rect in playmode. + + + + Draws borders around a rect. + + The rect. + The left size. + The right size. + The top size. + The bottom size. + The color of the borders. + If true applies the user's playmdoe tint to the rect in playmode. + + + + Draws a toolbar search field. + + The current search text. + If set to true the force focus on the field. + The left and right margin. + The current search text. + + + + Draws a search field. + + + + + Begins a horizontal toolbar. Remember to end with . + + The height of the toolbar. + Padding for the top of the toolbar. + The rect of the horizontal toolbar. + + + + Begins a horizontal toolbar. Remember to end with . + + The style for the toolbar. + The height of the toolbar. + The top padding. + + The rect of the horizontal toolbar. + + + + + Ends a horizontal toolbar started by . + + + + + Begins a horizontal indentation. Remember to end with . + + The GUI layout options. + + + + Begins a horizontal indentation. Remember to end with . + + The style of the indentation. + The GUI layout options. + + + + Ends a identation horizontal layout group started by . + + + + + Begins a vertical indentation. Remember to end with . + + The GUI layout options. + + + + Begins a vertical indentation. Remember to end with . + + The style of the indentation. + The GUI layout options. + + + + Ends a identation vertical layout group started by . + + + + + Indents by the current indent value, . + + + + + Draws a menu button. + + The indent of the button. + The text of the button. + The current state of the button. + The texture icon for the button. + The current state of the button. + + + + Begins a fade group. Remember to end with . + + The key for the fade group. + Current state of the fade group. + + + + Begins a fade group. Remember to end with . + + The key for the fade group. + Current state of the fade group. + A value between 0 and 1 indicating how expanded the fade group is. + + + + Begins a fade group. Remember to end with . + + The primary key for the fade group. + The secondly key for the fade group. + Current state of the fade group. + + + + Begins a fade group. Remember to end with . + + The key for the fade group. + The name of the fade group. + Current state of the fade group. + + + + Begins a fade group. Remember to end with . + + The key for the fade group. + Current state of the fade group. + The duration of fade in and out. + + + + Begins a fade group. Remember to end with . + + The key for the fade group. + Current state of the fade group. + A value between 0 and 1 indicating how expanded the fade group is. + The duration of fade in and out. + + + + Begins a fade group. Remember to end with . + + The primary key for the fade group. + The secondly key for the fade group. + Current state of the fade group. + The duration of fade in and out. + + + + Begins a fade group. Remember to end with . + + The key for the fade group. + The name of the fade group. + Current state of the fade group. + The duration of fade in and out. + + + + Begins a fade group. Remember to end with . + + The current fading value between 0 and 1. + + + + Ends a fade group started by any BeginFadeGroup. + + + + + Draws a foldout field where clicking on the label toggles to the foldout too. + + The current state of the foldout. + The label of the foldout. + The GUI style. + + The current state of the foldout. + + + + + Draws a foldout field where clicking on the label toggles to the foldout too. + + The current state of the foldout. + The label of the foldout. + The GUI style. + + + + Draws a foldout field where clicking on the label toggles to the foldout too. + + The current state of the foldout. + The label of the foldout. + The value rect. + The GUI style. + + + + Draws a foldout field where clicking on the label toggles to the foldout too. + + The rect to draw the foldout field in. + The current state of the foldout. + The label of the foldout. + The style. + + + + Draws a foldout field where clicking on the label toggles to the foldout too. + + The rect to draw the foldout field in. + The current state of the foldout. + The label of the foldout. + The style. + + + + Begins drawing a box. Remember to end with . + + The label of the box. + If set to true then center label. + The GUI layout options. + + + + Begins drawing a box. Remember to end with . + + The label of the box. + If set to true then center label. + The GUI layout options. + The rect of the box. + + + + Begins drawing a box. Remember to end with . + + The GUI layout options. + + + + Ends drawing a box started by any BeginBox. + + + + + Begins drawing a box header. Remember to end with . + + + + + Ends drawing a box header started by , + + + + + Begins drawing a box with toolbar style header. Remember to end with . + + Label for box header. + If true the label will be drawn in the center of the box header. + GUILayout options. + The rect of the box. + + + + Begins drawing a box with toolbar style header. Remember to end with . + + Label for box header. + If true the label will be drawn in the center of the box header. + GUILayout options. + The rect of the box. + + + + Begins drawing a box with toolbar style header. Remember to end with . + + GUILayout options. + The rect of the box. + + + + Ends the drawing a box with a toolbar style header started by . + + + + + Begins drawing a toolbar style box header. Remember to end with . + + The rect of the box. + + + + Ends the drawing of a toolbar style box header started by . + + + + + Begins drawing a legend style box. Remember to end with . + + The label for the legend style box. + If true the label will be drawn in the center of the box. + GUILayout options. + The rect of the box. + + + + Begins drawing a legend style box. Remember to end with . + + The label for the legend style box. + If true the label will be drawn in the center of the box. + GUILayout options. + The rect of the box. + + + + Begins drawing a legend style box. Remember to end with . + + GUILayout options. + The rect of the box. + + + + Ends the drawing of a legend style box started by + + + + + Begins drawing an inline box. Remember to end with . + + The GUI layout options. + The rect of the box. + + + + Ends drawing an inline box started by any BeginInlineBox. + + + + + Starts the shaking animation of a shaking group. + + + + + Starts the shaking animation of a shaking group. + + + + + Begins a shakeable group. + + + + + Ends the shakeable group. + + + + + Begins a shakeable group. + + + + + Begins a shakeable group. + + + + + Starts the shaking animation of a shaking group. + + + + + Ends the shakeable group. + + + + + Begins drawing a vertical menu list. + + The key for the menu list. + The rect created. + + + + Begins drawing a menu list item. Remember to end with + + Value indicating whether the item is selected. + Value indicating if the mouse is pressed on the item. + If set to true the item is set as selected.. + The rect used for the item. + + + + Ends drawing a menu list item started by + + + + + Ends drawing a vertical menu list started by + + + + + Begins drawing a vertical list. + + If set to true borders will be drawn around the vertical list. + If set to true a dark background will be drawn. + The GUI layout options. + The rect used for the list. + + + + Ends drawing a vertical list started by . + + + + + Begins drawing a list item. + + If set to true the item can be hovered with the mouse. + The style for the vertical list item. + The GUI layout options. + The rect used for the item. + + + + Begins drawing a list item. + + If set to true the item can be hovered with the mouse. + The style for the vertical list item. + The GUI layout options. + The color for even elements. + The color for odd elements. + The color for even elements when hovered. + The color for odd elements when hovered. + The rect used for the item. + + + + Ends drawing a list item started by . + + + + + Creates a animated tab group. + + The key for the tab group.. + An animated tab group. + + + + Begins drawing a toggle group. Remember to end with . + + The key of the group. + Value indicating if the group is enabled. + Value indicating if the group is visible. + The title of the group. + Value indicating if the group is toggled. + + + + Begins drawing a toggle group. Remember to end with . + + The key of the group. + Value indicating if the group is enabled. + Value indicating if the group is visible. + The title of the group. + Duration of the animation. + Value indicating if the group is toggled. + + + + Ends drawing a toggle group started by . + + + + + Begins drawing a horizontal auto scroll box. Remember to end with . + + The for the field. + The GUILayout options. + The rect used for the field. + + + + Ends drawing a horizontal auto scroll box started by . + + + + + Creates a rect that can be grabbed and pulled to change a value up or down. + + The grabbable rect. + The control ID for the sliding. + The current value. + + The current value. + + + + + Creates a rect that can be grabbed and pulled to change a value up or down. + + The grabbable rect. + The control ID for the sliding. + The current value. + + The current value. + + + + + Creates a rect that can be grabbed and pulled to change a value up or down. + + The grabbable rect. + The control ID for the sliding. + The current value. + + The current value. + + + + + Creates a rect that can be grabbed and pulled to change a value up or down. + + The grabbable rect. + The control ID for the sliding. + The current value. + + The current value. + + + + + Creates a rect that can be grabbed and pulled + + The grabbable rect. + The cursor. + + The the mouse delta position. + + + + + Creates a rect that can be grabbed and pulled + + The position. + The grabbable rect. + + The the mouse delta position. + + + + + Draws a field for a value of type T - dynamically choosing an appropriate drawer for the type. + Currently supported are: char, string, sbyte, byte, short, ushort, int, uint, long, ulong, float, double, decimal, Guid and all enums. + + The type of the value to draw. + The label of the fields. + The value to draw. + The layout options. + The possibly changed value. + + + + Checks whether a given type can be drawn as a dynamic field by + + The type to check. + True if the type can be drawn, otherwise false. + + + + Gets the feature rich control rect. + + + + + Gets the feature rich control rect. + + + + + Creates a control ID that handles keyboard control, focused editor window, indentation and prefix label correctly. + + The rect to make a feature rich control for. + The label for the control. Leave null for no label. + The created control ID. + A value indicating whether or not the control has keyboard focus. + + + + Creates a control ID that handles keyboard control, focused editor window, indentation and prefix label correctly. + + The rect to make a feature rich control for. + The created control ID. + A value indicating whether or not the control has keyboard focus. + + + + Draws a with support for slicing the Texture. + + The to draw the in. + The to draw. + The amount of slicing applied to the texture on all sides. + + + + Draws a with support for slicing the Texture. + + The to draw the in. + The to draw. + The amount of slicing applied to the left and right sides. + The amount of slicing applied to the top and bottom sides. + + + + Draws a with support for slicing the Texture. + + The to draw the in. + The to draw. + The amount of slicing applied to the left side. + The amount of slicing applied to the right side. + The amount of slicing applied to the top side. + The amount of slicing applied to the bottom side. + + + + Draws a with support for slicing the Texture. + + The to draw the in. + The to draw. + The UV-coordinates to use. + The amount of slicing applied to the texture on all sides. + + + + Draws a with support for slicing the Texture. + + The to draw the in. + The to draw. + The UV-coordinates to use. + The amount of slicing applied to the left and right sides. + The amount of slicing applied to the top and bottom sides. + + + + Draws a with support for slicing the Texture. + + The to draw the in. + The to draw. + The UV-coordinates to use. + The amount of slicing applied to the left side. + The amount of slicing applied to the right side. + The amount of slicing applied to the top side. + The amount of slicing applied to the bottom side. + + + + Draws a with support for slicing the Texture. + + The to draw the in. + The to draw. + The that modulates the output. + The amount of slicing applied to the texture on all sides. + + + + Draws a with support for slicing the Texture. + + The to draw the in. + The to draw. + The that modulates the output. + The amount of slicing applied to the left and right sides. + The amount of slicing applied to the top and bottom sides. + + + + Draws a with support for slicing the Texture. + + The to draw the in. + The to draw. + The that modulates the output. + The amount of slicing applied to the left side. + The amount of slicing applied to the right side. + The amount of slicing applied to the top side. + The amount of slicing applied to the bottom side. + + + + Draws a with support for slicing the Texture. + + The to draw the in. + The to draw. + The that modulates the output. + The UV-coordinates to use. + The amount of slicing applied to the texture on all sides. + + + + Draws a with support for slicing the Texture. + + The to draw the in. + The to draw. + The that modulates the output. + The UV-coordinates to use. + The amount of slicing applied to the left and right sides. + The amount of slicing applied to the top and bottom sides. + + + + Draws a with support for slicing the Texture. + + The to draw the in. + The to draw. + The that modulates the output. + The UV-coordinates to use. + The amount of slicing applied to the left side. + The amount of slicing applied to the right side. + The amount of slicing applied to the top side. + The amount of slicing applied to the bottom side. + + + + Draws a repeating in a given . + + The to draw the in. + The to draw. + Amount of scaling applied to the output. + + + + Draws a repeating in a given . + + The to draw the in. + The to draw. + The that modulates the output. + Amount of scaling applied to the output. + + + + Draws a button with a given Size. + + Text to display on the button. + The size of the button. + true when the button is pressed; otherwise false. + + + + Collection of GUIStyles used by Sirenix. + + + + + Validator Green + + + + + Inspector Orange + + + + + Serializer Yellow + + + + + Green valid color + + + + + Red error color + + + + + Yellow warning color + + + + + Border color. + + + + + Box background color. + + + + + Dark editor background color. + + + + + Editor window background color. + + + + + Menu background color. + + + + + Header box background color. + + + + + Highlighted Button Color. + + + + + Highlight text color. + + + + + Highlight property color. + + + + + List item hover color for every other item. + + + + + List item hover color for every other item. + + + + + List item drag background color. + + + + + List item drag background color. + + + + + Column title background colors. + + + + + The default background color for when a menu item is selected. + + + + + The default background color for when a menu item is selected. + + + + + The default background color for when a menu item is selected. + + + + + The default background color for when a menu item is selected. + + + + + A mouse over background overlay color. + + + + + The default background color for when a menu item is selected. + + + + + The default background color for when a menu item is selected. + + + + + List item background color for every other item. OBSOLETE: Use ListItemColorEven instead. + + + + + List item background color for every other item. OBSOLETE: Use ListItemColorOdd instead. + + + + + List item color for every other item. + + + + + List item color for every other item. + + + + + Menu button active background color. + + + + + Menu button border color. + + + + + Menu button color. + + + + + Menu button hover color. + + + + + A light border color. + + + + + Bold label style. + + + + + Tag Button style. + + + + + Bold label style. + + + + + Centered bold label style. + + + + + Box container style. + + + + + Popup style. + + + + + Box header style. + + + + + Button style. + + + + + Button selected style. + + + + + Left button style. + + + + + Left button selected style. + + + + + Mid button style. + + + + + Mid button selected style. + + + + + Right button style. + + + + + Right button selected style. + + + + + Pane Options Button + + + + + Left button style. + + + + + Left button selected style. + + + + + Left button style. + + + + + Left button selected style. + + + + + Mid button style. + + + + + Mid button selected style. + + + + + Right button style. + + + + + Right button selected style. + + + + + Color field background style. + + + + + Foldout style. + + + + + Icon button style. + + + + + Label style. + + + + + Highlighted label style. + + + + + White label style. + + + + + Black label style. + + + + + Centered label style. + + + + + Centered label style. + + + + + White centered label style. + + + + + Black centered label style. + + + + + Centered mini label style. + + + + + Left Aligned Centered Label + + + + + Left aligned grey mini label style. + + + + + Left aligned grey label style. + + + + + Centered grey mini label + + + + + Left right aligned white mini label style. + + + + + Centered white mini label style. + + + + + Centered black mini label style. + + + + + List item style. + + + + + Menu button background style. + + + + + No style. + + + + + Odin Editor Wrapper. + + + + + Padding less box style. + + + + + Content Padding + + + + + Property padding. + + + + + Property margin. + + + + + Rich text label style. + + + + + Right aligned grey mini label style. + + + + + Right aligned white mini label style. + + + + + Section header style. + + + + + Section header style. + + + + + Toggle group background style. + + + + + Toggle group checkbox style. + + + + + Toggle group padding style. + + + + + Toggle group title background style. + + + + + Toolbar background style. + + + + + Toolbar button style. + + + + + Toolbar button selected style. + + + + + Toolbar search cancel button style. + + + + + Toolbar search field style. + + + + + Toolbar tab style. + + + + + Title style. + + + + + Bold title style. + + + + + Centered bold title style. + + + + + Right aligned bold title style. + + + + + Centered title style. + + + + + Right aligned title style. + + + + + Subtitle style. + + + + + Centered sub-title style. + + + + + Right aligned sub-title style. + + + + + Message box style. + + + + + Detailed Message box style. + + + + + Multiline white label style. + + + + + Multiline Label + + + + + Centered Multiline Label + + + + + Centered Text Field + + + + + Gets the bottom box padding. + + + + + Unitys PaneOptions GUIStyle. + + + + + Unitys ProjectBrowserTextureIconDropShadow GUIStyle. + + + + + Unitys TL SelectionButton PreDropGlow GUIStyle. + + + + + Unitys ShurikenModuleTitle GUIStyle. + + + + + Draw this one manually with: new Color(1, 1, 1, EditorGUIUtility.isProSkin ? 0.25f : 0.45f) + + + + + SDFIconButton Label. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Utility functions for Unity assets. + + + + + Gets all assets of the specified type. + + + + + Gets all assets of the specified type. + + The type of assets to find. + The asset folder path. + + + + Gets all assets of the specified type. + + The type of assets to find. + The asset folder path. + + + + Asset search helper. + + + + + The asset object. + + + + + Current index. + + + + + Search result count. + + + + + Tests if an asset can be created from a type. + + The type to test. + true if an asset can be created. Otherwise false. + + + + Tests if an asset can be created from a type. + + The type to test. + The base asset type. + true if an asset can be created. Otherwise false. + + + + Gets project path to the specified asset. + + The asset object. + The path to the asset. + + + + Creates a new asset of the specified type. + + The type of the asset. + Project path to the new asset. + The name of the asset. + + + + Functions for accessing the clipboard. + + + + + Gets the current copy mode. + + + + + Copies the specified object. + + + The object. + The copy mode. + + + + Copies the specified object. + + + + + Clears this instance. + + + + + Determines whether this instance can paste the specified type. + + + + + Determines whether this instance can paste the specified type. + + + + + Determines whether or not the Clipboard contains any instance. + + + + + Tries the paste. + + + + + Copies or gets the current object in the clipboard. + + + + + Copies or gets the current object in the clipboard. + + + + + The various modes of copying an object to the clipboard. + + + + + Deep copy. + + + + + Shallow Copy. + + + + + Reference Copy. + + + + + A utility class for getting delta time for the GUI editor. + + + + + A utility class for getting delta time for the GUI editor. + + + + + Compare strings and produce a distance score between them. + + + + + Determines whether if the source is within the search. + + The source string. + The target string. + Should the algorithm ignore letter case?. + Should the algorithm attempt to search on an abbreviation of the source?. + Threshold for what is considered to be within the search. 0 will return everything and 1 will only return exact matches. + True if the source is within the search. Otherwise false. + + + + Compares the target to the source and returns a distance score. + + The source string. + The target string. + + + Distance score. 0 is no match, and 1 is exact match. + + + + A utility class for properly counting frames and helps determine when a frame has started in an editor window. + + + + + Gets the frame count. + + + + + Gets a value indicating whether this instance is new frame. + + + + + Updates the frame counter and returns itself. + + + + + Hides the ObjectMembers in Visual Studio IntelliSense + + + + + Determines whether the specified , is equal to this instance. + + + + + Returns a hash code for this instance. + + + + + Gets the type. + + + + + Returns a that represents this instance. + + + + + Collection of texture functions. + + + + + Creates a new texture with no mimapping, linier colors, and calls texture.LoadImage(bytes), DontDestroyOnLoad(tex) and sets hideFlags = DontUnloadUnusedAsset | DontSaveInEditor. + + Old description no longer relevant as we've moved past version 2017. + Loads an image from bytes with the specified width and height. Use this instead of someTexture.LoadImage() if you're compiling to an assembly. Unity has moved the method in 2017, + and Unity's assembly updater is not able to fix it for you. This searches for a proper LoadImage method in multiple locations, and also handles type name conflicts. + + + + + Crops a Texture2D into a new Texture2D. + + + + + Resizes a texture by blitting, this allows you to resize unreadable textures. + + + + + Converts a Sprite to a Texture2D. + + + + + + + Categories of units. A unit value can only be converted to another of the same category. + + + + + Tools for converting between units, for example, converting from inches to meters. + + + + + + + Gets all UnitInfo registered, both built-in and custom. + + Enumerable of both built-in and custom units. + + + + Gets the UnitInfo for the given Units enum value. + + Units enum value. + UnitInfo for the unit. + Throws for invalid unit input. + + + + Gets the UnitInfo with the corrosponding name. + + The name of the unit. + UnitInfo for the name. + Throws when no unit with the given name is found. + + + + Finds the UnitInfo that best fits the given symbol within the given category. + + The symbol to find a unit for. + The category to look for units within. + The UnitInfo that best matches the given symbol. + Throws when no match was found. + + + + Gets the UnitInfo for the given Units enum value. + + Units enum value. + The UnitInfo matching the given unit value. + true when a UnitInfo was found. Otherwise false. + + + + Gets the UnitInfo with the given name. + + The name of the unit. + The UnitInfo matching the given name. + true when a UnitInfo was found. Otherwise false. + + + + Finds the UnitInfo that best fits the given symbol within the given category. + + The symbol to find a unit for. + The category to look for units within. + The UnitInfo that best matches the given symbol. + true when a UnitInfo was found. Otherwise false. + + + + Converts between two units. The units must be of the same category. + + The value to convert. Should be in the from units. + The unit to convert the value from. value should be in this unit. + To unit to convert the value to. Must be the same category as from. + The value converted to to units. + Throws when either 'from' or 'to' units are invalid, or when the units are of different categories. + + + decimal meters = 5m; + decimal centimeters = ConvertUnitsFromTo(meters, Units.Meter, Units.Centimeter); + // centimeters = 500 + + + + + + Converts between two units. The units must be of the same category. + + The value to convert. Should be in the fromUnitInfo units. + The unit to convert the value from. value should be in this unit. + To unit to convert the value to. Must be the same category as fromUnitInfo. + The value converted to toUnitInfo units. + Throws when either 'fromUnitInfo' or 'toUnitInfo' units are invalid, or when the units are of different categories. + + + decimal meters = 5m; + decimal centimeters = ConvertUnitsFromTo(meters, meterUnitInfo, centimeterUnitInfo); + // centimeters = 500 + + + + + + Converts between two units. The units must be of the same category. + + The value to convert. Should be in the from units. + The unit to convert the value from. value should be in this unit. + To unit to convert the value to. Must be the same category as from. + The value converted to to units. + true when the unit was successfully converted. Otherwise false. + + + decimal meters = 5m; + if (TryConvertUnitsFromTo(meters, Units.Meter, Units.Centimeter, out decimal centimeters) + { + // centimeters = 500 + } + + + + + + Converts between two units. The units must be of the same category. + + The value to convert. Should be in the fromUnitInfo units. + The unit to convert the value from. value should be in this unit. + To unit to convert the value to. Must be the same category as fromUnitInfo. + The value converted to toUnitInfo units. + true when the unit was successfully converted. Otherwise false. + + + decimal meters = 5m; + if (TryConvertUnitsFromTo(meters, meterUnitInfo, centimeterUnitInfo, out decimal centimeters)) + { + // centimeters = 500 + } + + + Throws if either fromUnitInfo or toUnitInfo is null. + + + + Indicates whether or not a value can be converted between the given a and b units. + + Unit a. + Unit b. + true if both units have the same category. Otherwise false. + + + + Indicates whether or not a value can be converted between the given a and b units. + + Unit a. + Unit b. + true if both units have the same category. Otherwise false. + + + + Adds a custom unit to the UnitNumberUtility, that can also be used with the . + Call this using InitializeOnLoad or InitializeOnLoadMethod. + + The name of the unit. Duplicate names are not allowed. + Symbols used for the unit. First value in the array will be used as the primary symbol. Atleast 1 value required. Duplicate symbols are not allowed within the same category. + The category of the unit. Units can only be converted to another of the same category. Custom categories are allowed. + The multiplier to convert the unit from the base value. For example, meters are the base unit of the distance category, therefore centimeters have a multipler of 100. + + Example of adding centimeters as a custom unit. + + UnitNumberUtility.AddCustomUnit("Centimeter", new string[]{ "cm" }, "Distance", 100m); + + + + + + Adds a custom unit to the UnitNumberUtility, that can also be used with the . + Call this using InitializeOnLoad or InitializeOnLoadMethod. + + The name of the unit. Duplicate names are not allowed. + Symbols used for the unit. First value in the array will be used as the primary symbol. Atleast 1 value required. Duplicate symbols are not allowed within the same category. + The category of the unit. Units can only be converted to another of the same category. Custom categories are allowed. + The multiplier to convert the unit from the base value. For example, meters are the base unit of the distance category, therefore centimeters have a multipler of 100. + + Example of adding centimeters as a custom unit. + + UnitNumberUtility.AddCustomUnit("Centimeter", new string[]{ "cm" }, UnitCategory.Distance, 100m); + + + + + + Adds a custom unit to the UnitNumberUtility, that can also be used with the . + This overload allows for custom conversion methods but, if possible, the multiplier overloads should be prefered. + Call this using InitializeOnLoad or InitializeOnLoadMethod. + + The name of the unit. Duplicate names are not allowed. + Symbols used for the unit. First value in the array will be used as the primary symbol. Atleast 1 value required. Duplicate symbols are not allowed within the same category. + The category of the unit. Units can only be converted to another of the same category. Custom categories are allowed. + Method for converting a given value of the custom unit to the base unit. For example, for centimeter, use: x => x / 100m;. + Method for converting a given value of the base unit to the custom unit. For example, for centimeter, use: x => x * 100m;. + + Example of adding centimeters as a custom unit. + + UnitNumberUtility.AddCustomUnit("Centimeter", new string[]{ "cm" }, "Distance", x => x / 100m, x = > x * 100m); + + + + + + Adds a custom unit to the UnitNumberUtility, that can also be used with the . + This overload allows for custom conversion methods but, if possible, the multiplier overloads should be prefered. + Call this using InitializeOnLoad or InitializeOnLoadMethod. + + The name of the unit. Duplicate names are not allowed. + Symbols used for the unit. First value in the array will be used as the primary symbol. Atleast 1 value required. Duplicate symbols are not allowed within the same category. + The category of the unit. Units can only be converted to another of the same category. Custom categories are allowed. + Method for converting a given value of the custom unit to the base unit. For example, for centimeter, use: x => x / 100m;. + Method for converting a given value of the base unit to the custom unit. For example, for centimeter, use: x => x * 100m;. + /// + Example of adding centimeters as a custom unit. + + UnitNumberUtility.AddCustomUnit("Centimeter", new string[]{ "cm" }, UnitCategory.Distance, x => x / 100m, x = > x * 100m); + + + + + + Object describing units, including name, symbols and how to convert it to other units. + + + + + Name of the unit. + + + + + Symbols of the unit. First symbol is considered the primary symbol. + + + + + The category of the unit. Units can only be converted within the same category. + + + + + Multiplier for converting from the base unit. + + + + + Custom method for converting from the base unit. + + + + + Custom method for converting to the base unit. + + + + + Indicates whether the UnitInfo should use the multiplier or the ConvertFromBase and ConvertToBase methods. + + + + + + This is an internal class that is used solely in pre-built assembly versions of Odin, not in source distributions. + Some Unity API's differ in different versions of the engine, like the Color, Color32, Rect and Vector2/3/4 structs. + This class contains replacements or reimplementations of these Unity APIs. This class should not be used directly. + + + At build time, Odin's assemblies are IL post-processed to redirect all relevant calls with shims into the implementations + here instead of using the Unity versions of these APIs, such that Odin's pre-built assemblies work across a wide + range of Unity versions. + + + + + + AssemblyTypeFlags is a bitmask used to filter types and assemblies related to Unity. + + + + + + Excludes all types. + + + + + UserTypes includes all custom user scripts that are not located in an editor or plugin folder. + + + + + PluginTypes includes all types located in the plugins folder and are not located in an editor folder. + + + + + UnityTypes includes all types depended on UnityEngine and from UnityEngine, except editor, plugin and user types. + + + + + UserEditorTypes includes all custom user scripts that are located in an editor folder but not in a plugins folder. + + + + + PluginEditorTypes includes all editor types located in the plugins folder. + + + + + UnityEditorTypes includes all editor types that are not user editor types nor plugin editor types. + + + + + OtherTypes includes all other types that are not depended on UnityEngine or UnityEditor. + + + + + CustomTypes includes includes all types manually added to the Unity project. + This includes UserTypes, UserEditorTypes, PluginTypes and PluginEditorTypes. + + + + + GameTypes includes all assemblies that are likely to be included in builds. + This includes UserTypes, PluginTypes, UnityTypes and OtherTypes. + + + + + EditorTypes includes UserEditorTypes, PluginEditorTypes and UnityEditorTypes. + + + + + All includes UserTypes, PluginTypes, UnityTypes, UserEditorTypes, PluginEditorTypes, UnityEditorTypes and OtherTypes. + + + + + A utility class for finding types in various asssembly. + + + + + Gets an of all assemblies in the current . + + An of all assemblies in the current . + + + + Gets the for a given assembly. + + The assembly. + The for a given assembly. + is null. + + + + Determines whether an assembly is depended on another assembly. + + The assembly. + The other assembly. + + true if has a reference in or is the same as . + + is null. + is null. + + + + Determines whether the assembly module is a of type . + + The assembly. + + true if the specified assembly of type ; otherwise, false. + + assembly + + + + Gets the full file path to a given assembly's containing directory. + + The assembly. + The full file path to a given assembly's containing directory, or Null if no file path was found. + is Null. + + + + Gets the full directory path to a given assembly. + + The assembly. + The full directory path in which a given assembly is located, or Null if no file path was found. + + + + Gets the type. + + The full name of the type, with or without any assembly information. + + + + Get types from the current AppDomain with a specified filter. + + The filters. + Types from the current AppDomain with the specified filters. + + + + Get types from the current AppDomain with a specified filter. + + The filters. + Types from the current AppDomain with the specified filters. + + + + Find members of the given type, while providing good error messages based on the following search filters provided. + See for more information. + + + + + MemberFinder is obsolete, and has been replacted by and . + Use cases that do not fit those utlities should use manual reflection that is hand-optimized for the best performance in the given case. + + MemberFinder was a utility class often used by Odin drawers to find fields, methods, and + properties while providing good user-friendly error messages based on the search criteria. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + + + + Find members of the given type, while providing good error messages based on the following search filters provided. + + + + + Find members of the given type, while providing good error messages based on the following search filters provided. + + + + + Can be true for both fields, properties and methods. + + + + + + Exclude members found in base-types. + + + + + Only include methods with the following parameter. + Calling this will also exclude fields and properties. + Parameter type inheritance is supported. + + + + + Only include methods with the following parameters. + Calling this will also exclude fields and properties. + Parameter type inheritance is supported. + + + + + Only include methods with the following parameters. + Calling this will also exclude fields and properties. + Parameter type inheritance is supported. + + + + + Only include methods with the following parameters. + Calling this will also exclude fields and properties. + Parameter type inheritance is supported. + + + + + Only include methods with the following parameters. + Calling this will also exclude fields and properties. + Parameter type inheritance is supported. + + + + + Only include methods with the following parameters. + Calling this will also exclude fields and properties. + Parameter type inheritance is supported. + + + + + Only include methods with the following parameters. + Calling this will also exclude fields and properties. + Parameter type inheritance is supported. + + + + + Only include methods with the following parameters. + Calling this will also exclude fields and properties. + Parameter type inheritance is supported. + + + + + Determines whether [has return type] [the specified return type]. + + + + + Can be true for both fields, properties and methods. + + + + + Calls IsField() and IsProperty(). + + + + + Only include static members. By default, both static and non-static members are included. + + + + + Only include non-static members. By default, both static and non-static members are included. + + + + + Specify the name of the member. + + + + + Excludes fields and methods if nether IsField() or IsMethod() is called. Otherwise includes properties. + By default, all member types are included. + + + + + Excludes fields and properties if nether IsField() or IsProperty() is called. Otherwise includes methods. + By default, all member types are included. + + + + + Excludes properties and methods if nether IsProperty() or IsMethod() is called. Otherwise includes fields. + By default, all member types are included. + + + + + Excludes non-public members if IsNonPublic() has not yet been called. Otherwise includes public members. + By default, both public and non-public members are included. + + + + + Excludes public members if IsPublic() has not yet been called. Otherwise includes non-public members. + By default, both public and non-public members are included. + + + + + Excludes fields and properties, and only includes methods with a return type of void. + + + + + Gets the member based on the search filters provided + Returns null if no member was found. + + + + + Gets the member based on the search filters provided, and provides a proper error message if no members was found. + + + + + Gets the member based on the search filters provided, and provides a proper error message if no members was found. + + + + + Try gets the member based on the search filters provided, and provides a proper error message if no members was found. + + + + + Try gets the member based on the search filters provided, and provides a proper error message if no members was found. + + + + + Try gets all members based on the search filters provided, and provides a proper error message if no members was found. + + + + + Gets or sets the width of the col. + + + + + Gets or sets the minimum width. + + + + + Gets a value indicating whether the width should be preserved when the table itself gets resiszed. + + + + + Gets a value indicating whether this is resizable. + + + + + This class contains utility methods for subscribing to various UnityEditor events reliably and safely across all Odin-supported versions of Unity. + + + + + Sometimes, someone accidentally overrides a delay action subscription to + by setting the value instead of using the += operator as should be done, + which can be done because in many versions of Unity it is a field, and not an event. + (In some versions of Unity it is an event, though, and in this case, this method acts as a wrapper + to subscribe reliably, no matter the nature of the backing event.) + This method subscribes to a lot of different callbacks, in the hopes of catching at least one. + + As opposed to , this method is safe to call from any thread, and will + delay the actual subscription to a safe time. + + + + + Sometimes, an idiot overrides a delay action subscription to , + which can be done because the people at Unity didn't know what events were once upon a time. + This method subscribes to a lot of different callbacks, in the hopes of catching at least one. + + + + + Sometimes, an idiot overrides a delay action subscription to , + which can be done because the people at Unity didn't know what events were once upon a time. + This method subscribes to a lot of different callbacks, in the hopes of catching at least one. + + + + + In 2019.1+, this event subscribes to SceneView.duringSceneGui. In 2018.4 and lower, it subscribes to SceneView.onSceneGUIDelegate. + + + + + In 2020.1, Unity changed EditorApplication.delayCall from a field to an event, meaning + we now have to use reflection to access it consistently across all versions of Unity. + + + + diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.Editor.xml.meta b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.Editor.xml.meta new file mode 100644 index 00000000..03f29c1b --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.Editor.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5c65184932ff4fd48a343e236025096f +timeCreated: 1488828285 +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.dll b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.dll new file mode 100644 index 00000000..2083665b Binary files /dev/null and b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.dll differ diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.dll.meta b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.dll.meta new file mode 100644 index 00000000..44c2d221 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.dll.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 4873f2a8bdae42baa0406e8a61366ca1 +timeCreated: 1488828285 +PluginImporter: + serializedVersion: 1 + iconMap: {} + executionOrder: {} + isPreloaded: 0 + isOverridable: 0 + platformData: + Any: + enabled: 0 + settings: + Exclude Android: 1 + Exclude Editor: 0 + Exclude Linux: 1 + Exclude Linux64: 1 + Exclude LinuxUniversal: 1 + Exclude N3DS: 1 + Exclude OSXIntel: 1 + Exclude OSXIntel64: 1 + Exclude OSXUniversal: 1 + Exclude PS4: 1 + Exclude PSM: 1 + Exclude PSP2: 1 + Exclude SamsungTV: 1 + Exclude Tizen: 1 + Exclude WebGL: 1 + Exclude WiiU: 1 + Exclude Win: 1 + Exclude Win64: 1 + Exclude WindowsStoreApps: 1 + Exclude XboxOne: 1 + Exclude iOS: 1 + Exclude tvOS: 1 + Editor: + enabled: 1 + settings: + DefaultValueInitialized: true + WindowsStoreApps: + enabled: 0 + settings: + CPU: AnyCPU + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.xml b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.xml new file mode 100644 index 00000000..6315c4d0 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.xml @@ -0,0 +1,3724 @@ + + + + Sirenix.Utilities + + + + + Extension methods for the UnityEngine.Color type. + + + + + Lerps between multiple colors. + + The colors. + The t. + + + + + Moves the towards implementation for Color. + + From color. + To color. + The maximum delta. + + + + Tries to parse a string to a Color. The following formats are supported: + "new Color(0.4, 0, 0, 1)", "#FFEEBBFF", "#FFEECC", "FFEEBBFF", "FFEECC" + + The color string. + The color. + Returns true if the parse was a success. + + + + Converts a color to a string formatted to c# + + The color. + new Color(r, g, b, a) + + + + Pows the color with the specified factor. + + The color. + The factor. + + + + Normalizes the RGB values of the color ignoring the alpha value. + + The color. + + + + Gets the perceived luminosity of a given . + + The current . + Determines if the Color.a value should impact the result. + The float value representing the luminosity. + + + + Delegate method extensions. + + + + + Memoizes the specified func - returns the memoized version + + + + + Memoizes the specified func - returns the memoized version + + + + + FieldInfo method extensions. + + + + + Determines whether the specified field is an alias. + + The field to check. + + true if the specified field is an alias; otherwise, false. + + + + + Returns the original, backing field of an alias field if the field is an alias. + + The field to check. + /// if set to true an exception will be thrown if the field is not aliased. + + The field was not aliased; this only occurs if throwOnNotAliased is true. + + + + Garbage free enumerator methods. + + + + + Garbage free enumerator for lists. + + + + + Garbage free enumerator for dictionaries. + + + + + Garbage free enumator for dictionary values. + + + + + Garbage free enumerator for hashsets. + + + + + List iterator. + + + + + Creates a list iterator. + + + + + Gets the enumerator. + + + + + Gets the current value. + + + + + Moves to the next value. + + + + + Disposes the iterator. + + + + + Hashset iterator. + + + + + Creates a hashset iterator. + + + + + Gets the enumerator. + + + + + Gets the current value. + + + + + Moves to the next value. + + + + + Disposes the iterator. + + + + + Dictionary iterator. + + + + + Creates a dictionary iterator. + + + + + Gets the enumerator. + + + + + Gets the current value. + + + + + Moves to the next value. + + + + + Disposes the iterator. + + + + + Dictionary value iterator. + + + + + Creates a dictionary value iterator. + + + + + Gets the enumerator. + + + + + Gets the current value. + + + + + Moves to the next value. + + + + + Disposes the iterator. + + + + + Various LinQ extensions. + + + + + Calls an action on each item before yielding them. + + The collection. + The action to call for each item. + + + + Perform an action on each item. + + The source. + The action to perform. + + + + Perform an action on each item. + + The source. + The action to perform. + + + + Convert each item in the collection. + + The collection. + Func to convert the items. + + + + Convert a collection to an immutable list. + + The collection. + + + + Add an item to the beginning of a collection. + + The collection. + Func to create the item to prepend. + + + + Add an item to the beginning of a collection. + + The collection. + The item to prepend. + + + + Add a collection to the beginning of another collection. + + The collection. + The collection to prepend. + + + + Add an item to the beginning of another collection, if a condition is met. + + The collection. + The condition. + Func to create the item to prepend. + + + + Add an item to the beginning of another collection, if a condition is met. + + The collection. + The condition. + The item to prepend. + + + + Add a collection to the beginning of another collection, if a condition is met. + + The collection. + The condition. + The collection to prepend. + + + + Add an item to the beginning of another collection, if a condition is met. + + The collection. + The condition. + Func to create the item to prepend. + + + + Add an item to the beginning of another collection, if a condition is met. + + The collection. + The condition. + The item to prepend. + + + + Add a collection to the beginning of another collection, if a condition is met. + + The collection. + The condition. + The collection to prepend. + + + + Add an item to the beginning of another collection, if a condition is met. + + The collection. + The condition. + Func to create the item to prepend. + + + + Add an item to the beginning of another collection, if a condition is met. + + The collection. + The condition. + The item to prepend. + + + + Add a collection to the beginning of another collection, if a condition is met. + + The collection. + The condition. + The collection to prepend. + + + + Add an item to the end of a collection. + + The collection. + Func to create the item to append. + + + + Add an item to the end of a collection. + + The collection. + The item to append. + + + + Add a collection to the end of another collection. + + The collection. + The collection to append. + + + + Add an item to the end of a collection if a condition is met. + + The collection. + The condition. + Func to create the item to append. + + + + Add an item to the end of a collection if a condition is met. + + The collection. + The condition. + The item to append. + + + + Add a collection to the end of another collection if a condition is met. + + The collection. + The condition. + The collection to append. + + + + Add an item to the end of a collection if a condition is met. + + The collection. + The condition. + Func to create the item to append. + + + + Add an item to the end of a collection if a condition is met. + + The collection. + The condition. + The item to append. + + + + Add a collection to the end of another collection if a condition is met. + + The collection. + The condition. + The collection to append. + + + + Returns and casts only the items of type . + + The collection. + + + + Adds a collection to a hashset. + + The hashset. + The collection. + + + + Returns true if the list is either null or empty. Otherwise false. + + The list. + + + + Sets all items in the list to the given value. + + The list. + The value. + + + + Adds the elements of the specified collection to the end of the IList<T>. + + + + + Sorts an IList + + + + + Sorts an IList + + + + + Various list extension methods. + + + + + Increases or decrease the number of items in the list to the specified count. + + The list. + The new length. + + + + Increases or decrease the number of items in the list to the specified count. + + The list. + The new length. + Value of new elements. + + + + Increases or decrease the number of items in the list to the specified count. + + The list. + The new length. + + + + Increases or decrease the number of items in the list to the specified count. + + The list. + The new length. + Value of new elements. + + + + MemberInfo method extensions. + + + + + Returns true if the attribute whose type is specified by the generic argument is defined on this member + + + + + Returns true if the attribute whose type is specified by the generic argument is defined on this member + + + + + Returns the first found custom attribute of type T on this member + Returns null if none was found + + + + + Returns the first found non-inherited custom attribute of type T on this member + Returns null if none was found + + + + + Gets all attributes of the specified generic type. + + The member. + + + + Gets all attributes of the specified generic type. + + The member. + If true, specifies to also search the ancestors of element for custom attributes. + + + + Gets all attribute instances defined on a MemeberInfo. + + The member. + + + + Gets all attribute instances on a MemberInfo. + + The member. + If true, specifies to also search the ancestors of element for custom attributes. + + + + If this member is a method, returns the full method name (name + params) otherwise the member name paskal splitted + + + + + Determines whether a FieldInfo, PropertyInfo or MethodInfo is static. + + The member. + + true if the specified member is static; otherwise, false. + + + + + + Determines whether the specified member is an alias. + + The member to check. + + true if the specified member is an alias; otherwise, false. + + + + + Returns the original, backing member of an alias member if the member is an alias. + + The member to check. + /// if set to true an exception will be thrown if the member is not aliased. + + The member was not aliased; this only occurs if throwOnNotAliased is true. + + + + Various extensions for MethodInfo. + + + + + Returns the specified method's full name "methodName(argType1 arg1, argType2 arg2, etc)" + Uses the specified gauntlet to replaces type names, ex: "int" instead of "Int32" + + + + + Returns a string representing the passed method parameters names. Ex "int num, float damage, Transform target" + + + + + Returns the specified method's full name. + + + + + Tests if a method is an extension method. + + + + + Determines whether the specified method is an alias. + + The method to check. + + true if the specified method is an alias; otherwise, false. + + + + + Returns the original, backing method of an alias method if the method is an alias. + + The method to check. + /// if set to true an exception will be thrown if the method is not aliased. + + The method was not aliased; this only occurs if throwOnNotAliased is true. + + + + Determines the type of operator. + + + + + + The == operator. + + + + + The != operator. + + + + + The + operator. + + + + + The - operator. + + + + + The * operator. + + + + + The / operator. + + + + + The < operator. + + + + + The > operator. + + + + + The <= operator. + + + + + The >= operator. + + + + + The % operator. + + + + + The >> operator. + + + + + The << operator. + + + + + The & operator. + + + + + The | operator. + + + + + The ^ operator. + + + + + The ~ operator. + + + + + The && operator. + + + + + The || operator. + + + + + The ! operator. + + + + + DirectoryInfo method extensions. + + + + + Gets the name of the directory. Always returns forward slash seperators as opposed to Path.GetDirectoryName(). + + + + + Determines whether the directory has a given directory in its hierarchy of children. + + The parent directory. + The sub directory. + + + + Finds a parent directory with a given name, or null if no such parent directory exists. + + + + + Returns a value indicating whether or not a path can be made relative to another. + + The parent path. + The path to make relative to the parent path. + A value indicating if the path can be made relative to the parent path. + + + + Returns a path string to path that is relative to the parent path. + + The parent path. + The path to make relative to the parent path. + A relative path from parent path to path. + + + + Tries to make a path that is relative from parent path to path. + + The parent path. + The path to make relative to the parent path. + A relative path from parent path to path. null if no relative path could be made. + A value indicating if the method succeeded in making a relative path. + + + + Combines two paths, and replaces all backslases with forward slash. + + + + + PropertyInfo method extensions. + + + + + Determines whether a property is an auto property. + + + + + Determines whether the specified property is an alias. + + The property to check. + + true if the specified property is an alias; otherwise, false. + + + + + Returns the original, backing property of an alias property if the property is an alias. + + The property to check. + /// if set to true an exception will be thrown if the property is not aliased. + + The property was not aliased; this only occurs if throwOnNotAliased is true. + + + + Defines a collection of handy Rect transformation methods, that can chained together for complex behaviour. + Note that only the TakeX method defined here actually change the original Rect; the rest instead return a new transformed Rect. + + + + + Returns a Rect with the specified width. + + The original Rect. + The desired width of the new Rect. + + + + Returns a Rect with the specified height. + + The original Rect. + The desired height of the new Rect. + + + + Returns a Rect with the specified size. + + The original Rect. + The desired width of the new Rect. + The desired height of the new Rect. + + + + Returns a Rect with the specified size. + + The original Rect. + The desired width and height of the new Rect. + + + + Returns a Rect with the specified size. + + The original Rect. + The desired size of the new Rect. + + + + Returns a Rect that has been inserted by the specified amount on the X-axis. + + The original Rect. + The desired padding. + + + + Returns a Rect that has been inserted by the specified amount on the X-axis. + + The original Rect. + Desired padding on the left side. + Desired padding on the right side. + + + + Returns a Rect that has been inserted by the specified amount on the Y-axis. + + The original Rect. + The desired padding. + + + + Returns a Rect that has been inserted by the specified amount on the Y-axis. + + The original Rect. + The desired padding on the top. + The desired padding on the bottom. + + + + Returns a Rect that has been inserted by the specified amount. + + The original Rect. + The desired padding. + + + + Returns a Rect that has been inserted by the specified amount. + + The original Rect. + The desired horizontal padding. + The desired vertical padding. + + + + Returns a Rect that has been inserted by the specified amount. + + The original Rect. + The desired padding on the left. + The desired padding on the right. + The desired padding on the top. + The desired padding on the bottom. + + + + Returns a Rect, with the specified width, that has been aligned to the left of the original Rect. + + The original Rect. + The desired width of the new Rect. + + + + Returns a Rect, with the specified width, that has been aligned to horizontal center of the original Rect. + + The original Rect. + The desired width of the new Rect. + + + + Returns a Rect, with the specified width and height in the center of the provided rect. + + The original Rect. + The desired width of the new Rect. + The desired height of the new Rect. + + + + Returns a Rect, with the specified width, that has been aligned to the right of the original Rect. + + The original Rect. + The desired width of the new Rect. + + + + Returns a Rect, with the specified width, that has been aligned to the right of the original Rect. + + + + + Returns a Rect, with the specified height, that has been aligned to the top of the original Rect. + + The original Rect. + The desired height of the new Rect. + + + + Returns a Rect, with the specified height, that has been aligned to the vertical middle of the original Rect. + + The original Rect. + The desired height of the new Rect. + + + + Returns a Rect, with the specified height, that has been aligned to the bottom of the original Rect. + + The original Rect. + The desired height of the new Rect. + + + + Returns a Rect, with the specified width, that has been aligned horizontally to the center of the original rect. + + The original Rect. + The desired width of the new Rect. + + + + Returns a Rect, with the specified height, that has been aligned vertically to the center of the original rect. + + The original Rect. + The desired height of the new Rect. + + + + Returns a Rect, with the specified width and height, that has been aligned horizontally and vertically to the center of the original rect. + + The original Rect. + The desired width and height of the new Rect. + + + + Returns a Rect, with the specified width and height, that has been aligned horizontally and vertically to the center of the original rect. + + The original Rect. + The desired width of the new Rect. + The desired height of the new Rect. + + + + Returns a Rect that has been expanded by the specified amount. + + The original Rect. + The desired expansion. + + + + Returns a Rect that has been expanded by the specified amount. + + The original Rect. + The desired expansion on the X-axis. + The desired expansion on the Y-axis. + + + + Returns a Rect that has been expanded by the specified amount. + + The original Rect. + The desired expansion on the left. + The desired expansion on the right. + The desired expansion on the top. + The desired expansion on the bottom. + + + + Splits a Rect horizontally into the specified number of sub-rects, and returns a sub-rect for the specified index. + + The original Rect. + The index for the subrect. Includes 0, and excludes count. + The amount of subrects the Rect should be split into. + + + + Splits a Rect vertically into the specified number of sub-rects, and returns a sub-rect for the specified index. + + The original Rect. + The index for the subrect. Includes 0, and excludes count. + The amount of subrects the Rect should be split into. + + + + Splits a Rect into a grid from left to right and then down. + + The original rect. + The width of a grid cell. + The height of a grid cell. + The index of the grid cell. + + + + + Splits a Rect into a grid from left to right and then down. + + + + + Moves a Rect to the specified center X position. + + The original Rect. + The desired center x position. + + + + Moves a Rect to the specified center Y position. + + The desired original Rect. + The desired desired center y position. + + + + Moves a Rect to the specified center position. + + The original Rect. + The desired center X position. + The desired center Y position. + + + + Moves a Rect to the specified center position. + + The original Rect. + The desired center position. + + + + Moves a Rect to the specified position. + + The orignal Rect. + The desired position. + + + + Resets a Rect's position to zero. + + The original Rect. + + + + Moves a Rect's position by the specified amount. + + The original Rect. + The change in position. + + + + Moves a Rect's position by the specified amount. + + The original Rect. + The x. + The y. + + + + Sets a Rect's X position. + + The original Rect. + The desired X position. + + + + Adds to a Rect's X position. + + The original Rect. + The value to add. + + + + Subtracts from a Rect's X position. + + The original Rect. + The value to subtract. + + + + Sets a Rect's Y position. + + The original Rect. + The desired Y position. + + + + Adds to a Rect's Y position. + + The original Rect. + The value to add. + + + + Subtracts a Rect's Y position. + + The original Rect. + The value to subtract. + + + + Sets the min position of a Rect. + + The original Rect. + The desired min position. + + + + Adds to a Rect's min position. + + The original rect. + The value to add. + + + + Subtracts a Rect's min position. + + The original Rect. + The vlaue to subtract. + + + + Sets a Rect's max position. + + The original Rect. + The desired max position. + + + + Adds to a Rect's max position. + + The original Rect. + The value to add. + + + + Subtracts a Rect's max position. + + The original Rect. + The value to add. + + + + Sets a Rect's X min position. + + The original Rect. + The desired min X position. + + + + Adds to a Rect's X min position. + + The original Rect. + The value to add. + + + + Subtracts from a Rect's X min position. + + The original Rect. + The value to subtract. + + + + Sets a Rect's X max position. + + The original Rect. + The desired X max position. + + + + Adds to a Rect's X max position. + + The original Rect. + The value to add. + + + + Subtracts a Rect's X max position. + + The original Rect. + The value to subtract. + + + + Sets a Rect's Y min position. + + The original Rect. + The desired Y min. + + + + Adds to a Rect's Y min position. + + The original Rect. + The value to add. + + + + Subtracts a Rect's Y min position. + + The original Rect. + The value to subtract. + + + + + Sets a Rect's Y max position. + + The original Rect. + The desired Y max position. + + + + Adds to a Rect's Y max position. + + The original Rect. + The value to add. + + + + Subtracts from a Rect's Y max position. + + The original Rect. + The value to subtract. + + + + Sets a Rect's width, if it is less than the specified value. + + The original Rect. + The desired min width. + + + + Sets a Rect's width, if it is greater than the specified value. + + The original Rect. + The desired max width. + + + + Sets a Rect's height, if it is less than the specified value. + + The original Rect. + The desired min height. + + + + Sets a Rect's height, if it is greater than the specified value. + + The original Rect. + The desired max height. + + + + Expands a rect to contain a given position. + + The original Rect. + The position to expand the rect towards. + + + + Determines if an is a placeholder; usually (0, 0, 1, 1) in Layout. + + The original . + true if the is equal to (0, 0, 0, 0) or (0, 0, 1, 1); otherwise false. + + + + String method extensions. + + + + + Eg MY_INT_VALUE => MyIntValue + + + + + Returns whether or not the specified string is contained with this string + + + + + Ex: "thisIsCamelCase" -> "This Is Camel Case" + + + + + Returns true if this string is null, empty, or contains only whitespace. + + The string to check. + true if this string is null, empty, or contains only whitespace; otherwise, false. + + + + O(n*m) - Use with care. + + + + + Type method extensions. + + + + + Type name alias lookup. + + + + + Checks whether a given string is a valid CSharp identifier name. This also checks full type names including namespaces. + + The identifier to check. + + + + Determines whether a type can be casted to another type. + + From. + To. + if set to true an implicit or explicit operator must be defined on the given type. + + + + If a type can be casted to another type, this provides a function to manually convert the type. + + From. + To. + if set to true an implicit or explicit operator must be defined on the given type. + + + + If a type can be casted to another type, this provides a function to manually convert the type. + + if set to true an implicit or explicit operator must be defined on the given type. + + + + If a type can be casted to another type, this provides the method info of the method in charge of converting the type. + + From. + To. + if set to true an implicit or explicit operator must be defined on the given type. + + + + Gets an equality comparer delegate used to compare the equality of values of a given type. In order, this will be: + + 1. The == operator, if one is defined on the type. + 2. A delegate that uses , if the type implements that interface. + 3. .NET's own + + + Note that in the special case of the type , a special equality comparer is returned that only checks whether all the Quaternion components are equal. + This is because, by default, Quaternion's equality operator is broken when operating on invalid quaternions; "default(Quaternion) == default(Quaternion)" evaluates to false, and this causes a multitude of problems. + Special delegates are also returned for float and double, that consider float.NaN to be equal to float.NaN, and double.NaN to be equal to double.NaN. + + + + + Gets the first attribute of type T. Returns null in the no attribute of type T was found. + + The type. + If true, specifies to also search the ancestors of element for custom attributes. + + + + Determines whether a type implements or inherits from another type. + + The type. + To. + + + + Determines whether a type implements an open generic interface or class such as IList<> or List<>. + + Type of the candidate. + Type of the open generic type. + + + + + Determines whether a type implements an open generic interface such as IList<>. + + Type of the candidate. + Type of the open generic interface. + + Type " + openGenericInterfaceType.Name + " is not a generic type definition and an interface. + + + + Determines whether a type implements an open generic class such as List<>. + + Type of the candidate. + Type of the open generic interface. + + + + Gets the generic arguments of an inherited open generic class or interface. + + Type of the candidate. + The open generic type to get the arguments of. + + + + Gets the generic arguments of an inherited open generic class. + + Type of the candidate. + Type of the open generic class. + + + + Gets the generic arguments of an inherited open generic interface. + + Type of the candidate. + Type of the open generic interface. + + + + Gets the MethodInfo of a specific operator kind, with the given left and right operands. This overload is *far* faster than any of the other GetOperatorMethod implementations, and should be used whenever possible. + + + + + Gets the MethodInfo of a specific operator type. + + + + + Gets the MethodInfo of a specific operator type. + + + + + Gets all members from a given type, including members from all base types if the flag isn't set. + + + + + Gets all members from a given type, including members from all base types. + + + + + Gets all members of a specific type from a type, including members from all base types, if the flag isn't set. + + + + + Gets the generic type definition of an open generic base type. + + + + + Gets the generic type definition of an open generic base type. + + + + + Returns a lazy enumerable of all the base types of this type including interfaces and classes + + + + + Returns a lazy enumerable of all the base classes of this type + + + + + Returns a nicely formatted name of a type. + + + + + Returns a nicely formatted full name of a type. + + + + + Gets the name of the compilable nice. + + The type. + + + + Gets the full name of the compilable nice. + + The type. + + + + Returns the first found custom attribute of type T on this type + Returns null if none was found + + + + + Returns the first found non-inherited custom attribute of type T on this type + Returns null if none was found + + + + + Gets all attributes of type T. + + The type. + + + + Gets all attributes of type T. + + The type + If true, specifies to also search the ancestors of element for custom attributes. + + + + Returns true if the attribute whose type is specified by the generic argument is defined on this type + + + + + Returns true if the attribute whose type is specified by the generic argument is defined on this type + + + + + Determines whether a type inherits or implements another type. Also include support for open generic base types such as List<>. + + + + + + Determines whether a type inherits or implements another type. Also include support for open generic base types such as List<>. + + + + + + + Gets the number of base types between given type and baseType. + + + + + Determines whether a method has the specified parameter types. + + + + + FieldInfo will return the fieldType, propertyInfo the PropertyType, MethodInfo the return type and EventInfo will return the EventHandlerType. + + The MemberInfo. + + + + Gets the value contained in a given . Currently only and is supported. + + The to get the value of. + The instance to get the value from. + The value contained in the given . + Can't get the value of the given type. + + + + Sets the value of a given MemberInfo. Currently only and is supported. + + The to set the value of. + The object to set the value on. + The value to set. + + Property has no setter + or + Can't set the value of the given type. + + + + // + Tries to infer a set of valid generic parameters for a generic type definition, given a subset of known parameters. + + The generic type definition to attempt to infer parameters for. + The inferred parameters, if inferral was successful. + The known parameters to infer from. + True if the parameters could be inferred, otherwise, false. + + genericTypeDefinition is null + or + knownParameters is null + + The genericTypeDefinition parameter must be a generic type definition. + + + + Checks whether an array of types satisfy the constraints of a given generic type definition. + If this method returns true, the given parameters can be safely used with with the given generic type definition. + + The generic type definition to check. + The parameters to check validity for. + + genericType is null + or + types is null + + The genericType parameter must be a generic type definition. + + + + Checks whether an array of types satisfy the constraints of a given generic method definition. + If this method returns true, the given parameters can be safely used with with the given generic method definition. + + The generic method definition to check. + The parameters to check validity for. + + genericType is null + or + types is null + + The genericMethod parameter must be a generic method definition. + + + + Before calling this method we must ALWAYS hold a lock on the GenericConstraintsSatisfaction_LOCK object, as that is an implicit assumption it works with. + + + + + Not yet documented. + + + + + Formats a string with the specified generic parameter constraints on any given type. Example output: where T : class + + + + + Determines whether a generic type contains the specified generic argument constraints. + + The type. + The generic argument types. + + + + Determines whether a type is a fully constructed generic type. + + + + + Determines whether a type is nullable by ensuring the type is neither a PrimitiveType, ValueType or an Enum. + + + + + Gets the enum bitmask in a ulong. + + enumType + + + + Gets a value indicating if the string is a reserved C# keyword. + + The identifier to check. + true if the string is a C# keyword. Otherwise false. + + + + Determines if a given has a default constructor. + A type is considered to have a default constructor if: It is a string, if it is an array, if it is a value type or if it has a public parameterless constructor. + + The to investigate. + true if a default constructor has been found; otherwise false. + + + + Attempts to instantiate an object of a given with it's default constructor. If no default constructor is found then it attempts to find the most suitable alternative constructor and instantiate the with default parameters. + + The to instantiate. + Determines if the use of is preferred over a non-default constructor call. + The instantiated object or null if no suitable alternative constructor is found. + + + + Finds the constructor of a type that is closest to a default constructor while favoring safer options. + Unmanaged constructors are ignored. + + The whose constructors are evaluated. + + The to use when retrieving constructors. + restricts the search to public constructors. + + + The considered closest to a default constructor based on the ranking heuristics. + + +

Constructors are ranked using these heuristics:

+

1. Empty constructors are preferred first.

+

2. Constructors where all parameters have default values are preferred next.

+

3. Shorter constructors are preferred over longer ones.

+

4. Constructors with more parameters that have default values are preferred.

+

5. Constructors with more value-type parameters are preferred.

+
+
+ + + Checks if a given is unmanaged, by checking if it contains any , or parameters. + + The to validate. + true if the is unmanaged; otherwise false. + + + + Extends various Unity classes. + + + + + Determines whether a Unity object is null or "fake null", + without ever calling Unity's own equality operators. + This method is useful for checking if a Unity object is + null, destroyed or missing at times when it is not allowed + to call Unity's own equality operators, for example when + not running on the main thread. + + The Unity object to check. + True if the object is null, missing or destroyed; otherwise false. + + + + Contains utilities for operating on arrays. + + + + + Creates a new array with an added element. + + The element type of the array. + The array. + The value to add. + The new array. + The given array was null. + + + + Creates a new array with an element inserted at a given index. + + The element type of the array. + The array. + The index to insert at. + The value to insert. + The given array was null. + The index to insert at was out of range. + + + + Creates a new array with an element removed. + + The element type of the array. + The array. + The index to remove an element at. + + The given array was null. + The given index to remove an element at was out of range. + + + + Utility class for asset Guid script + + + + + Tries to update the Guid of a specified asset with the Guid from a specified script type. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Provides utilities for using the namespace. + + This class is due for refactoring. Use at your own peril. + + + + + Gets a value indicating whether emitting is supported on the current platform. + + + true if the current platform can emit; otherwise, false. + + + + + Creates a delegate which gets the value of a field. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The type of the field to get a value from. + The instance describing the field to create a getter for. + A delegate which gets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which gets the value of a field. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The instance describing the field to create a getter for. + A delegate which gets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which sets the value of a field. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + The type of the field to set a value to. + The instance describing the field to create a setter for. + A delegate which sets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which sets the value of a field. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + The instance describing the field to create a setter for. + A delegate which sets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which gets the value of a field. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The type of the instance to get a value from. + The type of the field to get a value from. + The instance describing the field to create a getter for. + A delegate which gets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which gets the value of a field from a weakly typed instance of a given type. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The type of the field to get a value from. + The of the instance to get a value from. + The instance describing the field to create a getter for. + A delegate which gets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which gets the weakly typed value of a field from a weakly typed instance of a given type. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The of the instance to get a value from. + The instance describing the field to create a getter for. + A delegate which gets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which sets the value of a field. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + The type of the instance to set a value on. + The type of the field to set a value to. + The instance describing the field to create a setter for. + A delegate which sets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which sets the value of a field on a weakly typed instance of a given type. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + The type of the field to set a value to. + Type of the instance. + The instance describing the field to create a setter for. + + A delegate which sets the value of the given field. + + The fieldInfo parameter is null. + Field cannot be static. + + + + Creates a delegate which sets the weakly typed value of a field on a weakly typed instance of a given type. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + Type of the instance. + The instance describing the field to create a setter for. + + A delegate which sets the value of the given field. + + The fieldInfo parameter is null. + Field cannot be static. + + + + Creates a delegate which gets the weakly typed value of a field from a weakly typed instance of a given type. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The of the instance to get a value from. + The instance describing the field to create a getter for. + A delegate which gets the value of the given field. + The fieldInfo parameter is null. + + + + Creates a delegate which sets the weakly typed value of a property on a weakly typed instance of a given type. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + Type of the instance. + The instance describing the property to create a setter for. + + A delegate which sets the value of the given field. + + The fieldInfo parameter is null. + Property cannot be static. + + + + Creates a delegate which sets the value of a property. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + The type of the property to set a value to. + The instance describing the property to create a setter for. + A delegate which sets the value of the given property. + The propertyInfo parameter is null. + + + + Creates a delegate which gets the value of a property. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The type of the property to get a value from. + The instance describing the property to create a getter for. + A delegate which gets the value of the given property. + The propertyInfo parameter is null. + + + + Creates a delegate which sets the value of a property. If emitting is not supported on the current platform, the delegate will use reflection to set the value. + + The type of the instance to set a value on. + The type of the property to set a value to. + The instance describing the property to create a setter for. + A delegate which sets the value of the given property. + The propertyInfo parameter is null. + + + + Creates a delegate which gets the value of a property. If emitting is not supported on the current platform, the delegate will use reflection to get the value. + + The type of the instance to get a value from. + The type of the property to get a value from. + The instance describing the property to create a getter for. + A delegate which gets the value of the given property. + The propertyInfo parameter is null. + + + + Creates a fast delegate method which calls a given parameterless instance method and returns the result. + + The type of the class which the method is on. + The type which is returned by the given method info. + The method info instance which is used. + A delegate which calls the method and returns the result, except it's hundreds of times faster than MethodInfo.Invoke. + + + + Creates a fast delegate method which calls a given parameterless static method. + + The method info instance which is used. + A delegate which calls the method and returns the result, except it's hundreds of times faster than MethodInfo.Invoke. + + + + Creates a fast delegate method which calls a given parameterless weakly typed instance method. + + The method info instance which is used. + A delegate which calls the method and returns the result, except it's hundreds of times faster than MethodInfo.Invoke. + + + + Not yet documented. + + + + + Creates a fast delegate method which calls a given weakly typed instance method with one argument and returns a value. + + The type of the result. + The type of the first argument. + The method info instance which is used. + + A delegate which calls the method and returns the result, except it's hundreds of times faster than MethodInfo.Invoke. + + methodInfo + + Given method ' + methodInfo.Name + ' is static when it has to be an instance method. + or + Given method ' + methodInfo.Name + ' must return type + typeof(TResult) + . + or + Given method ' + methodInfo.Name + ' must have exactly one parameter. + or + The first parameter of the method ' + methodInfo.Name + ' must be of type + typeof(TArg1) + . + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Creates a fast delegate method which calls a given parameterless instance method. + + The type of the class which the method is on. + The method info instance which is used. + A delegate which calls the method and returns the result, except it's hundreds of times faster than MethodInfo.Invoke. + + + + Creates a fast delegate method which calls a given instance method with a given argument. + + The type of the class which the method is on. + The type of the argument with which to call the method. + The method info instance which is used. + A delegate which calls the method and returns the result, except it's hundreds of times faster than MethodInfo.Invoke. + + + + This class encapsulates common combinations. + + + + + Search criteria encompassing all public and non-public members, including base members. + Note that you also need to specify either the Instance or Static flag. + + + + + Search criteria encompassing all public instance members, including base members. + + + + + Search criteria encompassing all non-public instance members, including base members. + + + + + Search criteria encompassing all public and non-public instance members, including base members. + + + + + Search criteria encompassing all public static members, including base members. + + + + + Search criteria encompassing all non-public static members, including base members. + + + + + Search criteria encompassing all public and non-public static members, including base members. + + + + + Search criteria encompassing all public instance members, excluding base members. + + + + + Search criteria encompassing all non-public instance members, excluding base members. + + + + + Search criteria encompassing all public and non-public instance members, excluding base members. + + + + + Search criteria encompassing all public static members, excluding base members. + + + + + Search criteria encompassing all non-public static members, excluding base members. + + + + + Search criteria encompassing all public and non-public static members, excluding base members. + + + + + Search criteria encompassing all members, including base and static members. + + + + + Search criteria encompassing all members (public and non-public, instance and static), including base members. + + + + + + A GlobalConfig singleton, automatically created and saved as a ScriptableObject in the project at the specified path. + This only happens if the UnityEditor is present. If it's not, a non-persistent ScriptableObject is created at run-time. + + + Remember to locate the path within a resources folder if you want the config file to be loaded at runtime without the Unity editor being present. + + + The asset path is specified by defining a . If no attribute is defined it will be saved in the root assets folder. + + + + + [GlobalConfig("Assets/Resources/MyConfigFiles/")] + public class MyGlobalConfig : GlobalConfig<MyGlobalConfig> + { + public int MyGlobalVariable; + } + + void SomeMethod() + { + int value = MyGlobalConfig.Instance.MyGlobalVariable; + } + + + + + + Gets a value indicating whether this instance has instance loaded. + + + + + Gets the singleton instance. + + + + + Tries to load the singleton instance. + + + + + Opens the config in a editor window. This is currently only used internally by the Sirenix.OdinInspector.Editor assembly. + + + + + Gets a value indicating whether this instance has instance loaded. + + + + + Gets the singleton instance. + + + + + This attribute is used by classes deriving from GlobalConfig and specifies the asset path for the generated config file. + + + + + + + Gets the full asset path including Application.dataPath. Only relevant if IsInResourcesFolder is false. + + + + + Gets the relative asset path. Only relevant if IsInResourcesFolder is false. + + + + + Gets the resources path. Only relevant if IsInResourcesFolder is true. + + + + + Whether the config should be associated with an asset in the project. If false, no config asset will be generated or loaded, and a new "temporary" config instance will be created for every reload. This is true by default. + + + + + Gets a value indicating whether this asset is located within a resource folder. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + The relative asset. Remember to locate the path within a resources folder if you want the config file to be loaded at runtime without the Unity Editor. + + + + + GUILayoutOptions is a handy utility that provides cached GUILayoutOpion arrays based on the wanted parameters. + + + + + Most GUILayout and EditorGUILayout methods takes an optional "params GUILayoutOption[]" parameter. + Each time you call this, an array is allocated generating garbage. + + + // Generates garbage: + GUILayout.Label(label, GUILayout.Label(label, GUILayout.Width(20), GUILayout.ExpandHeight(), GUILayout.MaxWidth(300))); + + // Does not generate garbage: + GUILayout.Label(label, GUILayout.Label(label, GUILayoutOptions.Width(20).ExpandHeight().MaxWidth(300))); + + + + + + An EmptyGUIOption[] array with a length of 0. + + + + + A GUILayoutOptions instance with an implicit operator to be converted to a GUILayoutOption[] array. + + + + + + Gets or creates the cached GUILayoutOption array based on the layout options specified. + + + + + Option passed to a control to give it an absolute width. + + + + + Option passed to a control to give it an absolute height. + + + + + Option passed to a control to specify a maximum height. + + + + + Option passed to a control to specify a maximum width. + + + + + Option passed to a control to specify a minimum height. + + + + + Option passed to a control to specify a minimum width. + + + + + Option passed to a control to allow or disallow vertical expansion. + + + + + Option passed to a control to allow or disallow horizontal expansion. + + + + + Determines whether the instance is equals another instance. + + + + + Returns a hash code for this instance. + + + + + Option passed to a control to give it an absolute width. + + + + + Option passed to a control to give it an absolute height. + + + + + Option passed to a control to specify a maximum height. + + + + + Option passed to a control to specify a maximum width. + + + + + Option passed to a control to specify a minimum width. + + + + + Option passed to a control to specify a minimum height. + + + + + Option passed to a control to allow or disallow vertical expansion. + + + + + Option passed to a control to allow or disallow horizontal expansion. + + + + + Immutable hashset wraps another hashset, and allows for reading the inner hashset, without the ability to change it. + + + + + Creates an immutable hashset around another hashset. + + + + + Returns true if the item is contained in the list. + + The item's value. + + + + Gets the enumerator. + + + + + Gets the enumerator. + + + + + Interface for immutable list. + + + + + Interface for generic immutable list. + + + + + Index accessor. + + + + + Immutable list wraps another list, and allows for reading the inner list, without the ability to change it. + + + + + Creates an immutable list around another list. + + + + + Number of items in the list. + + + + + Immutable list cannot be changed directly, so it's size is always fixed. + + + + + Immutable list are always readonly. + + + + + Returns true if the inner list is synchronized. + + + + + Gets the sync root object. + + + + + Index accessor. + + Index. + + + + Returns true if the item is contained in the list. + + The item's value. + + + + Copy the list to an array, + + Target array. + Index. + + + + Copy the list to an array, + + Target array. + Index. + + + + Gets an enumerator. + + + + + Get the index of a value. + + The item's value. + + + + Immutable list cannot be edited. + + Index. + + + + Immutable list cannot be edited. + + Index. + Item. + + + + Immutable list cannot be edited. + + Item. + + + + Immutable list cannot be edited. + + + + + Immutable list cannot be edited. + + Item. + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Immutable list wraps another list, and allows for reading the inner list, without the ability to change it. + + + + + Creates an immutable list around another list. + + + + + Number of items in the list. + + + + + Immutable list are always readonly. + + + + + Index accessor. + + Index. + + + + Returns true if the item is contained in the list. + + + + + Copies the list to an array. + + + + + Gets an enumerator. + + + + + Gets the index of an item. + + + + + Collection of math function. + + + + + Distance from a point to a line. + + + + + Returns a smooth value between start and end based on t. + + First point. + Second point. + Position between 0 and 1. + + + + Returns a smooth value between start and end based on t. + + First point. + Second point. + Position between 0 and 1. + Number of interpolations to make. + + + + Returns the fractional of the value. + + The value to get the fractional of. + + + + Returns the fractional of the value. + + The value to get the fractional of. + + + + Returns the fractional of the value. + + The value to get the fractional of. + + + + Returns a value based on t, that bounces faster and faster. + + The value to bounce. + + + + Returns a smooth value between 0 and 1 based on t. + + Position between 0 and 1. + + + + Returns a smooth value between 0 and 1 based on t. + + Position between 0 and 1. + Number of interpolations to make. + + + + Returns an unclamped linear interpolation of two vectors. + + The first vector. + The second vector. + The interpolation factor. + + + + Returns an unclamped linear interpolation of two vectors. + + The first vector. + The second vector. + The interpolation factor. + + + + Returns a value that bounces between 0 and 1 based on value. + + The value to bounce. + + + + Returns a value that eases in elasticly. + + The value to ease in elasticly. + The amplitude. + The length. + + + + Pows each element of the vector. + + The vector. + The power. + + + + Returns a Vector2 with each element set to their respective sign. + + The vector to sign. + + + + Returns a Vector3 with each element set to their respective sign. + + The vector to sign. + + + + Returns a value that eases out elasticly. + + The value to ease out elasticly. + The amplitude. + The length. + + + + Returns a smooth value betweeen that peaks at t=0.5 and then comes back down again. + + A value between 0 and 1. + + + + Clamps the value of a Vector3. + + The vector to clamp. + The min value. + The max value. + + + + Clamps the value of a Vector2. + + The vector to clamp. + The min value. + The max value. + + + + Computes a hash for a byte array. + + The byte array. + + + + Gives a smooth path between a collection of points. + + The collection of point. + The current position in the path. 0 is at the start of the path, 1 is at the end of the path. + + + + Checks if two given lines intersect with one another and returns the intersection point (if + any) in an out parameter. + Source: http://stackoverflow.com/questions/3746274/line-intersection-with-aabb-rectangle. + Edited to implement Cohen-Sutherland type pruning for efficiency. + + Starting point of line a. + Ending point of line a. + Starting point of line b. + Ending point of line b. + + The out parameter which contains the intersection point if there was any. + + True if the two lines intersect, otherwise false. + + + + Returns the collision point between two infinite lines. + + + + + Distance from line to plane. + + Position of the plane. + Surface normal of the plane. + Origin of the line. + Line direction normal. + + + + Distance from ray to plane. + + The ray. + The plane. + + + + Rotates a Vector2 by an angle. + + The point to rotate. + The angle to rotate. + + + + Rotates a Vector2 around a point by an angle.. + + The point to rotate. + The point to rotate around. + The angle to rotate. + + + + Interpolates t between a and b to a value between 0 and 1 using a Hermite polynomial. + + The first value. + The second value. + The position value. + A smoothed value between 0 and 1. + + + + Interpolates t between a and b to a value between 0 and 1. + + The first value. + The second value. + The position value. + Linear value between 0 and 1. + + + + Wraps a value between min and max. + + The value to wrap. + The minimum value. + The maximum value. + + + + Wraps a value between min and max. + + The value to wrap. + The minimum value. + The maximum value. + + + + Wraps a value between min and max. + + The value to wrap. + The minimum value. + The maximum value. + + + + Rounds a number based on a mininum difference. + + The value to round. + The min difference. + The rounded value. + + + + Discards the least significant demicals. + + The value of insignificant decimals. + Value with significant decimals. + + + + Clamps and wraps an angle between two values. + + + + + Provides a methods of representing imaginary fields which are unique to serialization. + + We aggregate the FieldInfo associated with this member and return a mangled form of the name. + + + + + + The default fake name separator string. + + + + + Initializes a new instance of the class. + + The field to alias. + The name prefix to use. + + + + Initializes a new instance of the class. + + The field to alias. + The name prefix to use. + The separator string to use. + + + + Gets the aliased field. + + + The aliased field. + + + + + Gets the module in which the type that declares the member represented by the current is defined. + + + + + Gets a value that identifies a metadata element. + + + + + Gets the name of the current member. + + + + + Gets the class that declares this member. + + + + + Gets the class object that was used to obtain this instance of MemberInfo. + + + + + Gets the type of the field. + + + The type of the field. + + + + + Gets a RuntimeFieldHandle, which is a handle to the internal metadata representation of a field. + + + + + Gets the attributes. + + + The attributes. + + + + + When overridden in a derived class, returns an array of all custom attributes applied to this member. + + True to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + An array that contains all the custom attributes applied to this member, or an array with zero elements if no attributes are defined. + + + + + When overridden in a derived class, returns an array of custom attributes applied to this member and identified by . + + The type of attribute to search for. Only attributes that are assignable to this type are returned. + True to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + An array of custom attributes applied to this member, or an array with zero elements if no attributes assignable to have been applied. + + + + + When overridden in a derived class, indicates whether one or more attributes of the specified type or of its derived types is applied to this member. + + The type of custom attribute to search for. The search includes derived types. + True to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + True if one or more instances of or any of its derived types is applied to this member; otherwise, false. + + + + + Gets the value of the field. + + The object instance to get the value from. + The value of the field. + + + + When overridden in a derived class, sets the value of the field supported by the given object. + + The object whose field value will be set. + The value to assign to the field. + A field of Binder that specifies the type of binding that is desired (for example, Binder.CreateInstance or Binder.ExactBinding). + A set of properties that enables the binding, coercion of argument types, and invocation of members through reflection. If is null, then Binder.DefaultBinding is used. + The software preferences of a particular culture. + + + + Provides a methods of representing aliased methods. + + In this case, what we're representing is a method on a parent class with the same name. + + We aggregate the MethodInfo associated with this member and return a mangled form of the name. + The name that we return is "parentname+methodName". + + + + + + The default fake name separator string. + + + + + Initializes a new instance of the class. + + The method to alias. + The name prefix to use. + + + + Initializes a new instance of the class. + + The method to alias. + The name prefix to use. + The separator string to use. + + + + Gets the aliased method. + + + The aliased method. + + + + + Gets the custom attributes for the return type. + + + + + Gets a handle to the internal metadata representation of a method. + + + + + Gets the attributes associated with this method. + + + + + Gets the class that declares this member. + + + + + Gets the name of the current member. + + + + + Gets the class object that was used to obtain this instance of MemberInfo. + + + + + When overridden in a derived class, returns the MethodInfo object for the method on the direct or indirect base class in which the method represented by this instance was first declared. + + + A MethodInfo object for the first implementation of this method. + + + + + When overridden in a derived class, returns an array of all custom attributes applied to this member. + + true to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + An array that contains all the custom attributes applied to this member, or an array with zero elements if no attributes are defined. + + + + + When overridden in a derived class, returns an array of custom attributes applied to this member and identified by . + + The type of attribute to search for. Only attributes that are assignable to this type are returned. + true to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + An array of custom attributes applied to this member, or an array with zero elements if no attributes assignable to have been applied. + + + + + When overridden in a derived class, returns the flags. + + + The MethodImplAttributes flags. + + + + + When overridden in a derived class, gets the parameters of the specified method or constructor. + + + An array of type ParameterInfo containing information that matches the signature of the method (or constructor) reflected by this MethodBase instance. + + + + + When overridden in a derived class, invokes the reflected method or constructor with the given parameters. + + The object on which to invoke the method or constructor. If a method is static, this argument is ignored. If a constructor is static, this argument must be null or an instance of the class that defines the constructor. + A bitmask that is a combination of 0 or more bit flags from . If is null, this parameter is assigned the value ; thus, whatever you pass in is ignored. + An object that enables the binding, coercion of argument types, invocation of members, and retrieval of MemberInfo objects via reflection. If is null, the default binder is used. + An argument list for the invoked method or constructor. This is an array of objects with the same number, order, and type as the parameters of the method or constructor to be invoked. If there are no parameters, this should be null.If the method or constructor represented by this instance takes a ByRef parameter, there is no special attribute required for that parameter in order to invoke the method or constructor using this function. Any object in this array that is not explicitly initialized with a value will contain the default value for that object type. For reference-type elements, this value is null. For value-type elements, this value is 0, 0.0, or false, depending on the specific element type. + An instance of CultureInfo used to govern the coercion of types. If this is null, the CultureInfo for the current thread is used. (This is necessary to convert a String that represents 1000 to a Double value, for example, since 1000 is represented differently by different cultures.) + + An Object containing the return value of the invoked method, or null in the case of a constructor, or null if the method's return type is void. Before calling the method or constructor, Invoke checks to see if the user has access permission and verifies that the parameters are valid.CautionElements of the array that represent parameters declared with the ref or out keyword may also be modified. + + + + + When overridden in a derived class, indicates whether one or more attributes of the specified type or of its derived types is applied to this member. + + The type of custom attribute to search for. The search includes derived types. + true to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + true if one or more instances of or any of its derived types is applied to this member; otherwise, false. + + + + + Provides a methods of representing imaginary properties which are unique to serialization. + + We aggregate the PropertyInfo associated with this member and return a mangled form of the name. + + + + + + The default fake name separator string. + + + + + Initializes a new instance of the class. + + The property to alias. + The name prefix to use. + + + + Initializes a new instance of the class. + + The property to alias. + The name prefix to use. + The separator string to use. + + + + Not yet documented. + + + + + Gets the module in which the type that declares the member represented by the current is defined. + + + + + Gets a value that identifies a metadata element. + + + + + Gets the name of the current member. + + + + + Gets the class that declares this member. + + + + + Gets the class object that was used to obtain this instance of MemberInfo. + + + + + Gets the type of the property. + + + The type of the property. + + + + + Gets the attributes. + + + The attributes. + + + + + Gets a value indicating whether this instance can read. + + + true if this instance can read; otherwise, false. + + + + + Gets a value indicating whether this instance can write. + + + true if this instance can write; otherwise, false. + + + + + When overridden in a derived class, returns an array of all custom attributes applied to this member. + + True to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + An array that contains all the custom attributes applied to this member, or an array with zero elements if no attributes are defined. + + + + + When overridden in a derived class, returns an array of custom attributes applied to this member and identified by . + + The type of attribute to search for. Only attributes that are assignable to this type are returned. + True to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + An array of custom attributes applied to this member, or an array with zero elements if no attributes assignable to have been applied. + + + + + When overridden in a derived class, indicates whether one or more attributes of the specified type or of its derived types is applied to this member. + + The type of custom attribute to search for. The search includes derived types. + True to search this member's inheritance chain to find the attributes; otherwise, false. This parameter is ignored for properties and events; see Remarks. + + True if one or more instances of or any of its derived types is applied to this member; otherwise, false. + + + + + Returns an array whose elements reflect the public and, if specified, non-public get, set, and other accessors of the property reflected by the current instance. + + Indicates whether non-public methods should be returned in the MethodInfo array. true if non-public methods are to be included; otherwise, false. + + An array of objects whose elements reflect the get, set, and other accessors of the property reflected by the current instance. If is true, this array contains public and non-public get, set, and other accessors. If is false, this array contains only public get, set, and other accessors. If no accessors with the specified visibility are found, this method returns an array with zero (0) elements. + + + + + When overridden in a derived class, returns the public or non-public get accessor for this property. + + Indicates whether a non-public get accessor should be returned. true if a non-public accessor is to be returned; otherwise, false. + + A MethodInfo object representing the get accessor for this property, if is true. Returns null if is false and the get accessor is non-public, or if is true but no get accessors exist. + + + + + Gets the index parameters of the property. + + The index parameters of the property. + + + + When overridden in a derived class, returns the set accessor for this property. + + Indicates whether the accessor should be returned if it is non-public. true if a non-public accessor is to be returned; otherwise, false. + + Value Condition A object representing the Set method for this property. The set accessor is public.-or- is true and the set accessor is non-public. null is true, but the property is read-only.-or- is false and the set accessor is non-public.-or- There is no set accessor. + + + + + Gets the value of the property on the given instance. + + The object to invoke the getter on. + The to invoke with. + The binder to use. + The indices to use. + The culture to use. + The value of the property on the given instance. + + + + Sets the value of the property on the given instance. + + The object to set the value on. + The value to set. + The to invoke with. + The binder to use. + The indices to use. + The culture to use. + + + + Contains utilities for operating on arrays multi-dimentional arrays. + + + + + Inserts one column left of the specified column index. + + The type of the element. + Index of the column. + The array. + + + + Inserts one column right of the specified column index. + + The type of the element. + Index of the column. + The arr. + + + + Inserts one row above the specified row index. + + The type of the element. + The array. + The row index. + + + + Inserts one row below the specified row index. + + The type of the element. + The array. + Index of the row. + + + + Duplicates the column. + + The type of the element. + Index of the column. + The array. + + + + Duplicates the row. + + The type of the element. + The array. + Index of the row. + + + + Moves a column. + + The type of the element. + The array. + From column. + To column. + + + + Moves a row. + + The type of the element. + The array. + From row. + To row. + + + + Deletes a column. + + The type of the element. + The array. + Index of the column. + + + + Deletes the row. + + The type of the element. + The array. + Index of the row. + + + + Indicates a persistent assembly. + + + + + Compares objects by reference only, ignoring equality operators completely. This is used by the property tree reference dictionaries to keep track of references. + + + + + A default, cached instance of this generic variant of the reference equality comparer. + + + + + Returns true if the object references are equal. + + + + + Returns the result of the object's own GetHashCode method. + + + + + Paths to Sirenix assets. + + + + + Path to Odin Inspector folder. + + + + + Path to Sirenix assets folder. + + + + + Path to Sirenix folder. + + + + + Path to Sirenix assemblies. + + + + + Path to Odin Inspector resources folder. + + + + + Path to Odin Inspector configuration folder. + + + + + Path to Odin Inspector resources configuration folder. + + + + + Path to Odin Inspector temporary folder. + + + + + This attribute is used by classes deriving from GlobalConfig and specifies the menu item path for the preference window and the asset path for the generated config file. + The scriptable object created will be located at the OdinEditorConfigs path unless other is specified. + Classes implementing this attribute will be part of the Odin Preferences window. + + + + + + Initializes a new instance of the class. + + + + + This attribute is used by classes deriving from GlobalConfig and specifies the menu item path for the preference window and the asset path for the generated config file. + The scriptable object created will be located at the OdinResourcesConigs path unless other is specified. + Classes implementing this attribute will be part of the Odin Preferences window. + + + + + + Initializes a new instance of the class. + + + + + Not yet documented. + + + + + Not yet documented. + + Not yet documented. + Not yet documented. + Not yet documented. + + + + Compares two strings in a number-aware manner, IE, "[2] Foo" is considered to come before "[10] Bar". + + + + + Utility class indicating current Unity version. + + + + + Tests current Unity version is equal or greater. + + Minimum major version. + Minimum minor version. + true if the current Unity version is greater. Otherwise false. + + + + The current Unity version major. + + + + + The current Unity version minor. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + + + + Not yet documented. + + +
+
diff --git a/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.xml.meta b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.xml.meta new file mode 100644 index 00000000..cc14132c --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/Sirenix.Utilities.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4873f2a8bdae42baa0406e8a6136096f +timeCreated: 1488828285 +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Assemblies/link.xml b/Assets/Plugins/Sirenix/Assemblies/link.xml new file mode 100644 index 00000000..1df8f847 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/link.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Assemblies/link.xml.meta b/Assets/Plugins/Sirenix/Assemblies/link.xml.meta new file mode 100644 index 00000000..27e066d5 --- /dev/null +++ b/Assets/Plugins/Sirenix/Assemblies/link.xml.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 1bec01331befdea4d9ed9033eabd68f8 +timeCreated: 1613046886 +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Demos.meta b/Assets/Plugins/Sirenix/Demos.meta new file mode 100644 index 00000000..bdb22ec9 --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 39584688cfac6ff44bd94124e5bc1ca7 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows.meta b/Assets/Plugins/Sirenix/Demos/Editor Windows.meta new file mode 100644 index 00000000..02599f43 --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0f4ea59722339dc4c97cc07c4cd3a4fe +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts.meta b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts.meta new file mode 100644 index 00000000..1b5f42b3 --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a7d451a5ad971b64bb3d609eacff3a4c +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor.meta b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor.meta new file mode 100644 index 00000000..9f203200 --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f61850bb111c02e46b895c9950bf09a8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/BasicOdinEditorExampleWindow.cs b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/BasicOdinEditorExampleWindow.cs new file mode 100644 index 00000000..29ff1a17 --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/BasicOdinEditorExampleWindow.cs @@ -0,0 +1,26 @@ +#if UNITY_EDITOR +namespace Sirenix.OdinInspector.Demos +{ + using UnityEditor; + using Sirenix.OdinInspector.Editor; + using Sirenix.OdinInspector; + using Sirenix.Utilities.Editor; + using Sirenix.Utilities; + + public class BasicOdinEditorExampleWindow : OdinEditorWindow + { + [MenuItem("Tools/Odin/Demos/Odin Editor Window Demos/Basic Odin Editor Window")] + private static void OpenWindow() + { + var window = GetWindow(); + + // Nifty little trick to quickly position the window in the middle of the editor. + window.position = GUIHelper.GetEditorWindowRect().AlignCenter(700, 700); + } + + [EnumToggleButtons] + [InfoBox("Inherit from OdinEditorWindow instead of EditorWindow in order to create editor windows like you would inspectors - by exposing members and using attributes.")] + public ViewTool SomeField; + } +} +#endif diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/BasicOdinEditorExampleWindow.cs.meta b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/BasicOdinEditorExampleWindow.cs.meta new file mode 100644 index 00000000..a0b7f6f1 --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/BasicOdinEditorExampleWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9a1e435d912810b4890a5ca4682f0e0f +timeCreated: 1514982238 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OdinMenuEditorWindowExample.cs b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OdinMenuEditorWindowExample.cs new file mode 100644 index 00000000..3ce85da2 --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OdinMenuEditorWindowExample.cs @@ -0,0 +1,60 @@ +#if UNITY_EDITOR +namespace Sirenix.OdinInspector.Demos +{ + using Sirenix.OdinInspector.Editor; + using System.Linq; + using UnityEngine; + using Sirenix.Utilities.Editor; + using Sirenix.Serialization; + using UnityEditor; + using Sirenix.Utilities; + + // + // Be sure to check out OdinMenuStyleExample.cs as well. It shows you various ways to customize the look and behaviour of OdinMenuTrees. + // + + public class OdinMenuEditorWindowExample : OdinMenuEditorWindow + { + [MenuItem("Tools/Odin/Demos/Odin Editor Window Demos/Odin Menu Editor Window Example")] + private static void OpenWindow() + { + var window = GetWindow(); + window.position = GUIHelper.GetEditorWindowRect().AlignCenter(800, 600); + } + + [SerializeField] + private SomeData someData = new SomeData(); // Take a look at SomeData.cs to see how serialization works in Editor Windows. + + protected override OdinMenuTree BuildMenuTree() + { + OdinMenuTree tree = new OdinMenuTree(supportsMultiSelect: true) + { + { "Home", this, EditorIcons.House }, // Draws the this.someData field in this case. + { "Odin Settings", null, SdfIconType.GearFill }, + { "Odin Settings/Color Palettes", ColorPaletteManager.Instance, SdfIconType.PaletteFill }, + { "Odin Settings/AOT Generation", AOTGenerationConfig.Instance, EditorIcons.SmartPhone }, + { "Player Settings", Resources.FindObjectsOfTypeAll().FirstOrDefault() }, + { "Some Class", this.someData } + }; + + tree.AddAllAssetsAtPath("Odin Settings/More Odin Settings", "Plugins/Sirenix", typeof(ScriptableObject), true) + .AddThumbnailIcons(); + + tree.AddAssetAtPath("Odin Getting Started", "Plugins/Sirenix/Getting Started With Odin.asset"); + + tree.MenuItems.Insert(2, new OdinMenuItem(tree, "Menu Style", tree.DefaultMenuStyle)); + + tree.Add("Menu/Items/Are/Created/As/Needed", new GUIContent()); + tree.Add("Menu/Items/Are/Created", new GUIContent("And can be overridden")); + + tree.SortMenuItemsByName(); + + // As you can see, Odin provides a few ways to quickly add editors / objects to your menu tree. + // The API also gives you full control over the selection, etc.. + // Make sure to check out the API Documentation for OdinMenuEditorWindow, OdinMenuTree and OdinMenuItem for more information on what you can do! + + return tree; + } + } +} +#endif diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OdinMenuEditorWindowExample.cs.meta b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OdinMenuEditorWindowExample.cs.meta new file mode 100644 index 00000000..d34770f6 --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OdinMenuEditorWindowExample.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 66093819dfa2a0e49a76dae21d7c8a4c +timeCreated: 1515335602 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OdinMenuStyleExample.cs b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OdinMenuStyleExample.cs new file mode 100644 index 00000000..3536917e --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OdinMenuStyleExample.cs @@ -0,0 +1,117 @@ +#if UNITY_EDITOR +namespace Sirenix.OdinInspector.Demos +{ + using Sirenix.OdinInspector.Editor; + using UnityEngine; + using UnityEditor; + using System.Linq; + using Sirenix.Utilities; + using System.Collections.Generic; + using Sirenix.Utilities.Editor; + + public class OdinMenuStyleExample : OdinMenuEditorWindow + { + [MenuItem("Tools/Odin/Demos/Odin Editor Window Demos/Odin Menu Style Example")] + private static void OpenWindow() + { + var window = GetWindow(); + window.position = GUIHelper.GetEditorWindowRect().AlignCenter(800, 600); + } + + protected override OdinMenuTree BuildMenuTree() + { + var tree = new OdinMenuTree(true); + + var customMenuStyle = new OdinMenuStyle + { + BorderPadding = 0f, + AlignTriangleLeft = true, + TriangleSize = 16f, + TrianglePadding = 0f, + Offset = 20f, + Height = 23, + IconPadding = 0f, + BorderAlpha = 0.323f + }; + + tree.DefaultMenuStyle = customMenuStyle; + + tree.Config.DrawSearchToolbar = true; + + // Adds the custom menu style to the tree, so that you can play around with it. + // Once you are happy, you can press Copy C# Snippet copy its settings and paste it in code. + // And remove the "Menu Style" menu item from the tree. + tree.AddObjectAtPath("Menu Style", customMenuStyle); + + for (int i = 0; i < 5; i++) + { + var customObject = new SomeCustomClass() { Name = i.ToString() }; + var customMenuItem = new MyCustomMenuItem(tree, customObject); + tree.AddMenuItemAtPath("Custom Menu Items", customMenuItem); + } + + tree.AddAllAssetsAtPath("Scriptable Objects in Plugins Tree", "Plugins", typeof(ScriptableObject), true, false); + tree.AddAllAssetsAtPath("Scriptable Objects in Plugins Flat", "Plugins", typeof(ScriptableObject), true, true); + tree.AddAllAssetsAtPath("Only Configs has Icons", "Plugins/Sirenix", true, false); + + tree.EnumerateTree() + .AddThumbnailIcons() + .SortMenuItemsByName(); + + return tree; + } + + //// The editor window itself can also be customized. + //protected override void OnEnable() + //{ + // base.OnEnable(); + + // this.MenuWidth = 200; + // this.ResizableMenuWidth = true; + // this.WindowPadding = new Vector4(10, 10, 10, 10); + // this.DrawUnityEditorPreview = true; + // this.DefaultEditorPreviewHeight = 20; + // this.UseScrollView = true; + //} + + private class MyCustomMenuItem : OdinMenuItem + { + private readonly SomeCustomClass instance; + + public MyCustomMenuItem(OdinMenuTree tree, SomeCustomClass instance) : base(tree, instance.Name, instance) + { + this.instance = instance; + } + + protected override void OnDrawMenuItem(Rect rect, Rect labelRect) + { + labelRect.x -= 16; + this.instance.Enabled = GUI.Toggle(labelRect.AlignMiddle(18).AlignLeft(16), this.instance.Enabled, GUIContent.none); + + // Toggle selection when pressing space. + if (Event.current.type == EventType.KeyDown && Event.current.keyCode == KeyCode.Space) + { + var selection = this.MenuTree.Selection + .Select(x => x.Value) + .OfType(); + + if (selection.Any()) + { + var enabled = !selection.FirstOrDefault().Enabled; + selection.ForEach(x => x.Enabled = enabled); + Event.current.Use(); + } + } + } + + public override string SmartName { get { return this.instance.Name; } } + } + + private class SomeCustomClass + { + public bool Enabled = true; + public string Name; + } + } +} +#endif diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OdinMenuStyleExample.cs.meta b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OdinMenuStyleExample.cs.meta new file mode 100644 index 00000000..160888cd --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OdinMenuStyleExample.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e18d6c02692f0604f84f93cb250834f1 +timeCreated: 1515762718 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OverrideGetTargetsExampleWindow.cs b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OverrideGetTargetsExampleWindow.cs new file mode 100644 index 00000000..93e37e2c --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OverrideGetTargetsExampleWindow.cs @@ -0,0 +1,63 @@ +#if UNITY_EDITOR +namespace Sirenix.OdinInspector.Demos +{ + using UnityEditor; + using UnityEngine; + using System.Collections.Generic; + using Sirenix.OdinInspector.Editor; + using Sirenix.Utilities.Editor; + using Sirenix.OdinInspector; + using Sirenix.Utilities; + + public class OverrideGetTargetsExampleWindow : OdinEditorWindow + { + [MenuItem("Tools/Odin/Demos/Odin Editor Window Demos/Draw Any Target")] + private static void OpenWindow() + { + GetWindow() + .position = GUIHelper.GetEditorWindowRect().AlignCenter(800, 600); + } + + [HideLabel] + [Multiline(6)] + [SuffixLabel("This is drawn", true)] + public string Test; + + // In the default implemenentation, it simply yield returns it self. + // But you can also override this behaviour and have your window render any + // object you like - Unity and non-Unity objects a like. + protected override IEnumerable GetTargets() + { + // Draws this instance using Odin + yield return this; + + // Draw non-unity objects. + yield return GUI.skin.settings; // GUISettings is a regular class. + + // Or Unity objects. + yield return GUI.skin; // GUI.Skin is a ScriptableObject + } + + // You can also override the method that draws each editor. + // This come in handy if you want to add titles, boxes, or draw them in a GUI.Window etc... + protected override void DrawEditor(int index) + { + var currentDrawingEditor = this.CurrentDrawingTargets[index]; + + SirenixEditorGUI.Title( + title: currentDrawingEditor.ToString(), + subtitle: currentDrawingEditor.GetType().GetNiceFullName(), + textAlignment: TextAlignment.Left, + horizontalLine: true + ); + + base.DrawEditor(index); + + if (index != this.CurrentDrawingTargets.Count - 1) + { + SirenixEditorGUI.DrawThickHorizontalSeparator(15, 15); + } + } + } +} +#endif diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OverrideGetTargetsExampleWindow.cs.meta b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OverrideGetTargetsExampleWindow.cs.meta new file mode 100644 index 00000000..47ee70e5 --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/OverrideGetTargetsExampleWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5957605b5da2ea642a9d9037f88d3627 +timeCreated: 1514982238 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/QuicklyInspectObjects.cs b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/QuicklyInspectObjects.cs new file mode 100644 index 00000000..20e7645e --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/QuicklyInspectObjects.cs @@ -0,0 +1,64 @@ +#if UNITY_EDITOR +namespace Sirenix.OdinInspector.Demos +{ + using Sirenix.OdinInspector; + using Sirenix.OdinInspector.Editor; + using Sirenix.Utilities; + using Sirenix.Utilities.Editor; + using UnityEngine; + + public class SomeClass2 + { + [HideLabel, Title("Title", horizontalLine: false, bold: false)] + public string Title = "Some Title"; + + [TextArea(10, 20)] + public string Description = "Some description."; + } + + public class QuicklyInspectObjects + { + private SomeClass2 someObject = new SomeClass2(); + + [Button(ButtonSizes.Large)] + [Title("OdinEditorWindow.InspectObject examples", "Make sure to checkout QuicklyInspectObjects.cs")] + private void InspectObject() + { + OdinEditorWindow.InspectObject(this.someObject); + } + + [Button(ButtonSizes.Large), HorizontalGroup("row1")] + private void InDropDownAutoHeight() + { + var btnRect = GUIHelper.GetCurrentLayoutRect(); + OdinEditorWindow.InspectObjectInDropDown(this.someObject, btnRect, btnRect.width); + } + + [Button(ButtonSizes.Large), HorizontalGroup("row1")] + private void InDropDown() + { + var btnRect = GUIHelper.GetCurrentLayoutRect(); + OdinEditorWindow.InspectObjectInDropDown(this.someObject, btnRect, new Vector2(btnRect.width, 100)); + } + + [Button(ButtonSizes.Large), HorizontalGroup("row2")] + private void InCenter() + { + var window = OdinEditorWindow.InspectObject(this.someObject); + window.position = GUIHelper.GetEditorWindowRect().AlignCenter(270, 200); + } + + [Button(ButtonSizes.Large), HorizontalGroup("row2")] + private void OtherStuffYouCanDo() + { + var window = OdinEditorWindow.InspectObject(this.someObject); + + window.position = GUIHelper.GetEditorWindowRect().AlignCenter(270, 200); + window.titleContent = new GUIContent("Custom title", EditorIcons.RulerRect.Active); + window.OnClose += () => Debug.Log("Window Closed"); + window.OnBeginGUI += () => GUILayout.Label("-----------"); + window.OnEndGUI += () => GUILayout.Label("-----------"); + } + } +} +#endif diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/QuicklyInspectObjects.cs.meta b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/QuicklyInspectObjects.cs.meta new file mode 100644 index 00000000..98c9838b --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/QuicklyInspectObjects.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 503c8a9f7cfad80439b12cb7464b21e4 +timeCreated: 1515088606 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/SomeData.cs b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/SomeData.cs new file mode 100644 index 00000000..38d14845 --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/SomeData.cs @@ -0,0 +1,33 @@ +#if UNITY_EDITOR +namespace Sirenix.OdinInspector.Demos +{ + using UnityEditor; + using System; + + [HideLabel] + [Serializable] + public class SomeData + { + [MultiLineProperty(3), Title("Basic Odin Menu Editor Window", "Inherit from OdinMenuEditorWindow, and build your menu tree")] + public string Test1 = "This value is persistent cross reloads, but will reset once you restart Unity or close the window."; + + [MultiLineProperty(3), ShowInInspector, NonSerialized] + public string Test2 = "This value is not persistent cross reloads, and will reset once you hit play or recompile."; + + [MultiLineProperty(3), ShowInInspector] + private string Test3 + { + get + { + return EditorPrefs.GetString("OdinDemo.PersistentString", + "This value is persistent forever, even cross Unity projects. But it's not saved together " + + "with your project. That's where ScriptableObejcts and OdinEditorWindows come in handy."); + } + set + { + EditorPrefs.SetString("OdinDemo.PersistentString", value); + } + } + } +} +#endif diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/SomeData.cs.meta b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/SomeData.cs.meta new file mode 100644 index 00000000..27fa569a --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/SomeData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 23d6e50778fcc414388c45efaf3da20f +timeCreated: 1516273612 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/SomeTextureToolWindow.cs b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/SomeTextureToolWindow.cs new file mode 100644 index 00000000..9b87023d --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/SomeTextureToolWindow.cs @@ -0,0 +1,48 @@ +#if UNITY_EDITOR +namespace Sirenix.OdinInspector.Demos +{ + using UnityEngine; + using UnityEditor; + using Sirenix.OdinInspector.Editor; + using Sirenix.OdinInspector; + using Sirenix.Utilities.Editor; + using Sirenix.Utilities; + + public class SomeTextureToolWindow : OdinEditorWindow + { + [MenuItem("Tools/Odin/Demos/Odin Editor Window Demos/Some Texture Tool")] + private static void OpenWindow() + { + var window = GetWindow(); + window.position = GUIHelper.GetEditorWindowRect().AlignCenter(600, 600); + window.titleContent = new GUIContent("Some Texture Tool Window"); + } + + [BoxGroup("Settings")] + [FolderPath(RequireExistingPath = true)] + public string OutputPath + { + // Use EditorPrefs to hold persisntent user-variables. + get { return EditorPrefs.GetString("SomeTextureToolWindow.OutputPath"); } + set { EditorPrefs.SetString("SomeTextureToolWindow.OutputPath", value); } + } + + [EnumToggleButtons] + [BoxGroup("Settings")] + public ScaleMode ScaleMode; + + [HorizontalGroup(0.5f, PaddingRight = 5, LabelWidth = 70)] + public Texture[] Textures = new Texture[8]; + + [ReadOnly] + [HorizontalGroup] + [InlineEditor(InlineEditorModes.LargePreview)] + public Texture Preview; + + [Button(ButtonSizes.Gigantic), GUIColor(0, 1, 0)] + public void PerformSomeAction() + { + } + } +} +#endif diff --git a/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/SomeTextureToolWindow.cs.meta b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/SomeTextureToolWindow.cs.meta new file mode 100644 index 00000000..df1d16da --- /dev/null +++ b/Assets/Plugins/Sirenix/Demos/Editor Windows/Scripts/Editor/SomeTextureToolWindow.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2a14e003cbbbc8446aace397291feeae +timeCreated: 1514333524 +licenseType: Free +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector.meta b/Assets/Plugins/Sirenix/Odin Inspector.meta new file mode 100644 index 00000000..afb70e81 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: fe4970195facd664dbd38d1cbf2100c3 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets.meta b/Assets/Plugins/Sirenix/Odin Inspector/Assets.meta new file mode 100644 index 00000000..fcb0c3e6 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 52c0fd243c6c01e4d9efa03616b655d5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor.meta b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor.meta new file mode 100644 index 00000000..f482d7bf --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 85e532eecf67ab545b2a5a28f1a22894 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Bootstrap License.txt b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Bootstrap License.txt new file mode 100644 index 00000000..2b637b2d --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Bootstrap License.txt @@ -0,0 +1,30 @@ +Odin Inspector makes use of the Bootstrap icon library. +The library has been packed into the SdfIconAtlas.png +file as SDF data. + +Bootstrap is released under the following license: + +--- + +The MIT License (MIT) + +Copyright (c) 2011-2018 Twitter, Inc. +Copyright (c) 2011-2018 The Bootstrap Authors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Bootstrap License.txt.meta b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Bootstrap License.txt.meta new file mode 100644 index 00000000..e3864a0f --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Bootstrap License.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3fdc67fad3e362e47b5dd365a0bbdd7f +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/ConfigData.bytes b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/ConfigData.bytes new file mode 100644 index 00000000..1a63707e Binary files /dev/null and b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/ConfigData.bytes differ diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/ConfigData.bytes.meta b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/ConfigData.bytes.meta new file mode 100644 index 00000000..6ad740b0 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/ConfigData.bytes.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 90eaa0dc28c1934408dc1c02e13a507f +timeCreated: 1628274352 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden.meta b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden.meta new file mode 100644 index 00000000..70c7c0b0 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e22dad2728c77344f8da0d2789866a0e +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/ExtractSpriteShader.shader b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/ExtractSpriteShader.shader new file mode 100644 index 00000000..85ad00de --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/ExtractSpriteShader.shader @@ -0,0 +1,51 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +Shader "Hidden/Sirenix/Editor/ExtractSprite" +{ + Properties + { + _MainTex("Texture", 2D) = "white" {} + _Color("Color", Color) = (1,1,1,1) + _Rect("Rect", Vector) = (0,0,0,0) + _TexelSize("TexelSize", Vector) = (0,0,0,0) + } + SubShader + { + Blend SrcAlpha OneMinusSrcAlpha + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + + struct appdata { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + sampler2D _MainTex; + float4 _Rect; + + v2f vert(appdata v) { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = v.uv; + return o; + } + + fixed4 frag(v2f i) : SV_Target { + float2 uv = i.uv; + uv *= _Rect.zw; + uv += _Rect.xy; + return tex2D(_MainTex, uv); + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/ExtractSpriteShader.shader.meta b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/ExtractSpriteShader.shader.meta new file mode 100644 index 00000000..4ce11e97 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/ExtractSpriteShader.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 0675e2791073a4147b190e55f1da7ac2 +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/GUIUtilShader.shader b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/GUIUtilShader.shader new file mode 100644 index 00000000..ff3f8435 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/GUIUtilShader.shader @@ -0,0 +1,98 @@ +Shader "Hidden/Sirenix/OdinGUIShader" +{ + SubShader + { + Lighting Off + Cull Off + ZWrite Off + ZTest Always + Blend SrcAlpha OneMinusSrcAlpha + + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + + struct appdata { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + sampler2D _MainTex; + float _SirenixOdin_GreyScale; + float4 _SirenixOdin_GUIColor; + float4 _SirenixOdin_GUIUv; + float4 _SirenixOdin_HueColor; + + v2f vert(appdata v) { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = v.uv; + return o; + } + + float test1(float x, float y) { + if (x >= y) { + return 0; + } else { + return 1; + } + } + + float test2(float x, float y) { + return step(x, y); + } + + float3 rgb2hsv(float3 c) { + float4 K = float4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); + float4 p = lerp(float4(c.bg, K.wz), float4(c.gb, K.xy), step(c.b, c.g)); + float4 q = lerp(float4(p.xyw, c.r), float4(c.r, p.yzx), step(p.x, c.r)); + + float d = q.x - min(q.w, q.y); + float e = 1.0e-10; + return float3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); + } + + float3 hsv2rgb(float3 c) { + c = float3(c.x, clamp(c.yz, 0.0, 1.0)); + float4 K = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); + float3 p = abs(frac(c.xxx + K.xyz) * 6.0 - K.www); + return c.z * lerp(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); + } + + float4 frag(v2f i) : SV_Target { + float2 uv = i.uv; + uv.y = 1 - uv.y; + uv.x = _SirenixOdin_GUIUv.x + uv.x * _SirenixOdin_GUIUv.z; + uv.y = _SirenixOdin_GUIUv.y + uv.y * _SirenixOdin_GUIUv.w; + uv.y = 1 - uv.y; + + // Greyscale + float4 col = tex2D(_MainTex, uv); + float3 greyScale = (0.3 * col.r) + (0.59 * col.g) + (0.11 * col.b); + col.rgb = lerp(col.rgb, greyScale, _SirenixOdin_GreyScale); + + // Change hue + float3 h = col.rgb; + h = rgb2hsv(h); + float hue = rgb2hsv(_SirenixOdin_HueColor.rgb).x; + h.x = hue; + h = hsv2rgb(h); + col.rgb = lerp(col.rgb, h, _SirenixOdin_HueColor.a); + + // Blend color + col *= _SirenixOdin_GUIColor; + + return col; + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/GUIUtilShader.shader.meta b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/GUIUtilShader.shader.meta new file mode 100644 index 00000000..977b3025 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/GUIUtilShader.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 7619c1ca61a5ef94ca78ddfa69941dad +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/LazyEditorIconShader.shader b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/LazyEditorIconShader.shader new file mode 100644 index 00000000..9ea2f1ba --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/LazyEditorIconShader.shader @@ -0,0 +1,57 @@ +// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)' + +Shader "Hidden/Sirenix/Editor/GUIIcon" +{ + Properties + { + _MainTex("Texture", 2D) = "white" {} + _Color("Color", Color) = (1,1,1,1) + } + SubShader + { + Blend SrcAlpha Zero + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + + struct appdata { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + sampler2D _MainTex; + float4 _Color; + + v2f vert(appdata v) { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = v.uv; + return o; + } + + fixed4 frag(v2f i) : SV_Target { + // drop shadow: + // float texelSize = 1.0 / 34.0; + // float2 shadowUv = clamp(i.uv + float2(-texelSize, texelSize * 2), float2(0, 0), float2(1, 1)); + // fixed4 shadow = fixed4(0, 0, 0, tex2D(_MainTex, shadowUv).a); + + fixed4 col = _Color; + col.a *= tex2D(_MainTex, i.uv).a; + + // drop shadow: + // col = lerp(shadow, col, col.a); + + return col; + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/LazyEditorIconShader.shader.meta b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/LazyEditorIconShader.shader.meta new file mode 100644 index 00000000..eb145b53 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/LazyEditorIconShader.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2ad0a53eacb91bd4fbe0dc668bf25e6f +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/SdfIconShader.shader b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/SdfIconShader.shader new file mode 100644 index 00000000..206d73d7 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/SdfIconShader.shader @@ -0,0 +1,95 @@ +Shader "Hidden/Sirenix/SdfIconShader" +{ + SubShader + { + Blend SrcAlpha OneMinusSrcAlpha + Pass + { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + + struct appdata { + float4 vertex : POSITION; + float2 uv : TEXCOORD0; + }; + + struct v2f { + float2 uv : TEXCOORD0; + float4 vertex : SV_POSITION; + }; + + sampler2D _MainTex; + sampler2D _SirenixOdin_SdfTex; + float _SirenixOdin_EdgeOffset; + float4 _SirenixOdin_Color; + float4 _SirenixOdin_BgColor; + float4 _SirenixOdin_Uv; + + v2f vert(appdata v) { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + o.uv = v.uv; + return o; + } + + float samplePixel(float2 uv) { + return tex2D(_SirenixOdin_SdfTex, uv).a; + } + + float linearstep(float lo, float hi, float input) { + float diff = hi - lo; + float offset = input - lo; + return min(1.0, max(0.0, offset / diff)); + } + + float sampleDist(float2 uv, float dx, float edge, float padding) { + float dist = samplePixel(uv); + float p = -abs((dx * 3072.0) / -padding); + float a = min(1, max(0, edge - p * 0.33333)); + float b = max(0, min(1, edge + p * 0.33333)); + return smoothstep(b, a, dist); + } + + float4 frag(v2f i) : SV_Target { + float2 uv = i.uv; + uv.y = 1 - uv.y; + uv.x = _SirenixOdin_Uv.x + uv.x * _SirenixOdin_Uv.z; + uv.y = _SirenixOdin_Uv.y + uv.y * _SirenixOdin_Uv.w; + uv.y = 1 - uv.y; + + float alpha = 0.0; + float edge = 0.5019608 + _SirenixOdin_EdgeOffset; + + if (_SirenixOdin_BgColor.a > 0.01) { + float3 colorBg = _SirenixOdin_BgColor.rgb; + float3 colorFg = _SirenixOdin_Color.rgb; + + float padding = 8; + float dx = ddx(uv.x); + float2 t = float2(dx * 0.333333, 0); + float3 subDist = float3( + sampleDist(uv.xy - t, dx, edge, padding), + sampleDist(uv.xy, dx, edge, padding), + sampleDist(uv.xy + t, dx, edge, padding)); + float3 color = lerp(colorBg, colorFg, clamp(subDist, 0.0, 1.0)); + + float alpha = min(1, subDist.r + subDist.g + subDist.b); + float4 col = float4(color, alpha * _SirenixOdin_Color.a); + + return col; + } else { + float padding = 8; + float dx = ddx(uv.x); + float alpha = sampleDist(uv, dx, edge, padding); + float4 col = _SirenixOdin_Color; + col.a *= alpha; + + return col; + } + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/SdfIconShader.shader.meta b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/SdfIconShader.shader.meta new file mode 100644 index 00000000..7634f127 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/Hidden/SdfIconShader.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 99e0f263ae4ed2d4d962a2e995dff6df +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/OdinPathLookup.asset b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/OdinPathLookup.asset new file mode 100644 index 00000000..3a82383c --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/OdinPathLookup.asset @@ -0,0 +1,13 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -262940062, guid: a4865f1ab4504ed8a368670db22f409c, type: 3} + m_Name: OdinPathLookup + m_EditorClassIdentifier: \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/OdinPathLookup.asset.meta b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/OdinPathLookup.asset.meta new file mode 100644 index 00000000..4d528ebb --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/OdinPathLookup.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 08379ccefc05200459f90a1c0711a340 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/SdfIconAtlas.png b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/SdfIconAtlas.png new file mode 100644 index 00000000..6d255d58 Binary files /dev/null and b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/SdfIconAtlas.png differ diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/SdfIconAtlas.png.meta b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/SdfIconAtlas.png.meta new file mode 100644 index 00000000..0c039332 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Assets/Editor/SdfIconAtlas.png.meta @@ -0,0 +1,128 @@ +fileFormatVersion: 2 +guid: 2a0112a98875dfd488b5d10bdb8a4903 +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 11 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 1 + aniso: 1 + mipBias: 0 + wrapU: 0 + wrapV: 0 + wrapW: 0 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 10 + textureShape: 1 + singleChannelComponent: 0 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + applyGammaDecoding: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 16384 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 16384 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Server + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: WebGL + maxTextureSize: 16384 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + spritePackingTag: + pSDRemoveMatte: 0 + pSDShowRemoveMatteOption: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config.meta b/Assets/Plugins/Sirenix/Odin Inspector/Config.meta new file mode 100644 index 00000000..cecc5022 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6a812b2471e042c4a8f0597af5f87c25 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor.meta b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor.meta new file mode 100644 index 00000000..519ce047 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1422588a87e1db047a83fece7f33f3d5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/AOTGenerationConfig.asset b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/AOTGenerationConfig.asset new file mode 100644 index 00000000..9b4888ce --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/AOTGenerationConfig.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1726182683, guid: a4865f1ab4504ed8a368670db22f409c, type: 3} + m_Name: AOTGenerationConfig + m_EditorClassIdentifier: Sirenix.OdinInspector.Editor.dll::Sirenix.Serialization.AOTGenerationConfig + automateBeforeBuilds: 0 + deleteDllAfterBuilds: 1 + AutomateForAllAOTPlatforms: 1 + automateForPlatforms: 0900000014000000 + supportSerializedTypes: [] diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/AOTGenerationConfig.asset.meta b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/AOTGenerationConfig.asset.meta new file mode 100644 index 00000000..7f2fa1c2 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/AOTGenerationConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: c406cd3a19fda034faa814326f7e46b3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/ColorPaletteManager.asset b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/ColorPaletteManager.asset new file mode 100644 index 00000000..ef31ce4c --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/ColorPaletteManager.asset @@ -0,0 +1,136 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 772478971, guid: a4865f1ab4504ed8a368670db22f409c, type: 3} + m_Name: ColorPaletteManager + m_EditorClassIdentifier: Sirenix.OdinInspector.Editor.dll::Sirenix.OdinInspector.Editor.ColorPaletteManager + colorPalettes: + - name: Country + showAlpha: 0 + colors: + - {r: 0.776, g: 0.651, b: 0.349, a: 1} + - {r: 0.863, g: 0.761, b: 0.631, a: 1} + - {r: 0.91, g: 0.831, b: 0.686, a: 1} + - {r: 0.961, g: 0.902, b: 0.788, a: 1} + - {r: 0.753, g: 0.714, b: 0.667, a: 1} + - {r: 0.478, g: 0.573, b: 0.431, a: 1} + - {r: 0.314, g: 0.427, b: 0.31, a: 1} + - {r: 0.596, g: 0.345, b: 0.235, a: 1} + - {r: 0.545, g: 0.329, b: 0.318, a: 1} + - {r: 0.647, g: 0.204, b: 0.227, a: 1} + - {r: 0.435, g: 0.161, b: 0.063, a: 1} + - {r: 0.357, g: 0.333, b: 0.278, a: 1} + - {r: 0.976, g: 0.98, b: 0.961, a: 1} + - {r: 0.165, g: 0.271, b: 0.11, a: 1} + - name: Beach + showAlpha: 0 + colors: + - {r: 0.996, g: 0.906, b: 0.459, a: 1} + - {r: 0.314, g: 0.592, b: 0.035, a: 1} + - {r: 0.486, g: 0.953, b: 0.875, a: 1} + - {r: 0.996, g: 0.82, b: 0.212, a: 1} + - {r: 1, g: 0.769, b: 0.165, a: 1} + - {r: 0.804, g: 0.835, b: 0.753, a: 1} + - {r: 1, g: 0.769, b: 0.165, a: 1} + - {r: 1, g: 0.702, b: 0.063, a: 1} + - {r: 1, g: 0.898, b: 0.569, a: 1} + - name: Fall + showAlpha: 0 + colors: + - {r: 0.82, g: 0.722, b: 0.318, a: 1} + - {r: 0.537, g: 0.192, b: 0.153, a: 1} + - {r: 0.996, g: 0.812, b: 0.012, a: 1} + - {r: 1, g: 0.431, b: 0.02, a: 1} + - {r: 0.937, g: 0.267, b: 0.094, a: 1} + - {r: 0.42, g: 0.212, b: 0.18, a: 1} + - {r: 0.992, g: 0.651, b: 0.004, a: 1} + - {r: 0.89, g: 0.353, b: 0.086, a: 1} + - {r: 1, g: 0.443, b: 0.004, a: 1} + - {r: 0.682, g: 0.275, b: 0.137, a: 1} + - {r: 0.306, g: 0.231, b: 0.114, a: 1} + - {r: 0.384, g: 0.416, b: 0.082, a: 1} + - {r: 0.165, g: 0.157, b: 0.008, a: 1} + - {r: 0.906, g: 0.635, b: 0.227, a: 1} + - {r: 0.82, g: 0.722, b: 0.318, a: 1} + - {r: 0.745, g: 0.435, b: 0.031, a: 1} + - {r: 0.765, g: 0.682, b: 0.569, a: 1} + - {r: 0.18, g: 0.149, b: 0.075, a: 1} + - {r: 0.702, g: 0.451, b: 0.059, a: 1} + - name: Passion + showAlpha: 0 + colors: + - {r: 0.925, g: 0.682, b: 0.624, a: 1} + - {r: 0.188, g: 0.114, b: 0.224, a: 1} + - {r: 0.349, g: 0.11, b: 0.231, a: 1} + - {r: 0.435, g: 0.267, b: 0.357, a: 1} + - name: Sepia + showAlpha: 0 + colors: + - {r: 0.353, g: 0.098, b: 0.02, a: 1} + - {r: 0.663, g: 0.188, b: 0.114, a: 1} + - {r: 0.906, g: 0.643, b: 0.082, a: 1} + - {r: 0.996, g: 0.839, b: 0.322, a: 1} + - {r: 0.486, g: 0.392, b: 0.02, a: 1} + - {r: 0.294, g: 0.235, b: 0.012, a: 1} + - name: Floral + showAlpha: 0 + colors: + - {r: 0.855, g: 0.518, b: 0.412, a: 1} + - {r: 0.827, g: 0.294, b: 0.333, a: 1} + - {r: 0.737, g: 0.118, b: 0.208, a: 1} + - {r: 0.549, g: 0.149, b: 0.235, a: 1} + - {r: 0.949, g: 0.925, b: 0.784, a: 1} + - {r: 0.945, g: 0.882, b: 0.69, a: 1} + - {r: 0.871, g: 0.812, b: 0.698, a: 1} + - {r: 0.4, g: 0.196, b: 0.243, a: 1} + - {r: 0.271, g: 0.157, b: 0.227, a: 1} + - name: Underwater + showAlpha: 0 + colors: + - {r: 0.663, g: 0.416, b: 0.733, a: 1} + - {r: 0.2, g: 0.6, b: 0.698, a: 1} + - {r: 0.11, g: 0.49, b: 0.698, a: 1} + - {r: 0.439, g: 0.627, b: 0.227, a: 1} + - {r: 0, g: 0.357, b: 0.604, a: 1} + - {r: 0.067, g: 0.271, b: 0.353, a: 1} + - name: Breeze + showAlpha: 0 + colors: + - {r: 0.706, g: 1, b: 0, a: 1} + - {r: 0.651, g: 1, b: 0.404, a: 1} + - {r: 0.122, g: 1, b: 0.514, a: 1} + - {r: 0.216, g: 0.894, b: 0.961, a: 1} + - {r: 0.4, g: 1, b: 0.882, a: 1} + - {r: 0.027, g: 0.792, b: 0.8, a: 1} + - name: Clovers + showAlpha: 0 + colors: + - {r: 0.431, g: 0.549, b: 0.102, a: 1} + - {r: 0.671, g: 0.714, b: 0.071, a: 1} + - {r: 0.969, g: 0.949, b: 0.831, a: 1} + - {r: 0.886, g: 0.902, b: 0.702, a: 1} + - {r: 0.753, g: 0.824, b: 0.627, a: 1} + - {r: 0.404, g: 0.6, b: 0.4, a: 1} + - name: Tropical + showAlpha: 0 + colors: + - {r: 0.953, g: 0.647, b: 0.804, a: 1} + - {r: 0.965, g: 0.741, b: 0.871, a: 1} + - {r: 0.949, g: 0.549, b: 0.643, a: 1} + - {r: 0.992, g: 0.659, b: 0.498, a: 1} + - {r: 0.976, g: 0.792, b: 0.729, a: 1} + - {r: 0.984, g: 0.855, b: 0.725, a: 1} + - {r: 0.259, g: 0.882, b: 0.663, a: 1} + - {r: 0.349, g: 0.753, b: 0.78, a: 1} + - {r: 0.725, g: 0.976, b: 0.91, a: 1} + - {r: 0.647, g: 0.745, b: 0.957, a: 1} + - {r: 0.725, g: 0.863, b: 0.973, a: 1} + - {r: 0.89, g: 0.945, b: 0.996, a: 1} diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/ColorPaletteManager.asset.meta b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/ColorPaletteManager.asset.meta new file mode 100644 index 00000000..e36cd80a --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/ColorPaletteManager.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 12f4303fae7c240478b19b5818736f6f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/GeneralDrawerConfig.asset b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/GeneralDrawerConfig.asset new file mode 100644 index 00000000..ddef7500 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/GeneralDrawerConfig.asset @@ -0,0 +1,25 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -645759843, guid: a4865f1ab4504ed8a368670db22f409c, type: 3} + m_Name: GeneralDrawerConfig + m_EditorClassIdentifier: Sirenix.OdinInspector.Editor.dll::Sirenix.OdinInspector.Editor.GeneralDrawerConfig + enableUIToolkitSupport: 1 + useOldUnityObjectField: 0 + useOldUnityPreviewField: 0 + useOldTypeSelector: 0 + useNewObjectSelector: 1 + showNoneItem: 1 + showCategoriesByDefault: 0 + preferNamespacesOverAssemblyCategories: 1 + useOldPolymorphicField: 0 + showBaseType: 1 + nonDefaultConstructorPreference: 0 diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/GeneralDrawerConfig.asset.meta b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/GeneralDrawerConfig.asset.meta new file mode 100644 index 00000000..9255360a --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/GeneralDrawerConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 28093e48ed374f745853a7d214970341 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/ImportSettingsConfig.asset b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/ImportSettingsConfig.asset new file mode 100644 index 00000000..7e4f9dfd --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/ImportSettingsConfig.asset @@ -0,0 +1,15 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 188390376, guid: a4865f1ab4504ed8a368670db22f409c, type: 3} + m_Name: ImportSettingsConfig + m_EditorClassIdentifier: Sirenix.OdinInspector.Editor.dll::Sirenix.OdinInspector.Editor.ImportSettingsConfig + automateBeforeBuild: 1 diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/ImportSettingsConfig.asset.meta b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/ImportSettingsConfig.asset.meta new file mode 100644 index 00000000..bd90e4b8 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/ImportSettingsConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 962087e9d661f8e4092e5263723ffbec +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/InspectorConfig.asset b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/InspectorConfig.asset new file mode 100644 index 00000000..9cf8bb54 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/InspectorConfig.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1137305049, guid: a4865f1ab4504ed8a368670db22f409c, type: 3} + m_Name: InspectorConfig + m_EditorClassIdentifier: Sirenix.OdinInspector.Editor.dll::Sirenix.OdinInspector.Editor.InspectorConfig + enableOdinInInspector: 1 + defaultEditorBehaviour: 11 + processMouseMoveInInspector: 1 + drawingConfig: + configs: [] diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/InspectorConfig.asset.meta b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/InspectorConfig.asset.meta new file mode 100644 index 00000000..0c0fb246 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/InspectorConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7192b50bef6e20945980eaea1a53e40d +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinModuleConfig.asset b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinModuleConfig.asset new file mode 100644 index 00000000..ea72c5ac --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinModuleConfig.asset @@ -0,0 +1,19 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -228747253, guid: a4865f1ab4504ed8a368670db22f409c, type: 3} + m_Name: OdinModuleConfig + m_EditorClassIdentifier: Sirenix.OdinInspector.Editor.dll::Sirenix.OdinInspector.Editor.Modules.OdinModuleConfig + configurations: + - ID: Unity.Mathematics + ActivationSettings: 0 + ModuleTogglingSettings: 1 + ModuleUpdateSettings: 1 diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinModuleConfig.asset.meta b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinModuleConfig.asset.meta new file mode 100644 index 00000000..04efc2b7 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinModuleConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a3637919f59638641a151bfe86d6aa7f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinVisualDesignerConfig.asset b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinVisualDesignerConfig.asset new file mode 100644 index 00000000..bb591a76 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinVisualDesignerConfig.asset @@ -0,0 +1,16 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 240468018, guid: a4865f1ab4504ed8a368670db22f409c, type: 3} + m_Name: OdinVisualDesignerConfig + m_EditorClassIdentifier: Sirenix.OdinInspector.Editor.dll::Sirenix.OdinInspector.Editor.OdinVisualDesignerConfig + SerializedFavoriteAttributes: [] + savePath: Assets/Plugins/Sirenix/Odin Inspector/Visual Designer/Saved diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinVisualDesignerConfig.asset.meta b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinVisualDesignerConfig.asset.meta new file mode 100644 index 00000000..6d52fbbf --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/OdinVisualDesignerConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: efc5ae00c81a33049bb426b0fbe25154 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/TypeRegistryUserConfig.asset b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/TypeRegistryUserConfig.asset new file mode 100644 index 00000000..da68e0e5 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/TypeRegistryUserConfig.asset @@ -0,0 +1,24 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 2050440665, guid: a4865f1ab4504ed8a368670db22f409c, type: 3} + m_Name: TypeRegistryUserConfig + m_EditorClassIdentifier: Sirenix.OdinInspector.Editor.dll::Sirenix.Config.TypeRegistryUserConfig + shownTypes: + serializedCollection: [] + hiddenTypes: + serializedCollection: [] + addedIllegalTypes: + serializedCollection: [] + typeSettings: + serializedDictionary: [] + typePriorities: + serializedDictionary: [] diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/TypeRegistryUserConfig.asset.meta b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/TypeRegistryUserConfig.asset.meta new file mode 100644 index 00000000..eaf225d7 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Editor/TypeRegistryUserConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2d1110920ebfef24e91ecc6149b3ca85 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Resources.meta b/Assets/Plugins/Sirenix/Odin Inspector/Config/Resources.meta new file mode 100644 index 00000000..7affa460 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 20b5154cd8f3a184ea6da2d59a70bfc2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Resources/Sirenix.meta b/Assets/Plugins/Sirenix/Odin Inspector/Config/Resources/Sirenix.meta new file mode 100644 index 00000000..a72752bd --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Resources/Sirenix.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b2211ef09d99432458640a60c4ec70d9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Resources/Sirenix/GlobalSerializationConfig.asset b/Assets/Plugins/Sirenix/Odin Inspector/Config/Resources/Sirenix/GlobalSerializationConfig.asset new file mode 100644 index 00000000..6191590f --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Resources/Sirenix/GlobalSerializationConfig.asset @@ -0,0 +1,22 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 1549551891, guid: 74721b9f0af448f5ae2e91102a1a5edd, type: 3} + m_Name: GlobalSerializationConfig + m_EditorClassIdentifier: Sirenix.Serialization.Config.dll::Sirenix.Serialization.GlobalSerializationConfig + HideSerializationCautionaryMessage: 0 + HidePrefabCautionaryMessage: 0 + HideOdinSerializeAttributeWarningMessages: 0 + HideNonSerializedShowInInspectorWarningMessages: 0 + buildSerializationFormat: 0 + editorSerializationFormat: 2 + loggingPolicy: 0 + errorHandlingPolicy: 0 diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Config/Resources/Sirenix/GlobalSerializationConfig.asset.meta b/Assets/Plugins/Sirenix/Odin Inspector/Config/Resources/Sirenix/GlobalSerializationConfig.asset.meta new file mode 100644 index 00000000..426f1ea1 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Config/Resources/Sirenix/GlobalSerializationConfig.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2006a0a1d6da74b4b99f954e145fb366 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules.meta new file mode 100644 index 00000000..40fd9213 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 356a67db9bc6244428bcd2aad1eefbda +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables.data b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables.data new file mode 100644 index 00000000..f0a13660 Binary files /dev/null and b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables.data differ diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables.data.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables.data.meta new file mode 100644 index 00000000..38859a12 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Addressables.data.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d92d0eb8b980c6d44b5f0e64a620355b +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Entities.data b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Entities.data new file mode 100644 index 00000000..d86c063d Binary files /dev/null and b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Entities.data differ diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Entities.data.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Entities.data.meta new file mode 100644 index 00000000..965c525f --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Entities.data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 728df0e3465c1a148b83053a3f31d489 +timeCreated: 1573836981 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization.data b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization.data new file mode 100644 index 00000000..551ada8d Binary files /dev/null and b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization.data differ diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization.data.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization.data.meta new file mode 100644 index 00000000..8b4ef823 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Localization.data.meta @@ -0,0 +1,6 @@ +fileFormatVersion: 2 +guid: 5a1693d73a4f6e34d955789129c71e11 +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics.data b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics.data new file mode 100644 index 00000000..f3de456c Binary files /dev/null and b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics.data differ diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics.data.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics.data.meta new file mode 100644 index 00000000..ee5dc74a --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics.data.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 4866e740a22eb1e49b1603b051e4d92c +timeCreated: 1573836980 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics.meta new file mode 100644 index 00000000..3d838761 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 049b3685a0978b3458f7d3cb39e093a5 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/MathematicsDrawers.cs b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/MathematicsDrawers.cs new file mode 100644 index 00000000..a8a70e7e --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/MathematicsDrawers.cs @@ -0,0 +1,883 @@ +//----------------------------------------------------------------------- +// +// Copyright (c) Sirenix ApS. All rights reserved. +// +//----------------------------------------------------------------------- + +namespace Sirenix.OdinInspector.Modules.UnityMathematics.Editor +{ +#if UNITY_EDITOR + using System; + using System.Collections.Generic; + using System.Reflection; + using Sirenix.OdinInspector.Editor; + using Sirenix.Utilities; + using Sirenix.Utilities.Editor; + using Unity.Mathematics; + using UnityEditor; + using UnityEngine; + + public sealed class MatrixFloat2x2Processor : MatrixProcessor { } + public sealed class MatrixFloat3x2Processor : MatrixProcessor { } + public sealed class MatrixFloat4x2Processor : MatrixProcessor { } + public sealed class MatrixFloat2x3Processor : MatrixProcessor { } + public sealed class MatrixFloat3x3Processor : MatrixProcessor { } + public sealed class MatrixFloat4x3Processor : MatrixProcessor { } + public sealed class MatrixFloat2x4Processor : MatrixProcessor { } + public sealed class MatrixFloat3x4Processor : MatrixProcessor { } + public sealed class MatrixFloat4x4Processor : MatrixProcessor { } + + public sealed class MatrixDouble2x2Processor : MatrixProcessor { } + public sealed class MatrixDouble3x2Processor : MatrixProcessor { } + public sealed class MatrixDouble4x2Processor : MatrixProcessor { } + public sealed class MatrixDouble2x3Processor : MatrixProcessor { } + public sealed class MatrixDouble3x3Processor : MatrixProcessor { } + public sealed class MatrixDouble4x3Processor : MatrixProcessor { } + public sealed class MatrixDouble2x4Processor : MatrixProcessor { } + public sealed class MatrixDouble3x4Processor : MatrixProcessor { } + public sealed class MatrixDouble4x4Processor : MatrixProcessor { } + + public sealed class MatrixBool2x2Processor : MatrixProcessor { } + public sealed class MatrixBool3x2Processor : MatrixProcessor { } + public sealed class MatrixBool4x2Processor : MatrixProcessor { } + public sealed class MatrixBool2x3Processor : MatrixProcessor { } + public sealed class MatrixBool3x3Processor : MatrixProcessor { } + public sealed class MatrixBool4x3Processor : MatrixProcessor { } + public sealed class MatrixBool2x4Processor : MatrixProcessor { } + public sealed class MatrixBool3x4Processor : MatrixProcessor { } + public sealed class MatrixBool4x4Processor : MatrixProcessor { } + + public sealed class MatrixInt2x2Processor : MatrixProcessor { } + public sealed class MatrixInt3x2Processor : MatrixProcessor { } + public sealed class MatrixInt4x2Processor : MatrixProcessor { } + public sealed class MatrixInt2x3Processor : MatrixProcessor { } + public sealed class MatrixInt3x3Processor : MatrixProcessor { } + public sealed class MatrixInt4x3Processor : MatrixProcessor { } + public sealed class MatrixInt2x4Processor : MatrixProcessor { } + public sealed class MatrixInt3x4Processor : MatrixProcessor { } + public sealed class MatrixInt4x4Processor : MatrixProcessor { } + + public sealed class MatrixUInt2x2Processor : MatrixProcessor { } + public sealed class MatrixUInt3x2Processor : MatrixProcessor { } + public sealed class MatrixUInt4x2Processor : MatrixProcessor { } + public sealed class MatrixUInt2x3Processor : MatrixProcessor { } + public sealed class MatrixUInt3x3Processor : MatrixProcessor { } + public sealed class MatrixUInt4x3Processor : MatrixProcessor { } + public sealed class MatrixUInt2x4Processor : MatrixProcessor { } + public sealed class MatrixUInt3x4Processor : MatrixProcessor { } + public sealed class MatrixUInt4x4Processor : MatrixProcessor { } + + public sealed class DisableUnityMatrixDrawerAttribute : Attribute { } + + public abstract class MatrixProcessor : OdinAttributeProcessor + { + public override void ProcessSelfAttributes(InspectorProperty property, List attributes) + { + attributes.GetOrAddAttribute(); + attributes.GetOrAddAttribute(); + } + + public override void ProcessChildMemberAttributes(InspectorProperty parentProperty, MemberInfo member, List attributes) + { + attributes.Add(new HideLabelAttribute()); + attributes.Add(new MatrixChildAttribute()); + } + } + + public class DisableUnityMatrixDrawerAttributeDrawer : OdinAttributeDrawer + { + protected override void Initialize() + { + this.SkipWhenDrawing = true; + var chain = this.Property.GetActiveDrawerChain().BakedDrawerArray; + + for (int i = 0; i < chain.Length; i++) + { + var type = chain[i].GetType(); + + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(UnityPropertyDrawer<,>) && type.GetGenericArguments()[0].Name == "MatrixDrawer") + { + chain[i].SkipWhenDrawing = true; + break; + } + } + } + } + + public class MatrixChildAttribute : Attribute { } + + public class Bool2Drawer : OdinValueDrawer + { + private bool isMatrixChild; + + protected override void Initialize() + { + this.isMatrixChild = this.Property.GetAttribute() != null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + Rect labelRect; + Rect contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); + { + var showLabels = !this.isMatrixChild && SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 100; + + if (label != null) + { + GUILayout.Space(3); // Ugh, better than nothing + } + + var options = GUILayoutOptions.Height(EditorGUIUtility.singleLineHeight); + + GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); + EditorGUILayout.BeginVertical(options); + this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); + EditorGUILayout.EndVertical(); + EditorGUILayout.BeginVertical(options); + this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); + EditorGUILayout.EndVertical(); + GUIHelper.PopLabelWidth(); + } + SirenixEditorGUI.EndHorizontalPropertyLayout(); + } + } + + public class Bool3Drawer : OdinValueDrawer + { + private bool isMatrixChild; + + protected override void Initialize() + { + this.isMatrixChild = this.Property.GetAttribute() != null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + Rect labelRect; + Rect contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); + { + var showLabels = !this.isMatrixChild && SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 100; + + if (label != null) + { + GUILayout.Space(3); // Ugh, better than nothing + } + + var options = GUILayoutOptions.Height(EditorGUIUtility.singleLineHeight); + + GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); + EditorGUILayout.BeginVertical(options); + this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); + EditorGUILayout.EndVertical(); + EditorGUILayout.BeginVertical(options); + this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); + EditorGUILayout.EndVertical(); + EditorGUILayout.BeginVertical(options); + this.ValueEntry.Property.Children[2].Draw(showLabels ? GUIHelper.TempContent("Z") : null); + EditorGUILayout.EndVertical(); + GUIHelper.PopLabelWidth(); + } + SirenixEditorGUI.EndHorizontalPropertyLayout(); + } + } + + public class Bool4Drawer : OdinValueDrawer + { + private bool isMatrixChild; + + protected override void Initialize() + { + this.isMatrixChild = this.Property.GetAttribute() != null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + Rect labelRect; + Rect contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); + { + var showLabels = !this.isMatrixChild && SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 100; + + if (label != null) + { + GUILayout.Space(3); // Ugh, better than nothing + } + + var options = GUILayoutOptions.Height(EditorGUIUtility.singleLineHeight); + + GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); + EditorGUILayout.BeginVertical(options); + this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); + EditorGUILayout.EndVertical(); + EditorGUILayout.BeginVertical(options); + this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); + EditorGUILayout.EndVertical(); + EditorGUILayout.BeginVertical(options); + this.ValueEntry.Property.Children[2].Draw(showLabels ? GUIHelper.TempContent("Z") : null); + EditorGUILayout.EndVertical(); + EditorGUILayout.BeginVertical(options); + this.ValueEntry.Property.Children[3].Draw(showLabels ? GUIHelper.TempContent("W") : null); + EditorGUILayout.EndVertical(); + GUIHelper.PopLabelWidth(); + } + SirenixEditorGUI.EndHorizontalPropertyLayout(); + } + } + + public class Float2Drawer : OdinValueDrawer, IDefinesGenericMenuItems + { + private bool isMatrixChild; + + protected override void Initialize() + { + this.isMatrixChild = this.Property.GetAttribute() != null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + Rect labelRect; + Rect contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); + { + // Slide rect + { + var val = this.ValueEntry.SmartValue; + EditorGUI.BeginChangeCheck(); + var vec = SirenixEditorFields.VectorPrefixSlideRect(labelRect, new Vector2(val.x, val.y)); + val = new float2(vec.x, vec.y); + if (EditorGUI.EndChangeCheck()) + { + this.ValueEntry.SmartValue = val; + } + } + + var showLabels = !this.isMatrixChild && SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 185; + GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); + this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); + this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); + GUIHelper.PopLabelWidth(); + + } + SirenixEditorGUI.EndHorizontalPropertyLayout(); + } + + /// + /// Populates the generic menu for the property. + /// + public void PopulateGenericMenu(InspectorProperty property, GenericMenu genericMenu) + { + float2 value = (float2)property.ValueEntry.WeakSmartValue; + var vec = new Vector2(value.x, value.y); + + if (genericMenu.GetItemCount() > 0) + { + genericMenu.AddSeparator(""); + } + genericMenu.AddItem(new GUIContent("Normalize"), Mathf.Approximately(vec.magnitude, 1f), () => NormalizeEntries(property)); + genericMenu.AddItem(new GUIContent("Zero", "Set the vector to (0, 0)"), vec == Vector2.zero, () => SetVector(property, Vector2.zero)); + genericMenu.AddItem(new GUIContent("One", "Set the vector to (1, 1)"), vec == Vector2.one, () => SetVector(property, Vector2.one)); + genericMenu.AddSeparator(""); + genericMenu.AddItem(new GUIContent("Right", "Set the vector to (1, 0)"), vec == Vector2.right, () => SetVector(property, Vector2.right)); + genericMenu.AddItem(new GUIContent("Left", "Set the vector to (-1, 0)"), vec == Vector2.left, () => SetVector(property, Vector2.left)); + genericMenu.AddItem(new GUIContent("Up", "Set the vector to (0, 1)"), vec == Vector2.up, () => SetVector(property, Vector2.up)); + genericMenu.AddItem(new GUIContent("Down", "Set the vector to (0, -1)"), vec == Vector2.down, () => SetVector(property, Vector2.down)); + } + + private void SetVector(InspectorProperty property, Vector2 value) + { + property.Tree.DelayActionUntilRepaint(() => + { + for (int i = 0; i < property.ValueEntry.ValueCount; i++) + { + property.ValueEntry.WeakValues[i] = new float2(value.x, value.y); + } + }); + } + + private void NormalizeEntries(InspectorProperty property) + { + property.Tree.DelayActionUntilRepaint(() => + { + for (int i = 0; i < property.ValueEntry.ValueCount; i++) + { + property.ValueEntry.WeakValues[i] = math.normalizesafe((float2)property.ValueEntry.WeakValues[i]); + } + }); + } + } + + public class Float3Drawer : OdinValueDrawer, IDefinesGenericMenuItems + { + private bool isMatrixChild; + + protected override void Initialize() + { + this.isMatrixChild = this.Property.GetAttribute() != null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + Rect labelRect; + Rect contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); + { + // Slide rect + { + var val = this.ValueEntry.SmartValue; + EditorGUI.BeginChangeCheck(); + var vec = SirenixEditorFields.VectorPrefixSlideRect(labelRect, new Vector3(val.x, val.y, val.z)); + val = new float3(vec.x, vec.y, vec.z); + if (EditorGUI.EndChangeCheck()) + { + this.ValueEntry.SmartValue = val; + } + } + + var showLabels = !this.isMatrixChild && SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 185; + GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); + this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); + this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); + this.ValueEntry.Property.Children[2].Draw(showLabels ? GUIHelper.TempContent("Z") : null); + GUIHelper.PopLabelWidth(); + + } + SirenixEditorGUI.EndHorizontalPropertyLayout(); + } + + /// + /// Populates the generic menu for the property. + /// + public void PopulateGenericMenu(InspectorProperty property, GenericMenu genericMenu) + { + float3 value = (float3)property.ValueEntry.WeakSmartValue; + var vec = new Vector3(value.x, value.y, value.z); + + if (genericMenu.GetItemCount() > 0) + { + genericMenu.AddSeparator(""); + } + genericMenu.AddItem(new GUIContent("Normalize"), Mathf.Approximately(vec.magnitude, 1f), () => NormalizeEntries(property)); + genericMenu.AddItem(new GUIContent("Zero", "Set the vector to (0, 0, 0)"), vec == Vector3.zero, () => SetVector(property, Vector3.zero)); + genericMenu.AddItem(new GUIContent("One", "Set the vector to (1, 1, 1)"), vec == Vector3.one, () => SetVector(property, Vector3.one)); + genericMenu.AddSeparator(""); + genericMenu.AddItem(new GUIContent("Right", "Set the vector to (1, 0, 0)"), vec == Vector3.right, () => SetVector(property, Vector3.right)); + genericMenu.AddItem(new GUIContent("Left", "Set the vector to (-1, 0, 0)"), vec == Vector3.left, () => SetVector(property, Vector3.left)); + genericMenu.AddItem(new GUIContent("Up", "Set the vector to (0, 1, 0)"), vec == Vector3.up, () => SetVector(property, Vector3.up)); + genericMenu.AddItem(new GUIContent("Down", "Set the vector to (0, -1, 0)"), vec == Vector3.down, () => SetVector(property, Vector3.down)); + genericMenu.AddItem(new GUIContent("Forward", "Set the vector property to (0, 0, 1)"), vec == Vector3.forward, () => SetVector(property, Vector3.forward)); + genericMenu.AddItem(new GUIContent("Back", "Set the vector property to (0, 0, -1)"), vec == Vector3.back, () => SetVector(property, Vector3.back)); + } + + private void SetVector(InspectorProperty property, Vector3 value) + { + property.Tree.DelayActionUntilRepaint(() => + { + for (int i = 0; i < property.ValueEntry.ValueCount; i++) + { + property.ValueEntry.WeakValues[i] = new float3(value.x, value.y, value.z); + } + }); + } + + private void NormalizeEntries(InspectorProperty property) + { + property.Tree.DelayActionUntilRepaint(() => + { + for (int i = 0; i < property.ValueEntry.ValueCount; i++) + { + property.ValueEntry.WeakValues[i] = math.normalizesafe((float3)property.ValueEntry.WeakValues[i]); + } + }); + } + } + + public class Float4Drawer : OdinValueDrawer, IDefinesGenericMenuItems + { + private bool isMatrixChild; + + protected override void Initialize() + { + this.isMatrixChild = this.Property.GetAttribute() != null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + Rect labelRect; + Rect contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); + { + // Slide rect + { + var val = this.ValueEntry.SmartValue; + EditorGUI.BeginChangeCheck(); + var vec = SirenixEditorFields.VectorPrefixSlideRect(labelRect, new Vector4(val.x, val.y, val.z, val.w)); + val = new float4(vec.x, vec.y, vec.z, vec.w); + if (EditorGUI.EndChangeCheck()) + { + this.ValueEntry.SmartValue = val; + } + } + + var showLabels = !this.isMatrixChild && SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 185; + GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); + this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); + this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); + this.ValueEntry.Property.Children[2].Draw(showLabels ? GUIHelper.TempContent("Z") : null); + this.ValueEntry.Property.Children[3].Draw(showLabels ? GUIHelper.TempContent("W") : null); + GUIHelper.PopLabelWidth(); + + } + SirenixEditorGUI.EndHorizontalPropertyLayout(); + } + + /// + /// Populates the generic menu for the property. + /// + public void PopulateGenericMenu(InspectorProperty property, GenericMenu genericMenu) + { + float4 value = (float4)property.ValueEntry.WeakSmartValue; + var vec = new Vector4(value.x, value.y, value.z, value.w); + + if (genericMenu.GetItemCount() > 0) + { + genericMenu.AddSeparator(""); + } + genericMenu.AddItem(new GUIContent("Normalize"), Mathf.Approximately(vec.magnitude, 1f), () => NormalizeEntries(property)); + genericMenu.AddItem(new GUIContent("Zero", "Set the vector to (0, 0, 0, 0)"), vec == Vector4.zero, () => SetVector(property, Vector3.zero)); + genericMenu.AddItem(new GUIContent("One", "Set the vector to (1, 1, 1, 1)"), vec == Vector4.one, () => SetVector(property, Vector4.one)); + genericMenu.AddSeparator(""); + genericMenu.AddItem(new GUIContent("Right", "Set the vector to (1, 0, 0, 0)"), (Vector3)vec == Vector3.right, () => SetVector(property, Vector3.right)); + genericMenu.AddItem(new GUIContent("Left", "Set the vector to (-1, 0, 0, 0)"), (Vector3)vec == Vector3.left, () => SetVector(property, Vector3.left)); + genericMenu.AddItem(new GUIContent("Up", "Set the vector to (0, 1, 0, 0)"), (Vector3)vec == Vector3.up, () => SetVector(property, Vector3.up)); + genericMenu.AddItem(new GUIContent("Down", "Set the vector to (0, -1, 0, 0)"), (Vector3)vec == Vector3.down, () => SetVector(property, Vector3.down)); + genericMenu.AddItem(new GUIContent("Forward", "Set the vector property to (0, 0, 1, 0)"), (Vector3)vec == Vector3.forward, () => SetVector(property, Vector3.forward)); + genericMenu.AddItem(new GUIContent("Back", "Set the vector property to (0, 0, -1, 0)"), (Vector3)vec == Vector3.back, () => SetVector(property, Vector3.back)); + } + + private void SetVector(InspectorProperty property, Vector4 value) + { + property.Tree.DelayActionUntilRepaint(() => + { + for (int i = 0; i < property.ValueEntry.ValueCount; i++) + { + property.ValueEntry.WeakValues[i] = new float4(value.x, value.y, value.z, value.w); + } + }); + } + + private void NormalizeEntries(InspectorProperty property) + { + property.Tree.DelayActionUntilRepaint(() => + { + for (int i = 0; i < property.ValueEntry.ValueCount; i++) + { + property.ValueEntry.WeakValues[i] = math.normalizesafe((float4)property.ValueEntry.WeakValues[i]); + } + }); + } + } + + + public class Double2Drawer : OdinValueDrawer, IDefinesGenericMenuItems + { + private bool isMatrixChild; + + protected override void Initialize() + { + this.isMatrixChild = this.Property.GetAttribute() != null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + Rect labelRect; + Rect contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); + { + // Slide rect + { + var val = this.ValueEntry.SmartValue; + EditorGUI.BeginChangeCheck(); + var vec = SirenixEditorFields.VectorPrefixSlideRect(labelRect, new Vector2((float)val.x, (float)val.y)); + val = new double2(vec.x, vec.y); + if (EditorGUI.EndChangeCheck()) + { + this.ValueEntry.SmartValue = val; + } + } + + var showLabels = !this.isMatrixChild && SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 185; + GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); + this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); + this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); + GUIHelper.PopLabelWidth(); + + } + SirenixEditorGUI.EndHorizontalPropertyLayout(); + } + + /// + /// Populates the generic menu for the property. + /// + public void PopulateGenericMenu(InspectorProperty property, GenericMenu genericMenu) + { + double2 value = (double2)property.ValueEntry.WeakSmartValue; + var vec = new Vector2((float)value.x, (float)value.y); + + if (genericMenu.GetItemCount() > 0) + { + genericMenu.AddSeparator(""); + } + genericMenu.AddItem(new GUIContent("Normalize"), Mathf.Approximately(vec.magnitude, 1f), () => NormalizeEntries(property)); + genericMenu.AddItem(new GUIContent("Zero", "Set the vector to (0, 0)"), vec == Vector2.zero, () => SetVector(property, Vector2.zero)); + genericMenu.AddItem(new GUIContent("One", "Set the vector to (1, 1)"), vec == Vector2.one, () => SetVector(property, Vector2.one)); + genericMenu.AddSeparator(""); + genericMenu.AddItem(new GUIContent("Right", "Set the vector to (1, 0)"), vec == Vector2.right, () => SetVector(property, Vector2.right)); + genericMenu.AddItem(new GUIContent("Left", "Set the vector to (-1, 0)"), vec == Vector2.left, () => SetVector(property, Vector2.left)); + genericMenu.AddItem(new GUIContent("Up", "Set the vector to (0, 1)"), vec == Vector2.up, () => SetVector(property, Vector2.up)); + genericMenu.AddItem(new GUIContent("Down", "Set the vector to (0, -1)"), vec == Vector2.down, () => SetVector(property, Vector2.down)); + } + + private void SetVector(InspectorProperty property, Vector2 value) + { + property.Tree.DelayActionUntilRepaint(() => + { + for (int i = 0; i < property.ValueEntry.ValueCount; i++) + { + property.ValueEntry.WeakValues[i] = new double2(value.x, value.y); + } + }); + } + + private void NormalizeEntries(InspectorProperty property) + { + property.Tree.DelayActionUntilRepaint(() => + { + for (int i = 0; i < property.ValueEntry.ValueCount; i++) + { + property.ValueEntry.WeakValues[i] = math.normalizesafe((double2)property.ValueEntry.WeakValues[i]); + } + }); + } + } + + public class Double3Drawer : OdinValueDrawer, IDefinesGenericMenuItems + { + private bool isMatrixChild; + + protected override void Initialize() + { + this.isMatrixChild = this.Property.GetAttribute() != null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + Rect labelRect; + Rect contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); + { + // Slide rect + { + var val = this.ValueEntry.SmartValue; + EditorGUI.BeginChangeCheck(); + var vec = SirenixEditorFields.VectorPrefixSlideRect(labelRect, new Vector3((float)val.x, (float)val.y, (float)val.z)); + val = new double3(vec.x, vec.y, vec.z); + if (EditorGUI.EndChangeCheck()) + { + this.ValueEntry.SmartValue = val; + } + } + + var showLabels = !this.isMatrixChild && SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 185; + GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); + this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); + this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); + this.ValueEntry.Property.Children[2].Draw(showLabels ? GUIHelper.TempContent("Z") : null); + GUIHelper.PopLabelWidth(); + + } + SirenixEditorGUI.EndHorizontalPropertyLayout(); + } + + /// + /// Populates the generic menu for the property. + /// + public void PopulateGenericMenu(InspectorProperty property, GenericMenu genericMenu) + { + double3 value = (double3)property.ValueEntry.WeakSmartValue; + var vec = new Vector3((float)value.x, (float)value.y, (float)value.z); + + if (genericMenu.GetItemCount() > 0) + { + genericMenu.AddSeparator(""); + } + genericMenu.AddItem(new GUIContent("Normalize"), Mathf.Approximately(vec.magnitude, 1f), () => NormalizeEntries(property)); + genericMenu.AddItem(new GUIContent("Zero", "Set the vector to (0, 0, 0)"), vec == Vector3.zero, () => SetVector(property, Vector3.zero)); + genericMenu.AddItem(new GUIContent("One", "Set the vector to (1, 1, 1)"), vec == Vector3.one, () => SetVector(property, Vector3.one)); + genericMenu.AddSeparator(""); + genericMenu.AddItem(new GUIContent("Right", "Set the vector to (1, 0, 0)"), vec == Vector3.right, () => SetVector(property, Vector3.right)); + genericMenu.AddItem(new GUIContent("Left", "Set the vector to (-1, 0, 0)"), vec == Vector3.left, () => SetVector(property, Vector3.left)); + genericMenu.AddItem(new GUIContent("Up", "Set the vector to (0, 1, 0)"), vec == Vector3.up, () => SetVector(property, Vector3.up)); + genericMenu.AddItem(new GUIContent("Down", "Set the vector to (0, -1, 0)"), vec == Vector3.down, () => SetVector(property, Vector3.down)); + genericMenu.AddItem(new GUIContent("Forward", "Set the vector property to (0, 0, 1)"), vec == Vector3.forward, () => SetVector(property, Vector3.forward)); + genericMenu.AddItem(new GUIContent("Back", "Set the vector property to (0, 0, -1)"), vec == Vector3.back, () => SetVector(property, Vector3.back)); + } + + private void SetVector(InspectorProperty property, Vector3 value) + { + property.Tree.DelayActionUntilRepaint(() => + { + for (int i = 0; i < property.ValueEntry.ValueCount; i++) + { + property.ValueEntry.WeakValues[i] = new double3(value.x, value.y, value.z); + } + }); + } + + private void NormalizeEntries(InspectorProperty property) + { + property.Tree.DelayActionUntilRepaint(() => + { + for (int i = 0; i < property.ValueEntry.ValueCount; i++) + { + property.ValueEntry.WeakValues[i] = math.normalizesafe((double3)property.ValueEntry.WeakValues[i]); + } + }); + } + } + + public class Double4Drawer : OdinValueDrawer, IDefinesGenericMenuItems + { + private bool isMatrixChild; + + protected override void Initialize() + { + this.isMatrixChild = this.Property.GetAttribute() != null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + Rect labelRect; + Rect contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); + { + // Slide rect + { + var val = this.ValueEntry.SmartValue; + EditorGUI.BeginChangeCheck(); + var vec = SirenixEditorFields.VectorPrefixSlideRect(labelRect, new Vector4((float)val.x, (float)val.y, (float)val.z, (float)val.w)); + val = new double4(vec.x, vec.y, vec.z, vec.w); + if (EditorGUI.EndChangeCheck()) + { + this.ValueEntry.SmartValue = val; + } + } + + var showLabels = !this.isMatrixChild && SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 185; + GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); + this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); + this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); + this.ValueEntry.Property.Children[2].Draw(showLabels ? GUIHelper.TempContent("Z") : null); + this.ValueEntry.Property.Children[3].Draw(showLabels ? GUIHelper.TempContent("W") : null); + GUIHelper.PopLabelWidth(); + + } + SirenixEditorGUI.EndHorizontalPropertyLayout(); + } + + /// + /// Populates the generic menu for the property. + /// + public void PopulateGenericMenu(InspectorProperty property, GenericMenu genericMenu) + { + double4 value = (double4)property.ValueEntry.WeakSmartValue; + var vec = new Vector4((float)value.x, (float)value.y, (float)value.z, (float)value.w); + + if (genericMenu.GetItemCount() > 0) + { + genericMenu.AddSeparator(""); + } + genericMenu.AddItem(new GUIContent("Normalize"), Mathf.Approximately(vec.magnitude, 1f), () => NormalizeEntries(property)); + genericMenu.AddItem(new GUIContent("Zero", "Set the vector to (0, 0, 0, 0)"), vec == Vector4.zero, () => SetVector(property, Vector3.zero)); + genericMenu.AddItem(new GUIContent("One", "Set the vector to (1, 1, 1, 1)"), vec == Vector4.one, () => SetVector(property, Vector4.one)); + genericMenu.AddSeparator(""); + genericMenu.AddItem(new GUIContent("Right", "Set the vector to (1, 0, 0, 0)"), (Vector3)vec == Vector3.right, () => SetVector(property, Vector3.right)); + genericMenu.AddItem(new GUIContent("Left", "Set the vector to (-1, 0, 0, 0)"), (Vector3)vec == Vector3.left, () => SetVector(property, Vector3.left)); + genericMenu.AddItem(new GUIContent("Up", "Set the vector to (0, 1, 0, 0)"), (Vector3)vec == Vector3.up, () => SetVector(property, Vector3.up)); + genericMenu.AddItem(new GUIContent("Down", "Set the vector to (0, -1, 0, 0)"), (Vector3)vec == Vector3.down, () => SetVector(property, Vector3.down)); + genericMenu.AddItem(new GUIContent("Forward", "Set the vector property to (0, 0, 1, 0)"), (Vector3)vec == Vector3.forward, () => SetVector(property, Vector3.forward)); + genericMenu.AddItem(new GUIContent("Back", "Set the vector property to (0, 0, -1, 0)"), (Vector3)vec == Vector3.back, () => SetVector(property, Vector3.back)); + } + + private void SetVector(InspectorProperty property, Vector4 value) + { + property.Tree.DelayActionUntilRepaint(() => + { + for (int i = 0; i < property.ValueEntry.ValueCount; i++) + { + property.ValueEntry.WeakValues[i] = new double4(value.x, value.y, value.z, value.w); + } + }); + } + + private void NormalizeEntries(InspectorProperty property) + { + property.Tree.DelayActionUntilRepaint(() => + { + for (int i = 0; i < property.ValueEntry.ValueCount; i++) + { + property.ValueEntry.WeakValues[i] = math.normalizesafe((double4)property.ValueEntry.WeakValues[i]); + } + }); + } + } + + public class Int2Drawer : OdinValueDrawer + { + private bool isMatrixChild; + + protected override void Initialize() + { + this.isMatrixChild = this.Property.GetAttribute() != null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + Rect labelRect; + Rect contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); + { + var showLabels = !this.isMatrixChild && SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 185; + GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); + this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); + this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); + GUIHelper.PopLabelWidth(); + + } + SirenixEditorGUI.EndHorizontalPropertyLayout(); + } + } + + public class Int3Drawer : OdinValueDrawer + { + private bool isMatrixChild; + + protected override void Initialize() + { + this.isMatrixChild = this.Property.GetAttribute() != null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + Rect labelRect; + Rect contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); + { + var showLabels = !this.isMatrixChild && SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 185; + GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); + this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); + this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); + this.ValueEntry.Property.Children[2].Draw(showLabels ? GUIHelper.TempContent("Z") : null); + GUIHelper.PopLabelWidth(); + + } + SirenixEditorGUI.EndHorizontalPropertyLayout(); + } + } + + public class Int4Drawer : OdinValueDrawer + { + private bool isMatrixChild; + + protected override void Initialize() + { + this.isMatrixChild = this.Property.GetAttribute() != null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + Rect labelRect; + Rect contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); + { + var showLabels = !this.isMatrixChild && SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 185; + GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); + this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); + this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); + this.ValueEntry.Property.Children[2].Draw(showLabels ? GUIHelper.TempContent("Z") : null); + this.ValueEntry.Property.Children[3].Draw(showLabels ? GUIHelper.TempContent("W") : null); + GUIHelper.PopLabelWidth(); + + } + SirenixEditorGUI.EndHorizontalPropertyLayout(); + } + } + + public class UInt2Drawer : OdinValueDrawer + { + private bool isMatrixChild; + + protected override void Initialize() + { + this.isMatrixChild = this.Property.GetAttribute() != null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + Rect labelRect; + Rect contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); + { + var showLabels = !this.isMatrixChild && SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 185; + GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); + this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); + this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); + GUIHelper.PopLabelWidth(); + + } + SirenixEditorGUI.EndHorizontalPropertyLayout(); + } + } + + public class UInt3Drawer : OdinValueDrawer + { + private bool isMatrixChild; + + protected override void Initialize() + { + this.isMatrixChild = this.Property.GetAttribute() != null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + Rect labelRect; + Rect contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); + { + var showLabels = !this.isMatrixChild && SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 185; + GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); + this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); + this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); + this.ValueEntry.Property.Children[2].Draw(showLabels ? GUIHelper.TempContent("Z") : null); + GUIHelper.PopLabelWidth(); + + } + SirenixEditorGUI.EndHorizontalPropertyLayout(); + } + } + + public class UInt4Drawer : OdinValueDrawer + { + private bool isMatrixChild; + + protected override void Initialize() + { + this.isMatrixChild = this.Property.GetAttribute() != null; + } + + protected override void DrawPropertyLayout(GUIContent label) + { + Rect labelRect; + Rect contentRect = SirenixEditorGUI.BeginHorizontalPropertyLayout(label, out labelRect); + { + var showLabels = !this.isMatrixChild && SirenixEditorFields.ResponsiveVectorComponentFields && contentRect.width >= 185; + GUIHelper.PushLabelWidth(SirenixEditorFields.SingleLetterStructLabelWidth); + this.ValueEntry.Property.Children[0].Draw(showLabels ? GUIHelper.TempContent("X") : null); + this.ValueEntry.Property.Children[1].Draw(showLabels ? GUIHelper.TempContent("Y") : null); + this.ValueEntry.Property.Children[2].Draw(showLabels ? GUIHelper.TempContent("Z") : null); + this.ValueEntry.Property.Children[3].Draw(showLabels ? GUIHelper.TempContent("W") : null); + GUIHelper.PopLabelWidth(); + + } + SirenixEditorGUI.EndHorizontalPropertyLayout(); + } + } +#endif +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/MathematicsDrawers.cs.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/MathematicsDrawers.cs.meta new file mode 100644 index 00000000..95a33196 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/MathematicsDrawers.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 74718b273a32d874a9dc3c58269c36b3 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/Sirenix.OdinInspector.Modules.UnityMathematics.asmdef b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/Sirenix.OdinInspector.Modules.UnityMathematics.asmdef new file mode 100644 index 00000000..613c7ac2 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/Sirenix.OdinInspector.Modules.UnityMathematics.asmdef @@ -0,0 +1,11 @@ +{ + "name": "Sirenix.OdinInspector.Modules.UnityMathematics", + "references": [ "Unity.Mathematics", "Sirenix.OdinInspector.Attributes", "Sirenix.OdinInspector.Editor", "Sirenix.Utilities", "Sirenix.Utilities.Editor" ], + "includePlatforms": [ "Editor" ], + "excludePlatforms": [], + "allowUnsafeCode": true, + "autoReferenced": true, + "overrideReferences": false, + "precompiledReferences": [ "Sirenix.Utilities.dll", "Sirenix.Utilities.Editor.dll", "Sirenix.OdinInspector.Attributes.dll", "Sirenix.OdinInspector.Editor.dll", "Sirenix.Serialization.dll" ], + "defineConstraints": [] +} \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/Sirenix.OdinInspector.Modules.UnityMathematics.asmdef.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/Sirenix.OdinInspector.Modules.UnityMathematics.asmdef.meta new file mode 100644 index 00000000..791fd528 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/Sirenix.OdinInspector.Modules.UnityMathematics.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ad968d605628d06499b62cdc30f11cf8 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/manifest.txt b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/manifest.txt new file mode 100644 index 00000000..bc4189a0 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/manifest.txt @@ -0,0 +1,8 @@ +ManifestVersion: 1 +ModuleID: Unity.Mathematics +ModuleVersion: 1.0.1.0 +ModuleFiles: + MathematicsDrawers.cs + MathematicsDrawers.cs.meta + Sirenix.OdinInspector.Modules.UnityMathematics.asmdef + Sirenix.OdinInspector.Modules.UnityMathematics.asmdef.meta diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/manifest.txt.meta b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/manifest.txt.meta new file mode 100644 index 00000000..17c906a5 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Modules/Unity.Mathematics/manifest.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d709a8c107bc33340b1dfbb0cdb4a9c8 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Visual Designer.meta b/Assets/Plugins/Sirenix/Odin Inspector/Visual Designer.meta new file mode 100644 index 00000000..46d770b4 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Visual Designer.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 50ac61650ab15924ea510082ff5d3699 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Odin Inspector/Visual Designer/Saved.meta b/Assets/Plugins/Sirenix/Odin Inspector/Visual Designer/Saved.meta new file mode 100644 index 00000000..02a5f610 --- /dev/null +++ b/Assets/Plugins/Sirenix/Odin Inspector/Visual Designer/Saved.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ed5b5e5fe4eeec84fb2f865c243f4580 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Plugins/Sirenix/Readme.txt b/Assets/Plugins/Sirenix/Readme.txt new file mode 100644 index 00000000..bd8b1f89 --- /dev/null +++ b/Assets/Plugins/Sirenix/Readme.txt @@ -0,0 +1,35 @@ +------------------------------------ Getting Started ------------------------------------ + +Open up the Getting Started guide from "Tools > Odin Inspector > Getting Started." + + +------------------------------------- Helpful Links ------------------------------------- + +Tutorials: https://odininspector.com/tutorials +API Documentation: https://odininspector.com/documentation +Roadmap: https://odininspector.com/roadmap +Release Notes: https://odininspector.com/patch-notes +Issue Tracker: https://bitbucket.org/sirenix/odin-inspector + + +--------------------------------- Community and Support --------------------------------- + +If you have any issues, suggestions or want advice, then you're more than welcome +to join us on Discord, or reach out to us by any other means. + +Support: https://odininspector.com/support +Community Addons: https://odininspector.com/community-tools +Discord: https://discord.gg/AgDmStu + + +-------------------------------------- Thank you! --------------------------------------- + +We really hope you like using Odin. Be sure to leave a review on the Asset Store, +that helps us out a lot! + +Leave a review: https://assetstore.unity.com/packages/tools/utilities/odin-inspector-and-serializer-89041 + + +Odin Inspector is published and developed by Sirenix. + +Sirenix: Https://sirenix.net \ No newline at end of file diff --git a/Assets/Plugins/Sirenix/Readme.txt.meta b/Assets/Plugins/Sirenix/Readme.txt.meta new file mode 100644 index 00000000..71cef777 --- /dev/null +++ b/Assets/Plugins/Sirenix/Readme.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e957a9e8b4f4bce4b8a34e504a8c39d7 +timeCreated: 1533815770 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Presets/FolderIcons.asset b/Assets/Presets/FolderIcons.asset index 15aca284..6be5a460 100644 --- a/Assets/Presets/FolderIcons.asset +++ b/Assets/Presets/FolderIcons.asset @@ -33,7 +33,7 @@ MonoBehaviour: - folder: {fileID: 102900000, guid: 25a2d68e811df534985fb70a670b9b77, type: 3} folderIcon: {fileID: 2800000, guid: ab1024628a47f17439c50403cc5e4d89, type: 3} overlayIcon: {fileID: 0} - - folder: {fileID: 102900000, guid: 4f008884399e3704fb50da2d7d219083, type: 3} + - folder: {fileID: 102900000, guid: 65c18d699fcadad459bc3e16558c2bd2, type: 3} folderIcon: {fileID: 2800000, guid: 000047ea30b7100459342b9831217cd4, type: 3} overlayIcon: {fileID: 0} - folder: {fileID: 102900000, guid: ea89d43e29cde9c45894e751c978f217, type: 3} diff --git a/Assets/Third Parties/BuildReport.meta b/Assets/Third Parties/BuildReport.meta new file mode 100644 index 00000000..42652670 --- /dev/null +++ b/Assets/Third Parties/BuildReport.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: accda2cad8eb7094d9c33bc6399ef8f6 diff --git a/Assets/Third Parties/BuildReport/CustomBuildScriptExample.txt b/Assets/Third Parties/BuildReport/CustomBuildScriptExample.txt new file mode 100644 index 00000000..bdbf862a --- /dev/null +++ b/Assets/Third Parties/BuildReport/CustomBuildScriptExample.txt @@ -0,0 +1,174 @@ +using System; +using UnityEditor; + +public class SimpleBuilder +{ + // Example code on how to let Unity create a Build Report right after an automated build. + // If you don't need this, you can safely delete this file. + // + // To use, save/rename this as a proper script file (.cs instead of .txt), open a command line window, + // and type (change path to Unity.exe and path to project folder to your own): + // C:/Program Files/Unity/Editor/Unity.exe -quit -batchmode -projectPath "C:/Path/To/Project/Folder" -executeMethod SimpleBuilder.Build + // + // Also check https://support.unity3d.com/hc/en-us/articles/115000368846 for more examples on making custom build scripts. + // + static void Build() + { + Console.WriteLine("Will start building project..."); + +#if !UNITY_5_5_OR_NEWER // 5.4 and below + + // Unity 5.4 and below only has this way of building. + // You can remove this if your project isn't for Unity 5.4. + + // Put all scenes to build here. + // + // The values just need to be paths to scene files, + // relative to the project's Assets folder. + // Example: "Assets/Scene.unity" + // + // The build will fail if you put in a scene that + // doesn't exist in your project. + var scenes = new[] {"Assets/Scene.unity"}; + + // Destination of build + // + // Set this to whatever you want. + // + // Take note that in some build platforms, you have to specify the + // path only to a folder, without the executable filename. + var buildLocation = "C:/Path/To/Build.exe"; + + // Platform of the build + // + // Set this to whatever you want. + // See https://docs.unity3d.com/ScriptReference/BuildTarget.html for all possible values. + var buildTarget = BuildTarget.StandaloneWindows; + + // Extra options you may want to turn on. + // + // See https://docs.unity3d.com/ScriptReference/BuildOptions.html for all possible values. + // This enum is a flag type, so you can assign more than one value. + // For example, use: + // buildPlayerOptions.options = BuildOptions.Development | BuildOptions.CompressWithLz4; + // If you want both a development build and use LZ4 type of compression at the same time. + var buildOptions = BuildOptions.None; + + // Finally, do the build. + var result = BuildPipeline.BuildPlayer(scenes, buildLocation, buildTarget, buildOptions); + + Console.WriteLine("Finished building project:" + result); + + // You can optionally pass a 4th parameter to BuildReportTool.ReportGenerator.CreateReport(), + // a string specifying a custom Editor log path. + // + // If you need the path relative to your project folder's Assets path, use: + // UnityEngine.Application.dataPath (https://docs.unity3d.com/ScriptReference/Application-dataPath.html) + // + // If you need the path relative from the Unity Editor exe file, use: + // UnityEditor.EditorApplication.applicationPath (https://docs.unity3d.com/ScriptReference/EditorApplication-applicationPath.html) + // + // If you need the command line arguments, use: + // System.Environment.GetCommandLineArgs() (https://docs.microsoft.com/en-us/dotnet/api/system.environment.getcommandlineargs) + // + var pathToBuildReport = BuildReportTool.ReportGenerator.CreateReport(scenes, buildLocation, buildTarget); + + if (!string.IsNullOrEmpty(pathToBuildReport)) + { + // the 0 indicates a successful exit with no errors + EditorApplication.Exit(0); + } + else + { + // the 1 indicates an error + EditorApplication.Exit(1); + } +#else + // In Unity 5.5 and above, BuildPipeline.BuildPlayer now allows the use + // of a struct called BuildPlayerOptions, so you can prepare the values + // more neatly before building. + + BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions(); + + // EditorBuildSettings.scenes is an array that contains all the + // scenes included for the build, as it was configured in the project. + // Since I will be using that array, I check if it's empty first. + if (EditorBuildSettings.scenes.Length == 0) + { + // No scenes to build! Aborting. + + // the 1 indicates an error + EditorApplication.Exit(1); + return; + } + + // Put all scenes to build here. + // + // In this example, I'm only adding the first scene, + // but you can change this to whatever you want. + // + // buildPlayerOptions.scenes is a string array, + // and the values just need to be paths to scene files, + // relative to the project's Assets folder. + // Example: "Assets/Scenes/TestScene.unity" + buildPlayerOptions.scenes = new[] {EditorBuildSettings.scenes[0].path}; + + // Destination of build + // Set this to whatever you want. + // + // Take note that in some build platforms, you have to specify the + // path only to a folder, without the executable filename. + buildPlayerOptions.locationPathName = "C:/Path/To/Build.exe"; + + // Platform of the build + // Set this to whatever you want. + // See https://docs.unity3d.com/ScriptReference/BuildTarget.html for all possible values. + buildPlayerOptions.target = BuildTarget.StandaloneWindows64; + + // Extra options you may want to turn on. + // + // See https://docs.unity3d.com/ScriptReference/BuildOptions.html for all possible values. + // This enum is a flag type, so you can assign more than one value. + // For example, use: + // buildPlayerOptions.options = BuildOptions.Development | BuildOptions.CompressWithLz4; + // If you want both a development build and use LZ4 type of compression at the same time. + buildPlayerOptions.options = BuildOptions.None; + + // Finally, do the build. + var result = BuildPipeline.BuildPlayer(buildPlayerOptions); + + // In Unity 2017 and below, result is simply a string. + // In Unity 2018, result is a UnityEditor.Build.Reporting.BuildReport (a class). + // See https://docs.unity3d.com/ScriptReference/Build.Reporting.BuildReport.html + // if you want to output specific parts of the build result to the console. + // For example, if there are build errors, you can output + // result.summary.totalErrors to show the number of errors. + Console.WriteLine("Finished building project: " + result); + + // You can optionally pass a 2nd parameter to BuildReportTool.ReportGenerator.CreateReport(), + // a string specifying a custom Editor log path. + // + // If you need the path relative to your project folder's Assets path, use: + // UnityEngine.Application.dataPath (https://docs.unity3d.com/ScriptReference/Application-dataPath.html) + // + // If you need the path relative from the Unity Editor exe file, use: + // UnityEditor.EditorApplication.applicationPath (https://docs.unity3d.com/ScriptReference/EditorApplication-applicationPath.html) + // + // If you need the command line arguments, use: + // System.Environment.GetCommandLineArgs() (https://docs.microsoft.com/en-us/dotnet/api/system.environment.getcommandlineargs) + // + var pathToBuildReport = BuildReportTool.ReportGenerator.CreateReport(buildPlayerOptions); + + if (!string.IsNullOrEmpty(pathToBuildReport)) + { + // the 0 indicates a successful exit with no errors + EditorApplication.Exit(0); + } + else + { + // the 1 indicates an error + EditorApplication.Exit(1); + } +#endif + } +} diff --git a/Assets/Third Parties/BuildReport/CustomBuildScriptExample.txt.meta b/Assets/Third Parties/BuildReport/CustomBuildScriptExample.txt.meta new file mode 100644 index 00000000..10ca6ee7 --- /dev/null +++ b/Assets/Third Parties/BuildReport/CustomBuildScriptExample.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 01cc75c644d552146afb1a88c7ad98f5 +timeCreated: 1559200681 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI.meta b/Assets/Third Parties/BuildReport/GUI.meta new file mode 100644 index 00000000..4cc72e46 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e1f42419d1ef48049b50415bf657d55a diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin.meta new file mode 100644 index 00000000..4c81ce70 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 5c322998d55084447a57ea92d844d3cd diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/Alt.png b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Alt.png new file mode 100644 index 00000000..898bfbde Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Alt.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/Alt.png.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Alt.png.meta new file mode 100644 index 00000000..94f09c10 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Alt.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 25666cadf903fbd4989a8cefba8fc24c +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/AltDark.png b/Assets/Third Parties/BuildReport/GUI/BRTSkin/AltDark.png new file mode 100644 index 00000000..48573b6f Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/AltDark.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/AltDark.png.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/AltDark.png.meta new file mode 100644 index 00000000..e3d7585e --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/AltDark.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: b14e1cc735bc0462e9ce75f75a0626da +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/Border1.png b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Border1.png new file mode 100644 index 00000000..f1172ad1 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Border1.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/Border1.png.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Border1.png.meta new file mode 100644 index 00000000..1e9c7e3e --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Border1.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: d0285fedba859c74689e8eba27e5297b +timeCreated: 1558602012 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconHovered.png b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconHovered.png new file mode 100644 index 00000000..407f6036 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconHovered.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconHovered.png.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconHovered.png.meta new file mode 100644 index 00000000..b5609b2c --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconHovered.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: ad6a7640fa699fc46b411728d1c18b51 +timeCreated: 1558718349 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconHoveredDark.png b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconHoveredDark.png new file mode 100644 index 00000000..4fdd34ed Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconHoveredDark.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconHoveredDark.png.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconHoveredDark.png.meta new file mode 100644 index 00000000..309a3305 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconHoveredDark.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 4e634b8baf8e5f64f8a3026d6443f2f3 +timeCreated: 1558718980 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconInvalid.png b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconInvalid.png new file mode 100644 index 00000000..5c08b05c Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconInvalid.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconInvalid.png.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconInvalid.png.meta new file mode 100644 index 00000000..f19c6691 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconInvalid.png.meta @@ -0,0 +1,86 @@ +fileFormatVersion: 2 +guid: b900a745cfa24cb48b7e50457028a2f8 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconValid.png b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconValid.png new file mode 100644 index 00000000..38d8a0f4 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconValid.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconValid.png.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconValid.png.meta new file mode 100644 index 00000000..a55c55e0 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IconValid.png.meta @@ -0,0 +1,86 @@ +fileFormatVersion: 2 +guid: 8c49083ee1fe30f498dd7298cd26d01d +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/IndentStyle1.png b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IndentStyle1.png new file mode 100644 index 00000000..85fb1609 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IndentStyle1.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/IndentStyle1.png.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IndentStyle1.png.meta new file mode 100644 index 00000000..65d67b3d --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IndentStyle1.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: a68bd5f397e1f2a4ab605aa35026ca0d +timeCreated: 1558602012 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/IndentStyle2.png b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IndentStyle2.png new file mode 100644 index 00000000..68156519 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IndentStyle2.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/IndentStyle2.png.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IndentStyle2.png.meta new file mode 100644 index 00000000..0620af00 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/IndentStyle2.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: a45d3cc54f933a84791ee710207ddf33 +timeCreated: 1558602012 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/Selected.png b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Selected.png new file mode 100644 index 00000000..baabf146 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Selected.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/Selected.png.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Selected.png.meta new file mode 100644 index 00000000..fb0380e5 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Selected.png.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: a274f5f5cbdf47c409729d951606ae1f +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/SelectedDark.png b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SelectedDark.png new file mode 100644 index 00000000..1107eaf9 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SelectedDark.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/SelectedDark.png.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SelectedDark.png.meta new file mode 100644 index 00000000..d27c04c1 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SelectedDark.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 572c0c87dd48b624bad4d6289300c765 +timeCreated: 1558610169 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + linearTexture: 0 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -1 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapMode: -1 + nPOTScale: 1 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 0 + textureType: -1 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded-Highlight-Outlined.psd b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded-Highlight-Outlined.psd new file mode 100644 index 00000000..8df77701 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded-Highlight-Outlined.psd differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded-Highlight-Outlined.psd.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded-Highlight-Outlined.psd.meta new file mode 100644 index 00000000..60197bf4 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded-Highlight-Outlined.psd.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 862200d03ab47bb4fbe67878d074f7eb +timeCreated: 1558723208 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded-Outlined.psd b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded-Outlined.psd new file mode 100644 index 00000000..20953184 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded-Outlined.psd differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded-Outlined.psd.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded-Outlined.psd.meta new file mode 100644 index 00000000..ac77ac3b --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded-Outlined.psd.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 1d35c6f19492f7147a4fb89911480ab2 +timeCreated: 1558602012 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 32 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded.png b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded.png new file mode 100644 index 00000000..76335410 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded.png.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded.png.meta new file mode 100644 index 00000000..5cac5ad5 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRounded.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 3051c49201420ce4eae4692f920675fc +timeCreated: 1486842069 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRoundedDark.png b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRoundedDark.png new file mode 100644 index 00000000..cfff6eef Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRoundedDark.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRoundedDark.png.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRoundedDark.png.meta new file mode 100644 index 00000000..c7615e7e --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/SimpleBoxRoundedDark.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: c26d7a4f0daeb3b48973a2a5e2ccdcee +timeCreated: 1486842069 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/Warning.png b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Warning.png new file mode 100644 index 00000000..ba4bc248 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Warning.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/BRTSkin/Warning.png.meta b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Warning.png.meta new file mode 100644 index 00000000..af64b133 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BRTSkin/Warning.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 78babf560b3543043bce62a6d7d5edfc +timeCreated: 1513575564 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/BuildReportWindow.guiskin b/Assets/Third Parties/BuildReport/GUI/BuildReportWindow.guiskin new file mode 100644 index 00000000..56255f26 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BuildReportWindow.guiskin @@ -0,0 +1,7705 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12001, guid: 0000000000000000e000000000000000, type: 0} + m_Name: BuildReportWindow + m_EditorClassIdentifier: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_box: + m_Name: box + m_Normal: + m_Background: {fileID: 2575269581626704993, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: -8126836811217315462, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 2 + m_Bottom: 2 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + m_button: + m_Name: button + m_Normal: + m_Background: {fileID: -573041650897247223, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: -1537457205435906773, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: -7527060558648309217, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: -8766172725880940643, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 7832598784815925287, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: -9059002882264723198, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: -4454209017672384243, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: -4993635991501620529, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 4047951448802137905, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: 7382603045041641420, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 8556163245987529883, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: 8718812295543890339, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 3 + m_Bottom: 3 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 2 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_toggle: + m_Name: toggle + m_Normal: + m_Background: {fileID: -5335821736339326178, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: -5440736679484030619, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 8488476462167042113, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: -6861823045970851139, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: -6998870504307324776, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: -2043049995710802033, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 15 + m_Right: 0 + m_Top: 13 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 2 + m_Bottom: 2 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 2 + m_Bottom: 3 + m_Overflow: + m_Left: -3 + m_Right: 0 + m_Top: -3 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 15, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_label: + m_Name: label + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0.023529412} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0.023529412} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0.023529412} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 2 + m_Bottom: 2 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 1 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 3459068928204737762, guid: 0000000000000000d000000000000000, + type: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textField: + m_Name: textfield + m_Normal: + m_Background: {fileID: 2597227618725028271, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: -2355377567497197369, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: -7902305245580594835, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: -7480287054991643601, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 2 + m_Bottom: 2 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 1 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textArea: + m_Name: textarea + m_Normal: + m_Background: {fileID: 11024, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_Hover: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_window: + m_Name: window + m_Normal: + m_Background: {fileID: 11023, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11022, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 8 + m_Right: 8 + m_Top: 18 + m_Bottom: 8 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 20 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -18} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSlider: + m_Name: horizontalslider + m_Normal: + m_Background: {fileID: 11009, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -2 + m_Bottom: -3 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSliderThumb: + m_Name: horizontalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 7 + m_Right: 7 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalSlider: + m_Name: verticalslider + m_Normal: + m_Background: {fileID: 11021, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Overflow: + m_Left: -2 + m_Right: -3 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalSliderThumb: + m_Name: verticalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 7 + m_Bottom: 7 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_horizontalScrollbar: + m_Name: horizontalscrollbar + m_Normal: + m_Background: {fileID: -3273041606263085236, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: -311698570160889163, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 25 + m_Right: 25 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 1 + m_Right: 1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 15 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarThumb: + m_Name: horizontalscrollbarthumb + m_Normal: + m_Background: {fileID: -7716058669073582569, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: 8639621063432762522, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 8 + m_Right: 8 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 8 + m_Right: 8 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 15 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarLeftButton: + m_Name: horizontalscrollbarleftbutton + m_Normal: + m_Background: {fileID: 4476514712964175617, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: -7917270662258052987, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2884324555085707582, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: 7509333680719945740, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 8 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 17 + m_FixedHeight: 15 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarRightButton: + m_Name: horizontalscrollbarrightbutton + m_Normal: + m_Background: {fileID: -1802176199048881894, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: -1719773835037083180, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 7059179968116174260, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: 7510343993111087507, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 8 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 17.24739 + m_FixedHeight: 15 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbar: + m_Name: verticalscrollbar + m_Normal: + m_Background: {fileID: 488918262070282077, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: -3927972358972204458, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 9 + m_Bottom: 9 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarThumb: + m_Name: verticalscrollbarthumb + m_Normal: + m_Background: {fileID: 944833255956038975, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: 4570962278689354513, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 8 + m_Bottom: 8 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 10 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalScrollbarUpButton: + m_Name: verticalscrollbarupbutton + m_Normal: + m_Background: {fileID: -2655953919643799188, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: -1797764562729272291, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: -7354372766510949456, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: 9141456082652879494, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 8 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 17 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarDownButton: + m_Name: verticalscrollbardownbutton + m_Normal: + m_Background: {fileID: -7119383920812324710, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: -8460701622354431290, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: -1371287000565055330, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: -4129062762289497750, guid: 0000000000000000d000000000000000, type: 0} + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 8 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 17 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_ScrollView: + m_Name: scrollview + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_CustomStyles: + - m_Name: MiniButton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 12 + m_Right: 12 + m_Top: 1 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -1} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: DebugOverlay + m_Normal: + m_Background: {fileID: 2800000, guid: c26d7a4f0daeb3b48973a2a5e2ccdcee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: LabelSingleLine + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 2 + m_Bottom: 2 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 2 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: Big1 + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 10 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 20 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 24 + m_FontStyle: 1 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: -3, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TextInfo + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 20 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 16 + m_FontStyle: 1 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: -3, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: TinyHelp + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.16037738, g: 0.16037738, b: 0.16037738, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Big2 + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 32 + m_FontStyle: 1 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 3, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Big3 + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 17 + m_FontStyle: 1 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 3, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: Title + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 5 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 32 + m_FontStyle: 1 + m_Alignment: 1 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Subtitle + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Header3 + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 2 + m_Bottom: 2 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 1 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 1 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: Header2 + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 6 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Header2Bold + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 6 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Text + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TextSelected + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TextNoWrap + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: Text-Boxed + m_Normal: + m_Background: {fileID: 2800000, guid: 3051c49201420ce4eae4692f920675fc, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Tooltip + m_Normal: + m_Background: {fileID: 2800000, guid: 828d9b22190dfe746ae229893d0ed85e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 5 + m_Right: 9 + m_Top: 5 + m_Bottom: 9 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TooltipText + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TextField-Search + m_Normal: + m_Background: {fileID: 2800000, guid: ec577dc4a2bb0f24b9b056ed15024f75, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 17 + m_Right: 0 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 3 + m_Right: 0 + m_Top: 3 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 17, y: 1} + m_FixedWidth: 0 + m_FixedHeight: 18 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TextField-Search-Text + m_Normal: + m_Background: {fileID: 2800000, guid: 7bab1b503eb28b7498b376aaef0c4f90, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 0 + m_Top: 1 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 1} + m_FixedWidth: 0 + m_FixedHeight: 18 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TextField-Search-DropDown + m_Normal: + m_Background: {fileID: 2800000, guid: bdfae28b47e3a5444b4490d930fd7a6f, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 8a51a690a4ea0ef4aa9394c0498e35b0, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 8a51a690a4ea0ef4aa9394c0498e35b0, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 24 + m_Right: 0 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 3 + m_Right: 0 + m_Top: 3 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 1} + m_FixedWidth: 24 + m_FixedHeight: 18 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TextField-Search-ClearButton + m_Normal: + m_Background: {fileID: 2800000, guid: 052aa522a7b5fb646897414b72655233, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 6f3ea1a6420b7b54ea10732fdfe9eeb5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 3 + m_Top: 3 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 16 + m_FixedHeight: 18 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: Version + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 5 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 2 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: TextBold + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 12 + m_FontStyle: 1 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ToolbarLeft + m_Normal: + m_Background: {fileID: 2800000, guid: 886f7fba07047d14b9b79b864468f9dc, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 71a8ca93cd5adf0479b0bbeca1507fc8, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: fa8b703aedc9e2b4288eeff8b4022c05, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 16111157c6e49234e923ea8f4e450d37, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 5 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Margin: + m_Left: 3 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 9 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 1 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ToolbarMiddle + m_Normal: + m_Background: {fileID: 2800000, guid: 147e6ec51a8432c45a10b5b4c7dde820, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 35fe22e2115a5464d929ad10166b9b4c, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 759d1ac2eca8fcd4f89295dd9b10a613, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 7af8692d98dd6db4486da44329739efc, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 6 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 1 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 9 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 1 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ToolbarRight + m_Normal: + m_Background: {fileID: 2800000, guid: 6a7d0f391f1753c479ae5e2441c9a6ac, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: f8ef87e87e01a73458343e226c7264a3, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 53dac5eeceae7564ea274b0696ae5fd1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 8d035465503f51a4fac1d5e80295a7f8, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 5 + m_Top: 2 + m_Bottom: 2 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 8 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 2 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 9 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 1 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: RadioLeft + m_Normal: + m_Background: {fileID: 2800000, guid: 886f7fba07047d14b9b79b864468f9dc, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 71a8ca93cd5adf0479b0bbeca1507fc8, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: fa8b703aedc9e2b4288eeff8b4022c05, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 16111157c6e49234e923ea8f4e450d37, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 5 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Margin: + m_Left: 3 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 1 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: RadioMiddle + m_Normal: + m_Background: {fileID: 2800000, guid: 147e6ec51a8432c45a10b5b4c7dde820, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 35fe22e2115a5464d929ad10166b9b4c, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 759d1ac2eca8fcd4f89295dd9b10a613, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 7af8692d98dd6db4486da44329739efc, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 6 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 1 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 1 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: RadioRight + m_Normal: + m_Background: {fileID: 2800000, guid: 6a7d0f391f1753c479ae5e2441c9a6ac, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: f8ef87e87e01a73458343e226c7264a3, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 53dac5eeceae7564ea274b0696ae5fd1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 8d035465503f51a4fac1d5e80295a7f8, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 5 + m_Top: 2 + m_Bottom: 2 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 8 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 2 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 1 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TabLeft + m_Normal: + m_Background: {fileID: 2800000, guid: 373f51c87086b02459607308775e78b1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 56b54d9b7e99bcc479c4823c1317c447, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 215aeacc8dd97ea409ba40042a72ebb9, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 4eee8a1e3ad70bd45ad389a03dfe5359, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 5 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 3 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 5 + m_Top: 6 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TabMiddle + m_Normal: + m_Background: {fileID: 2800000, guid: 5e13d30c0c9c75040bcdfbffcfb53988, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 48046c6ee29acef4ea8a4ce350a9c24b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 3874401684fdc974695d1605db6560f9, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 7ee779862f08a1348901b65417c54188, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 5 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 6 + m_Bottom: 2 + m_Overflow: + m_Left: 1 + m_Right: 1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TabRight + m_Normal: + m_Background: {fileID: 2800000, guid: 20a776457908cc845babf45bdb476646, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 1d7941a993179f9469860cf3457f7234, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: f32cc235fdcbbec4bbc2834d837b58fd, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 24d235eb01f65e941ac4dfcb7fd57098, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 5 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 7 + m_Top: 6 + m_Bottom: 2 + m_Overflow: + m_Left: 2 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: StatusBarBg + m_Normal: + m_Background: {fileID: 2800000, guid: d349f3cb6d91cff46a973dce538ab51c, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 7 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 4, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: StatusBarLabel + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 5 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 4, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: TopBarBg + m_Normal: + m_Background: {fileID: 2800000, guid: 9df4d45783545b84b8ce5b9e9701c5f2, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 9999 + m_Right: 9999 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 23 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: TopBarLabel + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 5 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: TopBarButton + m_Normal: + m_Background: {fileID: 2800000, guid: 9df4d45783545b84b8ce5b9e9701c5f2, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 11acdc56b262a4641b40b01ef5f15c37, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 38ef303dece76ef45910e97f04f5e348, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 1c034283ef2550f4eb6858e32222c693, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: TopBarPopup + m_Normal: + m_Background: {fileID: 2800000, guid: 721f56281f947524eba4a280e2a1b050, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: b1e01f571280a5c4b828236cd81dc58d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 10 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 5 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: ListColumnHeader + m_Normal: + m_Background: {fileID: 2800000, guid: 45dcc34572cb4234fbef9600252cfa5b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: ed75aa4653665b543af4301df7ab0aa6, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.1567164, g: 0.1567164, b: 0.1567164, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListColumnHeader-Asc + m_Normal: + m_Background: {fileID: 2800000, guid: d21040d4186bf9546aafc2db57600f8a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: ec6253a98d8bee64789ebe15c586ab49, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.1567164, g: 0.1567164, b: 0.1567164, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 59fd6b4691d8a154ca5f24122b2183d3, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 163d65b61ac37404f9bea771fe477056, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 15 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListColumnHeader-Desc + m_Normal: + m_Background: {fileID: 2800000, guid: f4306844cc37ee44e9b8867e960b025d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 93968e46ef3c25d42ac4f60f2fdf45da, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.1567164, g: 0.1567164, b: 0.1567164, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 98e9c8080c5a37048be6f3f4b95f0ff8, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 2ee7fd8754b16f24fb5755637e60f925, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 15 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: List + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.2509804, g: 0.2509804, b: 0.2509804, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListNormal + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListIcon + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListAlt + m_Normal: + m_Background: {fileID: 2800000, guid: 25666cadf903fbd4989a8cefba8fc24c, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.2509804, g: 0.2509804, b: 0.2509804, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListAltNormal + m_Normal: + m_Background: {fileID: 2800000, guid: 25666cadf903fbd4989a8cefba8fc24c, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListAltNormalSelected + m_Normal: + m_Background: {fileID: 2800000, guid: a274f5f5cbdf47c409729d951606ae1f, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListAltIcon + m_Normal: + m_Background: {fileID: 2800000, guid: 25666cadf903fbd4989a8cefba8fc24c, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListAltSelected + m_Normal: + m_Background: {fileID: 2800000, guid: a274f5f5cbdf47c409729d951606ae1f, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.88235295, g: 0.88235295, b: 0.88235295, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListButton + m_Normal: + m_Background: {fileID: 2800000, guid: 9df4d45783545b84b8ce5b9e9701c5f2, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 11acdc56b262a4641b40b01ef5f15c37, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.88235295, g: 0.88235295, b: 0.88235295, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 2 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 1 + m_Right: 1 + m_Top: 1 + m_Bottom: 1 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 2 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ListButtonRadio + m_Normal: + m_Background: {fileID: 2800000, guid: 9df4d45783545b84b8ce5b9e9701c5f2, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 11acdc56b262a4641b40b01ef5f15c37, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.88235295, g: 0.88235295, b: 0.88235295, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 2 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 1 + m_Right: 1 + m_Top: 2 + m_Bottom: 0 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 1 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ExpandButton + m_Normal: + m_Background: {fileID: 2800000, guid: 06d0f14a2a2072042a3a46c3a3149986, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: c3e29123c6d739644ababd6cd69eb2e9, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: d422219eeef1b6844ac4fc1e006a9646, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.2, g: 0.2, b: 0.2, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 7b75248593b59d046a38f49deb01d380, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 12 + m_Right: 12 + m_Top: 2 + m_Bottom: 2 + m_Margin: + m_Left: 1 + m_Right: 1 + m_Top: 2 + m_Bottom: 0 + m_Padding: + m_Left: 14 + m_Right: 14 + m_Top: 0 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 15 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ButtonAlreadyPressed + m_Normal: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Padding: + m_Left: 8 + m_Right: 8 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: c8b341ffedce18c4f942721df5b8d12a, type: 3} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Popup + m_Normal: + m_Background: {fileID: 2800000, guid: f4306844cc37ee44e9b8867e960b025d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: f4306844cc37ee44e9b8867e960b025d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 93968e46ef3c25d42ac4f60f2fdf45da, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 15 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 5 + m_Bottom: 5 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 4 + m_Bottom: -2 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -4} + m_FixedWidth: 0 + m_FixedHeight: 18 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: PopupPanel + m_Normal: + m_Background: {fileID: 2800000, guid: 3743f95c1a415f2468d32581b011aae3, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 9 + m_Right: 9 + m_Top: 4 + m_Bottom: 11 + m_Margin: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 3 + m_Right: 0 + m_Top: 0 + m_Bottom: 5 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ButtonHasContents + m_Normal: + m_Background: {fileID: 2800000, guid: 00214140d9fa24f40abd57777ff9b082, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 00214140d9fa24f40abd57777ff9b082, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: c8b341ffedce18c4f942721df5b8d12a, type: 3} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ButtonNoContents + m_Normal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: c8b341ffedce18c4f942721df5b8d12a, type: 3} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: AssetInfoPanel + m_Normal: + m_Background: {fileID: 2800000, guid: d0285fedba859c74689e8eba27e5297b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 3 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: AssetInfoPanelToolbarTop + m_Normal: + m_Background: {fileID: 2800000, guid: d0285fedba859c74689e8eba27e5297b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: AssetInfoPanelToolbarTopAllList + m_Normal: + m_Background: {fileID: 2800000, guid: d0285fedba859c74689e8eba27e5297b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 4 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: AssetInfoPanelNoList + m_Normal: + m_Background: {fileID: 2800000, guid: d0285fedba859c74689e8eba27e5297b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: IndentStyle1 + m_Normal: + m_Background: {fileID: 2800000, guid: a68bd5f397e1f2a4ab605aa35026ca0d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 5 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 7 + m_Top: 6 + m_Bottom: 2 + m_Overflow: + m_Left: 2 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ProjectSettingsGroup + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: Asset + m_Normal: + m_Background: {fileID: 2800000, guid: 1d35c6f19492f7147a4fb89911480ab2, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: c26d7a4f0daeb3b48973a2a5e2ccdcee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 6 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: AssetHovered + m_Normal: + m_Background: {fileID: 2800000, guid: 862200d03ab47bb4fbe67878d074f7eb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: c26d7a4f0daeb3b48973a2a5e2ccdcee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 6 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: AssetUsageArrow + m_Normal: + m_Background: {fileID: 2800000, guid: f8e6be5e2d9da41449602ca7def584b9, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: c26d7a4f0daeb3b48973a2a5e2ccdcee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 9 + m_FixedHeight: 11 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: IconValidity + m_Normal: + m_Background: {fileID: 2800000, guid: 8c49083ee1fe30f498dd7298cd26d01d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: b900a745cfa24cb48b7e50457028a2f8, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: IconHovered + m_Normal: + m_Background: {fileID: 2800000, guid: ad6a7640fa699fc46b411728d1c18b51, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: c26d7a4f0daeb3b48973a2a5e2ccdcee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: HiddenScrollbar + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: HiddenScrollbarthumb + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: HiddenScrollbarupbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: HiddenScrollbardownbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: HiddenScrollbarleftbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: HiddenScrollbarrightbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: DrawTexture + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + - m_Name: Icon-ArrowBig-Left + m_Normal: + m_Background: {fileID: 2800000, guid: 476ce0ec9616e944284359243b46f7e5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-ArrowBig-Right + m_Normal: + m_Background: {fileID: 2800000, guid: f8e6be5e2d9da41449602ca7def584b9, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-Toolbar-Log + m_Normal: + m_Background: {fileID: 2800000, guid: 73b48382876c31a4693ea55ac56ee9db, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-Toolbar-Open + m_Normal: + m_Background: {fileID: 2800000, guid: b3a0f42d2ccf3ee4599a4536f3761e07, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-Toolbar-Save + m_Normal: + m_Background: {fileID: 2800000, guid: 3f88df51b08315344a6f0becd7da78f2, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-Toolbar-Options + m_Normal: + m_Background: {fileID: 2800000, guid: 4d786bc9c8f625e469cce304e692c494, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-Toolbar-Help + m_Normal: + m_Background: {fileID: 2800000, guid: 36e97b21954b2c140bad7f0f34bda190, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-Toolbar-Column + m_Normal: + m_Background: {fileID: 2800000, guid: 9d0c5c006dbbc9744bfd357e2ec08bb7, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 30 + m_FixedHeight: 30 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: Icon-Warning + m_Normal: + m_Background: {fileID: 2800000, guid: 78babf560b3543043bce62a6d7d5edfc, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 30 + m_FixedHeight: 30 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: GUIEditor.BreadcrumbLeft + m_Normal: + m_Background: {fileID: -8730859949539617441, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 3607839988326647129, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: -2909435724611740479, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 658594365626841568, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 10 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 11 + m_Top: 2 + m_Bottom: 2 + m_Overflow: + m_Left: 6 + m_Right: 7 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 19 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: GUIEditor.BreadcrumbMid + m_Normal: + m_Background: {fileID: 298390163510713244, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: -5694940394960273964, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 4917697211602105510, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2726902712204841013, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 10 + m_Right: 10 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 2 + m_Bottom: 2 + m_Overflow: + m_Left: 5 + m_Right: 7 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 19 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: RL DragHandle + m_Normal: + m_Background: {fileID: -126394901853745249, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: 0} + m_TextColor: {r: 0.043137256, g: 0.043137256, b: 0.043137256, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 4028824154787511821, guid: 0000000000000000d000000000000000, + type: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 7 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 6 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: RL Header + m_Normal: + m_Background: {fileID: 2222539610708135272, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.07058824, g: 0.07058824, b: 0.07058824, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 3 + m_Bottom: 2 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 3021071571035331536, guid: 0000000000000000d000000000000000, + type: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -1} + m_FixedWidth: 0 + m_FixedHeight: 18 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: RL Footer + m_Normal: + m_Background: {fileID: -5145904889709520074, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8666667, g: 0.8666667, b: 0.8666667, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.1019608, g: 0.1019608, b: 0.1019608, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 3 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 0 + m_Font: {fileID: 4028824154787511821, guid: 0000000000000000d000000000000000, + type: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 13 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: RL Background + m_Normal: + m_Background: {fileID: 3094889842989577616, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Border: + m_Left: 6 + m_Right: 3 + m_Top: 0 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: RL FooterButton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8666667, g: 0.8666667, b: 0.8666667, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.101960786, g: 0.101960786, b: 0.101960786, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.1019608, g: 0.1019608, b: 0.1019608, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -3 + m_Bottom: 0 + m_Font: {fileID: 4028824154787511821, guid: 0000000000000000d000000000000000, + type: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 17 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: RL Element + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: -5193758048584019022, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 7516798493847391269, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 7516798493847391269, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 7516798493847391269, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 3 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: LogMessageIcons + m_Normal: + m_Background: {fileID: 5425037494185492166, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: -5763820162405496800, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: -2005373149481181617, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_Settings: + m_DoubleClickSelectsWord: 1 + m_TripleClickSelectsLine: 1 + m_CursorColor: {r: 0, g: 0, b: 0, a: 1} + m_CursorFlashSpeed: -1 + m_SelectionColor: {r: 0.23921569, g: 0.49803922, b: 0.87058824, a: 0.69803923} diff --git a/Assets/Third Parties/BuildReport/GUI/BuildReportWindow.guiskin.meta b/Assets/Third Parties/BuildReport/GUI/BuildReportWindow.guiskin.meta new file mode 100644 index 00000000..9a9fd88b --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BuildReportWindow.guiskin.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: a2f841654b107c84287eb9b647fcfb5f diff --git a/Assets/Third Parties/BuildReport/GUI/BuildReportWindowDark.guiskin b/Assets/Third Parties/BuildReport/GUI/BuildReportWindowDark.guiskin new file mode 100644 index 00000000..7e3a4c3c --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BuildReportWindowDark.guiskin @@ -0,0 +1,7711 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_PrefabParentObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 1 + m_Script: {fileID: 12001, guid: 0000000000000000e000000000000000, type: 0} + m_Name: BuildReportWindowDark + m_EditorClassIdentifier: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_box: + m_Name: box + m_Normal: + m_Background: {fileID: 2575269581626704993, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 2 + m_Bottom: 2 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 1 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + m_button: + m_Name: button + m_Normal: + m_Background: {fileID: 2800000, guid: 9e644f611032dfe438662bf693b63531, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 4e3a67ec9e85b1a4394acede318d9039, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: bd5b2b78eb67c9f4098b0cad7d330df3, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 5e2c2fc9f318f504d8486e23c2996945, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_Border: + m_Left: 6 + m_Right: 6 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 2 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_toggle: + m_Name: toggle + m_Normal: + m_Background: {fileID: -5335821736339326178, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: -5440736679484030619, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_Focused: + m_Background: {fileID: 8488476462167042113, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_OnNormal: + m_Background: {fileID: -6861823045970851139, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: -6998870504307324776, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_OnFocused: + m_Background: {fileID: -2043049995710802033, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_Border: + m_Left: 15 + m_Right: 0 + m_Top: 13 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 2 + m_Bottom: 2 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 2 + m_Bottom: 3 + m_Overflow: + m_Left: -3 + m_Right: 0 + m_Top: -3 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 15, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_label: + m_Name: label + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 2 + m_Bottom: 2 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 1 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 3459068928204737762, guid: 0000000000000000d000000000000000, + type: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textField: + m_Name: textfield + m_Normal: + m_Background: {fileID: 2800000, guid: b6e9a3400cb80844b9b86c56a020568e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 2800000, guid: 80003ef802d6179429eed4d66bf577d0, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 2 + m_Bottom: 2 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 2 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_textArea: + m_Name: textarea + m_Normal: + m_Background: {fileID: 2800000, guid: b6e9a3400cb80844b9b86c56a020568e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.9019608, g: 0.9019608, b: 0.9019608, a: 1} + m_Hover: + m_Background: {fileID: 11026, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.79999995, g: 0.79999995, b: 0.79999995, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11025, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_window: + m_Name: window + m_Normal: + m_Background: {fileID: 11023, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 11022, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 8 + m_Right: 8 + m_Top: 18 + m_Bottom: 8 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 20 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -18} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSlider: + m_Name: horizontalslider + m_Normal: + m_Background: {fileID: 11009, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -2 + m_Bottom: -3 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalSliderThumb: + m_Name: horizontalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 7 + m_Right: 7 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 12 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalSlider: + m_Name: verticalslider + m_Normal: + m_Background: {fileID: 11021, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Overflow: + m_Left: -2 + m_Right: -3 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalSliderThumb: + m_Name: verticalsliderthumb + m_Normal: + m_Background: {fileID: 11011, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 11012, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 11010, guid: 0000000000000000e000000000000000, type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 7 + m_Bottom: 7 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 12 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_horizontalScrollbar: + m_Name: horizontalscrollbar + m_Normal: + m_Background: {fileID: 2800000, guid: 154606301c8355545a7251945b2070cd, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 25 + m_Right: 25 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 1 + m_Right: 1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 15 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarThumb: + m_Name: horizontalscrollbarthumb + m_Normal: + m_Background: {fileID: 2800000, guid: e333933629c354d41a6c29fc5b52832f, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 8 + m_Right: 8 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 8 + m_Right: 8 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 15 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarLeftButton: + m_Name: horizontalscrollbarleftbutton + m_Normal: + m_Background: {fileID: 2800000, guid: 54a117b0d87a73743870ba5697db4c7e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 9ad4bd4ead4232f4f9ff61d6a68d0093, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 8 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 17 + m_FixedHeight: 15 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_horizontalScrollbarRightButton: + m_Name: horizontalscrollbarrightbutton + m_Normal: + m_Background: {fileID: 2800000, guid: cfff64841883793418cdced67a06666b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 5e29d420126aad846b65c11c40e02a54, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 8 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 17.24739 + m_FixedHeight: 15 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbar: + m_Name: verticalscrollbar + m_Normal: + m_Background: {fileID: 2800000, guid: 38f65eab78de46e49b1f04de17a4f5cc, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 9 + m_Bottom: 9 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: -1 + m_Bottom: -1 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarThumb: + m_Name: verticalscrollbarthumb + m_Normal: + m_Background: {fileID: 2800000, guid: ad72ae6b5fa68ba4ab16f2b560b97287, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 8 + m_Bottom: 8 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 10 + m_Bottom: 10 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 2 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 1 + m_verticalScrollbarUpButton: + m_Name: verticalscrollbarupbutton + m_Normal: + m_Background: {fileID: 2800000, guid: cb67d961c9719794399051c8da95f39b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 04165b0ffe255ce47a434b3e2815daf2, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 8 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 17 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_verticalScrollbarDownButton: + m_Name: verticalscrollbardownbutton + m_Normal: + m_Background: {fileID: 2800000, guid: 378141fc61556bb49b1eb4738da928be, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 6177c9f88d9604a45a0fececf270b89c, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 8 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 15 + m_FixedHeight: 17 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_ScrollView: + m_Name: scrollview + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + m_CustomStyles: + - m_Name: MiniButton + m_Normal: + m_Background: {fileID: 2800000, guid: 9e644f611032dfe438662bf693b63531, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8113208, g: 0.8113208, b: 0.8113208, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8117647, g: 0.8117647, b: 0.8117647, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 4e3a67ec9e85b1a4394acede318d9039, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: bd5b2b78eb67c9f4098b0cad7d330df3, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8117647, g: 0.8117647, b: 0.8117647, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 5e2c2fc9f318f504d8486e23c2996945, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 12 + m_Right: 12 + m_Top: 1 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -1} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: DebugOverlay + m_Normal: + m_Background: {fileID: 2800000, guid: c26d7a4f0daeb3b48973a2a5e2ccdcee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: LabelSingleLine + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 2 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: Big1 + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8507463, g: 0.8507463, b: 0.8507463, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 10 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 20 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 24 + m_FontStyle: 1 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: -3, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TextInfo + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 20 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 16 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: -3, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: TinyHelp + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.5943396, g: 0.5943396, b: 0.5943396, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Padding: + m_Left: 2 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Big2 + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 32 + m_FontStyle: 1 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 3, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Big3 + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 17 + m_FontStyle: 1 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 3, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: Title + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 5 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 32 + m_FontStyle: 1 + m_Alignment: 1 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Subtitle + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Header3 + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 2 + m_Bottom: 2 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 1 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 1 + m_Alignment: 6 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: Header2 + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 14 + m_FontStyle: 0 + m_Alignment: 6 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Header2Bold + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 6 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Text + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TextSelected + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TextNoWrap + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8207547, g: 0.8207547, b: 0.8207547, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: Text-Boxed + m_Normal: + m_Background: {fileID: 2800000, guid: c26d7a4f0daeb3b48973a2a5e2ccdcee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Tooltip + m_Normal: + m_Background: {fileID: 2800000, guid: 828d9b22190dfe746ae229893d0ed85e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 5 + m_Right: 9 + m_Top: 5 + m_Bottom: 9 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TooltipText + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TextField-Search + m_Normal: + m_Background: {fileID: 2800000, guid: ec577dc4a2bb0f24b9b056ed15024f75, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.35294116, g: 0.35294116, b: 0.35294116, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 17 + m_Right: 0 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 3 + m_Right: 0 + m_Top: 3 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 17, y: 1} + m_FixedWidth: 0 + m_FixedHeight: 18 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TextField-Search-Text + m_Normal: + m_Background: {fileID: 2800000, guid: 7bab1b503eb28b7498b376aaef0c4f90, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.11372549, g: 0.11372549, b: 0.11372549, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 0 + m_Top: 1 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 1} + m_FixedWidth: 0 + m_FixedHeight: 18 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TextField-Search-DropDown + m_Normal: + m_Background: {fileID: 2800000, guid: bdfae28b47e3a5444b4490d930fd7a6f, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.35294116, g: 0.35294116, b: 0.35294116, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 8a51a690a4ea0ef4aa9394c0498e35b0, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 8a51a690a4ea0ef4aa9394c0498e35b0, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 24 + m_Right: 0 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 3 + m_Right: 0 + m_Top: 3 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 1} + m_FixedWidth: 24 + m_FixedHeight: 18 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TextField-Search-ClearButton + m_Normal: + m_Background: {fileID: 2800000, guid: 052aa522a7b5fb646897414b72655233, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.35294116, g: 0.35294116, b: 0.35294116, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 6f3ea1a6420b7b54ea10732fdfe9eeb5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 3 + m_Top: 3 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 1 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 16 + m_FixedHeight: 18 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: Version + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 5 + m_Top: 5 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 2 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: TextBold + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.5377358, g: 0.5377358, b: 0.5377358, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 12 + m_FontStyle: 1 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ToolbarLeft + m_Normal: + m_Background: {fileID: 2800000, guid: 5564fea23991ca341baaa53f06cd6137, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 9389f88a278c7f54a9af8c869d752946, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 3e3c42e12414604469ee077869eaa861, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 1f5b00268884dac4881ce0809bfb03fd, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 2 + m_Top: 2 + m_Bottom: 3 + m_Margin: + m_Left: 3 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 9 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 1 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ToolbarMiddle + m_Normal: + m_Background: {fileID: 2800000, guid: dcf615e454a68004c80c6311b6af330c, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 40a207e7a3c635e4ea8088d995280a63, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 4fb754b002829ea4eb221879e0ff7222, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 54c653dd33cfabc43a14818a9e3941e0, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 3 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 6 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 1 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 9 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 1 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ToolbarRight + m_Normal: + m_Background: {fileID: 2800000, guid: a8aaf08f368747c41ab163ddecb2f42f, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 16405c6a4c5289a4888accae2ff48a1a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 82719a8ac678bd041a2749241b274bd7, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: df298b4295d08e74da0aae66ebc52eca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 3 + m_Top: 2 + m_Bottom: 3 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 6 + m_Right: 8 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 2 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 9 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 1 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: RadioLeft + m_Normal: + m_Background: {fileID: 2800000, guid: 5564fea23991ca341baaa53f06cd6137, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 9389f88a278c7f54a9af8c869d752946, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 3e3c42e12414604469ee077869eaa861, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 1f5b00268884dac4881ce0809bfb03fd, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 5 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Margin: + m_Left: 3 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 1 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: RadioMiddle + m_Normal: + m_Background: {fileID: 2800000, guid: dcf615e454a68004c80c6311b6af330c, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 40a207e7a3c635e4ea8088d995280a63, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 4fb754b002829ea4eb221879e0ff7222, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 54c653dd33cfabc43a14818a9e3941e0, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 6 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 1 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 1 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: RadioRight + m_Normal: + m_Background: {fileID: 2800000, guid: a8aaf08f368747c41ab163ddecb2f42f, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 82719a8ac678bd041a2749241b274bd7, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 16405c6a4c5289a4888accae2ff48a1a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: df298b4295d08e74da0aae66ebc52eca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 5 + m_Top: 2 + m_Bottom: 2 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 8 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 2 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 1 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TabLeft + m_Normal: + m_Background: {fileID: 2800000, guid: c503b913cf5eeb941b6afd666dc92652, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 345e479402e005844bd9ead400648933, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 7e99c3d9cea55a44a997e2080c9f5c64, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 39c440be84b648d45b27205440fb9df1, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 5 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 3 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 5 + m_Top: 6 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TabMiddle + m_Normal: + m_Background: {fileID: 2800000, guid: 06fdbb959fdc16a429a60fdc1b891d6a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: dd2206eb6339fb84490319fede1250fa, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: a386b30514769604280a79563c307e67, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 950c8f6862de1894985c9deeccb44b1c, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 5 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 6 + m_Bottom: 2 + m_Overflow: + m_Left: 1 + m_Right: 1 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: TabRight + m_Normal: + m_Background: {fileID: 2800000, guid: dd49c0bbf3671e547ab1813b9c2e2d03, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: c41881b7118ba9c449d4ded5d0a33c60, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 23ff8206be541ce4b95aabb591360f64, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 8f965e743ad46af4881be1810e3ee6f8, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 5 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 7 + m_Top: 6 + m_Bottom: 2 + m_Overflow: + m_Left: 2 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: StatusBarBg + m_Normal: + m_Background: {fileID: 2800000, guid: 1ca5533c69eb2f54aa409c5fcf41e1ca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 7 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 4, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: StatusBarLabel + m_Normal: + m_Background: {fileID: 2800000, guid: 1ca5533c69eb2f54aa409c5fcf41e1ca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 5 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 4, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: TopBarBg + m_Normal: + m_Background: {fileID: 2800000, guid: 781d5fa17ba67b343a0f1f5fc4b890d7, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 9999 + m_Right: 9999 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 23 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: TopBarLabel + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 5 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: TopBarButton + m_Normal: + m_Background: {fileID: 2800000, guid: f0e3c8e28e40b5249870c3e3db685051, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: e6e477e69bde1144b823fe621ddc1090, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: a386b30514769604280a79563c307e67, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 950c8f6862de1894985c9deeccb44b1c, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: -1 + m_Right: -1 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: TopBarPopup + m_Normal: + m_Background: {fileID: 2800000, guid: 3d4ab15594af81345a2559291a937b8b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: a95cb67892caf7f48ad04ba26484fb9f, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 10 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 5 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: ListColumnHeader + m_Normal: + m_Background: {fileID: 2800000, guid: d991b78680057d642bd61c8f7601baf4, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: f322b44ed25d78045bed6966ac9c997b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 2 + m_Bottom: 2 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListColumnHeader-Asc + m_Normal: + m_Background: {fileID: 2800000, guid: 9309bddb79ba8544eb740260186ab1ff, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: a6d9bf1d86df4f444a040eb60dd38422, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 59fd6b4691d8a154ca5f24122b2183d3, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 163d65b61ac37404f9bea771fe477056, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 15 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListColumnHeader-Desc + m_Normal: + m_Background: {fileID: 2800000, guid: 6afa125853d8a0d4abce452dfdcb9e27, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 44fa44c27de6a1d4c9a08c8aa141ffb2, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 98e9c8080c5a37048be6f3f4b95f0ff8, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 2ee7fd8754b16f24fb5755637e60f925, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 15 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 0 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 1 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: List + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.46323532, g: 0.46323532, b: 0.46323532, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListNormal + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListIcon + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListAlt + m_Normal: + m_Background: {fileID: 2800000, guid: b14e1cc735bc0462e9ce75f75a0626da, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.46323532, g: 0.46323532, b: 0.46323532, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListAltNormal + m_Normal: + m_Background: {fileID: 2800000, guid: b14e1cc735bc0462e9ce75f75a0626da, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListAltNormalSelected + m_Normal: + m_Background: {fileID: 2800000, guid: 572c0c87dd48b624bad4d6289300c765, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListAltIcon + m_Normal: + m_Background: {fileID: 2800000, guid: b14e1cc735bc0462e9ce75f75a0626da, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListAltSelected + m_Normal: + m_Background: {fileID: 2800000, guid: 572c0c87dd48b624bad4d6289300c765, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.88235295, g: 0.88235295, b: 0.88235295, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 11 + m_FontStyle: 0 + m_Alignment: 3 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ListButton + m_Normal: + m_Background: {fileID: 2800000, guid: f0e3c8e28e40b5249870c3e3db685051, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: e6e477e69bde1144b823fe621ddc1090, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.88235295, g: 0.88235295, b: 0.88235295, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 2 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 1 + m_Right: 1 + m_Top: 1 + m_Bottom: 1 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 2 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ListButtonRadio + m_Normal: + m_Background: {fileID: 2800000, guid: f0e3c8e28e40b5249870c3e3db685051, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: e6e477e69bde1144b823fe621ddc1090, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: f322b44ed25d78045bed6966ac9c997b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.88235295, g: 0.88235295, b: 0.88235295, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 2 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 1 + m_Right: 1 + m_Top: 2 + m_Bottom: 0 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 1 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ExpandButton + m_Normal: + m_Background: {fileID: 2800000, guid: 09d370cb92bf7ca4f985a950cbf7acfa, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: e4e412fdf0bbf8647bc7175f88e05bb2, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 2fba41542a4c0e440b7fae310b98e6b7, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: 8dcaefb813272534f925c2cc1be37b69, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 12 + m_Right: 12 + m_Top: 2 + m_Bottom: 2 + m_Margin: + m_Left: 1 + m_Right: 1 + m_Top: 2 + m_Bottom: 0 + m_Padding: + m_Left: 14 + m_Right: 14 + m_Top: 0 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 15 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ButtonAlreadyPressed + m_Normal: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 2 + m_Padding: + m_Left: 8 + m_Right: 8 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: c8b341ffedce18c4f942721df5b8d12a, type: 3} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Popup + m_Normal: + m_Background: {fileID: 2800000, guid: 6afa125853d8a0d4abce452dfdcb9e27, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 6afa125853d8a0d4abce452dfdcb9e27, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: 44fa44c27de6a1d4c9a08c8aa141ffb2, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.46323532, g: 0.46323532, b: 0.46323532, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 15 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 5 + m_Bottom: 5 + m_Padding: + m_Left: 3 + m_Right: 3 + m_Top: 4 + m_Bottom: 4 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 4 + m_Bottom: -2 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -4} + m_FixedWidth: 0 + m_FixedHeight: 18 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: PopupPanel + m_Normal: + m_Background: {fileID: 2800000, guid: 398adf16755d0d34682292b57a94786e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.46323532, g: 0.46323532, b: 0.46323532, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 9 + m_Right: 9 + m_Top: 4 + m_Bottom: 11 + m_Margin: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Padding: + m_Left: 5 + m_Right: 5 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 3 + m_Right: 0 + m_Top: 0 + m_Bottom: 5 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ButtonHasContents + m_Normal: + m_Background: {fileID: 2800000, guid: 00214140d9fa24f40abd57777ff9b082, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 00214140d9fa24f40abd57777ff9b082, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: c8b341ffedce18c4f942721df5b8d12a, type: 3} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: ButtonNoContents + m_Normal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 4 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 12800000, guid: c8b341ffedce18c4f942721df5b8d12a, type: 3} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: AssetInfoPanel + m_Normal: + m_Background: {fileID: 2800000, guid: d0285fedba859c74689e8eba27e5297b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 3 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: AssetInfoPanelToolbarTop + m_Normal: + m_Background: {fileID: 2800000, guid: d0285fedba859c74689e8eba27e5297b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 2 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: AssetInfoPanelToolbarTopAllList + m_Normal: + m_Background: {fileID: 2800000, guid: d0285fedba859c74689e8eba27e5297b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 4 + m_Bottom: 2 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: AssetInfoPanelNoList + m_Normal: + m_Background: {fileID: 2800000, guid: d0285fedba859c74689e8eba27e5297b, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 2 + m_Right: 2 + m_Top: 5 + m_Bottom: 5 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: IndentStyle1 + m_Normal: + m_Background: {fileID: 2800000, guid: a68bd5f397e1f2a4ab605aa35026ca0d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 5 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 3 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 7 + m_Top: 6 + m_Bottom: 2 + m_Overflow: + m_Left: 2 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: ProjectSettingsGroup + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: Asset + m_Normal: + m_Background: {fileID: 2800000, guid: 1d35c6f19492f7147a4fb89911480ab2, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: c26d7a4f0daeb3b48973a2a5e2ccdcee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 6 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: AssetHovered + m_Normal: + m_Background: {fileID: 2800000, guid: 862200d03ab47bb4fbe67878d074f7eb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 862200d03ab47bb4fbe67878d074f7eb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: c26d7a4f0daeb3b48973a2a5e2ccdcee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 4 + m_Bottom: 4 + m_Margin: + m_Left: 2 + m_Right: 2 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 4 + m_Right: 6 + m_Top: 3 + m_Bottom: 3 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: AssetUsageArrow + m_Normal: + m_Background: {fileID: 2800000, guid: 356851a1da2c40c4682114040e12128f, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 862200d03ab47bb4fbe67878d074f7eb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: c26d7a4f0daeb3b48973a2a5e2ccdcee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 9 + m_FixedHeight: 11 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: IconValidity + m_Normal: + m_Background: {fileID: 2800000, guid: 8c49083ee1fe30f498dd7298cd26d01d, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: b900a745cfa24cb48b7e50457028a2f8, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: IconHovered + m_Normal: + m_Background: {fileID: 2800000, guid: 4e634b8baf8e5f64f8a3026d6443f2f3, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Hover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 2800000, guid: c26d7a4f0daeb3b48973a2a5e2ccdcee, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 2800000, guid: 043830c7072ba5c4bbebcdc822d33ddb, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 2800000, guid: f9e951705a56dc44da46d6523bb55cca, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 3 + m_Right: 3 + m_Top: 3 + m_Bottom: 3 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: HiddenScrollbar + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: HiddenScrollbarthumb + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: HiddenScrollbarupbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: HiddenScrollbardownbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: HiddenScrollbarleftbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: HiddenScrollbarrightbutton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: DrawTexture + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-ArrowBig-Left + m_Normal: + m_Background: {fileID: 2800000, guid: 8d9e22fc216ec7040951b3fc639fee65, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-ArrowBig-Right + m_Normal: + m_Background: {fileID: 2800000, guid: 356851a1da2c40c4682114040e12128f, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-Toolbar-Log + m_Normal: + m_Background: {fileID: 2800000, guid: 315f41d9a48042544ad8ee904a85489a, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-Toolbar-Open + m_Normal: + m_Background: {fileID: 2800000, guid: 4f37f55e356d36541b6b6c98cd6f9552, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-Toolbar-Save + m_Normal: + m_Background: {fileID: 2800000, guid: 544efce9a6412b842bdc5f70c3b8c6e5, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-Toolbar-Options + m_Normal: + m_Background: {fileID: 2800000, guid: 45696119a0f085748a79d353c96bf81e, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-Toolbar-Help + m_Normal: + m_Background: {fileID: 2800000, guid: dce2f5f611fdaaa48aa3c56b70fede18, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-Toolbar-Column + m_Normal: + m_Background: {fileID: 2800000, guid: b1ff0ab72e5d25f41be81b7470928d76, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: Icon-Warning + m_Normal: + m_Background: {fileID: 2800000, guid: 78babf560b3543043bce62a6d7d5edfc, type: 3} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 0} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 30 + m_FixedHeight: 30 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: GUIEditor.BreadcrumbLeft + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Border: + m_Left: 3 + m_Right: 10 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 5 + m_Right: 11 + m_Top: 2 + m_Bottom: 2 + m_Overflow: + m_Left: 6 + m_Right: 7 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 19 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: GUIEditor.BreadcrumbMid + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Border: + m_Left: 10 + m_Right: 10 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 10 + m_Right: 10 + m_Top: 2 + m_Bottom: 2 + m_Overflow: + m_Left: 5 + m_Right: 7 + m_Top: 1 + m_Bottom: 1 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 19 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: RL DragHandle + m_Normal: + m_Background: {fileID: -6754115436749502611, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: + - {fileID: 0} + m_TextColor: {r: 0.043137256, g: 0.043137256, b: 0.043137256, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 6 + m_Right: 6 + m_Top: 6 + m_Bottom: 6 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 1 + m_Alignment: 7 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 3 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 6 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: RL Header + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 3 + m_Bottom: 2 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -1} + m_FixedWidth: 0 + m_FixedHeight: 20 + m_StretchWidth: 0 + m_StretchHeight: 0 + - m_Name: RL Footer + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.1019608, g: 0.1019608, b: 0.1019608, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 3 + m_Bottom: 4 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 3 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 1 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 20 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: RL Background + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.705, g: 0.705, b: 0.705, a: 1} + m_Border: + m_Left: 6 + m_Right: 3 + m_Top: 0 + m_Bottom: 6 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: RL FooterButton + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.1019608, g: 0.1019608, b: 0.1019608, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: -3 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 1 + m_Alignment: 4 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 16 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: RL Element + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 1, g: 1, b: 1, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnFocused: + m_Background: {fileID: 7516798493847391269, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 2 + m_Right: 3 + m_Top: 0 + m_Bottom: 3 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 1 + - m_Name: LogMessageIcons + m_Normal: + m_Background: {fileID: 5425037494185492166, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Hover: + m_Background: {fileID: -5763820162405496800, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Active: + m_Background: {fileID: -2005373149481181617, guid: 0000000000000000d000000000000000, + type: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_Border: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 0 + m_FontStyle: 0 + m_Alignment: 0 + m_WordWrap: 0 + m_RichText: 1 + m_TextClipping: 0 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: 0} + m_FixedWidth: 0 + m_FixedHeight: 0 + m_StretchWidth: 1 + m_StretchHeight: 0 + - m_Name: RL Empty Header + m_Normal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Hover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Active: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_Focused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0, g: 0, b: 0, a: 1} + m_OnNormal: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnHover: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnActive: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.8235294, g: 0.8235294, b: 0.8235294, a: 1} + m_OnFocused: + m_Background: {fileID: 0} + m_ScaledBackgrounds: [] + m_TextColor: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} + m_Border: + m_Left: 4 + m_Right: 4 + m_Top: 3 + m_Bottom: 2 + m_Margin: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Overflow: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_Font: {fileID: 0} + m_FontSize: 10 + m_FontStyle: 0 + m_Alignment: 1 + m_WordWrap: 0 + m_RichText: 0 + m_TextClipping: 1 + m_ImagePosition: 0 + m_ContentOffset: {x: 0, y: -1} + m_FixedWidth: 0 + m_FixedHeight: 20 + m_StretchWidth: 0 + m_StretchHeight: 0 + m_Settings: + m_DoubleClickSelectsWord: 1 + m_TripleClickSelectsLine: 1 + m_CursorColor: {r: 0.34117648, g: 0.34117648, b: 0.34117648, a: 1} + m_CursorFlashSpeed: -1 + m_SelectionColor: {r: 0.23921569, g: 0.49803922, b: 0.87058824, a: 0.69803923} diff --git a/Assets/Third Parties/BuildReport/GUI/BuildReportWindowDark.guiskin.meta b/Assets/Third Parties/BuildReport/GUI/BuildReportWindowDark.guiskin.meta new file mode 100644 index 00000000..e9fb8511 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/BuildReportWindowDark.guiskin.meta @@ -0,0 +1,4 @@ +fileFormatVersion: 2 +guid: a83ea98aba103134fa3413925488bb89 +NativeFormatImporter: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin.meta new file mode 100644 index 00000000..9ca20849 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: fd59a4a617258c74080a00714078ee79 diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark.meta new file mode 100644 index 00000000..1872ee78 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 06c3b722988a16d48a8a84b5c248fedb +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-Active.png new file mode 100644 index 00000000..9e7a889c Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-Active.png.meta new file mode 100644 index 00000000..6b470b01 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-Active.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 9389f88a278c7f54a9af8c869d752946 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-Normal.png new file mode 100644 index 00000000..19cba371 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-Normal.png.meta new file mode 100644 index 00000000..c229feb3 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-Normal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 5564fea23991ca341baaa53f06cd6137 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-OnActive.png new file mode 100644 index 00000000..63e7433f Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-OnActive.png.meta new file mode 100644 index 00000000..276941b1 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-OnActive.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 1f5b00268884dac4881ce0809bfb03fd +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-OnNormal.png new file mode 100644 index 00000000..11b16c68 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-OnNormal.png.meta new file mode 100644 index 00000000..d8b91ef4 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Left-OnNormal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 3e3c42e12414604469ee077869eaa861 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-Active.png new file mode 100644 index 00000000..14ee4c03 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-Active.png.meta new file mode 100644 index 00000000..e195ba27 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-Active.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 40a207e7a3c635e4ea8088d995280a63 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-Normal.png new file mode 100644 index 00000000..0b944a1a Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-Normal.png.meta new file mode 100644 index 00000000..10f99b72 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-Normal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: dcf615e454a68004c80c6311b6af330c +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-OnActive.png new file mode 100644 index 00000000..e18e399d Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-OnActive.png.meta new file mode 100644 index 00000000..e0ba4bd6 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-OnActive.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 54c653dd33cfabc43a14818a9e3941e0 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-OnNormal.png new file mode 100644 index 00000000..4185edfc Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-OnNormal.png.meta new file mode 100644 index 00000000..8d23753a --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Mid-OnNormal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 4fb754b002829ea4eb221879e0ff7222 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-Active.png new file mode 100644 index 00000000..a90c9217 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-Active.png.meta new file mode 100644 index 00000000..8f8c8528 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-Active.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 82719a8ac678bd041a2749241b274bd7 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-Normal.png new file mode 100644 index 00000000..ac032c7c Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-Normal.png.meta new file mode 100644 index 00000000..582961cf --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-Normal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: a8aaf08f368747c41ab163ddecb2f42f +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-OnActive.png new file mode 100644 index 00000000..e375bc4a Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-OnActive.png.meta new file mode 100644 index 00000000..6490763e --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-OnActive.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: df298b4295d08e74da0aae66ebc52eca +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-OnNormal.png new file mode 100644 index 00000000..4c0788d7 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-OnNormal.png.meta new file mode 100644 index 00000000..a8476400 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/BigToolbar-Button-Right-OnNormal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 16405c6a4c5289a4888accae2ff48a1a +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Depressed-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Depressed-Normal.png new file mode 100644 index 00000000..d253db5e Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Depressed-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Depressed-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Depressed-Normal.png.meta new file mode 100644 index 00000000..1584157a --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Depressed-Normal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: bd5b2b78eb67c9f4098b0cad7d330df3 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Depressed-Pressed.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Depressed-Pressed.png new file mode 100644 index 00000000..18199d95 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Depressed-Pressed.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Depressed-Pressed.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Depressed-Pressed.png.meta new file mode 100644 index 00000000..1925aba8 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Depressed-Pressed.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 5e2c2fc9f318f504d8486e23c2996945 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Normal.png new file mode 100644 index 00000000..95d4b4f5 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Normal.png.meta new file mode 100644 index 00000000..13e4fe49 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Normal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 9e644f611032dfe438662bf693b63531 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Pressed.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Pressed.png new file mode 100644 index 00000000..ae787ec7 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Pressed.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Pressed.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Pressed.png.meta new file mode 100644 index 00000000..bdcf29e0 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Button-Pressed.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 4e3a67ec9e85b1a4394acede318d9039 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Blank-Pressed.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Blank-Pressed.png new file mode 100644 index 00000000..b70d850d Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Blank-Pressed.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Blank-Pressed.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Blank-Pressed.png.meta new file mode 100644 index 00000000..b80f5899 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Blank-Pressed.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 9bebbd5347e86ae4ea9575fc47feeabb +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Blank.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Blank.png new file mode 100644 index 00000000..866367ed Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Blank.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Blank.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Blank.png.meta new file mode 100644 index 00000000..128687ff --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Blank.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 4ebb059901650294ab41eaa36f4708f1 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Checked-Pressed.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Checked-Pressed.png new file mode 100644 index 00000000..63eaa13a Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Checked-Pressed.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Checked-Pressed.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Checked-Pressed.png.meta new file mode 100644 index 00000000..c3ee8771 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Checked-Pressed.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 5b0fbf6145c07874e80af5b4f25a0ed9 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Checked.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Checked.png new file mode 100644 index 00000000..339e2f45 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Checked.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Checked.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Checked.png.meta new file mode 100644 index 00000000..5fe39205 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Checkbox-Checked.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: eb7f80b66ffde34449657e7367de38da +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-Active.png new file mode 100644 index 00000000..cfae2cef Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-Active.png.meta new file mode 100644 index 00000000..5d9ff4f5 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-Active.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: a6d9bf1d86df4f444a040eb60dd38422 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-Normal.png new file mode 100644 index 00000000..629a7142 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-Normal.png.meta new file mode 100644 index 00000000..9e910e72 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-Normal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 9309bddb79ba8544eb740260186ab1ff +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-OnActive.png new file mode 100644 index 00000000..16c4c060 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-OnActive.png.meta new file mode 100644 index 00000000..6ac47487 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-OnActive.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 922fb03a14bb3af459f9be1e53dedd05 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-OnNormal.png new file mode 100644 index 00000000..032376fb Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-OnNormal.png.meta new file mode 100644 index 00000000..4c768f04 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Asc-OnNormal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 6a6cdfa59d765264eacb2496908ffc51 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-Active.png new file mode 100644 index 00000000..13814671 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-Active.png.meta new file mode 100644 index 00000000..793a79f5 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-Active.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 44fa44c27de6a1d4c9a08c8aa141ffb2 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-Normal.png new file mode 100644 index 00000000..1980dcd4 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-Normal.png.meta new file mode 100644 index 00000000..1799837d --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-Normal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 6afa125853d8a0d4abce452dfdcb9e27 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-OnActive.png new file mode 100644 index 00000000..3d0da28f Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-OnActive.png.meta new file mode 100644 index 00000000..b4570ab0 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-OnActive.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: cc31713ef716e224196cfaedbc36fc91 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-OnNormal.png new file mode 100644 index 00000000..de38edff Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-OnNormal.png.meta new file mode 100644 index 00000000..3ac297d0 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ColumnHeader-Sort-Desc-OnNormal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 3413a3163ea01304ab4a6aecc11b8b56 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandDownButton-Normal.psd b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandDownButton-Normal.psd new file mode 100644 index 00000000..55b127bf Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandDownButton-Normal.psd differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandDownButton-Normal.psd.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandDownButton-Normal.psd.meta new file mode 100644 index 00000000..9b4186d6 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandDownButton-Normal.psd.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 2fba41542a4c0e440b7fae310b98e6b7 +timeCreated: 1559152540 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandDownButton-Pressed.psd b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandDownButton-Pressed.psd new file mode 100644 index 00000000..b0c3ef58 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandDownButton-Pressed.psd differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandDownButton-Pressed.psd.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandDownButton-Pressed.psd.meta new file mode 100644 index 00000000..ac20470a --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandDownButton-Pressed.psd.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 8dcaefb813272534f925c2cc1be37b69 +timeCreated: 1559152540 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandUpButton-Normal.psd b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandUpButton-Normal.psd new file mode 100644 index 00000000..56f3f33a Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandUpButton-Normal.psd differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandUpButton-Normal.psd.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandUpButton-Normal.psd.meta new file mode 100644 index 00000000..4b6ad795 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandUpButton-Normal.psd.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 09d370cb92bf7ca4f985a950cbf7acfa +timeCreated: 1559152540 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandUpButton-Pressed.psd b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandUpButton-Pressed.psd new file mode 100644 index 00000000..19773c3a Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandUpButton-Pressed.psd differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandUpButton-Pressed.psd.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandUpButton-Pressed.psd.meta new file mode 100644 index 00000000..ec7a74bb --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ExpandUpButton-Pressed.psd.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: e4e412fdf0bbf8647bc7175f88e05bb2 +timeCreated: 1559152540 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Active.png new file mode 100644 index 00000000..c26a02f4 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Active.png.meta new file mode 100644 index 00000000..c6e45af3 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Active.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: e6e477e69bde1144b823fe621ddc1090 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Normal.png new file mode 100644 index 00000000..78754f28 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Normal.png.meta new file mode 100644 index 00000000..34eead77 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Normal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: f0e3c8e28e40b5249870c3e3db685051 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Popup-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Popup-Active.png new file mode 100644 index 00000000..f7e69059 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Popup-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Popup-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Popup-Active.png.meta new file mode 100644 index 00000000..02a8744b --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Popup-Active.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: a95cb67892caf7f48ad04ba26484fb9f +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Popup-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Popup-Normal.png new file mode 100644 index 00000000..c963a89b Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Popup-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Popup-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Popup-Normal.png.meta new file mode 100644 index 00000000..18424681 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/MiniToolbar-Popup-Normal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 3d4ab15594af81345a2559291a937b8b +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/PopupPanel.psd b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/PopupPanel.psd new file mode 100644 index 00000000..c4874dfa Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/PopupPanel.psd differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/PopupPanel.psd.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/PopupPanel.psd.meta new file mode 100644 index 00000000..22b55aaf --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/PopupPanel.psd.meta @@ -0,0 +1,86 @@ +fileFormatVersion: 2 +guid: 398adf16755d0d34682292b57a94786e +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Left-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Left-Active.png new file mode 100644 index 00000000..a452b9a2 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Left-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Left-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Left-Active.png.meta new file mode 100644 index 00000000..cdb29c1b --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Left-Active.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 9ad4bd4ead4232f4f9ff61d6a68d0093 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Left.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Left.png new file mode 100644 index 00000000..11b7a525 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Left.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Left.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Left.png.meta new file mode 100644 index 00000000..08232a2e --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Left.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 54a117b0d87a73743870ba5697db4c7e +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Right-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Right-Active.png new file mode 100644 index 00000000..e4db0678 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Right-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Right-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Right-Active.png.meta new file mode 100644 index 00000000..5d9f8a6d --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Right-Active.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 5e29d420126aad846b65c11c40e02a54 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Right.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Right.png new file mode 100644 index 00000000..47dac0cd Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Right.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Right.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Right.png.meta new file mode 100644 index 00000000..ee60a9ba --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Right.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: cfff64841883793418cdced67a06666b +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Thumb.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Thumb.png new file mode 100644 index 00000000..bbab3f4e Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Thumb.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Thumb.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Thumb.png.meta new file mode 100644 index 00000000..e995ec18 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal-Thumb.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: e333933629c354d41a6c29fc5b52832f +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal.png new file mode 100644 index 00000000..6805b718 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal.png.meta new file mode 100644 index 00000000..c324261f --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Horizontal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 154606301c8355545a7251945b2070cd +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Down-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Down-Active.png new file mode 100644 index 00000000..c2f6764e Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Down-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Down-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Down-Active.png.meta new file mode 100644 index 00000000..0a8e716b --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Down-Active.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 6177c9f88d9604a45a0fececf270b89c +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Down.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Down.png new file mode 100644 index 00000000..da1831a6 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Down.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Down.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Down.png.meta new file mode 100644 index 00000000..c7a35873 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Down.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 378141fc61556bb49b1eb4738da928be +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Thumb.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Thumb.png new file mode 100644 index 00000000..2a4be4b5 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Thumb.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Thumb.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Thumb.png.meta new file mode 100644 index 00000000..fcce2efe --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Thumb.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: ad72ae6b5fa68ba4ab16f2b560b97287 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Up-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Up-Active.png new file mode 100644 index 00000000..395ac53e Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Up-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Up-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Up-Active.png.meta new file mode 100644 index 00000000..475cd907 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Up-Active.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 04165b0ffe255ce47a434b3e2815daf2 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Up.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Up.png new file mode 100644 index 00000000..36d94ce7 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Up.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Up.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Up.png.meta new file mode 100644 index 00000000..1b68ff8c --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical-Up.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: cb67d961c9719794399051c8da95f39b +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical.png new file mode 100644 index 00000000..bfa4c007 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical.png.meta new file mode 100644 index 00000000..44ffcab8 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Scrollbar-Vertical.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 38f65eab78de46e49b1f04de17a4f5cc +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/StatusBar.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/StatusBar.png new file mode 100644 index 00000000..9029a115 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/StatusBar.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/StatusBar.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/StatusBar.png.meta new file mode 100644 index 00000000..67b4bfaa --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/StatusBar.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 1ca5533c69eb2f54aa409c5fcf41e1ca +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-Active.png new file mode 100644 index 00000000..685c0ba3 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-Active.png.meta new file mode 100644 index 00000000..245e7731 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-Active.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 345e479402e005844bd9ead400648933 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-Normal.png new file mode 100644 index 00000000..60e3ef61 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-Normal.png.meta new file mode 100644 index 00000000..dce02095 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-Normal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: c503b913cf5eeb941b6afd666dc92652 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-OnActive.png new file mode 100644 index 00000000..a4bfa740 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-OnActive.png.meta new file mode 100644 index 00000000..9585441d --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-OnActive.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 39c440be84b648d45b27205440fb9df1 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-OnNormal.png new file mode 100644 index 00000000..7079e6a6 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-OnNormal.png.meta new file mode 100644 index 00000000..9611ffa5 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Left-OnNormal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 7e99c3d9cea55a44a997e2080c9f5c64 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-Active.png new file mode 100644 index 00000000..46ccc400 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-Active.png.meta new file mode 100644 index 00000000..2d0d84f6 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-Active.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: dd2206eb6339fb84490319fede1250fa +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-Normal.png new file mode 100644 index 00000000..01edf416 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-Normal.png.meta new file mode 100644 index 00000000..5b0200a4 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-Normal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 06fdbb959fdc16a429a60fdc1b891d6a +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-OnActive.png new file mode 100644 index 00000000..ddb32ac9 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-OnActive.png.meta new file mode 100644 index 00000000..cb9f24c2 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-OnActive.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 950c8f6862de1894985c9deeccb44b1c +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-OnNormal.png new file mode 100644 index 00000000..0e281d43 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-OnNormal.png.meta new file mode 100644 index 00000000..b029a7e8 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Mid-OnNormal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: a386b30514769604280a79563c307e67 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-Active.png new file mode 100644 index 00000000..ced0f731 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-Active.png.meta new file mode 100644 index 00000000..d6e3a349 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-Active.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: c41881b7118ba9c449d4ded5d0a33c60 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-Normal.png new file mode 100644 index 00000000..d26fddbb Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-Normal.png.meta new file mode 100644 index 00000000..46418aae --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-Normal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: dd49c0bbf3671e547ab1813b9c2e2d03 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-OnActive.png new file mode 100644 index 00000000..24caa58f Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-OnActive.png.meta new file mode 100644 index 00000000..a9f26878 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-OnActive.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 8f965e743ad46af4881be1810e3ee6f8 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-OnNormal.png new file mode 100644 index 00000000..aa620e62 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-OnNormal.png.meta new file mode 100644 index 00000000..25493021 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tab-Right-OnNormal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 23ff8206be541ce4b95aabb591360f64 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Textfield-Focused.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Textfield-Focused.png new file mode 100644 index 00000000..be93bba6 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Textfield-Focused.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Textfield-Focused.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Textfield-Focused.png.meta new file mode 100644 index 00000000..7c3f5b30 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Textfield-Focused.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 80003ef802d6179429eed4d66bf577d0 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Textfield.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Textfield.png new file mode 100644 index 00000000..5eae5f3e Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Textfield.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Textfield.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Textfield.png.meta new file mode 100644 index 00000000..659f441d --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Textfield.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: b6e9a3400cb80844b9b86c56a020568e +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Bg.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Bg.png new file mode 100644 index 00000000..60a09d1a Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Bg.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Bg.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Bg.png.meta new file mode 100644 index 00000000..4a014de3 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Bg.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 781d5fa17ba67b343a0f1f5fc4b890d7 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-Active.png new file mode 100644 index 00000000..0926ab65 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-Active.png.meta new file mode 100644 index 00000000..c93dc593 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-Active.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: f322b44ed25d78045bed6966ac9c997b +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-Normal.png new file mode 100644 index 00000000..10888ecd Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-Normal.png.meta new file mode 100644 index 00000000..45596007 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-Normal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: d991b78680057d642bd61c8f7601baf4 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-OnActive.png new file mode 100644 index 00000000..d554c91e Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-OnActive.png.meta new file mode 100644 index 00000000..08cd20a9 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-OnActive.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 13e0c604f1dc4a94ea0403fa052b8c59 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-OnNormal.png new file mode 100644 index 00000000..4e4013c7 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-OnNormal.png.meta new file mode 100644 index 00000000..5d003730 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/ToolBar-Button-OnNormal.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 8cfbcdaae83846142bdb1f73b708bd81 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tooltip1.psd b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tooltip1.psd new file mode 100644 index 00000000..139d6221 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tooltip1.psd differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tooltip1.psd.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tooltip1.psd.meta new file mode 100644 index 00000000..4faff61f --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Dark/Tooltip1.psd.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 828d9b22190dfe746ae229893d0ed85e +timeCreated: 1558623438 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: 2 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light.meta new file mode 100644 index 00000000..f67753fb --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: a9bdd2893931d8c45a27cdce15ba6dc5 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-Active.png new file mode 100644 index 00000000..1855aad9 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-Active.png.meta new file mode 100644 index 00000000..24de647e --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-Active.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 71a8ca93cd5adf0479b0bbeca1507fc8 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-Normal.png new file mode 100644 index 00000000..b0271f63 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-Normal.png.meta new file mode 100644 index 00000000..4562f166 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-Normal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 886f7fba07047d14b9b79b864468f9dc +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-OnActive.png new file mode 100644 index 00000000..ba2b2ef1 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-OnActive.png.meta new file mode 100644 index 00000000..81f67cf4 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-OnActive.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 16111157c6e49234e923ea8f4e450d37 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-OnNormal.png new file mode 100644 index 00000000..c6022e61 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-OnNormal.png.meta new file mode 100644 index 00000000..e57276ed --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Left-OnNormal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: fa8b703aedc9e2b4288eeff8b4022c05 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-Active.png new file mode 100644 index 00000000..cb7a38ba Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-Active.png.meta new file mode 100644 index 00000000..17151d08 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-Active.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 35fe22e2115a5464d929ad10166b9b4c +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-Normal.png new file mode 100644 index 00000000..bd6bce93 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-Normal.png.meta new file mode 100644 index 00000000..0bf07a06 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-Normal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 147e6ec51a8432c45a10b5b4c7dde820 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-OnActive.png new file mode 100644 index 00000000..b10190ec Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-OnActive.png.meta new file mode 100644 index 00000000..774caf15 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-OnActive.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 7af8692d98dd6db4486da44329739efc +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-OnNormal.png new file mode 100644 index 00000000..326b25d2 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-OnNormal.png.meta new file mode 100644 index 00000000..29968ec1 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Mid-OnNormal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 759d1ac2eca8fcd4f89295dd9b10a613 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-Active.png new file mode 100644 index 00000000..5c84657f Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-Active.png.meta new file mode 100644 index 00000000..5eff5076 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-Active.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: f8ef87e87e01a73458343e226c7264a3 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-Normal.png new file mode 100644 index 00000000..099d5dee Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-Normal.png.meta new file mode 100644 index 00000000..f46e0618 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-Normal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 6a7d0f391f1753c479ae5e2441c9a6ac +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-OnActive.png new file mode 100644 index 00000000..d54079d9 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-OnActive.png.meta new file mode 100644 index 00000000..3a126348 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-OnActive.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 8d035465503f51a4fac1d5e80295a7f8 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-OnNormal.png new file mode 100644 index 00000000..023ba743 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-OnNormal.png.meta new file mode 100644 index 00000000..8dd5e1fc --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/BigToolbar-Button-Right-OnNormal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 53dac5eeceae7564ea274b0696ae5fd1 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-Active.png new file mode 100644 index 00000000..ee5c7e72 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-Active.png.meta new file mode 100644 index 00000000..5a7c5334 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-Active.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ec6253a98d8bee64789ebe15c586ab49 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-Normal.png new file mode 100644 index 00000000..5366779a Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-Normal.png.meta new file mode 100644 index 00000000..da8ca7ef --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-Normal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: d21040d4186bf9546aafc2db57600f8a +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-OnActive.png new file mode 100644 index 00000000..16c4c060 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-OnActive.png.meta new file mode 100644 index 00000000..f08ce2d1 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-OnActive.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 163d65b61ac37404f9bea771fe477056 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-OnNormal.png new file mode 100644 index 00000000..032376fb Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-OnNormal.png.meta new file mode 100644 index 00000000..a197aabc --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Asc-OnNormal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 59fd6b4691d8a154ca5f24122b2183d3 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-Active.png new file mode 100644 index 00000000..709c3a95 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-Active.png.meta new file mode 100644 index 00000000..70618210 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-Active.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 93968e46ef3c25d42ac4f60f2fdf45da +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-Normal.png new file mode 100644 index 00000000..a649bde1 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-Normal.png.meta new file mode 100644 index 00000000..be0b5571 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-Normal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: f4306844cc37ee44e9b8867e960b025d +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-OnActive.png new file mode 100644 index 00000000..3d0da28f Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-OnActive.png.meta new file mode 100644 index 00000000..79ad0bed --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-OnActive.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 2ee7fd8754b16f24fb5755637e60f925 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-OnNormal.png new file mode 100644 index 00000000..de38edff Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-OnNormal.png.meta new file mode 100644 index 00000000..f11e7179 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ColumnHeader-Sort-Desc-OnNormal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 98e9c8080c5a37048be6f3f4b95f0ff8 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandDownButton-Normal.psd b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandDownButton-Normal.psd new file mode 100644 index 00000000..0d48bebf Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandDownButton-Normal.psd differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandDownButton-Normal.psd.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandDownButton-Normal.psd.meta new file mode 100644 index 00000000..a3c7e1ad --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandDownButton-Normal.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: d422219eeef1b6844ac4fc1e006a9646 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -100 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandDownButton-Pressed.psd b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandDownButton-Pressed.psd new file mode 100644 index 00000000..e623a886 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandDownButton-Pressed.psd differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandDownButton-Pressed.psd.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandDownButton-Pressed.psd.meta new file mode 100644 index 00000000..dede52cd --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandDownButton-Pressed.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 7b75248593b59d046a38f49deb01d380 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -100 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandUpButton-Normal.psd b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandUpButton-Normal.psd new file mode 100644 index 00000000..8d91c35a Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandUpButton-Normal.psd differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandUpButton-Normal.psd.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandUpButton-Normal.psd.meta new file mode 100644 index 00000000..7eaef80c --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandUpButton-Normal.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: 06d0f14a2a2072042a3a46c3a3149986 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -100 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandUpButton-Pressed.psd b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandUpButton-Pressed.psd new file mode 100644 index 00000000..7797c3d1 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandUpButton-Pressed.psd differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandUpButton-Pressed.psd.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandUpButton-Pressed.psd.meta new file mode 100644 index 00000000..b80f7109 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ExpandUpButton-Pressed.psd.meta @@ -0,0 +1,53 @@ +fileFormatVersion: 2 +guid: c3e29123c6d739644ababd6cd69eb2e9 +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: 0 + aniso: 1 + mipBias: -100 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Active.png new file mode 100644 index 00000000..072a1e62 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Active.png.meta new file mode 100644 index 00000000..e0b82816 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Active.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 11acdc56b262a4641b40b01ef5f15c37 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Normal.png new file mode 100644 index 00000000..895432d6 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Normal.png.meta new file mode 100644 index 00000000..a8ff23b9 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Normal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 9df4d45783545b84b8ce5b9e9701c5f2 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Popup-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Popup-Active.png new file mode 100644 index 00000000..fcb968e0 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Popup-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Popup-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Popup-Active.png.meta new file mode 100644 index 00000000..cf729cfc --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Popup-Active.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b1e01f571280a5c4b828236cd81dc58d +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Popup-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Popup-Normal.png new file mode 100644 index 00000000..2e60a1eb Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Popup-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Popup-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Popup-Normal.png.meta new file mode 100644 index 00000000..01bdf17e --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/MiniToolbar-Popup-Normal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 721f56281f947524eba4a280e2a1b050 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/PopupPanel.psd b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/PopupPanel.psd new file mode 100644 index 00000000..1275ef00 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/PopupPanel.psd differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/PopupPanel.psd.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/PopupPanel.psd.meta new file mode 100644 index 00000000..2336aede --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/PopupPanel.psd.meta @@ -0,0 +1,86 @@ +fileFormatVersion: 2 +guid: 3743f95c1a415f2468d32581b011aae3 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/StatusBar.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/StatusBar.png new file mode 100644 index 00000000..ce8d4090 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/StatusBar.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/StatusBar.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/StatusBar.png.meta new file mode 100644 index 00000000..6e6f36cc --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/StatusBar.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: d349f3cb6d91cff46a973dce538ab51c +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-Active.png new file mode 100644 index 00000000..9dd18830 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-Active.png.meta new file mode 100644 index 00000000..c2ef572a --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-Active.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 56b54d9b7e99bcc479c4823c1317c447 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-Normal.png new file mode 100644 index 00000000..422799a9 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-Normal.png.meta new file mode 100644 index 00000000..58254b14 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-Normal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 373f51c87086b02459607308775e78b1 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-OnActive.png new file mode 100644 index 00000000..1f267628 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-OnActive.png.meta new file mode 100644 index 00000000..ec71e53a --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-OnActive.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4eee8a1e3ad70bd45ad389a03dfe5359 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-OnNormal.png new file mode 100644 index 00000000..675ac9f6 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-OnNormal.png.meta new file mode 100644 index 00000000..86efd119 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Left-OnNormal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 215aeacc8dd97ea409ba40042a72ebb9 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-Active.png new file mode 100644 index 00000000..c55e2fde Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-Active.png.meta new file mode 100644 index 00000000..e53b7afa --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-Active.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 48046c6ee29acef4ea8a4ce350a9c24b +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-Normal.png new file mode 100644 index 00000000..75e6e3bd Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-Normal.png.meta new file mode 100644 index 00000000..f28191bb --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-Normal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 5e13d30c0c9c75040bcdfbffcfb53988 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-OnActive.png new file mode 100644 index 00000000..b84f914a Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-OnActive.png.meta new file mode 100644 index 00000000..22a1e00b --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-OnActive.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 7ee779862f08a1348901b65417c54188 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-OnNormal.png new file mode 100644 index 00000000..62ac68df Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-OnNormal.png.meta new file mode 100644 index 00000000..022be050 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Mid-OnNormal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 3874401684fdc974695d1605db6560f9 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-Active.png new file mode 100644 index 00000000..5971a61b Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-Active.png.meta new file mode 100644 index 00000000..cc492851 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-Active.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1d7941a993179f9469860cf3457f7234 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-Normal.png new file mode 100644 index 00000000..629cf57f Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-Normal.png.meta new file mode 100644 index 00000000..37ec8e58 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-Normal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 20a776457908cc845babf45bdb476646 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-OnActive.png new file mode 100644 index 00000000..6ee177b5 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-OnActive.png.meta new file mode 100644 index 00000000..c3c4aa49 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-OnActive.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 24d235eb01f65e941ac4dfcb7fd57098 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-OnNormal.png new file mode 100644 index 00000000..1ce4dbf6 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-OnNormal.png.meta new file mode 100644 index 00000000..c6c0db76 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/Tab-Right-OnNormal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: f32cc235fdcbbec4bbc2834d837b58fd +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Clear-Pressed.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Clear-Pressed.png new file mode 100644 index 00000000..41013273 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Clear-Pressed.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Clear-Pressed.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Clear-Pressed.png.meta new file mode 100644 index 00000000..74b46686 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Clear-Pressed.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 6f3ea1a6420b7b54ea10732fdfe9eeb5 +timeCreated: 1480242013 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Clear.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Clear.png new file mode 100644 index 00000000..ead1359d Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Clear.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Clear.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Clear.png.meta new file mode 100644 index 00000000..98c49c31 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Clear.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: 052aa522a7b5fb646897414b72655233 +timeCreated: 1480242013 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Text.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Text.png new file mode 100644 index 00000000..baf68607 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Text.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Text.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Text.png.meta new file mode 100644 index 00000000..d5c129ab --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search-Text.png.meta @@ -0,0 +1,76 @@ +fileFormatVersion: 2 +guid: 7bab1b503eb28b7498b376aaef0c4f90 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 1 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: -1 + mipBias: -1 + wrapU: -1 + wrapV: -1 + wrapW: -1 + nPOTScale: 1 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 0 + spriteTessellationDetail: -1 + textureType: 0 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search.png new file mode 100644 index 00000000..f6ee42de Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search.png.meta new file mode 100644 index 00000000..d7b5c97b --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-Search.png.meta @@ -0,0 +1,55 @@ +fileFormatVersion: 2 +guid: ec577dc4a2bb0f24b9b056ed15024f75 +timeCreated: 1480242013 +licenseType: Store +TextureImporter: + fileIDToRecycleName: {} + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + cubemapConvolution: 0 + cubemapConvolutionSteps: 8 + cubemapConvolutionExponent: 1.5 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 2048 + textureSettings: + filterMode: 1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + rGBM: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-SearchWithDropDown-Active.psd b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-SearchWithDropDown-Active.psd new file mode 100644 index 00000000..79ee2fe0 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-SearchWithDropDown-Active.psd differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-SearchWithDropDown-Active.psd.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-SearchWithDropDown-Active.psd.meta new file mode 100644 index 00000000..08d88903 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-SearchWithDropDown-Active.psd.meta @@ -0,0 +1,86 @@ +fileFormatVersion: 2 +guid: 8a51a690a4ea0ef4aa9394c0498e35b0 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-SearchWithDropDown.psd b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-SearchWithDropDown.psd new file mode 100644 index 00000000..020deb2e Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-SearchWithDropDown.psd differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-SearchWithDropDown.psd.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-SearchWithDropDown.psd.meta new file mode 100644 index 00000000..c0093574 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/TextField-SearchWithDropDown.psd.meta @@ -0,0 +1,86 @@ +fileFormatVersion: 2 +guid: bdfae28b47e3a5444b4490d930fd7a6f +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Bg.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Bg.png new file mode 100644 index 00000000..73645379 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Bg.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Bg.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Bg.png.meta new file mode 100644 index 00000000..9c88a157 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Bg.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4dde6db1ed123c0448eaace3e76a06da +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-Active.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-Active.png new file mode 100644 index 00000000..9a682d65 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-Active.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-Active.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-Active.png.meta new file mode 100644 index 00000000..2969adf8 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-Active.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: ed75aa4653665b543af4301df7ab0aa6 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-Normal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-Normal.png new file mode 100644 index 00000000..c8672970 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-Normal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-Normal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-Normal.png.meta new file mode 100644 index 00000000..52a00844 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-Normal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 45dcc34572cb4234fbef9600252cfa5b +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-OnActive.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-OnActive.png new file mode 100644 index 00000000..d554c91e Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-OnActive.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-OnActive.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-OnActive.png.meta new file mode 100644 index 00000000..9f4e44c2 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-OnActive.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 1c034283ef2550f4eb6858e32222c693 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-OnNormal.png b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-OnNormal.png new file mode 100644 index 00000000..4e4013c7 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-OnNormal.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-OnNormal.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-OnNormal.png.meta new file mode 100644 index 00000000..c7f77ac7 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkin/Light/ToolBar-Button-OnNormal.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 38ef303dece76ef45910e97f04f5e348 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons.meta new file mode 100644 index 00000000..af87807a --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 1ca27de5b1b96db46a213183afc874a6 diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark.meta new file mode 100644 index 00000000..93f15a77 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 6b52e8a3b282ffc4f8c754d092b4efec +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Column.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Column.png new file mode 100644 index 00000000..ee48cf16 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Column.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Column.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Column.png.meta new file mode 100644 index 00000000..cd01516b --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Column.png.meta @@ -0,0 +1,86 @@ +fileFormatVersion: 2 +guid: b1ff0ab72e5d25f41be81b7470928d76 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Down.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Down.png new file mode 100644 index 00000000..7ec9b775 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Down.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Down.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Down.png.meta new file mode 100644 index 00000000..7262dfcd --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Down.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: ec3db08d1bc1ea14f892bb48e64f2174 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Left.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Left.png new file mode 100644 index 00000000..86575398 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Left.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Left.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Left.png.meta new file mode 100644 index 00000000..096d43fa --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Left.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 8d9e22fc216ec7040951b3fc639fee65 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Right.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Right.png new file mode 100644 index 00000000..90a00741 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Right.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Right.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Right.png.meta new file mode 100644 index 00000000..0ecd4708 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Right.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 356851a1da2c40c4682114040e12128f +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Help.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Help.png new file mode 100644 index 00000000..b6bb55a3 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Help.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Help.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Help.png.meta new file mode 100644 index 00000000..5598d00b --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Help.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: dce2f5f611fdaaa48aa3c56b70fede18 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Log.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Log.png new file mode 100644 index 00000000..9c07189f Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Log.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Log.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Log.png.meta new file mode 100644 index 00000000..5717ab4a --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Log.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 315f41d9a48042544ad8ee904a85489a +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Open.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Open.png new file mode 100644 index 00000000..dc8b0182 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Open.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Open.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Open.png.meta new file mode 100644 index 00000000..024dee36 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Open.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 4f37f55e356d36541b6b6c98cd6f9552 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Options.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Options.png new file mode 100644 index 00000000..93b56871 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Options.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Options.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Options.png.meta new file mode 100644 index 00000000..91ec1e15 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Options.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 45696119a0f085748a79d353c96bf81e +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Save.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Save.png new file mode 100644 index 00000000..87e88380 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Save.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Save.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Save.png.meta new file mode 100644 index 00000000..e917e794 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Toolbar-Save.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 544efce9a6412b842bdc5f70c3b8c6e5 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Up.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Up.png new file mode 100644 index 00000000..e3edea7e Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Up.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Up.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Up.png.meta new file mode 100644 index 00000000..8443efdc --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Dark/Up.png.meta @@ -0,0 +1,46 @@ +fileFormatVersion: 2 +guid: 3787a2f70b774544b8f3f19573788154 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + seamlessCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: .5, y: .5} + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spritePixelsToUnits: 100 + alphaIsTransparency: 1 + textureType: 2 + buildTargetSettings: [] + spriteSheet: + sprites: [] + spritePackingTag: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light.meta new file mode 100644 index 00000000..37829521 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light.meta @@ -0,0 +1,5 @@ +fileFormatVersion: 2 +guid: 8cca6d87f2ab89f4aa681dbe304b61f9 +folderAsset: yes +DefaultImporter: + userData: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Column.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Column.png new file mode 100644 index 00000000..f3a496e9 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Column.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Column.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Column.png.meta new file mode 100644 index 00000000..ab2f0052 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Column.png.meta @@ -0,0 +1,86 @@ +fileFormatVersion: 2 +guid: 9d0c5c006dbbc9744bfd357e2ec08bb7 +TextureImporter: + fileIDToRecycleName: {} + externalObjects: {} + serializedVersion: 4 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 0 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapU: 1 + wrapV: 1 + wrapW: -1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 0 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 100 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 2 + textureShape: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + platformSettings: + - buildTarget: DefaultTexturePlatform + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + - buildTarget: Standalone + maxTextureSize: 1024 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + androidETC2FallbackOverride: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + spritePackingTag: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Down.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Down.png new file mode 100644 index 00000000..3c9febb7 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Down.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Down.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Down.png.meta new file mode 100644 index 00000000..3ed66b89 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Down.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 54910bd3949db90488fb6780e7473887 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Left.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Left.png new file mode 100644 index 00000000..acc0a2be Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Left.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Left.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Left.png.meta new file mode 100644 index 00000000..31bad8e1 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Left.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 476ce0ec9616e944284359243b46f7e5 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Right.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Right.png new file mode 100644 index 00000000..bf1fc67e Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Right.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Right.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Right.png.meta new file mode 100644 index 00000000..7703a81e --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Right.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: f8e6be5e2d9da41449602ca7def584b9 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Help.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Help.png new file mode 100644 index 00000000..782e4627 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Help.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Help.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Help.png.meta new file mode 100644 index 00000000..26a6f0dc --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Help.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 36e97b21954b2c140bad7f0f34bda190 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Log.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Log.png new file mode 100644 index 00000000..b0c60300 Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Log.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Log.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Log.png.meta new file mode 100644 index 00000000..c540c4f7 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Log.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 73b48382876c31a4693ea55ac56ee9db +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Open.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Open.png new file mode 100644 index 00000000..1a7d879b Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Open.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Open.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Open.png.meta new file mode 100644 index 00000000..b1da2a32 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Open.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: b3a0f42d2ccf3ee4599a4536f3761e07 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Options.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Options.png new file mode 100644 index 00000000..72bf617a Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Options.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Options.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Options.png.meta new file mode 100644 index 00000000..45381bd1 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Options.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 4d786bc9c8f625e469cce304e692c494 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Save.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Save.png new file mode 100644 index 00000000..eed797dc Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Save.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Save.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Save.png.meta new file mode 100644 index 00000000..a0a5f3aa --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Toolbar-Save.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: 3f88df51b08315344a6f0becd7da78f2 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Up.png b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Up.png new file mode 100644 index 00000000..cab3accd Binary files /dev/null and b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Up.png differ diff --git a/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Up.png.meta b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Up.png.meta new file mode 100644 index 00000000..f82b6797 --- /dev/null +++ b/Assets/Third Parties/BuildReport/GUI/NativeSkinExtraIcons/Light/Up.png.meta @@ -0,0 +1,33 @@ +fileFormatVersion: 2 +guid: df8358513208bdd4eb28feae0e233520 +TextureImporter: + serializedVersion: 2 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + linearTexture: 1 + correctGamma: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: .25 + normalMapFilter: 0 + isReadable: 0 + grayScaleToAlpha: 0 + generateCubemap: 0 + textureFormat: -3 + maxTextureSize: 1024 + textureSettings: + filterMode: -1 + aniso: 1 + mipBias: -1 + wrapMode: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + textureType: 2 + buildTargetSettings: [] diff --git a/Assets/Third Parties/BuildReport/README.txt b/Assets/Third Parties/BuildReport/README.txt new file mode 100644 index 00000000..9d4cb808 --- /dev/null +++ b/Assets/Third Parties/BuildReport/README.txt @@ -0,0 +1,199 @@ +Build Report Tool README + +Note: If you are upgrading Build Report Tool in your project, delete the current BuildReport folder first before importing the new one! This will eliminate any potential metadata file conflicts with the old Build Report Tool. + + + + +To show the Build Report Window, go to Window > Show Build Report. + +If Build Report Tool doesn't show up when you do that, you may have to reset your Unity Editor layout. Choose Window > Layouts > Default. + +Then try opening the Build Report Window again. + + + + +=== Saved Options === + +Options are saved to an XML file named "BuildReportToolOptions.xml". + +By default this file is saved inside the ProjectSettings folder of your Unity project, but can be copied/moved to the following locations: + +1. inside the BuildReport folder itself +2. inside the topmost Assets folder of your project +3. outside the topmost Assets folder (i.e. in your project folder) +4. in your project folder's ProjectSettings folder +5. in the user's My Documents (inside the same folder where Build Report XML files are saved) + +This is in prioritized order, to allow you to have per-project options: so even if there is an options file in the My Documents folder, but there is also one in the project folder, it will use the one in the project folder instead. + +If at any time no options file is found in any of these paths, it will create a new one inside the ProjectSettings folder of your Unity project, with default values. You can move this file elsewhere in the above mentioned places if you don't want it inside that path. + + + + +=== Batchmode Builds === + +You can call BuildReportTool.ReportGenerator.CreateReport() to manually create a build report. Use this in your build scripts to properly create build reports. It should be called after BuildPipeline.BuildPlayer(). + +Check the file in BuildReport/CustomBuildScriptExample.txt for example code on how it's done. + + + + +=== Important Notes === + +In case you get any build errors that you think might be caused by the Build Report Tool, try disabling the Build Report Window from showing automatically whenever you build. + +You can do this by opening the Build Report window, going to options, then uncheck "Collect and save build info automatically after building". If that doesn't work, you can simply delete the files in the Build Report Tool as a last resort. + + + + +=== Erroneous Values === + +The Build Report Tool gets much of its data from the Unity Editor's log file. Extremely large projects with large file sizes may get erroneous values. If you experience this, check your Editor log file: Go to your Console View (go to Window > Console, or press ctrl + shift + C). In the Console View's upper right corner, click the button "Open Editor Log". + +If the Unity Editor's log file itself is showing wrong values for your file sizes, you may want to submit a bug report to Unity (go to Help > Report a Bug). + + + + +=== How to use === + +To show the Build Report Window, go to Window > Show Build Report. + +Make sure you build your project first. If not, Build Report Tool has no data to get and will not work. + +However, it won't care if the project you built last time isn't the same one you currently have open. So it's always best to build your project before you look at the Build Report Window. + +You can also save build reports to XML files, or open previously saved ones. Whenever you build your project, the Build Report Tool will automatically generate a build report and save it. If you don't want the Build Report Tool to do that automatically, you can disable it in the options. + + + + +=== Parts === + +A build report is broken into five main categories: + +1. Overview: Summary of the report. +2. Project Settings: Shows project settings that were used upon time of building. +3. Size Stats: Shows the build's file size, and a table breaking down of which assets are taking up what percentage of space on the build. +4. Used Assets: Shows a list of *all* assets that were included in the build, along with how much space they take. +5. Unused Assets: Shows a list of assets in the project that were *not* used for the build. This is useful for finding out which assets are not used anymore that perhaps you may want to delete to save space. + + + + +=== What's counted in the Build Report === + +The Build Report only takes into account your assets' size, plus managed DLLs. The real final size of your build may be larger or smaller depending on the platform. + +In desktop and mobile builds, the build size reflects the size of the resulting sharedassets0.assets, sharedassets1.assets (and so on) files that are generated. Also counted are the files in the "Managed" folder (Mono DLLs, your scripts in compiled DLL form, plus other managed DLLs in your project). + +All other files are not counted in the total build size. That includes native plugins. + +But take note, native plugins will still show up in the asset lists, it is only that their size that is not counted in the "Total Used Assets Size". + + +Files in your StreamingAssets folder are not included in the "Used Assets Size Breakdown" table. However, their total size is still indicated, and those files are still included in the "Used Assets" list. + + +In desktop builds, you may find a "unity default resources" file in your build. Inside that are defaults, like the default GUI Skin, default font for the GUI, default shaders, the built-in cube, cylinder, or capsule, default white material, etc. + +That file is also not counted in the Build Report. + +See discussion here: http://forum.unity3d.com/threads/120081-unity-default-resources + + +In Windows, your resulting .exe file is also not considered in the Build Report as that is considered a "boilerplate" resource. The contents of your .exe file is largely standard among all Windows programs built in Unity, with some minor changes. + + +In web builds, your .unity3d file is a compressed archive of all your used assets, your Unity scene files, your scripts' resulting managed DLLs, any managed DLLs from the Mono standard library your build needs, plus any managed DLLs that you explicitly included. + +Take note there are several Mono libraries that cannot be included for web due to considerations for web browser security. + + +In iOS builds, the total build size only represents the size of the game before it gets compiled and packaged into an .app file in Xcode. The size may get smaller once it gets packaged into an .ipa file. + + +Note: Managed DLLs mean DLL files containing compiled .NET/Mono code. Native DLLs mean DLL files built out of code that wasn't .NET/Mono (usually C/C++). + + + + +=== Prefab Instances in Scenes === + +If you have prefab instances in a scene, they don't actually count in the editor log's build info. Why exactly, I'm not sure. + +My guess is things work this way: Actually during runtime, the concept of prefabs do not exist anymore. As far as Unity is concerned, they are all just game objects. + +Instantiate actually merely duplicates/clones an existing game object (whether it is currently residing in the scene or exists as a prefab in the assets folder). (side note: you can actually use Instantiate to duplicate a game object, even if it is not a prefab) + +As such, during runtime, prefab connections get lost. Once you run the game, prefab instances are simply considered regular game objects. I assume the same thing happens when you build your game. + +So the prefab files in your project are not included in the build. Instead, the individual prefab instances that are in your scenes are the ones counted in the file size (technically their file sizes are in the scene files' file sizes). + +Two exceptions: + +1. If your prefab file is in a Resources folder, it gets included in the build. +2. If your prefab is referenced from a script via a variable/field, then it is included in the build. + +Basically what it means is if you created your code in such a way that you need to instantiate a prefab at runtime (regardless of whether an instance of it is in the scene already or not) then Unity has no choice but to include it in the build. + +So you may find some prefab files in the "Used Assets" section that do not show a size reading. Those are the prefabs that were used in scenes but are not in a Resources folder, nor referenced as a variable. + + + + +=== Size Readings === + +Why is the build size larger when shown in Windows Explorer? + +You may find that the sizes in the Build Report Tool are different from the sizes of the files on disk. This is normal. Here is a good explanation why: http://superuser.com/questions/66825/what-is-the-difference-between-size-and-size-on-disk + +Quote: + +We know that a disk is made up of Tracks and Sectors. In Windows that means the OS allocates space for files in "clusters" or "allocation units". + +The size of a cluster can vary, but typical ranges are from 512 bytes to 32K or more. For example, on my C:\ drive, the allocation unit is 4096 bytes. This means that Windows will allocate 4096 bytes for any file or portion of a file that is from 1 to 4096 bytes in length. + +... + +Another example would be if I have a file that is 2000 bytes in size. The file size on disk would be 4096 bytes. The reason is, because even though the entire file can fit inside one allocation unit, it still takes up 4096 of space (one allocation unit) on disk (only one file can use an allocation unit and cannot be shared with other files). + +So the size on disk is the space of all those sectors in which the file is saved. That means, usually, the size on disk is always greater than the actual size. + +End quote. + + +Suffice to say that when your game/app will be downloaded over the Internet, the amount that needs to be transferred is the size reading that you see in the Build Report Tool, not the size reading on your disk. + +Side note: Size readings in the Build Report window that have fractional parts are rounded up by two decimal places. + + + + +=== Licenses === + +Build Report Tool uses FuzzyString (https://github.com/kdjones/fuzzystring), an approximate string comparision library. FuzzyString is in the Eclipse Public License (EPL). A copy of the license can be found in BuildReport/Scripts/Editor/FuzzyString/FuzzyStringLicense.txt + +Build Report Tool uses MiniJSON (https://github.com/AnomalousUnderdog/MiniJSON.cs), a small JSON parser. Copyright (c) 2013 Calvin Rien. MiniJSON is licensed under the MIT License. A copy of the license can be found in BuildReport/Scripts/Editor/MiniJSON/MiniJSON.cs + + + + +=== Additional Notes === + +Don't worry, the assets that the Build Report Tool itself uses won't be included in your build. + + + +Copyright © 2013-2022 by Anomalous Underdog + +For support, you can either: + +* send me a tweet at http://twitter.com/AnomalusUndrdog +* send me a private message in the Unity forums (http://forum.unity3d.com/members/8479-AnomalusUndrdog) +* send me an email at anomalous_underdog@yahoo.com \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/README.txt.meta b/Assets/Third Parties/BuildReport/README.txt.meta new file mode 100644 index 00000000..23fd540e --- /dev/null +++ b/Assets/Third Parties/BuildReport/README.txt.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b4da379d061f9f749bca47f296b5440c diff --git a/Assets/Third Parties/BuildReport/Scripts.meta b/Assets/Third Parties/BuildReport/Scripts.meta new file mode 100644 index 00000000..7d55cbf6 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bfd621b2a57848343a0f44c619a16738 diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor.meta b/Assets/Third Parties/BuildReport/Scripts/Editor.meta new file mode 100644 index 00000000..90619387 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 39eb7498cc81e4d4dbedb83cbc8000de diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/BRT_VersionInfo.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/BRT_VersionInfo.cs new file mode 100644 index 00000000..5c32b138 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/BRT_VersionInfo.cs @@ -0,0 +1,7 @@ +namespace BuildReportTool +{ + public static class Info + { + public const string ReadableVersion = "Build Report Tool v3.11.9"; + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/BRT_VersionInfo.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/BRT_VersionInfo.cs.meta new file mode 100644 index 00000000..cebbd37b --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/BRT_VersionInfo.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 70fb2953aa9990f4e81dfe9ff2142917 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/BuildReportTool.asmdef b/Assets/Third Parties/BuildReport/Scripts/Editor/BuildReportTool.asmdef new file mode 100644 index 00000000..a344ed65 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/BuildReportTool.asmdef @@ -0,0 +1,15 @@ +{ + "name": "BuildReportTool", + "references": [], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/BuildReportTool.asmdef.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/BuildReportTool.asmdef.meta new file mode 100644 index 00000000..924e0f3e --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/BuildReportTool.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 050ecfeccd482f24a8fcc4e107befa75 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString.meta new file mode 100644 index 00000000..fe47d33b --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 6b0f5b37c5f879a498fece214132bbda +folderAsset: yes +timeCreated: 1480240136 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/ApproximatelyEquals.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/ApproximatelyEquals.cs new file mode 100644 index 00000000..40b7134b --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/ApproximatelyEquals.cs @@ -0,0 +1,155 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FuzzyString +{ + public static partial class ComparisonMetrics + { + public static double GetFuzzyEqualityScore(this string source, string target, params FuzzyStringComparisonOptions[] options) + { + List comparisonResults = new List(); + + if (!options.Contains(FuzzyStringComparisonOptions.CaseSensitive)) + { + source = source.Capitalize(); + target = target.Capitalize(); + } + + // Min: 0 Max: source.Length = target.Length + if (options.Contains(FuzzyStringComparisonOptions.UseHammingDistance)) + { + if (source.Length == target.Length) + { + comparisonResults.Add(source.HammingDistance(target)/target.Length); + } + } + + // Min: 0 Max: 1 + if (options.Contains(FuzzyStringComparisonOptions.UseJaccardDistance)) + { + comparisonResults.Add(source.JaccardDistance(target)); + } + + // Min: 0 Max: 1 + if (options.Contains(FuzzyStringComparisonOptions.UseJaroDistance)) + { + comparisonResults.Add(source.JaroDistance(target)); + } + + // Min: 0 Max: 1 + if (options.Contains(FuzzyStringComparisonOptions.UseJaroWinklerDistance)) + { + comparisonResults.Add(source.JaroWinklerDistance(target)); + } + + // Min: 0 Max: LevenshteinDistanceUpperBounds - LevenshteinDistanceLowerBounds + // Min: LevenshteinDistanceLowerBounds Max: LevenshteinDistanceUpperBounds + if (options.Contains(FuzzyStringComparisonOptions.UseNormalizedLevenshteinDistance)) + { + comparisonResults.Add(Convert.ToDouble(source.NormalizedLevenshteinDistance(target))/ + Convert.ToDouble((Math.Max(source.Length, target.Length) - source.LevenshteinDistanceLowerBounds(target)))); + } + else if (options.Contains(FuzzyStringComparisonOptions.UseLevenshteinDistance)) + { + comparisonResults.Add(Convert.ToDouble(source.LevenshteinDistance(target))/ + Convert.ToDouble(source.LevenshteinDistanceUpperBounds(target))); + } + + if (options.Contains(FuzzyStringComparisonOptions.UseLongestCommonSubsequence)) + { + comparisonResults.Add(1 - + Convert.ToDouble((source.LongestCommonSubsequence(target).Length)/ + Convert.ToDouble(Math.Min(source.Length, target.Length)))); + } + + if (options.Contains(FuzzyStringComparisonOptions.UseLongestCommonSubstring)) + { + comparisonResults.Add(1 - + Convert.ToDouble((source.LongestCommonSubstring(target).Length)/ + Convert.ToDouble(Math.Min(source.Length, target.Length)))); + } + + // Min: 0 Max: 1 + if (options.Contains(FuzzyStringComparisonOptions.UseSorensenDiceDistance)) + { + comparisonResults.Add(source.SorensenDiceDistance(target)); + } + + // Min: 0 Max: 1 + if (options.Contains(FuzzyStringComparisonOptions.UseOverlapCoefficient)) + { + comparisonResults.Add(1 - source.OverlapCoefficient(target)); + } + + // Min: 0 Max: 1 + if (options.Contains(FuzzyStringComparisonOptions.UseRatcliffObershelpSimilarity)) + { + comparisonResults.Add(1 - source.RatcliffObershelpSimilarity(target)); + } + + return comparisonResults.Average(); + } + + + public static bool ApproximatelyEquals(this string source, string target, FuzzyStringComparisonTolerance tolerance, params FuzzyStringComparisonOptions[] options) + { + if (options.Length == 0) + { + return false; + } + + var score = source.GetFuzzyEqualityScore(target, options); + + if (tolerance == FuzzyStringComparisonTolerance.Strong) + { + if (score < 0.25) + { + return true; + } + else + { + return false; + } + } + else if (tolerance == FuzzyStringComparisonTolerance.Normal) + { + if (score < 0.5) + { + return true; + } + else + { + return false; + } + } + else if (tolerance == FuzzyStringComparisonTolerance.Weak) + { + if (score < 0.75) + { + return true; + } + else + { + return false; + } + } + else if (tolerance == FuzzyStringComparisonTolerance.Manual) + { + if (score > 0.6) + { + return true; + } + else + { + return false; + } + } + else + { + return false; + } + } + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/ApproximatelyEquals.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/ApproximatelyEquals.cs.meta new file mode 100644 index 00000000..62bb9f83 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/ApproximatelyEquals.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 52c9e315ce408da44a5051f07f4d77c2 +timeCreated: 1480240216 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringComparisonOptions.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringComparisonOptions.cs new file mode 100644 index 00000000..da39996d --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringComparisonOptions.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FuzzyString +{ + public enum FuzzyStringComparisonOptions + { + UseHammingDistance, + + UseJaccardDistance, + + UseJaroDistance, + + UseJaroWinklerDistance, + + UseLevenshteinDistance, + + UseLongestCommonSubsequence, + + UseLongestCommonSubstring, + + UseNormalizedLevenshteinDistance, + + UseOverlapCoefficient, + + UseRatcliffObershelpSimilarity, + + UseSorensenDiceDistance, + + UseTanimotoCoefficient, + + CaseSensitive + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringComparisonOptions.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringComparisonOptions.cs.meta new file mode 100644 index 00000000..2de16ecb --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringComparisonOptions.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8418a062dc45ffa41b5edf5f6c1ace75 +timeCreated: 1480240216 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringComparisonTolerance.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringComparisonTolerance.cs new file mode 100644 index 00000000..421c2024 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringComparisonTolerance.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FuzzyString +{ + public enum FuzzyStringComparisonTolerance + { + Strong, + + Normal, + + Weak, + + Manual + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringComparisonTolerance.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringComparisonTolerance.cs.meta new file mode 100644 index 00000000..801028a8 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringComparisonTolerance.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 142b46597f1b8c649a575d39d52f0e60 +timeCreated: 1480240216 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringLicense.txt b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringLicense.txt new file mode 100644 index 00000000..89cc8ae7 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringLicense.txt @@ -0,0 +1,87 @@ +Eclipse Public License -v 1.0 + +THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT. + +1. DEFINITIONS + +"Contribution" means: + +a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and + +b) in the case of each subsequent Contributor: + +i) changes to the Program, and + +ii) additions to the Program; + +where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. + +"Contributor" means any person or entity that distributes the Program. + +"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. + +"Program" means the Contributions distributed in accordance with this Agreement. + +"Recipient" means anyone who receives the Program under this Agreement, including all Contributors. + +2. GRANT OF RIGHTS + +a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. + +b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. + +c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program. + +d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. + +3. REQUIREMENTS + +A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: + +a) it complies with the terms and conditions of this Agreement; and + +b) its license agreement: + +i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; + +ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; + +iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and + +iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. + +When the Program is made available in source code form: + +a) it must be made available under this Agreement; and + +b) a copy of this Agreement must be included with each copy of the Program. + +Contributors may not remove or alter any copyright notices contained within the Program. + +Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. + +4. COMMERCIAL DISTRIBUTION + +Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. + +For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. + +5. NO WARRANTY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. + +6. DISCLAIMER OF LIABILITY + +EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. GENERAL + +If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. + +If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. + +All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. + +Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. + +This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringLicense.txt.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringLicense.txt.meta new file mode 100644 index 00000000..cc1f841b --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/FuzzyStringLicense.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 231bc3d9a68d6444b82e673f1aa4aeee +timeCreated: 1480240220 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/HammingDistance.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/HammingDistance.cs new file mode 100644 index 00000000..d87f8881 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/HammingDistance.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FuzzyString +{ + public static partial class ComparisonMetrics + { + public static int HammingDistance(this string source, string target) + { + int distance = 0; + + if (source.Length == target.Length) + { + for (int i = 0; i < source.Length; i++) + { + if (!source[i].Equals(target[i])) + { + distance++; + } + } + return distance; + } + else { return 99999; } + } + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/HammingDistance.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/HammingDistance.cs.meta new file mode 100644 index 00000000..b5df2c08 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/HammingDistance.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 442805575a155b34eb98cbef87ee3955 +timeCreated: 1480240216 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaccardDistance.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaccardDistance.cs new file mode 100644 index 00000000..261fcc97 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaccardDistance.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FuzzyString +{ + public static partial class ComparisonMetrics + { + public static double JaccardDistance(this string source, string target) + { + return 1 - source.JaccardIndex(target); + } + + public static double JaccardIndex(this string source, string target) + { + return (Convert.ToDouble(source.Intersect(target).Count())) / (Convert.ToDouble(source.Union(target).Count())); + } + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaccardDistance.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaccardDistance.cs.meta new file mode 100644 index 00000000..9c9abc4e --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaccardDistance.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6d1e6db0392d10341a8c25c2154ddcee +timeCreated: 1480240216 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaroDistance.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaroDistance.cs new file mode 100644 index 00000000..e7201070 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaroDistance.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FuzzyString +{ + public static partial class ComparisonMetrics + { + public static double JaroDistance(this string source, string target) + { + int m = source.Intersect(target).Count(); + + if (m == 0) { return 0; } + else + { + string sourceTargetIntersetAsString = ""; + string targetSourceIntersetAsString = ""; + IEnumerable sourceIntersectTarget = source.Intersect(target); + IEnumerable targetIntersectSource = target.Intersect(source); + foreach (char character in sourceIntersectTarget) { sourceTargetIntersetAsString += character; } + foreach (char character in targetIntersectSource) { targetSourceIntersetAsString += character; } + double t = sourceTargetIntersetAsString.LevenshteinDistance(targetSourceIntersetAsString) / 2; + return ((m / source.Length) + (m / target.Length) + ((m - t) / m)) / 3; + } + } + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaroDistance.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaroDistance.cs.meta new file mode 100644 index 00000000..4ed9c3f3 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaroDistance.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 91f3890fdf8883346ad1f5871d897baf +timeCreated: 1480240216 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaroWinklerDistance.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaroWinklerDistance.cs new file mode 100644 index 00000000..4879096c --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaroWinklerDistance.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FuzzyString +{ + public static partial class ComparisonMetrics + { + public static double JaroWinklerDistance(this string source, string target) + { + double jaroDistance = source.JaroDistance(target); + double commonPrefixLength = CommonPrefixLength(source, target); + + return jaroDistance + (commonPrefixLength * 0.1 * (1 - jaroDistance)); + } + + public static double JaroWinklerDistanceWithPrefixScale(string source, string target, double p) + { + double prefixScale = 0.1; + + if (p > 0.25) { prefixScale = 0.25; } // The maximu value for distance to not exceed 1 + else if (p < 0) { prefixScale = 0; } // The Jaro Distance + else { prefixScale = p; } + + double jaroDistance = source.JaroDistance(target); + double commonPrefixLength = CommonPrefixLength(source, target); + + return jaroDistance + (commonPrefixLength * prefixScale * (1 - jaroDistance)); + } + + private static double CommonPrefixLength(string source, string target) + { + int maximumPrefixLength = 4; + int commonPrefixLength = 0; + if (source.Length <= 4 || target.Length <= 4) { maximumPrefixLength = Math.Min(source.Length, target.Length); } + + for (int i = 0; i < maximumPrefixLength; i++) + { + if (source[i].Equals(target[i])) { commonPrefixLength++; } + else { return commonPrefixLength; } + } + + return commonPrefixLength; + } + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaroWinklerDistance.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaroWinklerDistance.cs.meta new file mode 100644 index 00000000..14bc4ed9 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/JaroWinklerDistance.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: b91a749102d81ad4daf9827850ead7dc +timeCreated: 1480240217 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LevenshteinDistance.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LevenshteinDistance.cs new file mode 100644 index 00000000..2acd98ad --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LevenshteinDistance.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FuzzyString +{ + public static partial class ComparisonMetrics + { + public static int LevenshteinDistance(this string source, string target) + { + if (source.Length == 0) { return target.Length; } + if (target.Length == 0) { return source.Length; } + + int distance = 0; + + if (source[source.Length - 1] == target[target.Length - 1]) { distance = 0; } + else { distance = 1; } + + return Math.Min(Math.Min(LevenshteinDistance(source.Substring(0, source.Length - 1), target) + 1, + LevenshteinDistance(source, target.Substring(0, target.Length - 1))) + 1, + LevenshteinDistance(source.Substring(0, source.Length - 1), target.Substring(0, target.Length - 1)) + distance); + } + + public static double NormalizedLevenshteinDistance(this string source, string target) + { + int unnormalizedLevenshteinDistance = source.LevenshteinDistance(target); + + return unnormalizedLevenshteinDistance - source.LevenshteinDistanceLowerBounds(target); + } + + public static int LevenshteinDistanceUpperBounds(this string source, string target) + { + // If the two strings are the same length then the Hamming Distance is the upper bounds of the Levenshtien Distance. + if (source.Length == target.Length) { return source.HammingDistance(target); } + + // Otherwise, the upper bound is the length of the longer string. + else if (source.Length > target.Length) { return source.Length; } + else if (target.Length > source.Length) { return target.Length; } + + return 9999; + } + + public static int LevenshteinDistanceLowerBounds(this string source, string target) + { + // If the two strings are the same length then the lower bound is zero. + if (source.Length == target.Length) { return 0; } + + // If the two strings are different lengths then the lower bounds is the difference in length. + else { return Math.Abs(source.Length - target.Length); } + } + + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LevenshteinDistance.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LevenshteinDistance.cs.meta new file mode 100644 index 00000000..e58efed1 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LevenshteinDistance.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d2eb81c9a38774d48ae2e2788e109092 +timeCreated: 1480240217 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LongestCommonSubsequence.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LongestCommonSubsequence.cs new file mode 100644 index 00000000..25ba16b8 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LongestCommonSubsequence.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FuzzyString +{ + public static partial class ComparisonMetrics + { + public static string LongestCommonSubsequence(this string source, string target) + { + int[,] C = LongestCommonSubsequenceLengthTable(source, target); + + return Backtrack(C, source, target, source.Length, target.Length); + } + + private static int[,] LongestCommonSubsequenceLengthTable(string source, string target) + { + int[,] C = new int[source.Length + 1, target.Length + 1]; + + for (int i = 0; i < source.Length + 1; i++) { C[i, 0] = 0; } + for (int j = 0; j < target.Length + 1; j++) { C[0, j] = 0; } + + for (int i = 1; i < source.Length + 1; i++) + { + for (int j = 1; j < target.Length + 1; j++) + { + if (source[i - 1].Equals(target[j - 1])) + { + C[i, j] = C[i - 1, j - 1] + 1; + } + else + { + C[i, j] = Math.Max(C[i, j - 1], C[i - 1, j]); + } + } + } + + return C; + } + + private static string Backtrack(int[,] C, string source, string target, int i, int j) + { + if (i == 0 || j == 0) + { + return ""; + } + else if (source[i - 1].Equals(target[j - 1])) + { + return Backtrack(C, source, target, i - 1, j - 1) + source[i - 1]; + } + else + { + if (C[i, j - 1] > C[i - 1, j]) + { + return Backtrack(C, source, target, i, j - 1); + } + else + { + return Backtrack(C, source, target, i - 1, j); + } + } + } + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LongestCommonSubsequence.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LongestCommonSubsequence.cs.meta new file mode 100644 index 00000000..9af14441 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LongestCommonSubsequence.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: e92ef006685958347b7bac1e79a34956 +timeCreated: 1480240217 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LongestCommonSubstring.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LongestCommonSubstring.cs new file mode 100644 index 00000000..b05afde3 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LongestCommonSubstring.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FuzzyString +{ + public static partial class ComparisonMetrics + { + public static string LongestCommonSubstring(this string source, string target) + { + if (String.IsNullOrEmpty(source) || String.IsNullOrEmpty(target)) { return null; } + + int[,] L = new int[source.Length, target.Length]; + int maximumLength = 0; + int lastSubsBegin = 0; + StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 0; i < source.Length; i++) + { + for (int j = 0; j < target.Length; j++) + { + if (source[i] != target[j]) + { + L[i, j] = 0; + } + else + { + if ((i == 0) || (j == 0)) + L[i, j] = 1; + else + L[i, j] = 1 + L[i - 1, j - 1]; + + if (L[i, j] > maximumLength) + { + maximumLength = L[i, j]; + int thisSubsBegin = i - L[i, j] + 1; + if (lastSubsBegin == thisSubsBegin) + {//if the current LCS is the same as the last time this block ran + stringBuilder.Append(source[i]); + } + else //this block resets the string builder if a different LCS is found + { + lastSubsBegin = thisSubsBegin; + stringBuilder.Length = 0; //clear it + stringBuilder.Append(source.Substring(lastSubsBegin, (i + 1) - lastSubsBegin)); + } + } + } + } + } + + return stringBuilder.ToString(); + } + + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LongestCommonSubstring.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LongestCommonSubstring.cs.meta new file mode 100644 index 00000000..b9863aeb --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/LongestCommonSubstring.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 6c12917da8d444f4ead18cda49cb1b0a +timeCreated: 1480240216 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/Operations.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/Operations.cs new file mode 100644 index 00000000..6a39e951 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/Operations.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FuzzyString +{ + public static partial class Operations + { + public static string Capitalize(this string source) + { + return source.ToUpper(); + } + + public static string[] SplitIntoIndividualElements(string source) + { + string[] stringCollection = new string[source.Length]; + + for (int i = 0; i < stringCollection.Length; i++) + { + stringCollection[i] = source[i].ToString(); + } + + return stringCollection; + } + + public static string MergeIndividualElementsIntoString(IEnumerable source) + { + string returnString = ""; + + for (int i = 0; i < source.Count(); i++) + { + returnString += source.ElementAt(i); + } + return returnString; + } + + public static List ListPrefixes(this string source) + { + List prefixes = new List(); + + for (int i = 0; i < source.Length; i++) + { + prefixes.Add(source.Substring(0, i)); + } + + return prefixes; + } + + public static List ListBiGrams(this string source) + { + return ListNGrams(source, 2); + } + + public static List ListTriGrams(this string source) + { + return ListNGrams(source, 3); + } + + public static List ListNGrams(this string source, int n) + { + List nGrams = new List(); + + if (n > source.Length) + { + return null; + } + else if (n == source.Length) + { + nGrams.Add(source); + return nGrams; + } + else + { + for (int i = 0; i < source.Length - n; i++) + { + nGrams.Add(source.Substring(i, n)); + } + + return nGrams; + } + } + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/Operations.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/Operations.cs.meta new file mode 100644 index 00000000..fd6bd942 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/Operations.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 1099ad1dfff8e364bbfd13fa796b6ad3 +timeCreated: 1480240216 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/OverlapCoefficient.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/OverlapCoefficient.cs new file mode 100644 index 00000000..ac4d49e7 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/OverlapCoefficient.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FuzzyString +{ + public static partial class ComparisonMetrics + { + public static double OverlapCoefficient(this string source, string target) + { + return (Convert.ToDouble(source.Intersect(target).Count())) / Convert.ToDouble(Math.Min(source.Length, target.Length)); + } + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/OverlapCoefficient.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/OverlapCoefficient.cs.meta new file mode 100644 index 00000000..2dee03b0 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/OverlapCoefficient.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 9d9e58b928ef76c45b076d10be498295 +timeCreated: 1480240216 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/RatcliffObershelpSimilarity.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/RatcliffObershelpSimilarity.cs new file mode 100644 index 00000000..ccff42ef --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/RatcliffObershelpSimilarity.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FuzzyString +{ + public static partial class ComparisonMetrics + { + public static double RatcliffObershelpSimilarity(this string source, string target) + { + return (2 * Convert.ToDouble(source.Intersect(target).Count())) / (Convert.ToDouble(source.Length + target.Length)); + } + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/RatcliffObershelpSimilarity.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/RatcliffObershelpSimilarity.cs.meta new file mode 100644 index 00000000..11af97ab --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/RatcliffObershelpSimilarity.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 91761eda3a4ce614d8e6155b58573f9e +timeCreated: 1480240216 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/SorensenDiceDistance.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/SorensenDiceDistance.cs new file mode 100644 index 00000000..35a70107 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/SorensenDiceDistance.cs @@ -0,0 +1,20 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FuzzyString +{ + public static partial class ComparisonMetrics + { + public static double SorensenDiceDistance(this string source, string target) + { + return 1 - source.SorensenDiceIndex(target); + } + + public static double SorensenDiceIndex(this string source, string target) + { + return (2 * Convert.ToDouble(source.Intersect(target).Count())) / (Convert.ToDouble(source.Length + target.Length)); + } + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/SorensenDiceDistance.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/SorensenDiceDistance.cs.meta new file mode 100644 index 00000000..b30499c7 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/SorensenDiceDistance.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: a4f986a8582fa1746b9341fb8600e0b5 +timeCreated: 1480240216 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/TanimotoCoefficient.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/TanimotoCoefficient.cs new file mode 100644 index 00000000..f759c851 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/TanimotoCoefficient.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace FuzzyString +{ + public static partial class ComparisonMetrics + { + public static double TanimotoCoefficient(this string source, string target) + { + double Na = source.Length; + double Nb = target.Length; + double Nc = source.Intersect(target).Count(); + + return Nc / (Na + Nb - Nc); + } + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/TanimotoCoefficient.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/TanimotoCoefficient.cs.meta new file mode 100644 index 00000000..f97ca487 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/FuzzyString/TanimotoCoefficient.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 81089ababf44160429ce96d78cef55a6 +timeCreated: 1480240216 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/MiniJSON.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/MiniJSON.meta new file mode 100644 index 00000000..33a070a7 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/MiniJSON.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 13a482ba4833cff4aaccee9b9e1c3fe6 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/MiniJSON/MiniJSON.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/MiniJSON/MiniJSON.cs new file mode 100644 index 00000000..a70d5014 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/MiniJSON/MiniJSON.cs @@ -0,0 +1,588 @@ +/* + * Copyright (c) 2013 Calvin Rien + * + * Based on the JSON parser by Patrick van Bergen + * http://techblog.procurios.nl/k/618/news/view/14605/14863/How-do-I-write-my-own-parser-for-JSON.html + * + * Simplified it so that it doesn't throw exceptions + * and can be used in Unity iPhone with maximum code stripping. + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Text; + +namespace MiniJSON { + // Example usage: + // + // using UnityEngine; + // using System.Collections; + // using System.Collections.Generic; + // using MiniJSON; + // + // public class MiniJSONTest : MonoBehaviour { + // void Start () { + // var jsonString = "{ \"array\": [1.44,2,3], " + + // "\"object\": {\"key1\":\"value1\", \"key2\":256}, " + + // "\"string\": \"The quick brown fox \\\"jumps\\\" over the lazy dog \", " + + // "\"unicode\": \"\\u3041 Men\u00fa sesi\u00f3n\", " + + // "\"int\": 65536, " + + // "\"float\": 3.1415926, " + + // "\"bool\": true, " + + // "\"null\": null }"; + // + // var dict = Json.Deserialize(jsonString) as Dictionary; + // + // Debug.Log("deserialized: " + dict.GetType()); + // Debug.Log("dict['array'][0]: " + ((List) dict["array"])[0]); + // Debug.Log("dict['string']: " + (string) dict["string"]); + // Debug.Log("dict['float']: " + (double) dict["float"]); // floats come out as doubles + // Debug.Log("dict['int']: " + (long) dict["int"]); // ints come out as longs + // Debug.Log("dict['unicode']: " + (string) dict["unicode"]); + // + // var str = Json.Serialize(dict); + // + // Debug.Log("serialized: " + str); + // } + // } + + /// + /// This class encodes and decodes JSON strings. + /// Spec. details, see http://www.json.org/ + /// + /// JSON uses Arrays and Objects. These correspond here to the datatypes IList and IDictionary. + /// All numbers are parsed to doubles. + /// + public static class Json { + /// + /// Parses the string json into a value + /// + /// A JSON string. + /// An List<object>, a Dictionary<string, object>, a double, an integer,a string, null, true, or false + public static object Deserialize(string json) { + // save the string for debug information + if (string.IsNullOrEmpty(json)) { + return null; + } + + return Parser.Parse(json); + } + + sealed class Parser : IDisposable { + const string WORD_BREAK = "{}[],:\""; + + public static bool IsWordBreak(char c) { + return Char.IsWhiteSpace(c) || WORD_BREAK.IndexOf(c) != -1; + } + + const string HEX_DIGIT = "0123456789ABCDEFabcdef"; + + public static bool IsHexDigit(char c) { + return HEX_DIGIT.IndexOf(c) != -1; + } + + enum TOKEN { + NONE, + CURLY_OPEN, + CURLY_CLOSE, + SQUARED_OPEN, + SQUARED_CLOSE, + COLON, + COMMA, + STRING, + NUMBER, + TRUE, + FALSE, + NULL + }; + + StringReader json; + + Parser(string jsonString) { + json = new StringReader(jsonString); + } + + public static object Parse(string jsonString) { + using (var instance = new Parser(jsonString)) { + return instance.ParseValue(); + } + } + + public void Dispose() { + json.Dispose(); + json = null; + } + + Dictionary ParseObject() { + Dictionary table = new Dictionary(); + + // ditch opening brace + json.Read(); + + // { + while (true) { + switch (NextToken) { + case TOKEN.NONE: + return null; + case TOKEN.COMMA: + continue; + case TOKEN.CURLY_CLOSE: + return table; + case TOKEN.STRING: + // name + string name = ParseString(); + if (name == null) { + return null; + } + + // : + if (NextToken != TOKEN.COLON) { + return null; + } + + // ditch the colon + json.Read(); + + // value + TOKEN valueToken = NextToken; + object value = ParseByToken(valueToken); + if(value==null && valueToken!=TOKEN.NULL) + return null; + table[name] = value; + break; + default: + return null; + } + } + } + + List ParseArray() { + List array = null; + + // ditch opening bracket + json.Read(); + + // [ + var parsing = true; + while (parsing) { + TOKEN nextToken = NextToken; + + switch (nextToken) { + case TOKEN.NONE: + return null; + case TOKEN.COMMA: + continue; + case TOKEN.SQUARED_CLOSE: + parsing = false; + break; + default: + object value = ParseByToken(nextToken); + if(value==null && nextToken!=TOKEN.NULL) + return null; + if (array == null) { + array = new List(); + } + array.Add(value); + break; + } + } + + if (array == null) { + array = new List(); + } + return array; + } + + object ParseValue() { + TOKEN nextToken = NextToken; + return ParseByToken(nextToken); + } + + object ParseByToken(TOKEN token) { + switch (token) { + case TOKEN.STRING: + return ParseString(); + case TOKEN.NUMBER: + return ParseNumber(); + case TOKEN.CURLY_OPEN: + return ParseObject(); + case TOKEN.SQUARED_OPEN: + return ParseArray(); + case TOKEN.TRUE: + return true; + case TOKEN.FALSE: + return false; + case TOKEN.NULL: + return null; + default: + return null; + } + } + + string ParseString() { + StringBuilder s = new StringBuilder(); + char c; + + // ditch opening quote + json.Read(); + + bool parsing = true; + while (parsing) { + + if (json.Peek() == -1) { + parsing = false; + break; + } + + c = NextChar; + switch (c) { + case '"': + parsing = false; + break; + case '\\': + if (json.Peek() == -1) { + parsing = false; + break; + } + + c = NextChar; + switch (c) { + case '"': + case '\\': + case '/': + s.Append(c); + break; + case 'b': + s.Append('\b'); + break; + case 'f': + s.Append('\f'); + break; + case 'n': + s.Append('\n'); + break; + case 'r': + s.Append('\r'); + break; + case 't': + s.Append('\t'); + break; + case 'u': + var hex = new char[4]; + + for (int i=0; i< 4; i++) { + hex[i] = NextChar; + if (!IsHexDigit(hex[i])) + return null; + } + + s.Append((char) Convert.ToInt32(new string(hex), 16)); + break; + } + break; + default: + s.Append(c); + break; + } + } + + return s.ToString(); + } + + object ParseNumber() { + string number = NextWord; + + if (number.IndexOf('.') == -1 && number.IndexOf('E') == -1 && number.IndexOf('e') == -1) { + long parsedInt; + Int64.TryParse(number, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out parsedInt); + if (parsedInt == 0) { + ulong parsedUInt; + UInt64.TryParse(number, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out parsedUInt); + return parsedUInt; + } + return parsedInt; + } + + double parsedDouble; + Double.TryParse(number, System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out parsedDouble); + return parsedDouble; + } + + void EatWhitespace() { + while (Char.IsWhiteSpace(PeekChar)) { + json.Read(); + + if (json.Peek() == -1) { + break; + } + } + } + + char PeekChar { + get { + return Convert.ToChar(json.Peek()); + } + } + + char NextChar { + get { + return Convert.ToChar(json.Read()); + } + } + + string NextWord { + get { + StringBuilder word = new StringBuilder(); + + while (!IsWordBreak(PeekChar)) { + word.Append(NextChar); + + if (json.Peek() == -1) { + break; + } + } + + return word.ToString(); + } + } + + TOKEN NextToken { + get { + EatWhitespace(); + + if (json.Peek() == -1) { + return TOKEN.NONE; + } + + switch (PeekChar) { + case '{': + return TOKEN.CURLY_OPEN; + case '}': + json.Read(); + return TOKEN.CURLY_CLOSE; + case '[': + return TOKEN.SQUARED_OPEN; + case ']': + json.Read(); + return TOKEN.SQUARED_CLOSE; + case ',': + json.Read(); + return TOKEN.COMMA; + case '"': + return TOKEN.STRING; + case ':': + return TOKEN.COLON; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + return TOKEN.NUMBER; + } + + switch (NextWord) { + case "false": + return TOKEN.FALSE; + case "true": + return TOKEN.TRUE; + case "null": + return TOKEN.NULL; + } + + return TOKEN.NONE; + } + } + } + + /// + /// Converts a IDictionary / IList object or a simple type (string, int, etc.) into a JSON string + /// + /// A Dictionary<string, object> / List<object> + /// A JSON encoded string, or null if object 'json' is not serializable + public static string Serialize(object obj) { + return Serializer.Serialize(obj); + } + + sealed class Serializer { + StringBuilder builder; + + Serializer() { + builder = new StringBuilder(); + } + + public static string Serialize(object obj) { + var instance = new Serializer(); + + instance.SerializeValue(obj); + + return instance.builder.ToString(); + } + + void SerializeValue(object value) { + IList asList; + IDictionary asDict; + string asStr; + + if (value == null) { + builder.Append("null"); + } else if ((asStr = value as string) != null) { + SerializeString(asStr); + } else if (value is bool) { + builder.Append((bool) value ? "true" : "false"); + } else if ((asList = value as IList) != null) { + SerializeArray(asList); + } else if ((asDict = value as IDictionary) != null) { + SerializeObject(asDict); + } else if (value is char) { + SerializeString(new string((char) value, 1)); + } else { + SerializeOther(value); + } + } + + void SerializeObject(IDictionary obj) { + bool first = true; + + builder.Append('{'); + + foreach (object e in obj.Keys) { + if (!first) { + builder.Append(','); + } + + SerializeString(e.ToString()); + builder.Append(':'); + + SerializeValue(obj[e]); + + first = false; + } + + builder.Append('}'); + } + + void SerializeArray(IList anArray) { + builder.Append('['); + + bool first = true; + + for (int i=0; i= 32) && (codepoint <= 126)) { + builder.Append(c); + } else { + builder.Append("\\u"); + builder.Append(codepoint.ToString("x4")); + } + break; + } + } + + builder.Append('\"'); + } + + void SerializeOther(object value) { + // NOTE: decimals lose precision during serialization. + // They always have, I'm just letting you know. + // Previously floats and doubles lost precision too. + if (value is float) { + var numberToString = ((float)value).ToString("R", System.Globalization.CultureInfo.InvariantCulture); + if (numberToString.IndexOf('.') < 0 && numberToString.IndexOf("E", StringComparison.OrdinalIgnoreCase) < 0) { + // if whole number, add a ".0" at the end + numberToString = string.Format("{0}.0", numberToString); + } + builder.Append(numberToString); + } else if (value is int + || value is uint + || value is long + || value is sbyte + || value is byte + || value is short + || value is ushort + || value is ulong) { + builder.Append(value); + } else if (value is double + || value is decimal) { + var numberToString = Convert.ToDouble(value).ToString("R", System.Globalization.CultureInfo.InvariantCulture); + if (numberToString.IndexOf('.') < 0 && numberToString.IndexOf("E", StringComparison.OrdinalIgnoreCase) < 0) { + // if whole number, add a ".0" at the end + numberToString = string.Format("{0}.0", numberToString); + } + builder.Append(numberToString); + } else { +#if UNITY_5_3_OR_NEWER + builder.Append(UnityEngine.JsonUtility.ToJson(value)); +#endif + } + } + } + } +} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/MiniJSON/MiniJSON.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/MiniJSON/MiniJSON.cs.meta new file mode 100644 index 00000000..db768667 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/MiniJSON/MiniJSON.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5b3621adf6fd24d4f9cc9b73338492c2 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Options.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Options.meta new file mode 100644 index 00000000..4efcfe74 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Options.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 01b9a87b36472424cac8f71d5f683dcc diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_FileFilters.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_FileFilters.cs new file mode 100644 index 00000000..d6622540 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_FileFilters.cs @@ -0,0 +1,476 @@ +using System; +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Xml.Serialization; + +namespace BuildReportTool +{ + [System.Serializable] + public class FileFilters + { + public FileFilters(string label, string[] filters) + { + _label = label; + + for (int n = 0, len = filters.Length; n < len; ++n) + { + _filtersDict.Add(filters[n], false); + var shouldBeAllLowerCase = true; + + if ((filters[n].StartsWith("/") || filters[n].StartsWith("Assets/", StringComparison.OrdinalIgnoreCase)) && + filters[n].EndsWith("/")) + { + _usesFolderFilter = true; + } + else if (filters[n].StartsWith(BUILT_IN_ASSET_KEYWORD, StringComparison.OrdinalIgnoreCase)) + { + _usesFolderFilter = true; + + // note: filters for built-in types are case-sensitive + shouldBeAllLowerCase = false; + + //Debug.Log("uses built-in: " + label + ", " + filters[n]); + } + else if (filters[n].StartsWith("\"") && filters[n].EndsWith("\"")) + { + _usesExactFileMatching = true; + } + + if (shouldBeAllLowerCase) + { + filters[n] = filters[n].ToLower(); + } + } + + _filtersList = filters; + } + + public FileFilters() + { + _label = ""; + } + + const string BUILT_IN_ASSET_KEYWORD = "Built-in"; + + + [SerializeField] + string _label; + + readonly Dictionary _filtersDict = new Dictionary(); + + [SerializeField] + string[] _filtersList; + + [SerializeField] + bool _usesFolderFilter; + + [SerializeField] + bool _usesExactFileMatching; + + public string Label + { + get { return _label; } + set { _label = value; } + } + + public string[] FiltersList + { + get { return _filtersList; } + set + { + _filtersList = value; + + for (int n = 0, len = _filtersList.Length; n < len; ++n) + { + _filtersDict.Add(_filtersList[n], false); + var shouldBeAllLowerCase = true; + + if ((_filtersList[n].StartsWith("/") || + _filtersList[n].StartsWith("Assets/", StringComparison.OrdinalIgnoreCase)) && + _filtersList[n].EndsWith("/")) + { + _usesFolderFilter = true; + } + else if (_filtersList[n].StartsWith(BUILT_IN_ASSET_KEYWORD, StringComparison.OrdinalIgnoreCase)) + { + _usesFolderFilter = true; + shouldBeAllLowerCase = false; + //Debug.Log("uses built-in: " + _label + ", " + _filtersList[n]); + } + else if (_filtersList[n].StartsWith("\"") && _filtersList[n].EndsWith("\"")) + { + _usesExactFileMatching = true; + } + + if (shouldBeAllLowerCase) + { + _filtersList[n] = _filtersList[n].ToLower(); + } + } + } + } + + + public string GetFileExt(string file) + { + int lastDotIdx = file.LastIndexOf(".", StringComparison.OrdinalIgnoreCase); + if (lastDotIdx == -1) return ""; + return file.Substring(lastDotIdx, file.Length - lastDotIdx); + } + + public bool IsFileInFilter(string file) + { + // ------------------------------------------------- + // try using folder filter method: + + if (_usesFolderFilter) + { + //Debug.Log(_label + " uses folder filter"); + for (int n = 0, len = _filtersList.Length; n < len; ++n) + { + // built-in asset compare is case-sensitive + if (_filtersList[n].StartsWith(BUILT_IN_ASSET_KEYWORD, StringComparison.OrdinalIgnoreCase) && + file.StartsWith(BUILT_IN_ASSET_KEYWORD, StringComparison.OrdinalIgnoreCase) && + file.IndexOf(_filtersList[n], StringComparison.OrdinalIgnoreCase) != -1) + { + return true; + } + + //Debug.Log(file + " ---- " + _filtersList[n]); + if ((_filtersList[n].StartsWith("/") || _filtersList[n].StartsWith("Assets/", StringComparison.OrdinalIgnoreCase)) && + _filtersList[n].EndsWith("/") && + file.IndexOf(_filtersList[n], StringComparison.OrdinalIgnoreCase) != -1) + { + return true; + } + } + } + + // ------------------------------------------------- + // if not found using folder filter method, try exact file matching next: + + if (_usesExactFileMatching) + { + //Debug.Log("_usesExactFileMatching"); + + string fileNameOnly = file.GetFileNameOnly(); + + for (int n = 0, len = _filtersList.Length; n < len; ++n) + { + //Debug.Log("in quotes: " + _filtersList[n] + " " + (_filtersList[n].StartsWith("\"") && _filtersList[n].EndsWith("\""))); + + + if (_filtersList[n].StartsWith("\"") && _filtersList[n].EndsWith("\"")) + { + string fileWithQuotes = string.Format("\"{0}\"", fileNameOnly); + + //Debug.Log("match? " + _filtersList[n] + " == " + fileWithQuotes); + + if (_filtersList[n].Equals(fileWithQuotes)) + { + return true; + } + } + } + } + + // ------------------------------------------------- + // if not found using exact file matching, try checking in dictionary next: + + var fileExtension = GetFileExt(file); + + if (_filtersDict.ContainsKey(fileExtension)) + { + return true; + } + + for (int n = 0, len = _filtersList.Length; n < len; ++n) + { + //Debug.Log("in quotes: " + _filtersList[n] + " " + (_filtersList[n].StartsWith("\"") && _filtersList[n].EndsWith("\""))); + + if (fileExtension.Equals(_filtersList[n], StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + + return false; + } + } + + + [System.Serializable, XmlRoot("FileFilterGroup")] + public class FileFilterGroup + { + [SerializeField] + FileFilters[] _fileFilters; + + public FileFilters[] FileFilters + { + get { return _fileFilters; } + set + { + _fileFilters = value; + InitNames(); + } + } + + [SerializeField] + string[] _names; + + public FileFilterGroup() + { + _fileFilters = null; + _names = null; + } + + public FileFilterGroup(FileFilters[] filters) + { + _fileFilters = filters; + InitNames(); + } + + void InitNames() + { + _names = new string[_fileFilters.Length + 2]; + + _names[0] = "All"; + + for (int n = 0, len = _fileFilters.Length; n < len; ++n) + { + _names[n + 1] = _fileFilters[n].Label; + } + + _names[_names.Length - 1] = "Unknown"; + } + + int _selectedFilterIdx; + + /// + /// -1 means "All" list. + /// + public int SelectedFilterIdx + { + get { return _selectedFilterIdx - 1; } + } + + public int GetSelectedFilterIdx() + { + return _selectedFilterIdx; + } + + public string GetSelectedFilterLabel() + { + return _selectedFilterIdx >= 1 && _selectedFilterIdx <= _fileFilters.Length ? _fileFilters[_selectedFilterIdx-1].Label : null; + } + + public int GetFilterIdx(string label) + { + for (int n = 0; n < _fileFilters.Length; ++n) + { + if (_fileFilters[n].Label == label) + { + return n; + } + } + + return -1; + } + + public void ForceSetSelectedFilterIdx(int idx) + { + if ((idx < _fileFilters.Length + 2) && idx >= 0) + { + _selectedFilterIdx = idx; + } + } + + const string UNPRESSED_STYLE_NAME = "ButtonNoContents"; + const string ALREADY_PRESSED_STYLE_NAME = "ButtonAlreadyPressed"; + + const string HAS_CONTENTS_UNPRESSED_STYLE_NAME = "ButtonHasContents"; + const string HAS_CONTENTS_ALREADY_PRESSED_STYLE_NAME = "ButtonAlreadyPressed"; + + GUIStyle GetStyleToUse(int assetNum, int selectedIdx, int idxOfThisGroup) + { + string styleToUse; + + if (assetNum > 0) + { + styleToUse = HAS_CONTENTS_UNPRESSED_STYLE_NAME; + if (selectedIdx == idxOfThisGroup) + { + styleToUse = HAS_CONTENTS_ALREADY_PRESSED_STYLE_NAME; + } + } + else + { + styleToUse = UNPRESSED_STYLE_NAME; + if (selectedIdx == idxOfThisGroup) + { + styleToUse = ALREADY_PRESSED_STYLE_NAME; + } + } + + var style = GUI.skin.FindStyle(styleToUse); + if (style == null) + { + return GUI.skin.button; + } + return style; + } + + public bool Draw(AssetList assetList, float width) + { + BuildReportTool.Options.FileFilterDisplay displayType = BuildReportTool.Options.GetOptionFileFilterDisplay(); + switch (displayType) + { + case BuildReportTool.Options.FileFilterDisplay.DropDown: + return DrawFiltersAsDropDown(assetList, width); + case BuildReportTool.Options.FileFilterDisplay.Buttons: + return DrawFiltersAsButtons(assetList, width); + } + + return false; + } + + bool DrawFiltersAsDropDown(AssetList assetList, float width) + { + var topBarLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TOP_BAR_LABEL_STYLE_NAME); + if (topBarLabelStyle == null) + { + topBarLabelStyle = GUI.skin.label; + } + + var topBarPopupStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.FILE_FILTER_POPUP_STYLE_NAME); + if (topBarPopupStyle == null) + { + topBarPopupStyle = GUI.skin.label; + } + + var changed = false; + GUILayout.BeginHorizontal(); + GUILayout.Space(3); + GUILayout.Label("Filter: ", topBarLabelStyle); + if (assetList != null && assetList.Labels != null && assetList.Labels.Length > 0) + { + var newSelectedFilterIdx = EditorGUILayout.Popup(_selectedFilterIdx, assetList.Labels, + topBarPopupStyle); + + if (newSelectedFilterIdx != _selectedFilterIdx) + { + _selectedFilterIdx = newSelectedFilterIdx; + assetList.SortIfNeeded(this); + changed = true; + } + } + + GUILayout.EndHorizontal(); + + return changed; + } + + bool DrawFiltersAsButtons(AssetList assetList, float width) + { + var changed = false; + GUILayout.BeginHorizontal(); + + float overallWidth = 0; + + + var styleToUse = GetStyleToUse(assetList.All.Length, _selectedFilterIdx, 0); + var label = string.Format("All ({0})", assetList.All.Length.ToString()); + + var widthToAdd = styleToUse.CalcSize(new GUIContent(label)).x; + + overallWidth += widthToAdd; + + if (GUILayout.Button(label, styleToUse)) + { + _selectedFilterIdx = 0; + assetList.SortIfNeeded(this); + changed = true; + } + + if (overallWidth >= width) + { + overallWidth = 0; + GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + } + + if (assetList.PerCategory != null && assetList.PerCategory.Length >= _fileFilters.Length) + { + for (int n = 0, len = _fileFilters.Length; n < len; ++n) + { + styleToUse = GetStyleToUse(assetList.PerCategory[n].Length, _selectedFilterIdx, n + 1); + label = string.Format("{0} ({1})", _fileFilters[n].Label, assetList.PerCategory[n].Length.ToString()); + + widthToAdd = styleToUse.CalcSize(new GUIContent(label)).x; + + if (overallWidth + widthToAdd >= width) + { + overallWidth = 0; + GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + } + + overallWidth += widthToAdd; + + if (GUILayout.Button(label, styleToUse)) + { + _selectedFilterIdx = n + 1; + assetList.SortIfNeeded(this); + changed = true; + } + } + + styleToUse = GetStyleToUse(assetList.PerCategory[assetList.PerCategory.Length - 1].Length, + _selectedFilterIdx, assetList.PerCategory.Length); + + label = string.Format("Unknown ({0})", + assetList.PerCategory[assetList.PerCategory.Length - 1].Length.ToString()); + widthToAdd = styleToUse.CalcSize(new GUIContent(label)).x; + if (overallWidth + widthToAdd >= width) + { + //overallWidth = 0; + GUILayout.EndHorizontal(); + GUILayout.BeginHorizontal(); + } + + if (GUILayout.Button(label, styleToUse)) + { + _selectedFilterIdx = assetList.PerCategory.Length; + assetList.SortIfNeeded(this); + changed = true; + } + } + + GUILayout.EndHorizontal(); + return changed; + } + + public FileFilters this[int idx] + { + get { return _fileFilters[idx]; } + } + + public int Count + { + get { return _fileFilters.Length; } + } + + public override string ToString() + { + string ret = "(" + _names.Length.ToString() + ") "; + + for (int n = 0, len = _names.Length; n < len; ++n) + { + ret += _names[n] + ", "; + } + + return ret; + } + } +} // namespace BuildReportTool \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_FileFilters.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_FileFilters.cs.meta new file mode 100644 index 00000000..4e22c086 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_FileFilters.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a0843a406dad03c43890250da06070e6 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_FiltersUsed.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_FiltersUsed.cs new file mode 100644 index 00000000..6313c26e --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_FiltersUsed.cs @@ -0,0 +1,322 @@ +#if UNITY_EDITOR + +using System.IO; +using System.Xml; +using System.Xml.Serialization; +using UnityEngine; + +namespace BuildReportTool +{ + public class FiltersUsed + { + static readonly FileFilterGroup DefaultFileFilters = new FileFilterGroup(CreateDefaultFileFilters()); + + static FileFilterGroup GetDefaultFileFilterGroup() + { + return DefaultFileFilters; + } + + static FileFilters[] CreateDefaultFileFilters() + { + return new[] + { + new FileFilters("Textures", + new[] + { + ".psd", + ".jpg", + ".jpeg", + ".gif", + ".png", + ".tiff", + ".tif", + ".tga", + ".bmp", + ".dds", + ".exr", + ".iff", + ".pict", + "Built-in Texture2D:", // Unity-generated sprite atlases + ".spriteatlasv2", // Sprite Atlas V2 + }), + new FileFilters("Models", + new[] + { + ".fbx", + ".dae", + ".mb", + ".ma", + ".max", + ".blend", + ".obj", + ".3ds", + ".dxf", + "Built-in Mesh:" + }), + new FileFilters("Prefabs", + new[] + { + ".prefab" + }), + new FileFilters("Animation", + new[] + { + ".anim", + ".controller", + ".mask" + }), + new FileFilters("Movies", + new[] + { + ".mov", + ".mpg", + ".mpeg", + ".mp4", + ".avi", + ".asf" + }), + new FileFilters("Materials", + new[] + { + ".mat", + ".sbsar", + ".cubemap", + ".flare", + ".terrainlayer", + "Built-in Material:" + }), + new FileFilters("Shaders", + new[] + { + ".shader", + ".compute", + ".cginc", + "Built-in Shader:" + }), + new FileFilters("GUI", + new[] + { + ".guiskin", + ".fontsettings", + ".ttf", + ".dfont", + ".otf" + }), + new FileFilters("Sounds", + new[] + { + ".mixer", + ".wav", + ".mp3", + ".ogg", + ".aif", + ".xm", + ".mod", + ".it", + ".s3m" + }), + new FileFilters("Scripts", + new[] + { + ".cs", + ".js", + ".boo", + "Built-in MonoScript:" + }), + new FileFilters("Plugins", + new[] + { + ".dll", // Windows + ".bundle", // Mac + ".so", // Android (C++) or Linux + ".jar", // Android (Java) + ".a", // iOS + ".m", // iOS + ".mm", // iOS + ".c", // iOS + ".cpp" // iOS + }), + new FileFilters("Text", + new[] + { + ".txt", + ".bytes", + ".html", + ".htm", + ".xml", + ".yaml", + ".json", + ".log" + }), + new FileFilters("Misc", + new[] + { + ".asset", + ".physicmaterial", + ".lighting", + ".unity" + }), + new FileFilters("Standard Assets", + new[] + { + "/Standard Assets/" + }), + new FileFilters("\"Resources\" Assets", + new[] + { + "/Resources/" + }), + new FileFilters("Streaming Assets", + new[] + { + "Assets/StreamingAssets/" + }), + new FileFilters("Editor", + new[] + { + "/Editor/" + }), + new FileFilters("Version Control", + new[] + { + "/.svn/", + "/.git/", + "/.cvs/" + }), + new FileFilters("Built-in Assets", + new[] + { + "Built-in", + "\"unity_builtin_extra\"" + }), + new FileFilters("Useless Files", + new[] + { + "\"Thumbs.db\"", + "\".DS_Store\"", + "\"._.DS_Store\"" + }) + }; + } + + static void SaveFileFilterGroupToFile(string saveFilePath, FileFilterGroup filterGroup) + { + System.Xml.Serialization.XmlSerializer x = new System.Xml.Serialization.XmlSerializer(typeof(FileFilterGroup)); + + saveFilePath = saveFilePath.Replace("\\", "/"); + + System.IO.TextWriter writer = new System.IO.StreamWriter(saveFilePath); + x.Serialize(writer, filterGroup); + writer.Close(); + + Debug.Log("Build Report Tool: Saved File Filter Group at \"" + saveFilePath + "\""); + } + + static FileFilterGroup AttemptLoadFileFiltersFromFile(string filePath) + { + FileFilterGroup ret; + + XmlSerializer x = new XmlSerializer(typeof(FileFilterGroup)); + + using (FileStream fs = new FileStream(filePath, FileMode.Open)) + { + XmlReader reader = new XmlTextReader(fs); + ret = (FileFilterGroup) x.Deserialize(reader); + fs.Close(); + } + + return ret; + } + + const string FILE_FILTERS_USED_FILENAME = "FileFiltersUsed.xml"; + + public static string GetProperFileFilterGroupToUseFilePath() + { + return GetProperFileFilterGroupToUseFilePath(BuildReportTool.Options.BuildReportSavePath); + } + + public static string GetProperFileFilterGroupToUseFilePath(string userFileFilterSavePath) + { + // attempt to get from Assets/BuildReport/Config/FileFiltersUsed.xml + // if none, attempt to get from ~/UnityBuildReports/FileFiltersUsed.xml + // if no dice, create a new FileFiltersUsed.xml in ~/UnityBuildReports/ and use that + + // attempt to get from default Build Report Tool folder: Assets/BuildReport/Config/FileFiltersUsed.xml + + string fileFilterGroupAtDefaultAssetsPath = + BuildReportTool.Options.BUILD_REPORT_TOOL_DEFAULT_PATH + "/" + FILE_FILTERS_USED_FILENAME; + + if (File.Exists(fileFilterGroupAtDefaultAssetsPath)) + { + return fileFilterGroupAtDefaultAssetsPath; + } + + + // search for Build Report Tool folder in all subfolders of Assets folder and look for file there + // maybe shouldn't do this? it's recursive and could be slow on project with hundreds of folders... +/* + string assetFolderPath = BuildReportTool.Util.FindAssetFolder(Application.dataPath, BuildReportTool.Config.BUILD_REPORT_TOOL_DEFAULT_FOLDER_NAME); + if (!string.IsNullOrEmpty(assetFolderPath)) + { + string fileFilterGroupAtFoundAssetsPath = assetFolderPath + "/" + FILE_FILTERS_USED_FILENAME; + + if (File.Exists(fileFilterGroupAtFoundAssetsPath)) + { + return fileFilterGroupAtFoundAssetsPath; + } + } +*/ + + string fileFilterGroupAtUserPersonalFolder = userFileFilterSavePath + "/" + FILE_FILTERS_USED_FILENAME; + if (File.Exists(fileFilterGroupAtUserPersonalFolder)) + { + //Debug.Log("will use file filter from user folder: " + fileFilterGroupAtUserPersonalFolder); + return fileFilterGroupAtUserPersonalFolder; + } + + string fileFilterGroupAtUserPersonalFolderDefaultName = + BuildReportTool.Util.GetUserHomeFolder() + "/" + BuildReportTool.Options.BUILD_REPORTS_DEFAULT_FOLDER_NAME + + "/" + FILE_FILTERS_USED_FILENAME; + if (File.Exists(fileFilterGroupAtUserPersonalFolderDefaultName)) + { + //Debug.Log("will use file filter from default user folder: " + fileFilterGroupAtUserPersonalFolderDefaultName); + return fileFilterGroupAtUserPersonalFolderDefaultName; + } + + // no dice. create a file filter group xml file at user personal folder + if (!Directory.Exists(userFileFilterSavePath)) + { + Debug.Log("Created a new Build Report File Filter Config XML File at " + userFileFilterSavePath); + Directory.CreateDirectory(userFileFilterSavePath); + } + + SaveFileFilterGroupToFile(fileFilterGroupAtUserPersonalFolder, DefaultFileFilters); + return fileFilterGroupAtUserPersonalFolder; + } + + + public static FileFilterGroup GetProperFileFilterGroupToUse() + { + return GetProperFileFilterGroupToUse(BuildReportTool.Options.BuildReportSavePath); + } + + public static FileFilterGroup GetProperFileFilterGroupToUse(string userFileFilterSavePath) + { + string fileFilterGroupPath = GetProperFileFilterGroupToUseFilePath(userFileFilterSavePath); + + //Debug.Log("fileFilterGroupPath: " + fileFilterGroupPath); + + FileFilterGroup ret = AttemptLoadFileFiltersFromFile(fileFilterGroupPath); + + if (ret != null) + { + return ret; + } + + Debug.LogError("Build Report Tool: Could not find proper File Filter Group to use."); + return null; + } + } +} // namespace BuildReportTool + +#endif \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_FiltersUsed.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_FiltersUsed.cs.meta new file mode 100644 index 00000000..edd2e03d --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_FiltersUsed.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a04b2835e79127b44a25b5b4b6a9e937 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_Options.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_Options.cs new file mode 100644 index 00000000..32ee33aa --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_Options.cs @@ -0,0 +1,2685 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Xml; +using System.Xml.Serialization; +using UnityEngine; + +namespace BuildReportTool +{ + /// + /// Class for holding options. + /// This is the class that is serialized when saving the options. + /// + [System.Serializable, XmlRoot("BuildReportToolOptions")] + public class SavedOptions + { + public string EditorLogOverridePath; + + public string BuildReportFolderName = BuildReportTool.Options.BUILD_REPORTS_DEFAULT_FOLDER_NAME; + + /// + /// Where build reports are saved to:
+ /// 0: in user's My Documents
+ /// 1: or outside the project folder. + ///
+ public int SaveType; + + public bool KeepCopyOfLogOfLastSuccessfulBuild = true; + + // ---------------------------------------------------------- + + public bool CollectBuildInfo = true; + public bool CalculateAssetDependencies = true; + public bool CalculateAssetDependenciesOnUnusedToo = false; + public bool CollectTextureImportSettings = true; + public bool CollectTextureImportSettingsOnUnusedToo = false; + public bool CollectMeshData = true; + public bool CollectMeshDataOnUnusedToo; + public bool CollectPrefabData = true; + + public bool GetProjectSettings = true; + + public bool IncludeUsedAssetsInReportCreation = true; + public bool IncludeUnusedAssetsInReportCreation = true; + public bool IncludeUnusedPrefabsInReportCreation = true; + public bool IncludeBuildSizeInReportCreation = true; + + public bool IncludeSvnInUnused = true; + public bool IncludeGitInUnused = true; + public bool IncludeBuildReportToolAssetsInUnused = true; + + public bool GetSizeBeforeBuildForUsedAssets = true; + public bool GetImportedSizesForUnusedAssets = true; + + public struct IgnorePattern + { + public int SearchType; + public string Pattern; + } + public List IgnorePatternsForUnused = new List(); + + // ---------------------------------------------------------- + + public string FileFilterNameForTextureData = "Textures"; + + public bool ShowTextureColumnTextureType = true; + public bool ShowTextureColumnIsSRGB = false; + public bool ShowTextureColumnAlphaSource = false; + public bool ShowTextureColumnAlphaIsTransparency = false; + public bool ShowTextureColumnIgnorePngGamma = false; + // ----------------------- + public bool ShowTextureColumnNPotScale = false; + public bool ShowTextureColumnIsReadable = false; + public bool ShowTextureColumnMipMapGenerated = false; + public bool ShowTextureColumnMipMapFilter = false; + public bool ShowTextureColumnStreamingMipMaps = false; + public bool ShowTextureColumnBorderMipMaps = false; + public bool ShowTextureColumnPreserveCoverageMipMaps = false; + public bool ShowTextureColumnFadeOutMipMaps = false; + // ----------------------- + public bool ShowTextureColumnSpriteImportMode = false; + public bool ShowTextureColumnSpritePackingTag = false; + public bool ShowTextureColumnSpritePixelsPerUnit = false; + public bool ShowTextureColumnQualifiesForSpritePacking = false; + // ----------------------- + public bool ShowTextureColumnWrapMode = false; + public bool ShowTextureColumnWrapModeU = false; + public bool ShowTextureColumnWrapModeV = false; + public bool ShowTextureColumnWrapModeW = false; + public bool ShowTextureColumnFilterMode = false; + public bool ShowTextureColumnAnisoLevel = false; + // ----------------------- + public bool ShowTextureColumnMaxTextureSize = false; + public bool ShowTextureColumnResizeAlgorithm = false; + public bool ShowTextureColumnTextureFormat = true; + public bool ShowTextureColumnCompressionType = false; + public bool ShowTextureColumnCompressionIsCrunched = false; + public bool ShowTextureColumnCompressionQuality = false; + // ----------------------- + public bool ShowTextureColumnImportedWidthAndHeight = true; + public bool ShowTextureColumnRealWidthAndHeight = false; + + // ---------------------------------------------------------- + + public string FileFilterNameForMeshData = "Models"; + + public bool ShowMeshColumnMeshFilterCount; + public bool ShowMeshColumnSkinnedMeshRendererCount; + public bool ShowMeshColumnSubMeshCount = true; + public bool ShowMeshColumnVertexCount; + public bool ShowMeshColumnTriangleCount = true; + public bool ShowMeshColumnAnimationType; + public bool ShowMeshColumnAnimationClipCount = true; + + // ---------------------------------------------------------- + + public string FileFilterNameForPrefabData = "Prefabs"; + + public bool ShowPrefabColumnContributeGI; + public bool ShowPrefabColumnBatchingStatic = true; + public bool ShowPrefabColumnOccluderStatic; + public bool ShowPrefabColumnOccludeeStatic; + public bool ShowPrefabColumnReflectionProbeStatic; + + public bool ShowPrefabColumnNavigationStatic; + public bool ShowPrefabColumnOffMeshLinkGeneration; + + // ---------------------------------------------------------- + + public bool ShowColumnAssetPath = true; + public bool ShowColumnSizeBeforeBuild = true; + public bool ShowColumnSizeInBuild = true; + + public bool ShowColumnUnusedRawSize = true; + public bool ShowColumnUnusedImportedSize = true; + + // ---------------------------------------------------------- + + public const int SEARCH_METHOD_BASIC = 0; + public const int SEARCH_METHOD_REGEX = 50; + public const int SEARCH_METHOD_FUZZY = 100; + + /// + /// Method of Search:
+ ///
+ ///
+ /// + ///
+ public int SearchType = SEARCH_METHOD_FUZZY; + public bool SearchFilenameOnly = true; + public bool SearchCaseSensitive = false; + + // ---------------------------------------------------------- + + public bool ShowProjectSettingsInMultipleColumns = true; + + public int LogMessagePaginationLength = 100; + + // ---------------------------------------------------------- + + /// + /// 0: Use file filters from global config.
+ /// 1: Use file filters embedded in the saved build report file. + ///
+ public int FilterToUseInt; + + public int AssetListPaginationLength = 300; + public bool ProcessUnusedAssetsInBatches = true; + public int UnusedAssetsEntriesPerBatch = 10000; + + public bool DoubleClickOnAssetWillPing = false; + + /// + /// Method of displaying labels that explain how one asset uses another.
+ /// 0: verbose (use words only)
+ /// 1: standard (use arrows when possible, use words for extra info)
+ /// 2: minimal (use arrows only, don't show extra info even if available) + ///
+ public int AssetUsageLabelType; + + public bool ShowAssetPrimaryUsersInTooltipIfAvailable = true; + + public bool ShowTooltipThumbnail = true; + + /// + /// 0: Thumbnail should appear when mouse is hovering over asset icon only.
+ /// 1: Thumbnail should appear when mouse is hovering over asset label too, not just on the icon. + ///
+ public int ShowThumbnailOnHoverType; + + public int TooltipThumbnailWidth = 256; + public int TooltipThumbnailHeight = 256; + + public int TooltipThumbnailZoomedInWidth = 512; + public int TooltipThumbnailZoomedInHeight = 512; + + public int NumberOfTopLargestUsedAssetsToShow = 10; + public int NumberOfTopLargestUnusedAssetsToShow = 10; + + // ---------------------------------------------------------- + + public bool AllowDeletingOfUsedAssets; + public bool ShowImportedSizeForUsedAssets = false; + + public bool AutoShowWindowAfterNormalBuild = true; + public bool AutoResortAssetsWhenUnityEditorRegainsFocus = false; + + public bool UseThreadedReportGeneration = true; + public bool UseThreadedFileLoading = false; + + // ---------------------------------------------------------- + + public void OnBeforeSave() + { + // get rid of invalid characters for folder name + // but still allow slash/backward slash so user could make relative paths + + BuildReportFolderName = BuildReportFolderName.Replace(":", string.Empty); + BuildReportFolderName = BuildReportFolderName.Replace("*", string.Empty); + BuildReportFolderName = BuildReportFolderName.Replace("?", string.Empty); + BuildReportFolderName = BuildReportFolderName.Replace("\"", string.Empty); + BuildReportFolderName = BuildReportFolderName.Replace("<", string.Empty); + BuildReportFolderName = BuildReportFolderName.Replace(">", string.Empty); + BuildReportFolderName = BuildReportFolderName.Replace("|", string.Empty); + } + + public static void Save(string savePath, SavedOptions optionsToSave) + { + optionsToSave.OnBeforeSave(); + + XmlSerializer x = new XmlSerializer(typeof(SavedOptions)); + TextWriter writer = new StreamWriter(savePath); + x.Serialize(writer, optionsToSave); + writer.Close(); + + //Debug.LogFormat("Build Report Tool: Saved options to: {0}", savePath); + } + + public static SavedOptions Load(string path) + { + SavedOptions result = null; + + XmlSerializer x = new XmlSerializer(typeof(SavedOptions)); + + try + { + using (FileStream fs = new FileStream(path, FileMode.Open)) + { + if (fs.Length == 0) + { + // nothing inside + return null; + } + + XmlReader reader = new XmlTextReader(fs); + result = (SavedOptions) x.Deserialize(reader); + fs.Close(); + } + } + catch (Exception e) + { + Debug.LogFormat( + "Build Report Tool: Error found upon loading options XML file in {0}\nWill create a new options file instead.\n\nError: {1}", + path, e); + return new SavedOptions(); + } + + //Debug.LogFormat("Build Report Tool: Loaded options from: {0}", path); + return result; + } + } + + public enum SearchType + { + Basic, + Regex = 50, + Fuzzy = 100 + } + + public static class Options + { + // ======================================================= + // constants + public const string BUILD_REPORT_PACKAGE_MOVED_MSG = "BuildReport package seems to have been moved. Finding..."; + + public const string BUILD_REPORT_PACKAGE_MISSING_MSG = + "Unable to find BuildReport package folder! Cannot find suitable GUI Skin.\nTry editing the source code and change the value\nof `BUILD_REPORT_TOOL_DEFAULT_PATH` to what path the Build Report Tool is in.\nMake sure the folder is named \"BuildReport\"."; + + public const string BUILD_REPORT_GUI_SKIN_MISSING_MSG = + "Unable to find BuildReport's GUI Skin! The GUI will not render properly.\nTry editing the source code and change the value\nof `BUILD_REPORT_TOOL_DEFAULT_PATH` to what path the Build Report Tool is in."; + + public const string BUILD_REPORT_TOOL_DEFAULT_PATH = "Assets/BuildReport"; + public const string BUILD_REPORT_TOOL_DEFAULT_FOLDER_NAME = "BuildReport"; + + public const string BUILD_REPORTS_DEFAULT_FOLDER_NAME = "UnityBuildReports"; + + + public const int SAVE_TYPE_PERSONAL = 0; + public const int SAVE_TYPE_PROJECT = 1; + + + public const int ASSET_USAGE_LABEL_TYPE_VERBOSE = 0; + public const int ASSET_USAGE_LABEL_TYPE_STANDARD = 1; + public const int ASSET_USAGE_LABEL_TYPE_MINIMAL = 2; + + // ======================================================= + // + static BuildReportTool.SavedOptions _savedOptions; + static string _foundPathForSavedOptions; + const string SAVED_OPTIONS_FILENAME = "BuildReportToolOptions.xml"; + + static string DefaultOptionsPath + { + get { return string.Format("{0}ProjectSettings/{1}", BuildReportTool.Util.GetProjectPath(Application.dataPath), SAVED_OPTIONS_FILENAME); } + } + + static bool IsBuildReportInRegularPaths + { + get + { + return Directory.Exists(string.Format("{0}/BuildReport", Application.dataPath)) || + Directory.Exists(string.Format("{0}/Plugins/BuildReport", Application.dataPath)); + } + } + + public static string FoundPathForSavedOptions + { + get { return _foundPathForSavedOptions; } + } + + static void InitializeOptionsIfNeeded() + { + if (_savedOptions == null) + { + _foundPathForSavedOptions = string.Empty; + } + + if (string.IsNullOrEmpty(_foundPathForSavedOptions)) + { + // look for the file in this order: + // 1. inside the BuildReport folder + // 2. at the very topmost Assets folder + // 3. outside the Assets folder + // 4. in the ProjectSettings folder + // 5. in the User's My Documents folder + + + // --------------------------------------------------- + // look in /Assets/BuildReport/ + var optionsInBuildReportFolder = DefaultOptionsPath; + if (File.Exists(optionsInBuildReportFolder)) + { + _savedOptions = BuildReportTool.SavedOptions.Load(optionsInBuildReportFolder); + _foundPathForSavedOptions = optionsInBuildReportFolder; + return; + } + + // --------------------------------------------------- + // look in /Assets/Plugins/BuildReport/ + var optionsInPluginsBuildReport = string.Format("{0}/Plugins/BuildReport/{1}", Application.dataPath, + SAVED_OPTIONS_FILENAME); + if (File.Exists(optionsInPluginsBuildReport)) + { + _savedOptions = BuildReportTool.SavedOptions.Load(optionsInPluginsBuildReport); + _foundPathForSavedOptions = optionsInPluginsBuildReport; + return; + } + + // --------------------------------------------------- + // search for "BuildReport" folder and look in there + if (!IsBuildReportInRegularPaths) + { + string customBuildReportFolder = + BuildReportTool.Util.FindAssetFolder(Application.dataPath, BUILD_REPORT_TOOL_DEFAULT_FOLDER_NAME); + if (!string.IsNullOrEmpty(customBuildReportFolder)) + { + var optionsInCustomBuildReportFolder = + string.Format("{0}/{1}", customBuildReportFolder, SAVED_OPTIONS_FILENAME); + if (File.Exists(optionsInCustomBuildReportFolder)) + { + _savedOptions = BuildReportTool.SavedOptions.Load(optionsInCustomBuildReportFolder); + _foundPathForSavedOptions = optionsInCustomBuildReportFolder; + return; + } + } + } + + // --------------------------------------------------- + // look in /Assets/ + var optionsInTopmostAssets = string.Format("{0}/{1}", Application.dataPath, SAVED_OPTIONS_FILENAME); + if (File.Exists(optionsInTopmostAssets)) + { + _savedOptions = BuildReportTool.SavedOptions.Load(optionsInTopmostAssets); + _foundPathForSavedOptions = optionsInTopmostAssets; + return; + } + + // --------------------------------------------------- + // look in Unity project folder (where Assets, Library, and ProjectSettings folder are) + var outsideAssets = BuildReportTool.Util.GetProjectPath(Application.dataPath); + var optionsOutsideAssets = string.Format("{0}{1}", outsideAssets, SAVED_OPTIONS_FILENAME); + if (File.Exists(optionsOutsideAssets)) + { + _savedOptions = BuildReportTool.SavedOptions.Load(optionsOutsideAssets); + _foundPathForSavedOptions = optionsOutsideAssets; + return; + } + + // --------------------------------------------------- + // look inside ProjectSettings folder + var optionsInProjectSettings = + string.Format("{0}ProjectSettings/{1}", outsideAssets, SAVED_OPTIONS_FILENAME); + //Debug.LogFormat("Looking in {0}", optionsInProjectSettings); + if (File.Exists(optionsInProjectSettings)) + { + _savedOptions = BuildReportTool.SavedOptions.Load(optionsInProjectSettings); + _foundPathForSavedOptions = optionsInProjectSettings; + return; + } + + // --------------------------------------------------- + // look in /My Documents/UnityBuildReports/ + var optionsInMyDocs = string.Format("{0}/{1}/{2}", BuildReportTool.Util.GetUserHomeFolder(), + BUILD_REPORTS_DEFAULT_FOLDER_NAME, SAVED_OPTIONS_FILENAME); + //Debug.LogFormat("Looking in {0}", optionsInMyDocs); + if (File.Exists(optionsInMyDocs)) + { + _savedOptions = BuildReportTool.SavedOptions.Load(optionsInMyDocs); + _foundPathForSavedOptions = optionsInMyDocs; + return; + } + + // --------------------------------------------------- + } + + // if the options file failed to load + // one last try + // + if (_savedOptions == null) + { + if (!string.IsNullOrEmpty(_foundPathForSavedOptions) && File.Exists(_foundPathForSavedOptions)) + { + // there's a valid options file already + // just load that one + _savedOptions = BuildReportTool.SavedOptions.Load(_foundPathForSavedOptions); + } + } + + // could not load the file, or there isn't one yet (at least, not in any recognized valid paths). + // so create a new one at the default path + if (_savedOptions == null) + { + _savedOptions = new BuildReportTool.SavedOptions(); + _foundPathForSavedOptions = DefaultOptionsPath; + + var defaultFolder = Path.GetDirectoryName(_foundPathForSavedOptions); + if (!string.IsNullOrEmpty(defaultFolder) && !Directory.Exists(defaultFolder)) + { + Directory.CreateDirectory(defaultFolder); + } + + SavedOptions.Save(_foundPathForSavedOptions, _savedOptions); + Debug.LogFormat("Build Report Tool: Created a new options file at: {0}", _foundPathForSavedOptions); + } + } + + public static void RefreshOptions() + { + _foundPathForSavedOptions = string.Empty; + _savedOptions = null; + InitializeOptionsIfNeeded(); + } + + public static void SaveOptions() + { + if (string.IsNullOrEmpty(_foundPathForSavedOptions)) + { + return; + } + + if (_savedOptions == null || !File.Exists(_foundPathForSavedOptions)) + { + _foundPathForSavedOptions = string.Empty; + return; + } + + SavedOptions.Save(_foundPathForSavedOptions, _savedOptions); + } + + // ======================================================= + // user options + + public static string EditorLogOverridePath + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.EditorLogOverridePath; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.EditorLogOverridePath != value) + { + _savedOptions.EditorLogOverridePath = value; + SaveOptions(); + } + } + } + + public static bool KeepCopyOfLogOfLastSuccessfulBuild + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.KeepCopyOfLogOfLastSuccessfulBuild; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.KeepCopyOfLogOfLastSuccessfulBuild != value) + { + _savedOptions.KeepCopyOfLogOfLastSuccessfulBuild = value; + SaveOptions(); + } + } + } + + public static bool IncludeSvnInUnused + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.IncludeSvnInUnused; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.IncludeSvnInUnused != value) + { + _savedOptions.IncludeSvnInUnused = value; + SaveOptions(); + } + } + } + + public static bool IncludeGitInUnused + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.IncludeGitInUnused; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.IncludeGitInUnused != value) + { + _savedOptions.IncludeGitInUnused = value; + SaveOptions(); + } + } + } + + public static bool IncludeBuildReportToolAssetsInUnused + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.IncludeBuildReportToolAssetsInUnused; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.IncludeBuildReportToolAssetsInUnused != value) + { + _savedOptions.IncludeBuildReportToolAssetsInUnused = value; + SaveOptions(); + } + } + } + + public static List IgnorePatternsForUnused + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.IgnorePatternsForUnused; + } + } + + public static FileFilterDisplay GetOptionFileFilterDisplay() + { + return FileFilterDisplay.DropDown; + } + + public static bool AllowDeletingOfUsedAssets + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.AllowDeletingOfUsedAssets; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.AllowDeletingOfUsedAssets != value) + { + _savedOptions.AllowDeletingOfUsedAssets = value; + SaveOptions(); + } + } + } + + public static bool CollectBuildInfo + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.CollectBuildInfo; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.CollectBuildInfo != value) + { + _savedOptions.CollectBuildInfo = value; + SaveOptions(); + } + } + } + + public static bool CalculateAssetDependencies + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.CalculateAssetDependencies; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.CalculateAssetDependencies != value) + { + _savedOptions.CalculateAssetDependencies = value; + SaveOptions(); + } + } + } + + public static bool CalculateAssetDependenciesOnUnusedToo + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.CalculateAssetDependenciesOnUnusedToo; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.CalculateAssetDependenciesOnUnusedToo != value) + { + _savedOptions.CalculateAssetDependenciesOnUnusedToo = value; + SaveOptions(); + } + } + } + + public static bool CollectTextureImportSettings + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.CollectTextureImportSettings; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.CollectTextureImportSettings != value) + { + _savedOptions.CollectTextureImportSettings = value; + SaveOptions(); + } + } + } + + public static bool CollectTextureImportSettingsOnUnusedToo + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.CollectTextureImportSettingsOnUnusedToo; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.CollectTextureImportSettingsOnUnusedToo != value) + { + _savedOptions.CollectTextureImportSettingsOnUnusedToo = value; + SaveOptions(); + } + } + } + + public static bool CollectMeshData + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.CollectMeshData; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.CollectMeshData != value) + { + _savedOptions.CollectMeshData = value; + SaveOptions(); + } + } + } + + public static bool CollectMeshDataOnUnusedToo + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.CollectMeshDataOnUnusedToo; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.CollectMeshDataOnUnusedToo != value) + { + _savedOptions.CollectMeshDataOnUnusedToo = value; + SaveOptions(); + } + } + } + + public static bool CollectPrefabData + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.CollectPrefabData; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.CollectPrefabData != value) + { + _savedOptions.CollectPrefabData = value; + SaveOptions(); + } + } + } + + public static string BuildReportFolderName + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.BuildReportFolderName; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.BuildReportFolderName != value) + { + _savedOptions.BuildReportFolderName = value; + SaveOptions(); + } + } + } + + + /// + /// Full path to folder where Build Reports are saved. + /// Note: Makes use of Application.dataPath so it has to be called from the main thread. + /// + public static string BuildReportSavePath + { + get + { + if (BuildReportTool.Options.SaveType == BuildReportTool.Options.SAVE_TYPE_PERSONAL) + { + return string.Format("{0}/{1}", BuildReportTool.Util.GetUserHomeFolder(), BuildReportFolderName); + } + else + { + // assume BuildReportTool.Options.SaveType == BuildReportTool.Options.SAVE_TYPE_PROJECT + + // makes use of Application.dataPath so it has to be called from the main thread + return string.Format("{0}/{1}", BuildReportTool.ReportGenerator.GetSavePathToProjectFolder(), BuildReportFolderName); + } + } + } + + + public static int SaveType + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.SaveType; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.SaveType != value) + { + _savedOptions.SaveType = value; + SaveOptions(); + } + } + } + + public enum FileFilterDisplay + { + DropDown = 0, + Buttons = 1 + } + + + public enum FilterToUseType + { + UseConfiguredFile, + UseEmbedded + } + + public static FilterToUseType GetOptionFilterToUse() + { + switch (FilterToUseInt) + { + case 0: + return FilterToUseType.UseConfiguredFile; + case 1: + return FilterToUseType.UseEmbedded; + } + + return FilterToUseType.UseConfiguredFile; + } + + public static bool ShouldUseConfiguredFileFilters() + { + //Debug.Log("GetOptionFilterToUse() " + GetOptionFilterToUse()); + return GetOptionFilterToUse() == FilterToUseType.UseConfiguredFile; + } + + public static bool ShouldUseEmbeddedFileFilters() + { + return GetOptionFilterToUse() == FilterToUseType.UseEmbedded; + } + + public static int FilterToUseInt + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.FilterToUseInt; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.FilterToUseInt != value) + { + _savedOptions.FilterToUseInt = value; + SaveOptions(); + } + } + } + + + public static int AssetListPaginationLength + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.AssetListPaginationLength; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.AssetListPaginationLength != value) + { + _savedOptions.AssetListPaginationLength = value; + SaveOptions(); + } + } + } + + + public static int AssetUsageLabelType + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.AssetUsageLabelType; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.AssetUsageLabelType != value) + { + _savedOptions.AssetUsageLabelType = value; + SaveOptions(); + } + } + } + + public static bool IsAssetUsageLabelTypeOnVerbose + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.AssetUsageLabelType == ASSET_USAGE_LABEL_TYPE_VERBOSE; + } + } + + public static bool IsAssetUsageLabelTypeOnStandard + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.AssetUsageLabelType == ASSET_USAGE_LABEL_TYPE_STANDARD; + } + } + + public static bool IsAssetUsageLabelTypeOnMinimal + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.AssetUsageLabelType == ASSET_USAGE_LABEL_TYPE_MINIMAL; + } + } + + + public static bool DoubleClickOnAssetWillPing + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.DoubleClickOnAssetWillPing; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.DoubleClickOnAssetWillPing != value) + { + _savedOptions.DoubleClickOnAssetWillPing = value; + SaveOptions(); + } + } + } + + + public static bool ShowAssetPrimaryUsersInTooltipIfAvailable + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowAssetPrimaryUsersInTooltipIfAvailable; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowAssetPrimaryUsersInTooltipIfAvailable != value) + { + _savedOptions.ShowAssetPrimaryUsersInTooltipIfAvailable = value; + SaveOptions(); + } + } + } + + public static bool ShowTooltipThumbnail + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTooltipThumbnail; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTooltipThumbnail != value) + { + _savedOptions.ShowTooltipThumbnail = value; + SaveOptions(); + } + } + } + + public static int ShowThumbnailOnHoverType + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowThumbnailOnHoverType; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowThumbnailOnHoverType != value) + { + _savedOptions.ShowThumbnailOnHoverType = value; + SaveOptions(); + } + } + } + + /// + /// If thumbnail should appear when mouse is hovering over asset label too, not just on the icon. + /// + public static bool ShowThumbnailOnHoverLabelToo + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowThumbnailOnHoverType == 1; + } + } + + public static int TooltipThumbnailWidth + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.TooltipThumbnailWidth; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.TooltipThumbnailWidth != value) + { + _savedOptions.TooltipThumbnailWidth = value; + SaveOptions(); + } + } + } + + public static int TooltipThumbnailHeight + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.TooltipThumbnailHeight; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.TooltipThumbnailHeight != value) + { + _savedOptions.TooltipThumbnailHeight = value; + SaveOptions(); + } + } + } + + + public static int TooltipThumbnailZoomedInWidth + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.TooltipThumbnailZoomedInWidth; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.TooltipThumbnailZoomedInWidth != value) + { + _savedOptions.TooltipThumbnailZoomedInWidth = value; + SaveOptions(); + } + } + } + + public static int TooltipThumbnailZoomedInHeight + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.TooltipThumbnailZoomedInHeight; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.TooltipThumbnailZoomedInHeight != value) + { + _savedOptions.TooltipThumbnailZoomedInHeight = value; + SaveOptions(); + } + } + } + + public static bool ProcessUnusedAssetsInBatches + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ProcessUnusedAssetsInBatches; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ProcessUnusedAssetsInBatches != value) + { + _savedOptions.ProcessUnusedAssetsInBatches = value; + SaveOptions(); + } + } + } + + public static int UnusedAssetsEntriesPerBatch + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.UnusedAssetsEntriesPerBatch; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.UnusedAssetsEntriesPerBatch != value) + { + _savedOptions.UnusedAssetsEntriesPerBatch = value; + SaveOptions(); + } + } + } + + public static int NumberOfTopLargestUsedAssetsToShow + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.NumberOfTopLargestUsedAssetsToShow; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.NumberOfTopLargestUsedAssetsToShow != value) + { + _savedOptions.NumberOfTopLargestUsedAssetsToShow = value; + SaveOptions(); + } + } + } + + public static int NumberOfTopLargestUnusedAssetsToShow + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.NumberOfTopLargestUnusedAssetsToShow; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.NumberOfTopLargestUnusedAssetsToShow != value) + { + _savedOptions.NumberOfTopLargestUnusedAssetsToShow = value; + SaveOptions(); + } + } + } + + // Build Report Calculation + // Full report + // No prefabs in unused assets calculation + // No unused assets calculation, but still has used assets list (won't collect prefabs in scene) + // No used assets and unused assets calculation (overview only) + + public static bool IncludeUsedAssetsInReportCreation + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.IncludeUsedAssetsInReportCreation; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.IncludeUsedAssetsInReportCreation != value) + { + _savedOptions.IncludeUsedAssetsInReportCreation = value; + SaveOptions(); + } + } + } + + public static bool IncludeUnusedAssetsInReportCreation + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.IncludeUnusedAssetsInReportCreation; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.IncludeUnusedAssetsInReportCreation != value) + { + _savedOptions.IncludeUnusedAssetsInReportCreation = value; + SaveOptions(); + } + } + } + + public static bool IncludeUnusedPrefabsInReportCreation + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.IncludeUnusedPrefabsInReportCreation; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.IncludeUnusedPrefabsInReportCreation != value) + { + _savedOptions.IncludeUnusedPrefabsInReportCreation = value; + SaveOptions(); + } + } + } + + + public static bool IncludeBuildSizeInReportCreation + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.IncludeBuildSizeInReportCreation; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.IncludeBuildSizeInReportCreation != value) + { + _savedOptions.IncludeBuildSizeInReportCreation = value; + SaveOptions(); + } + } + } + + public static bool ShowImportedSizeForUsedAssets + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowImportedSizeForUsedAssets; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowImportedSizeForUsedAssets != value) + { + _savedOptions.ShowImportedSizeForUsedAssets = value; + SaveOptions(); + } + } + } + + public static bool GetSizeBeforeBuildForUsedAssets + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.GetSizeBeforeBuildForUsedAssets; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.GetSizeBeforeBuildForUsedAssets != value) + { + _savedOptions.GetSizeBeforeBuildForUsedAssets = value; + SaveOptions(); + } + } + } + + public static bool GetImportedSizesForUnusedAssets + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.GetImportedSizesForUnusedAssets; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.GetImportedSizesForUnusedAssets != value) + { + _savedOptions.GetImportedSizesForUnusedAssets = value; + SaveOptions(); + } + } + } + + public static string FileFilterNameForTextureData + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.FileFilterNameForTextureData; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.FileFilterNameForTextureData != value) + { + _savedOptions.FileFilterNameForTextureData = value; + SaveOptions(); + } + } + } + + // ----------------------------------------------------------------- + + public static bool ShowTextureColumnTextureType + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnTextureType; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnTextureType != value) + { + _savedOptions.ShowTextureColumnTextureType = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnIsSRGB + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnIsSRGB; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnIsSRGB != value) + { + _savedOptions.ShowTextureColumnIsSRGB = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnAlphaSource + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnAlphaSource; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnAlphaSource != value) + { + _savedOptions.ShowTextureColumnAlphaSource = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnAlphaIsTransparency + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnAlphaIsTransparency; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnAlphaIsTransparency != value) + { + _savedOptions.ShowTextureColumnAlphaIsTransparency = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnIgnorePngGamma + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnIgnorePngGamma; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnIgnorePngGamma != value) + { + _savedOptions.ShowTextureColumnIgnorePngGamma = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnNPotScale + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnNPotScale; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnNPotScale != value) + { + _savedOptions.ShowTextureColumnNPotScale = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnIsReadable + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnIsReadable; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnIsReadable != value) + { + _savedOptions.ShowTextureColumnIsReadable = value; + SaveOptions(); + } + } + } + + // ---------------------------------------------- + + public static bool ShowTextureColumnMipMapGenerated + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnMipMapGenerated; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnMipMapGenerated != value) + { + _savedOptions.ShowTextureColumnMipMapGenerated = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnMipMapFilter + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnMipMapFilter; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnMipMapFilter != value) + { + _savedOptions.ShowTextureColumnMipMapFilter = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnStreamingMipMaps + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnStreamingMipMaps; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnStreamingMipMaps != value) + { + _savedOptions.ShowTextureColumnStreamingMipMaps = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnBorderMipMaps + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnBorderMipMaps; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnBorderMipMaps != value) + { + _savedOptions.ShowTextureColumnBorderMipMaps = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnPreserveCoverageMipMaps + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnPreserveCoverageMipMaps; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnPreserveCoverageMipMaps != value) + { + _savedOptions.ShowTextureColumnPreserveCoverageMipMaps = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnFadeOutMipMaps + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnFadeOutMipMaps; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnFadeOutMipMaps != value) + { + _savedOptions.ShowTextureColumnFadeOutMipMaps = value; + SaveOptions(); + } + } + } + + // ---------------------------------------------- + + public static bool ShowTextureColumnSpriteImportMode + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnSpriteImportMode; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnSpriteImportMode != value) + { + _savedOptions.ShowTextureColumnSpriteImportMode = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnSpritePackingTag + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnSpritePackingTag; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnSpritePackingTag != value) + { + _savedOptions.ShowTextureColumnSpritePackingTag = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnSpritePixelsPerUnit + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnSpritePixelsPerUnit; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnSpritePixelsPerUnit != value) + { + _savedOptions.ShowTextureColumnSpritePixelsPerUnit = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnQualifiesForSpritePacking + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnQualifiesForSpritePacking; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnQualifiesForSpritePacking != value) + { + _savedOptions.ShowTextureColumnQualifiesForSpritePacking = value; + SaveOptions(); + } + } + } + + // ---------------------------------------------- + + public static bool ShowTextureColumnWrapMode + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnWrapMode; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnWrapMode != value) + { + _savedOptions.ShowTextureColumnWrapMode = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnWrapModeU + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnWrapModeU; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnWrapModeU != value) + { + _savedOptions.ShowTextureColumnWrapModeU = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnWrapModeV + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnWrapModeV; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnWrapModeV != value) + { + _savedOptions.ShowTextureColumnWrapModeV = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnWrapModeW + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnWrapModeW; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnWrapModeW != value) + { + _savedOptions.ShowTextureColumnWrapModeW = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnFilterMode + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnFilterMode; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnFilterMode != value) + { + _savedOptions.ShowTextureColumnFilterMode = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnAnisoLevel + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnAnisoLevel; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnAnisoLevel != value) + { + _savedOptions.ShowTextureColumnAnisoLevel = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnMaxTextureSize + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnMaxTextureSize; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnMaxTextureSize != value) + { + _savedOptions.ShowTextureColumnMaxTextureSize = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnResizeAlgorithm + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnResizeAlgorithm; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnResizeAlgorithm != value) + { + _savedOptions.ShowTextureColumnResizeAlgorithm = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnTextureFormat + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnTextureFormat; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnTextureFormat != value) + { + _savedOptions.ShowTextureColumnTextureFormat = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnCompressionType + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnCompressionType; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnCompressionType != value) + { + _savedOptions.ShowTextureColumnCompressionType = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnCompressionIsCrunched + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnCompressionIsCrunched; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnCompressionIsCrunched != value) + { + _savedOptions.ShowTextureColumnCompressionIsCrunched = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnCompressionQuality + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnCompressionQuality; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnCompressionQuality != value) + { + _savedOptions.ShowTextureColumnCompressionQuality = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnImportedWidthAndHeight + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnImportedWidthAndHeight; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnImportedWidthAndHeight != value) + { + _savedOptions.ShowTextureColumnImportedWidthAndHeight = value; + SaveOptions(); + } + } + } + + public static bool ShowTextureColumnRealWidthAndHeight + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowTextureColumnRealWidthAndHeight; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowTextureColumnRealWidthAndHeight != value) + { + _savedOptions.ShowTextureColumnRealWidthAndHeight = value; + SaveOptions(); + } + } + } + + // ----------------------------------------------------------------- + + public static string FileFilterNameForMeshData + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.FileFilterNameForMeshData; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.FileFilterNameForMeshData != value) + { + _savedOptions.FileFilterNameForMeshData = value; + SaveOptions(); + } + } + } + + public static bool ShowMeshColumnMeshFilterCount + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowMeshColumnMeshFilterCount; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowMeshColumnMeshFilterCount != value) + { + _savedOptions.ShowMeshColumnMeshFilterCount = value; + SaveOptions(); + } + } + } + + public static bool ShowMeshColumnSkinnedMeshRendererCount + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowMeshColumnSkinnedMeshRendererCount; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowMeshColumnSkinnedMeshRendererCount != value) + { + _savedOptions.ShowMeshColumnSkinnedMeshRendererCount = value; + SaveOptions(); + } + } + } + + public static bool ShowMeshColumnSubMeshCount + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowMeshColumnSubMeshCount; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowMeshColumnSubMeshCount != value) + { + _savedOptions.ShowMeshColumnSubMeshCount = value; + SaveOptions(); + } + } + } + + public static bool ShowMeshColumnVertexCount + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowMeshColumnVertexCount; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowMeshColumnVertexCount != value) + { + _savedOptions.ShowMeshColumnVertexCount = value; + SaveOptions(); + } + } + } + + public static bool ShowMeshColumnTriangleCount + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowMeshColumnTriangleCount; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowMeshColumnTriangleCount != value) + { + _savedOptions.ShowMeshColumnTriangleCount = value; + SaveOptions(); + } + } + } + + public static bool ShowMeshColumnAnimationType + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowMeshColumnAnimationType; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowMeshColumnAnimationType != value) + { + _savedOptions.ShowMeshColumnAnimationType = value; + SaveOptions(); + } + } + } + + public static bool ShowMeshColumnAnimationClipCount + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowMeshColumnAnimationClipCount; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowMeshColumnAnimationClipCount != value) + { + _savedOptions.ShowMeshColumnAnimationClipCount = value; + SaveOptions(); + } + } + } + + // ----------------------------------------------------------------- + + public static string FileFilterNameForPrefabData + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.FileFilterNameForPrefabData; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.FileFilterNameForPrefabData != value) + { + _savedOptions.FileFilterNameForPrefabData = value; + SaveOptions(); + } + } + } + + public static bool ShowPrefabColumnContributeGI + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowPrefabColumnContributeGI; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowPrefabColumnContributeGI != value) + { + _savedOptions.ShowPrefabColumnContributeGI = value; + SaveOptions(); + } + } + } + + public static bool ShowPrefabColumnBatchingStatic + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowPrefabColumnBatchingStatic; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowPrefabColumnBatchingStatic != value) + { + _savedOptions.ShowPrefabColumnBatchingStatic = value; + SaveOptions(); + } + } + } + + public static bool ShowPrefabColumnOccluderStatic + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowPrefabColumnOccluderStatic; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowPrefabColumnOccluderStatic != value) + { + _savedOptions.ShowPrefabColumnOccluderStatic = value; + SaveOptions(); + } + } + } + + public static bool ShowPrefabColumnOccludeeStatic + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowPrefabColumnOccludeeStatic; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowPrefabColumnOccludeeStatic != value) + { + _savedOptions.ShowPrefabColumnOccludeeStatic = value; + SaveOptions(); + } + } + } + + public static bool ShowPrefabColumnReflectionProbeStatic + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowPrefabColumnReflectionProbeStatic; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowPrefabColumnReflectionProbeStatic != value) + { + _savedOptions.ShowPrefabColumnReflectionProbeStatic = value; + SaveOptions(); + } + } + } + + public static bool ShowPrefabColumnNavigationStatic + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowPrefabColumnNavigationStatic; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowPrefabColumnNavigationStatic != value) + { + _savedOptions.ShowPrefabColumnNavigationStatic = value; + SaveOptions(); + } + } + } + + public static bool ShowPrefabColumnOffMeshLinkGeneration + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowPrefabColumnOffMeshLinkGeneration; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowPrefabColumnOffMeshLinkGeneration != value) + { + _savedOptions.ShowPrefabColumnOffMeshLinkGeneration = value; + SaveOptions(); + } + } + } + + // ----------------------------------------------------------------- + + public static bool ShowColumnAssetPath + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowColumnAssetPath; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowColumnAssetPath != value) + { + _savedOptions.ShowColumnAssetPath = value; + SaveOptions(); + } + } + } + + public static bool ShowColumnSizeBeforeBuild + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowColumnSizeBeforeBuild; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowColumnSizeBeforeBuild != value) + { + _savedOptions.ShowColumnSizeBeforeBuild = value; + SaveOptions(); + } + } + } + + public static bool ShowColumnSizeInBuild + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowColumnSizeInBuild; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowColumnSizeInBuild != value) + { + _savedOptions.ShowColumnSizeInBuild = value; + SaveOptions(); + } + } + } + + public static bool ShowColumnUnusedRawSize + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowColumnUnusedRawSize; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowColumnUnusedRawSize != value) + { + _savedOptions.ShowColumnUnusedRawSize = value; + SaveOptions(); + } + } + } + + public static bool ShowColumnUnusedImportedSize + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowColumnUnusedImportedSize; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowColumnUnusedImportedSize != value) + { + _savedOptions.ShowColumnUnusedImportedSize = value; + SaveOptions(); + } + } + } + + // ----------------------------------------------------------------- + + static SearchType _previousSearchType = SearchType; + + public static bool HasSearchTypeChanged + { + get { return _previousSearchType != SearchType; } + } + + public static void UpdatePreviousSearchType() + { + _previousSearchType = SearchType; + } + + public static SearchType SearchType + { + get + { + InitializeOptionsIfNeeded(); + switch (_savedOptions.SearchType) + { + case SavedOptions.SEARCH_METHOD_REGEX: + return SearchType.Regex; + case SavedOptions.SEARCH_METHOD_FUZZY: + return SearchType.Fuzzy; + default: + return SearchType.Basic; + } + } + set + { + InitializeOptionsIfNeeded(); + + int newValue; + switch (value) + { + case SearchType.Regex: + newValue = SavedOptions.SEARCH_METHOD_REGEX; + break; + case SearchType.Fuzzy: + newValue = SavedOptions.SEARCH_METHOD_FUZZY; + break; + default: + newValue = SavedOptions.SEARCH_METHOD_BASIC; + break; + } + if (_savedOptions.SearchType != newValue) + { + _savedOptions.SearchType = newValue; + SaveOptions(); + } + } + } + + public const int SEARCH_TYPE_BASIC = 0; + public const int SEARCH_TYPE_REGEX = 1; + public const int SEARCH_TYPE_FUZZY = 2; + + public static bool SearchTypeIsBasic + { + get + { + return SearchTypeInt == SEARCH_TYPE_BASIC; + } + } + + public static bool SearchTypeIsRegex + { + get + { + return SearchTypeInt == SEARCH_TYPE_REGEX; + } + } + + public static bool SearchTypeIsFuzzy + { + get + { + return SearchTypeInt == SEARCH_TYPE_FUZZY; + } + } + + public static int SearchTypeInt + { + get + { + InitializeOptionsIfNeeded(); + switch (_savedOptions.SearchType) + { + case SavedOptions.SEARCH_METHOD_REGEX: + return SEARCH_TYPE_REGEX; + case SavedOptions.SEARCH_METHOD_FUZZY: + return SEARCH_TYPE_FUZZY; + default: + return SEARCH_TYPE_BASIC; + } + } + set + { + InitializeOptionsIfNeeded(); + + int newValue; + switch (value) + { + case SEARCH_TYPE_REGEX: + newValue = SavedOptions.SEARCH_METHOD_REGEX; + break; + case SEARCH_TYPE_FUZZY: + newValue = SavedOptions.SEARCH_METHOD_FUZZY; + break; + default: + newValue = SavedOptions.SEARCH_METHOD_BASIC; + break; + } + if (_savedOptions.SearchType != newValue) + { + _savedOptions.SearchType = newValue; + SaveOptions(); + } + } + } + + public static bool SearchFilenameOnly + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.SearchFilenameOnly; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.SearchFilenameOnly != value) + { + _savedOptions.SearchFilenameOnly = value; + SaveOptions(); + } + } + } + + public static bool SearchCaseSensitive + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.SearchCaseSensitive; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.SearchCaseSensitive != value) + { + _savedOptions.SearchCaseSensitive = value; + SaveOptions(); + } + } + } + + public static bool GetProjectSettings + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.GetProjectSettings; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.GetProjectSettings != value) + { + _savedOptions.GetProjectSettings = value; + SaveOptions(); + } + } + } + + public static bool ShowProjectSettingsInMultipleColumns + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.ShowProjectSettingsInMultipleColumns; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.ShowProjectSettingsInMultipleColumns != value) + { + _savedOptions.ShowProjectSettingsInMultipleColumns = value; + SaveOptions(); + } + } + } + + public static int LogMessagePaginationLength + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.LogMessagePaginationLength; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.LogMessagePaginationLength != value) + { + _savedOptions.LogMessagePaginationLength = value; + SaveOptions(); + } + } + } + + public static bool IsCalculationLevelAtFull(bool includeUsedAssets, bool includeUnusedAssets, + bool includeUnusedPrefabs) + { + return includeUsedAssets && includeUnusedAssets && includeUnusedPrefabs; + } + + public static bool IsCalculationLevelAtNoUnusedPrefabs(bool includeUsedAssets, bool includeUnusedAssets, + bool includeUnusedPrefabs) + { + return includeUsedAssets && includeUnusedAssets && !includeUnusedPrefabs; + } + + public static bool IsCalculationLevelAtNoUnusedAssets(bool includeUsedAssets, bool includeUnusedAssets, + bool includeUnusedPrefabs) + { + // unused prefabs are not checked. if unused assets are not calculated, it is understood that unused prefabs are not included + return includeUsedAssets && !includeUnusedAssets; + } + + public static bool IsCalculationLevelAtOverviewOnly(bool includeUsedAssets, bool includeUnusedAssets, + bool includeUnusedPrefabs) + { + // if used assets not included, it is understood that unused assets are not included too. + // if used assets are not included, there is no way to determing if an asset is unused. + return !includeUsedAssets; + } + + + public static bool IsCurrentCalculationLevelAtFull + { + get + { + return IsCalculationLevelAtFull(IncludeUsedAssetsInReportCreation, IncludeUnusedAssetsInReportCreation, + IncludeUnusedPrefabsInReportCreation); + } + } + + public static bool IsCurrentCalculationLevelAtNoUnusedPrefabs + { + get + { + return IsCalculationLevelAtNoUnusedPrefabs(IncludeUsedAssetsInReportCreation, + IncludeUnusedAssetsInReportCreation, IncludeUnusedPrefabsInReportCreation); + } + } + + public static bool IsCurrentCalculationLevelAtNoUnusedAssets + { + get + { + return IsCalculationLevelAtNoUnusedAssets(IncludeUsedAssetsInReportCreation, + IncludeUnusedAssetsInReportCreation, IncludeUnusedPrefabsInReportCreation); + } + } + + public static bool IsCurrentCalculationLevelAtOverviewOnly + { + get + { + return IsCalculationLevelAtOverviewOnly(IncludeUsedAssetsInReportCreation, + IncludeUnusedAssetsInReportCreation, IncludeUnusedPrefabsInReportCreation); + } + } + + + public static void SetCalculationLevelToFull() + { + IncludeUsedAssetsInReportCreation = true; + IncludeUnusedAssetsInReportCreation = true; + IncludeUnusedPrefabsInReportCreation = true; + } + + public static void SetCalculationLevelToNoUnusedPrefabs() + { + IncludeUsedAssetsInReportCreation = true; + IncludeUnusedAssetsInReportCreation = true; + IncludeUnusedPrefabsInReportCreation = false; + } + + public static void SetCalculationLevelToNoUnusedAssets() + { + IncludeUsedAssetsInReportCreation = true; + IncludeUnusedAssetsInReportCreation = false; + IncludeUnusedPrefabsInReportCreation = false; + } + + public static void SetCalculationLevelToOverviewOnly() + { + IncludeUsedAssetsInReportCreation = false; + IncludeUnusedAssetsInReportCreation = false; + IncludeUnusedPrefabsInReportCreation = false; + } + + + public static bool AutoShowWindowAfterNormalBuild + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.AutoShowWindowAfterNormalBuild; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.AutoShowWindowAfterNormalBuild != value) + { + _savedOptions.AutoShowWindowAfterNormalBuild = value; + SaveOptions(); + } + } + } + + public static bool AutoResortAssetsWhenUnityEditorRegainsFocus + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.AutoResortAssetsWhenUnityEditorRegainsFocus; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.AutoResortAssetsWhenUnityEditorRegainsFocus != value) + { + _savedOptions.AutoResortAssetsWhenUnityEditorRegainsFocus = value; + SaveOptions(); + } + } + } + + + public static bool UseThreadedReportGeneration + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.UseThreadedReportGeneration; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.UseThreadedReportGeneration != value) + { + _savedOptions.UseThreadedReportGeneration = value; + SaveOptions(); + } + } + } + + public static bool UseThreadedFileLoading + { + get + { + InitializeOptionsIfNeeded(); + return _savedOptions.UseThreadedFileLoading; + } + set + { + InitializeOptionsIfNeeded(); + if (_savedOptions.UseThreadedFileLoading != value) + { + _savedOptions.UseThreadedFileLoading = value; + SaveOptions(); + } + } + } + + + public static bool ShouldShowWindowAfterBuild + { + get { return (!IsInBatchMode && AutoShowWindowAfterNormalBuild); } + } + + public static bool IsInBatchMode + { + get + { + return UnityEditorInternal.InternalEditorUtility.inBatchMode; + + +#if OTHER_BATCH_MODE_DETECTION_CODE + // different ways to find out actually. + // included here in case a new version of Unity + // removes our current way of figuring out batchmode. + + // check the isHumanControllingUs bool + return UnityEditorInternal.InternalEditorUtility.isHumanControllingUs; + + // check the command line args for "-batchmode" + string[] arguments = Environment.GetCommandLineArgs(); + for (int n = 0, len = arguments.Length; n < len; ++n) + { + if (arguments[n] == "-batchmode") + { + return true; + } + } + return false; +#endif + } + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_Options.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_Options.cs.meta new file mode 100644 index 00000000..0d456c8c --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Options/BRT_Options.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d54b85804521d9e418a8b7a7807a454b +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData.meta new file mode 100644 index 00000000..691398cd --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f09b35d8cd4d59f4ba3898a19f0dafe0 diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_AssetDependencies.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_AssetDependencies.cs new file mode 100644 index 00000000..78810173 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_AssetDependencies.cs @@ -0,0 +1,364 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace BuildReportTool +{ + /// + /// Class for holding which asset uses which. + /// This is the class that is serialized when saving an Asset Dependency Report to a file. + /// + [System.Serializable, System.Xml.Serialization.XmlRoot("AssetDependencies")] + public class AssetDependencies : BuildReportTool.IDataFile + { + /// + /// Name of project folder. + /// Included as part of the filename when saved. + /// + public string ProjectName; + + /// + /// Type of build that the project was configured to, at the time that asset dependencies were calculated. + /// Included as part of the filename when saved. + /// + public string BuildType; + + /// + /// When asset dependencies were calculated. + /// Included as part of the filename when saved. + /// + public System.DateTime TimeGot; + + public string GetDefaultFilename() + { + return BuildReportTool.Util.GetAssetDependenciesDefaultFilename(ProjectName, BuildType, TimeGot); + } + + public string GetAccompanyingBuildReportFilename() + { + return BuildReportTool.Util.GetBuildInfoDefaultFilename(ProjectName, BuildType, TimeGot); + } + + // ================================================================================== + + /// + /// Full path where this Asset Dependencies is saved in the local storage. + /// + string _savedPath; + + /// + public string SavedPath + { + get { return _savedPath; } + } + + public void SetSavedPath(string val) + { + _savedPath = val.Replace("\\", "/"); + } + + + public bool HasContents + { + get { return _assetDependencies.Count > 0; } + } + + // ================================================================================== + + Dictionary _assetDependencies = new Dictionary(); + + public List Assets; + public List Dependencies; + + public Dictionary GetAssetDependencies() + { + return _assetDependencies; + } + + // ================================================================================== + + public void OnBeforeSave() + { + if (Assets != null) + { + Assets.Clear(); + } + else + { + Assets = new List(); + } + + Assets.AddRange(_assetDependencies.Keys); + + if (Dependencies != null) + { + Dependencies.Clear(); + } + else + { + Dependencies = new List(); + } + + Dependencies.AddRange(_assetDependencies.Values); + } + + public void OnAfterLoad() + { + _assetDependencies.Clear(); + + var len = Mathf.Min(Assets.Count, Dependencies.Count); + for (int n = 0; n < len; ++n) + { + _assetDependencies.Add(Assets[n], Dependencies[n]); + } + } + + // ---------------------------------------------------------- + + public static void PopulateAssetEndUsers(string rootAsset, AssetDependencies assetDependencies) + { + if (assetDependencies == null) + { + return; + } + + var dependencies = assetDependencies.GetAssetDependencies(); + + if (!dependencies.ContainsKey(rootAsset)) + { + return; + } + + var selectedAssetDependencies = dependencies[rootAsset]; + + if (selectedAssetDependencies.Users.Count <= 0) + { + // asset isn't used by any other asset + return; + } + + var destination = selectedAssetDependencies.GetEndUserLabels(); + + if (destination.Count > 0) + { + // already assigned + return; + } + + PopulateAssetEndUsers(rootAsset, destination, assetDependencies); + } + + public static void PopulateAssetEndUsers(string rootAsset, List destination, + AssetDependencies assetDependencies) + { + if (assetDependencies == null) + { + return; + } + + var dependencies = assetDependencies.GetAssetDependencies(); + + if (!dependencies.ContainsKey(rootAsset)) + { + return; + } + + var selectedAssetDependencies = dependencies[rootAsset]; + + if (destination.Count > 0) + { + // already assigned + return; + } + + var usersFlattened = selectedAssetDependencies.UsersFlattened; + + if (usersFlattened.Count <= 0) + { + // asset has no flattened users list + destination.Clear(); + return; + } + + // count: 2 + // availableExistingIdx: 0 + // + // 1st primary user found: + // count <= availableExistingIdx + // 2 <= 0 ? false: 1st primary user put to idx 0 + // availableExistingIdx: 1 + // + // 2nd primary user found: + // 2 <= 1 ? false: 2nd primary user put to idx 1 + // availableExistingIdx: 2 + // + // 3rd primary user found: + // 2 <= 2 ? true: 3rd primary user added as new entry to list (at idx 2) + // count: 3 + // availableExistingIdx: 3 + // + // while (count > availableExistingIdx) + // 3 > 3 ? false: stop while loop + + // count : 0 + // availableExistingIdx: 0 + // + // 1st primary user found: + // count <= availableExistingIdx + // 0 <= 0 ? true: 1st primary user added as new entry to list (at idx 0) + // count: 1 + // availableExistingIdx: 1 + // + // while (count > availableExistingIdx) + // 1 > 1 ? false: stop while loop + + // count: 2 + // availableExistingIdx: 0 + // + // 1st primary user found: + // count <= availableExistingIdx + // 2 <= 0 ? false: 1st primary user put to idx 0 + // availableExistingIdx: 1 + // + // while (count > availableExistingIdx) + // 2 > 1 ? true: removed idx 1 of list + // 1 > 1 ? false: stop while loop + + // count: 2 + // availableExistingIdx: 0 + // + // while (count > availableExistingIdx) + // 2 > 0 ? true: removed idx 1 of list + // 1 > 0 ? true: removed idx 0 of list + // 0 > 0 ? false: stop while loop + + int availableExistingIdx = 0; + + for (int n = 0, len = usersFlattened.Count; n < len; ++n) + { + bool isAssembly = usersFlattened[n].AssetPath.IsAnAssembly(); + if (usersFlattened[n].AssetPath.IsSceneFile() || + usersFlattened[n].AssetPath.IsInResourcesFolder() || + usersFlattened[n].AssetPath.IsSpriteAtlasFile() || + isAssembly) + { + string assetFilename = + isAssembly ? usersFlattened[n].AssetPath : usersFlattened[n].AssetPath.GetFileNameOnly(); + + var alreadyInList = false; + for (int alreadyN = 0, alreadyLen = availableExistingIdx; alreadyN < alreadyLen; ++alreadyN) + { + if (destination[alreadyN].text.Equals(assetFilename, StringComparison.OrdinalIgnoreCase)) + { + alreadyInList = true; + break; + } + } + + if (alreadyInList) + { + continue; + } + + Texture icon = isAssembly + ? BuildReportTool.Window.Utility.AssemblyIcon + : AssetDatabase.GetCachedIcon(usersFlattened[n].AssetPath); + + if (destination.Count <= availableExistingIdx) + { + destination.Add(new GUIContent( + assetFilename, + icon, + usersFlattened[n].AssetPath)); + } + else + { + destination[availableExistingIdx].text = assetFilename; + destination[availableExistingIdx].image = icon; + destination[availableExistingIdx].tooltip = usersFlattened[n].AssetPath; + } + + ++availableExistingIdx; + } + } + + while (destination.Count > availableExistingIdx) + { + destination.RemoveAt(destination.Count - 1); + } + } + } + + // ================================================================================== + + public class DependencyEntry + { + /// + /// Assets that this one directly uses. + /// + public List Uses = new List(); + + /// + /// Assets that directly use this one. + /// + public List Users = new List(); + + /// + /// Assets that use this one, and the assets that use those, et al. + /// + public List UsersFlattened = new List(); + + List _endUserLabels; + + public List GetEndUserLabels() + { + if (_endUserLabels == null) + { + _endUserLabels = new List(); + } + + return _endUserLabels; + } + } + + public struct AssetUserFlattened + { + public string AssetPath; + + /// + /// Always starts at 1. + /// + public int IndentLevel; + + public bool CyclicDependency; + +#if BRT_ASSET_DEPENDENCY_DEBUG + public string DebugInfo; +#endif + + public AssetUserFlattened(string assetPath, int indentLevel) + { + AssetPath = assetPath; + IndentLevel = indentLevel; + CyclicDependency = false; + +#if BRT_ASSET_DEPENDENCY_DEBUG + DebugInfo = null; +#endif + } + +#if BRT_ASSET_DEPENDENCY_DEBUG + public AssetUserFlattened(string assetPath, int indentLevel, string debugInfo) + { + AssetPath = assetPath; + IndentLevel = indentLevel; + CyclicDependency = false; + + DebugInfo = debugInfo; + } +#endif + } + + // ================================================================================== +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_AssetDependencies.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_AssetDependencies.cs.meta new file mode 100644 index 00000000..39a564da --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_AssetDependencies.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 8344c853aaa50c348aec96fdbdb839c7 +timeCreated: 1558252652 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_AssetList.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_AssetList.cs new file mode 100644 index 00000000..2f6b1b5d --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_AssetList.cs @@ -0,0 +1,689 @@ +using UnityEngine; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace BuildReportTool +{ + /// + /// A collection of file entries in a build report. + /// Used to display the "Used Assets" and the "Unused Assets". + /// + [System.Serializable] + public class AssetList + { + // ================================================================================== + + [SerializeField] + BuildReportTool.SizePart[] _all; + + int[] _viewOffsets; + + [SerializeField] + BuildReportTool.SizePart[][] _perCategory; + + + [SerializeField] + string[] _labels; + + + public BuildReportTool.SizePart[] All + { + get { return _all; } + set { _all = value; } + } + + public BuildReportTool.SizePart[][] PerCategory + { + get { return _perCategory; } + } + + public string[] Labels + { + get { return _labels; } + set { _labels = value; } + } + + // ================================================================================== + + BuildReportTool.SizePart[] _topLargest; + + public BuildReportTool.SizePart[] TopLargest + { + get { return _topLargest; } + } + + public int NumberOfTopLargest + { + get + { + if (_topLargest == null) + { + return 0; + } + + return _topLargest.Length; + } + } + + void PostSetListAll(int numberOfTop) + { + List topLargestList = new List(); + + // temporarily sort "All" list by raw size so we can get the top largest + AssetListUtility.SortAssetList(_all, SortType.RawSize, SortOrder.Descending); + + // in case entries in "all" list is lesser than the numberOfTop value + int len = Mathf.Min(numberOfTop, _all.Length); + + for (int n = 0; n < len; ++n) + { + topLargestList.Add(_all[n]); + } + + _topLargest = topLargestList.ToArray(); + + // revert "All" list to original sort type + Resort(_all); + } + + public void ResortDefault(int numberOfTop) + { + PostSetListAll(numberOfTop); + } + + // ================================================================================== + // Sort Type + + public enum SortType + { + None, + AssetFullPath, + AssetFilename, + RawSize, + ImportedSize, + + /// + /// Try imported size. If imported size is unavailable (N/A) use raw size. + /// + ImportedSizeOrRawSize, + + SizeBeforeBuild, + PercentSize, + + TextureData, + MeshData, + PrefabData, + } + + public enum SortOrder + { + None, + Ascending, + Descending + } + + SortType _lastSortType = SortType.None; + BuildReportTool.TextureData.DataId _lastTextureSortType = BuildReportTool.TextureData.DataId.None; + BuildReportTool.MeshData.DataId _lastMeshSortType = BuildReportTool.MeshData.DataId.None; + BuildReportTool.PrefabData.DataId _lastPrefabSortType = BuildReportTool.PrefabData.DataId.None; + SortOrder _lastSortOrder = SortOrder.None; + + public SortType LastSortType + { + get { return _lastSortType; } + } + + public SortOrder LastSortOrder + { + get { return _lastSortOrder; } + } + + readonly HashSet _hasListBeenSorted = new HashSet(); + + public void Resort(BuildReportTool.SizePart[] assetList) + { + if (_lastSortType != SortType.None && + _lastTextureSortType == BuildReportTool.TextureData.DataId.None && + _lastMeshSortType == BuildReportTool.MeshData.DataId.None && + _lastSortOrder != SortOrder.None) + { + AssetListUtility.SortAssetList(assetList, _lastSortType, _lastSortOrder); + } + } + + public void Sort(BuildReportTool.TextureData textureData, BuildReportTool.TextureData.DataId sortType, SortOrder sortOrder, BuildReportTool.FileFilterGroup fileFilters) + { + _lastTextureSortType = sortType; + _lastMeshSortType = BuildReportTool.MeshData.DataId.None; + _lastSortType = SortType.TextureData; + _lastSortOrder = sortOrder; + + _hasListBeenSorted.Clear(); + + _hasListBeenSorted.Add(fileFilters.SelectedFilterIdx); + + // sort only currently displayed list + if (fileFilters.SelectedFilterIdx == -1) + { + AssetListUtility.SortAssetList(_all, textureData, sortType, sortOrder); + } + else + { + AssetListUtility.SortAssetList(_perCategory[fileFilters.SelectedFilterIdx], textureData, sortType, sortOrder); + } + } + + public void Sort(BuildReportTool.MeshData meshData, BuildReportTool.MeshData.DataId sortType, SortOrder sortOrder, BuildReportTool.FileFilterGroup fileFilters) + { + _lastTextureSortType = BuildReportTool.TextureData.DataId.None; + _lastMeshSortType = sortType; + _lastSortType = SortType.MeshData; + _lastSortOrder = sortOrder; + + _hasListBeenSorted.Clear(); + + _hasListBeenSorted.Add(fileFilters.SelectedFilterIdx); + + // sort only currently displayed list + if (fileFilters.SelectedFilterIdx == -1) + { + AssetListUtility.SortAssetList(_all, meshData, sortType, sortOrder); + } + else + { + AssetListUtility.SortAssetList(_perCategory[fileFilters.SelectedFilterIdx], meshData, sortType, sortOrder); + } + } + + public void Sort(BuildReportTool.PrefabData prefabData, BuildReportTool.PrefabData.DataId sortType, SortOrder sortOrder, BuildReportTool.FileFilterGroup fileFilters) + { + _lastTextureSortType = BuildReportTool.TextureData.DataId.None; + _lastPrefabSortType = sortType; + _lastSortType = SortType.PrefabData; + _lastSortOrder = sortOrder; + + _hasListBeenSorted.Clear(); + + _hasListBeenSorted.Add(fileFilters.SelectedFilterIdx); + + // sort only currently displayed list + if (fileFilters.SelectedFilterIdx == -1) + { + AssetListUtility.SortAssetList(_all, prefabData, sortType, sortOrder); + } + else + { + AssetListUtility.SortAssetList(_perCategory[fileFilters.SelectedFilterIdx], prefabData, sortType, sortOrder); + } + } + + public void Sort(SortType sortType, SortOrder sortOrder, BuildReportTool.FileFilterGroup fileFilters) + { + _lastTextureSortType = BuildReportTool.TextureData.DataId.None; + _lastMeshSortType = BuildReportTool.MeshData.DataId.None; + _lastSortType = sortType; + _lastSortOrder = sortOrder; + + _hasListBeenSorted.Clear(); + + _hasListBeenSorted.Add(fileFilters.SelectedFilterIdx); + + // sort only currently displayed list + if (fileFilters.SelectedFilterIdx == -1) + { + AssetListUtility.SortAssetList(_all, sortType, sortOrder); + } + else + { + AssetListUtility.SortAssetList(_perCategory[fileFilters.SelectedFilterIdx], sortType, sortOrder); + } + + //SortAssetList(_all, sortType, sortOrder); + //for (int n = 0, len = _perCategory.Length; n < len; ++n) + //{ + // SortAssetList(_perCategory[n], sortType, sortOrder); + //} + } + + public void SortIfNeeded(BuildReportTool.FileFilterGroup fileFilters) + { + if (_lastSortType != SortType.None && + _lastSortOrder != SortOrder.None && + !_hasListBeenSorted.Contains(fileFilters.SelectedFilterIdx)) + { + if (fileFilters.SelectedFilterIdx == -1) + { + if (_lastSortType == SortType.TextureData) + { + + } + else if (_lastSortType == SortType.MeshData) + { + + } + else + { + AssetListUtility.SortAssetList(_all, _lastSortType, _lastSortOrder); + } + } + else + { + if (_lastSortType == SortType.TextureData) + { + + } + else if (_lastSortType == SortType.MeshData) + { + + } + else + { + AssetListUtility.SortAssetList(_perCategory[fileFilters.SelectedFilterIdx], _lastSortType, _lastSortOrder); + } + } + + _hasListBeenSorted.Add(fileFilters.SelectedFilterIdx); + } + } + + // Queries + // ================================================================================== + + public List GetAllAsList() + { + return _all.ToList(); + } + + public int AllCount + { + get { return _all.Length; } + } + + public double GetTotalSizeInBytes() + { + double total = 0; + + for (int n = 0, len = _all.Length; n < len; ++n) + { + if (_all[n].UsableSize > 0) + { + total += _all[n].UsableSize; + } + } + + return total; + } + + public int GetViewOffsetForDisplayedList(FileFilterGroup fileFilters) + { + if (_viewOffsets == null || _viewOffsets.Length == 0) + { + return 0; + } + + if (fileFilters.SelectedFilterIdx == -1) + { + return _viewOffsets[0]; // _viewOffsets[0] is the "All" list + } + else if (PerCategory != null && PerCategory.Length >= fileFilters.SelectedFilterIdx + 1) + { + return _viewOffsets[fileFilters.SelectedFilterIdx + 1]; + } + + return 0; + } + + public BuildReportTool.SizePart[] GetListToDisplay(FileFilterGroup fileFilters) + { + BuildReportTool.SizePart[] ret = null; + if (fileFilters.SelectedFilterIdx == -1) + { + ret = All; + } + else if (PerCategory != null && PerCategory.Length >= fileFilters.SelectedFilterIdx + 1) + { + ret = PerCategory[fileFilters.SelectedFilterIdx]; + } + + return ret; + } + + + // Commands + // ================================================================================== + + public void UnescapeAssetNames() + { + for (int n = 0, len = _all.Length; n < len; ++n) + { + _all[n].Name = BuildReportTool.Util.MyHtmlDecode(_all[n].Name); + } + + + if (_perCategory != null) + { + for (int catIdx = 0, catLen = _perCategory.Length; catIdx < catLen; ++catIdx) + { + for (int n = 0, len = _perCategory[catIdx].Length; n < len; ++n) + { + _perCategory[catIdx][n].Name = BuildReportTool.Util.MyHtmlDecode(_perCategory[catIdx][n].Name); + } + } + } + } + + public void SetViewOffsetForDisplayedList(FileFilterGroup fileFilters, int newVal) + { + if (fileFilters.SelectedFilterIdx == -1) + { + _viewOffsets[0] = newVal; // _viewOffsets[0] is the "All" list + } + else if (PerCategory != null && PerCategory.Length >= fileFilters.SelectedFilterIdx + 1) + { + _viewOffsets[fileFilters.SelectedFilterIdx + 1] = newVal; + } + } + + + public void PopulateRawSizes() + { + /*long importedSize = -1; + for (int n = 0, len = _all.Length; n < len; ++n) + { + importedSize = BRT_LibCacheUtil.GetImportedFileSize(_all[n].Name); + + _all[n].SizeBytes = importedSize; + _all[n].Size = BuildReportTool.Util.GetBytesReadable(importedSize); + }*/ + } + + + public void PopulateImportedSizes() + { + for (int n = 0, len = _all.Length; n < len; ++n) + { + /*if (BuildReportTool.Util.IsFileAUnityAsset(_all[n].Name)) + { + // Scene files/terrain files/scriptable object files/etc. always seem to be only 4kb in the library, + // no matter how large the actual file in the assets folder really is. + // The 4kb is probably just metadata/reference to the actual file itself. + // Makes sense since these file types are "native" to unity, so no importing is necessary. + // + // In this case, the raw size (size of the file in the assets folder) counts as the imported size + // so just use the raw size. + + _all[n].ImportedSizeBytes = _all[n].RawSizeBytes; + _all[n].ImportedSize = _all[n].RawSize; + } + else*/ + { + var importedSize = BRT_LibCacheUtil.GetImportedFileSize(_all[n].Name); + + _all[n].ImportedSizeBytes = importedSize; + _all[n].ImportedSize = BuildReportTool.Util.GetBytesReadable(importedSize); + } + } + } + + public void PopulateSizeInAssetsFolder() + { + var projectPath = BuildReportTool.Util.GetProjectPath(Application.dataPath); + for (int n = 0, len = _all.Length; n < len; ++n) + { + string assetImportedPath = projectPath + BuildReportTool.Util.MyHtmlDecode(_all[n].Name); + + var size = BuildReportTool.Util.GetFileSizeInBytes(assetImportedPath); + _all[n].SizeInAssetsFolderBytes = size; + _all[n].SizeInAssetsFolder = BuildReportTool.Util.GetBytesReadable(size); + } + } + + public void RecalculatePercentages(double totalSize) + { + //Debug.Log("Recalculate Percentage Start"); + + if (_all != null) + { + // if the all list is available, + // prefer using that to get the total size + + totalSize = 0; + + for (int n = 0, len = _all.Length; n < len; ++n) + { + totalSize += _all[n].UsableSize; + } + } + + if (_all != null) + { + for (int n = 0, len = _all.Length; n < len; ++n) + { + _all[n].Percentage = + Math.Round((_all[n].UsableSize / totalSize) * 100, 2, MidpointRounding.AwayFromZero); + //Debug.Log("Percentage for: " + n + " " + _all[n].Name + " = " + _all[n].Percentage + " = " + _all[n].UsableSize + " / " + totalSize); + } + } + + if (_perCategory != null) + { + for (int catIdx = 0, catLen = _perCategory.Length; catIdx < catLen; ++catIdx) + { + for (int n = 0, len = _perCategory[catIdx].Length; n < len; ++n) + { + _perCategory[catIdx][n].Percentage = + Math.Round((_perCategory[catIdx][n].UsableSize / totalSize) * 100, 2, + MidpointRounding.AwayFromZero); + } + } + } + + //Debug.Log("Recalculate Percentage End"); + } + + + // Commands: Initialization + // ================================================================================== + + public void Init(BuildReportTool.SizePart[] all, BuildReportTool.SizePart[][] perCategory, int numberOfTop, + FileFilterGroup fileFilters) + { + All = all; + PostSetListAll(numberOfTop); + _perCategory = perCategory; + + _viewOffsets = new int[1 + PerCategory.Length]; // +1 since we need to include the "All" list + + if (_lastSortType == SortType.None) + { + // sort by raw size, descending, by default + Sort(SortType.RawSize, SortOrder.Descending, fileFilters); + } + else + { + Sort(_lastSortType, _lastSortOrder, fileFilters); + } + + RefreshFilterLabels(fileFilters); + } + + public void Init(BuildReportTool.SizePart[] all, BuildReportTool.SizePart[][] perCategory, int numberOfTop, + FileFilterGroup fileFilters, SortType newSortType, SortOrder newSortOrder) + { + _lastSortType = newSortType; + _lastSortOrder = newSortOrder; + + Init(all, perCategory, numberOfTop, fileFilters); + } + + public void Reinit(BuildReportTool.SizePart[] all, BuildReportTool.SizePart[][] perCategory, int numberOfTop) + { + All = all; + PostSetListAll(numberOfTop); + _perCategory = perCategory; + } + + public void AssignPerCategoryList(BuildReportTool.SizePart[][] perCategory) + { + _perCategory = perCategory; + _viewOffsets = new int[1 + _perCategory.Length]; // +1 since we need to include the "All" list + } + + public void RefreshFilterLabels(FileFilterGroup fileFiltersToUse) + { + _labels = new string[1 + PerCategory.Length]; + _labels[0] = string.Format("All ({0})", All.Length.ToString()); + for (int n = 0, len = fileFiltersToUse.Count; n < len; ++n) + { + _labels[n + 1] = string.Format("{0} ({1})", fileFiltersToUse[n].Label, PerCategory[n].Length.ToString()); + } + + _labels[_labels.Length - 1] = string.Format("Unknown ({0})", PerCategory[PerCategory.Length - 1].Length.ToString()); + } + + + // Sum Selection + // ================================================================================== + + [SerializeField] + Dictionary _selectedForSum = new Dictionary(); + + BuildReportTool.SizePart _lastSelected; + + + // Sum Selection: Queries + // -------------------------------------------------------------------- + + public bool InSumSelection(BuildReportTool.SizePart b) + { + return _selectedForSum.ContainsKey(b.Name); + } + + double GetSizeOfSumSelection() + { + double total = 0; + foreach (var pair in _selectedForSum) + { + if (pair.Value.UsableSize > 0) + { + total += pair.Value.UsableSize; + } + } + + return total; + } + + public double GetPercentageOfSumSelection() + { + double total = 0; + foreach (var pair in _selectedForSum) + { + if (pair.Value.Percentage > 0) + { + if (pair.Value.Percentage > 0) + { + total += pair.Value.Percentage; + } + } + } + + return total; + } + + public string GetReadableSizeOfSumSelection() + { + return BuildReportTool.Util.GetBytesReadable(GetSizeOfSumSelection()); + } + + public bool AtLeastOneSelectedForSum + { + get { return _selectedForSum.Count > 0; } + } + + public bool IsNothingSelected + { + get { return _selectedForSum.Count <= 0; } + } + + public Dictionary.Enumerator GetSelectedEnumerator() + { + return _selectedForSum.GetEnumerator(); + } + + public int GetSelectedCount() + { + return _selectedForSum.Count; + } + + public SizePart GetLastSelected() + { + return _lastSelected; + } + + + // Sum Selection: Commands + // -------------------------------------------------------------------- + + public void ToggleSumSelection(BuildReportTool.SizePart b) + { + if (InSumSelection(b)) + { + RemoveFromSumSelection(b); + } + else + { + AddToSumSelection(b); + } + } + + public void RemoveFromSumSelection(BuildReportTool.SizePart b) + { + _selectedForSum.Remove(b.Name); + } + + public void AddToSumSelection(BuildReportTool.SizePart b) + { + if (_selectedForSum.ContainsKey(b.Name)) + { + // already added + return; + } + + _selectedForSum.Add(b.Name, b); + + _lastSelected = b; + } + + public void AddDisplayedRangeToSumSelection(FileFilterGroup fileFilters, int offset, int range) + { + BuildReportTool.SizePart[] listForSelection = GetListToDisplay(fileFilters); + + for (int n = offset; n < offset + range; ++n) + { + if (!InSumSelection(listForSelection[n])) + { + AddToSumSelection(listForSelection[n]); + } + } + } + + public void AddAllDisplayedToSumSelection(FileFilterGroup fileFilters) + { + BuildReportTool.SizePart[] listForSelection = GetListToDisplay(fileFilters); + + for (int n = 0; n < listForSelection.Length; ++n) + { + if (!InSumSelection(listForSelection[n])) + { + AddToSumSelection(listForSelection[n]); + } + } + } + + public void ClearSelection() + { + _selectedForSum.Clear(); + } + } +} // namespace BuildReportTool \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_AssetList.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_AssetList.cs.meta new file mode 100644 index 00000000..efc28673 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_AssetList.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: d373b2d2472b03a49a6d03c6c3211211 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildInfo.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildInfo.cs new file mode 100644 index 00000000..7beaebde --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildInfo.cs @@ -0,0 +1,269 @@ +using System.Collections.Generic; +using UnityEditor; + +namespace BuildReportTool +{ + /// + /// Class for holding a Build Report. + /// This is the class that is serialized when saving a Build Report to a file. + /// + [System.Serializable, System.Xml.Serialization.XmlRoot("BuildInfo")] + public partial class BuildInfo : BuildReportTool.IDataFile + { + // General Info + // ================================================================================== + + /// + /// Name of project folder. + /// Included as part of the filename when saved. + /// + public string ProjectName; + + /// + /// Type of build, as reported by the Unity Editor log, but as a string. + /// Included as part of the filename when saved. + /// + public string BuildType; + + // ----------------------------------------------- + + /// + /// When build was created. + /// Included as part of the filename when saved. + /// + public System.DateTime BuildTimeGot; + + /// + /// When report was created. + /// + public System.DateTime TimeGot; + + /// + /// When build was created, in readable format. + /// + public string BuildTimeGotReadable; + + /// + /// When report was created, in readable format. + /// + public string TimeGotReadable; + + // ----------------------------------------------- + + /// + /// How long it took to create this Build Report. + /// + System.TimeSpan _reportGenerationTime; + + /// + [System.Xml.Serialization.XmlIgnore] + public System.TimeSpan ReportGenerationTime + { + get { return _reportGenerationTime; } + set { _reportGenerationTime = value; } + } + + /// + [System.Xml.Serialization.XmlElement("ReportGenerationTime")] + public long ReportGenerationTimeInTicks + { + get { return _reportGenerationTime.Ticks; } + set { _reportGenerationTime = new System.TimeSpan(value); } + } + + // ----------------------------------------------- + + /// + /// How long it took to create the build. + /// + System.TimeSpan _buildDurationTime; + + [System.Xml.Serialization.XmlIgnore] + public System.TimeSpan BuildDurationTime + { + get { return _buildDurationTime; } + set { _buildDurationTime = value; } + } + + [System.Xml.Serialization.XmlElement("BuildDurationTime")] + public long BuildTimeDurationTicks + { + get { return _buildDurationTime.Ticks; } + set { _buildDurationTime = new System.TimeSpan(value); } + } + + // ----------------------------------------------- + + /// + /// Version of Unity that was used in building project. + /// + public string UnityVersion = ""; + + /// + /// Value of during time of build. + /// This is the full path where the Unity Editor executable is. + /// + public string EditorAppContentsPath = ""; + + /// + /// Value of during time of build. + /// This is the full path where the project folder is. + /// + public string ProjectAssetsPath = ""; + + /// + /// Value of during time of build. + /// This is the full path where the build output is. + /// + public string BuildFilePath = ""; + + + // Build Settings at time of Build Report creation + // ================================================================================== + + /// + /// If this Build Report recorded the various Build Settings when project was built. + /// + public bool HasUnityBuildSettings; + + /// + /// Various Build Settings when project was built. + /// + public UnityBuildSettings UnityBuildSettings; + + + // Unity/OS environment values at time of Build Report creation + // ================================================================================== + + //public string[] PrefabsUsedInScenes; + + /// + /// If the output for an Android build additionally had an .obb file beside the .apk file. + /// + public bool AndroidUseAPKExpansionFiles; + + /// + /// If the output for an Android build was a project instead of an .apk file. + /// + public bool AndroidCreateProject; + + + // Total sizes + // ================================================================================== + + /// + /// Total size of output, in readable format. + /// + public string TotalBuildSize = ""; + + /// + /// Not used anymore. This is kept here for compatibility + /// with opening and displaying old Build Report files. + /// This was the total size of output, in readable format. + /// + public string CompressedBuildSize = ""; + + /// + /// Total size of all assets used in the build, in readable format. + /// + public string UsedTotalSize = ""; + + /// + /// Total size of all assets *not* used in the build, in readable format. + /// + public string UnusedTotalSize = ""; + + /// + /// Total size of StreamingAssets folder (if present), in readable format. + /// + public string StreamingAssetsSize = ""; + + + // Per-platform specific sizes + // ------------------------------------------- + + /// + /// Not used anymore. This is kept here for compatibility + /// with opening and displaying old Build Report files. + /// This was the size of the .unity3d web build file, in readable format. + /// + public string WebFileBuildSize = ""; + + /// + /// For Android builds, this is the size of the .apk file, in readable format. + /// + public string AndroidApkFileBuildSize = ""; + + /// + /// For Android builds that generated an additional .obb file, + /// this is the size of the .obb file, in readable format. + /// + public string AndroidObbFileBuildSize = ""; + + + // Category Sizes + // ================================================================================== + + public BuildReportTool.SizePart[] BuildSizes; + + + // File entries + // ================================================================================== + + /// + /// All Mono/.NET DLL files used in the build, and their file sizes. + /// + public BuildReportTool.SizePart[] MonoDLLs; + + /// + /// All managed DLL files from the project's Assets folder + /// that were used in the build, and their file sizes. + /// + public BuildReportTool.SizePart[] ScriptDLLs; + + /// + /// All the Unity API managed DLL files + /// that were used in the build, and their file sizes. + /// + public BuildReportTool.SizePart[] UnityEngineDLLs; + + /// + /// File filters used at time of Build Report creation + /// + public FileFilterGroup FileFilters; + + /// + /// All files from the project's Assets folder + /// that were included in the build, and their file sizes. + /// + public AssetList UsedAssets; + + /// + /// All files from the project's Assets folder + /// that were *not* included in the build, and their file sizes. + /// + public AssetList UnusedAssets; + + /// + /// Scenes included in the build + /// + public SceneInBuild[] ScenesInBuild; + + + // Build Report Tool Options used at time of Build Report creation + // ================================================================================== + + public bool IncludedSvnInUnused; + public bool IncludedGitInUnused; + public bool IncludedBuildReportToolAssetsInUnused; + + public List IgnorePatternsForUnused; + + public bool UsedAssetsIncludedInCreation; + public bool UnusedAssetsIncludedInCreation; + public bool UnusedPrefabsIncludedInCreation; + + public bool ProcessUnusedAssetsInBatches = true; + public int UnusedAssetsEntriesPerBatch; + } +} // namespace BuildReportTool \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildInfo.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildInfo.cs.meta new file mode 100644 index 00000000..792ca9b4 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildInfo.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: ff2cf1458371b124d9aca896e244c45e +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildInfo_Commands.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildInfo_Commands.cs new file mode 100644 index 00000000..02b459ef --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildInfo_Commands.cs @@ -0,0 +1,602 @@ +#if UNITY_4 || UNITY_5_0 || UNITY_5_1 || UNITY_5_2 + #define UNITY_5_2_AND_LESSER +#endif + +using UnityEditor; +using System.Linq; +using System.Collections.Generic; + +namespace BuildReportTool +{ + public partial class BuildInfo + { + public struct SceneInBuild + { + public bool Enabled; + public string Path; + } + + // Queries + // ================================================================================== + + public bool HasContents + { + get + { + // build sizes can't be empty (they are always there when you build) + return !string.IsNullOrEmpty(ProjectName) && (BuildSizes != null && BuildSizes.Length > 0); + } + } + + public bool IsUnityVersionAtLeast(int majorAtLeast, int minorAtLeast, int patchAtLeast) + { + return DldUtil.UnityVersion.IsUnityVersionAtLeast(UnityVersion, majorAtLeast, minorAtLeast, patchAtLeast); + } + + public bool IsUnityVersionAtMost(int majorAtMost, int minorAtMost, int patchAtMost) + { + return DldUtil.UnityVersion.IsUnityVersionAtMost(UnityVersion, majorAtMost, minorAtMost, patchAtMost); + } + + public string SuitableTitle + { + get + { + if (UnityBuildSettings != null && UnityBuildSettings.HasValues && + !string.IsNullOrEmpty(UnityBuildSettings.ProductName)) + { + return UnityBuildSettings.ProductName; + } + + return ProjectName; + } + } + + public string GetTimeReadable() + { + if (!string.IsNullOrEmpty(BuildTimeGotReadable)) + { + return BuildTimeGotReadable; + } + + if (!string.IsNullOrEmpty(TimeGotReadable)) + { + return TimeGotReadable; + } + + return TimeGot.ToString(BuildReportTool.ReportGenerator.TIME_OF_BUILD_FORMAT); + } + + public string UnityVersionDisplayed + { + get + { + if (UnityBuildSettings != null && UnityBuildSettings.HasValues) + { + return UnityVersion + (UnityBuildSettings.UsingAdvancedLicense ? " Pro" : ""); + } + + return UnityVersion; + } + } + + public string GetDefaultFilename() + { + return BuildReportTool.Util.GetBuildInfoDefaultFilename(ProjectName, BuildType, BuildTimeGot); + } + + public string GetAccompanyingAssetDependenciesFilename() + { + return BuildReportTool.Util.GetAssetDependenciesDefaultFilename(ProjectName, BuildType, BuildTimeGot); + } + + // old size values were only TotalBuildSize and CompressedBuildSize + public bool HasOldSizeValues + { + get + { + return + string.IsNullOrEmpty(UnusedTotalSize) && + string.IsNullOrEmpty(UsedTotalSize) && + string.IsNullOrEmpty(StreamingAssetsSize) && + string.IsNullOrEmpty(WebFileBuildSize) && + string.IsNullOrEmpty(AndroidApkFileBuildSize) && + string.IsNullOrEmpty(AndroidObbFileBuildSize); + } + } + + public bool HasUsedAssets + { + get { return UsedAssets != null; } + } + + public bool HasUnusedAssets + { + get { return UnusedAssets != null; } + } + + public bool HasStreamingAssets + { + get { return StreamingAssetsSize != "0 B"; } + } + + // Commands + // ================================================================================== + + public void UnescapeAssetNames() + { + if (UsedAssets != null) + { + UsedAssets.UnescapeAssetNames(); + } + + if (UnusedAssets != null) + { + UnusedAssets.UnescapeAssetNames(); + } + } + + public void RecategorizeAssetLists() + { + FileFilterGroup fileFiltersToUse = FileFilters; + + if (BuildReportTool.Options.ShouldUseConfiguredFileFilters()) + { + fileFiltersToUse = BuildReportTool.FiltersUsed.GetProperFileFilterGroupToUse(); + //Debug.Log("going to use configured file filters instead... loaded: " + (fileFiltersToUse != null)); + } + + if (UsedAssets != null) + { + UsedAssets.AssignPerCategoryList( + BuildReportTool.ReportGenerator.SegregateAssetSizesPerCategory(UsedAssets.All, fileFiltersToUse)); + + UsedAssets.RefreshFilterLabels(fileFiltersToUse); + + UsedAssets.ResortDefault(BuildReportTool.Options.NumberOfTopLargestUsedAssetsToShow); + } + + if (UnusedAssets != null) + { + UnusedAssets.AssignPerCategoryList( + BuildReportTool.ReportGenerator.SegregateAssetSizesPerCategory(UnusedAssets.All, fileFiltersToUse)); + + UnusedAssets.RefreshFilterLabels(fileFiltersToUse); + + UnusedAssets.ResortDefault(BuildReportTool.Options.NumberOfTopLargestUnusedAssetsToShow); + } + } + + public void RecategorizeUsedAssets() + { + if (UsedAssets == null) + { + return; + } + + FileFilterGroup fileFiltersToUse = FileFilters; + + if (BuildReportTool.Options.ShouldUseConfiguredFileFilters()) + { + fileFiltersToUse = BuildReportTool.FiltersUsed.GetProperFileFilterGroupToUse(); + //Debug.Log("going to use configured file filters instead... loaded: " + (fileFiltersToUse != null)); + } + + UsedAssets.AssignPerCategoryList( + BuildReportTool.ReportGenerator.SegregateAssetSizesPerCategory(UsedAssets.All, fileFiltersToUse)); + + UsedAssets.RefreshFilterLabels(fileFiltersToUse); + + UsedAssets.ResortDefault(BuildReportTool.Options.NumberOfTopLargestUsedAssetsToShow); + } + + public void RecategorizeUnusedAssets() + { + if (UnusedAssets == null) + { + return; + } + + FileFilterGroup fileFiltersToUse = FileFilters; + + if (BuildReportTool.Options.ShouldUseConfiguredFileFilters()) + { + fileFiltersToUse = BuildReportTool.FiltersUsed.GetProperFileFilterGroupToUse(); + //Debug.Log("going to use configured file filters instead... loaded: " + (fileFiltersToUse != null)); + } + + UnusedAssets.AssignPerCategoryList( + BuildReportTool.ReportGenerator.SegregateAssetSizesPerCategory(UnusedAssets.All, fileFiltersToUse)); + + UnusedAssets.RefreshFilterLabels(fileFiltersToUse); + + UnusedAssets.ResortDefault(BuildReportTool.Options.NumberOfTopLargestUnusedAssetsToShow); + } + + void CalculateUsedAssetsDerivedSizes() + { + if (UsedAssets != null) + { + for (int n = 0, len = UsedAssets.All.Length; n < len; ++n) + { + UsedAssets.All[n].DerivedSize = BuildReportTool.Util.GetApproxSizeFromString(UsedAssets.All[n].Size); + } + } + } + + public void SortSizes() + { + System.Array.Sort(BuildSizes, delegate(BuildReportTool.SizePart b1, BuildReportTool.SizePart b2) + { + if (b1.Percentage > b2.Percentage) return -1; + else if (b1.Percentage < b2.Percentage) return 1; + // if percentages are equal, check actual file size (approximate values) + else if (b1.DerivedSize > b2.DerivedSize) return -1; + else if (b1.DerivedSize < b2.DerivedSize) return 1; + return 0; + }); + } + + + /// + /// This is called right after generating a build report. + /// + public void FixReport() + { +#if UNITY_5_2_AND_LESSER + // this bug has already been fixed since Unity 5.2.1 + // so we only execute this for Unity 5.2.0 and below + + if (!DldUtil.UnityVersion.IsUnityVersionAtLeast(5, 2, 1)) + { + // -------------------------------------------------------------------------------- + // fix imported sizes of Resources files + + for (int n = 0; n < UsedAssets.All.Length; ++n) + { + if (BuildReportTool.Util.IsFileInAPath(UsedAssets.All[n].Name, "/Resources/")) + { + UsedAssets.All[n].ImportedSizeBytes = BRT_LibCacheUtil.GetImportedFileSize(UsedAssets.All[n].Name); + UsedAssets.All[n].ImportedSize = + BuildReportTool.Util.GetBytesReadable(UsedAssets.All[n].ImportedSizeBytes); + + UsedAssets.All[n].RawSizeBytes = UsedAssets.All[n].ImportedSizeBytes; + UsedAssets.All[n].RawSize = UsedAssets.All[n].ImportedSize; + + UsedAssets.All[n].DerivedSize = 0; + UsedAssets.All[n].Percentage = -1; + } + } + + UsedAssets.ResortDefault(BuildReportTool.Options.NumberOfTopLargestUsedAssetsToShow); + + // -------------------------------------------------------------------------------- + // recalculate percentages + + var totalSizePart = BuildSizes.FirstOrDefault(part => part.IsTotal); + if (totalSizePart != null && System.Math.Abs(totalSizePart.DerivedSize) < 0.01) + { + var totalSize = GetTotalSize(); + ChangeTotalSize(totalSize); + } + + // add textures, meshes, sounds, and animations that are in resources folder to the build size + // since they are not included anymore in Unity 5 + + var resourcesTextureSizeSum = + GetSizeSumForUsedAssets("/Resources/", BuildReportTool.Util.IsTextureFile); + AddToSize("Textures", resourcesTextureSizeSum); + + var resourcesMeshSizeSum = GetSizeSumForUsedAssets("/Resources/", BuildReportTool.Util.IsMeshFile); + AddToSize("Meshes", resourcesMeshSizeSum); + + var resourcesSoundsSizeSum = GetSizeSumForUsedAssets("/Resources/", BuildReportTool.Util.IsSoundFile); + AddToSize("Sounds", resourcesSoundsSizeSum); + + var resourcesAnimationsSizeSum = + GetSizeSumForUsedAssets("/Resources/", BuildReportTool.Util.IsAnimationFile); + AddToSize("Animations", resourcesAnimationsSizeSum); + + AddToTotalSize(resourcesTextureSizeSum); + AddToTotalSize(resourcesMeshSizeSum); + AddToTotalSize(resourcesSoundsSizeSum); + AddToTotalSize(resourcesAnimationsSizeSum); + + RecalculatePercentages(); + + // sort sizes again since we modified them + SortSizes(); + } +#else + // newer versions of Unity (2017 and up) + // has a bug where the total size reported is actually the final build's size, + // instead of the total of the sizes indicated in the build log. + // so we recalculate the percentages. + // this is most noticeable when the percentages + // indicated don't really total up to 100, not even close to 90 + RecalculatePercentages(); + + // sort sizes again since we modified them + SortSizes(); +#endif + } + + // Events + // ================================================================================== + + public void OnBeforeSave() + { + } + + public void OnAfterLoad() + { + if (HasContents) + { + CalculateUsedAssetsDerivedSizes(); + UnescapeAssetNames(); + RecategorizeAssetLists(); + } + } + + // Helper methods + // ================================================================================== + + double GetTotalSize() + { + if (BuildSizes == null) + { + return 0; + } + + double totalSize = 0; + for (int n = 0, len = BuildSizes.Length; n < len; ++n) + { + if (!BuildSizes[n].IsTotal) + { + totalSize += BuildSizes[n].DerivedSize; + } + } + + + return totalSize; + } + + void RecalculatePercentages() + { + //Debug.Log("RecalculatePercentages() called"); + + + double totalSize = GetTotalSize(); + + //Debug.LogFormat("BuildSizes total: {0}", totalSize); + + for (int n = 0, len = BuildSizes.Length; n < len; ++n) + { + BuildSizes[n].Percentage = System.Math.Round((BuildSizes[n].UsableSize / totalSize) * 100, 2, + System.MidpointRounding.AwayFromZero); + } + + + // note: only Used Assets are shown the percentages so we + // don't bother recalculating percentage for Unused Assets + if (UsedAssets != null) + { + UsedAssets.RecalculatePercentages(totalSize); + } + + ChangeTotalSize(totalSize); + } + + long GetSizeSumForUsedAssets(string assetFolderName, System.Func fileTypePredicate) + { + if (UsedAssets == null || UsedAssets.All == null) + { + return 0; + } + + return UsedAssets.All.Where(part => + BuildReportTool.Util.IsFileInAPath(part.Name, assetFolderName) && + fileTypePredicate(part.Name)) + .Sum(part => BRT_LibCacheUtil.GetImportedFileSize(part.Name)); + } + + static void AddToSize(BuildReportTool.SizePart buildSize, long sizeToAdd) + { + if (buildSize != null) + { + buildSize.DerivedSize += sizeToAdd; + buildSize.Size = BuildReportTool.Util.GetBytesReadable(buildSize.DerivedSize); + } + } + + void AddToSize(string buildSizeName, long sizeToAdd) + { + if (sizeToAdd == 0) + { + return; + } + + BuildReportTool.SizePart buildSize = BuildSizes.FirstOrDefault(part => part.Name == buildSizeName); + + if (buildSize != null) + { + //Debug.LogFormat("{0} size before: {1}", buildSizeName, buildSize.DerivedSize); + + AddToSize(buildSize, sizeToAdd); + + //Debug.LogFormat("{0} size after: {1}", buildSizeName, buildSize.DerivedSize); + } + } + + void AddToTotalSize(long sizeToAdd) + { + if (sizeToAdd == 0) + { + return; + } + + BuildReportTool.SizePart buildSize = BuildSizes.FirstOrDefault(part => part.IsTotal); + + if (buildSize != null) + { + //Debug.LogFormat("total size before: {0}", buildSize.DerivedSize); + + AddToSize(buildSize, sizeToAdd); + + UsedTotalSize = buildSize.Size; + + //Debug.LogFormat("total size after: {0}", buildSize.DerivedSize); + } + } + + void ChangeTotalSize(double newSize) + { + if (System.Math.Abs(newSize) < 0.01) + { + // disallow zero total size + return; + } + + BuildReportTool.SizePart totalSize = BuildSizes.FirstOrDefault(part => part.IsTotal); + + if (totalSize != null) + { + //Debug.LogFormat("total size before: {0}", totalSize.DerivedSize); + + totalSize.DerivedSize = newSize; + totalSize.Size = BuildReportTool.Util.GetBytesReadable(totalSize.DerivedSize); + + UsedTotalSize = totalSize.Size; + + //Debug.LogFormat("total size after: {0}", totalSize.DerivedSize); + } + } + + + // temp variables that are not serialized into the XML file + // ================================================================================== + + // only used while generating the build report or opening one + + /// + /// Needed for ParseDLLs + /// + [System.Xml.Serialization.XmlIgnore] + public ApiCompatibilityLevel MonoLevel; + + /// + /// Needed for ParseDLLs + /// + [System.Xml.Serialization.XmlIgnore] + public StrippingLevel CodeStrippingLevel; + + + public void SetScenes(EditorBuildSettingsScene[] newScenes) + { + var len = newScenes.Length; + ScenesInBuild = new SceneInBuild[len]; + for (int n = 0; n < len; ++n) + { + ScenesInBuild[n].Enabled = newScenes[n].enabled; + ScenesInBuild[n].Path = newScenes[n].path; + } + } + + public void SetScenes(string[] newScenes) + { + var len = newScenes.Length; + ScenesInBuild = new SceneInBuild[len]; + for (int n = 0; n < len; ++n) + { + ScenesInBuild[n].Enabled = true; + ScenesInBuild[n].Path = newScenes[n]; + } + } + + + int _unusedAssetsBatchIdx; + + public int UnusedAssetsBatchIdx + { + get { return _unusedAssetsBatchIdx; } + } + + /// + /// Last asset number that each batch displays. + /// + [System.Xml.Serialization.XmlIgnore] + public List UnusedAssetsBatchFinalNum = new List(); + + public void ResetUnusedAssetsBatchData() + { + _unusedAssetsBatchIdx = 0; + UnusedAssetsBatchFinalNum.Clear(); + } + + public void MoveUnusedAssetsBatchNumToNext() + { + ++_unusedAssetsBatchIdx; + } + + public void MoveUnusedAssetsBatchNumToPrev() + { + if (_unusedAssetsBatchIdx == 0) + { + return; + } + + --_unusedAssetsBatchIdx; + } + + // --------------------------------------- + + /// + /// Full path where this Build Report is saved in the local storage. + /// + string _savedPath; + + /// + public string SavedPath + { + get { return _savedPath; } + } + + public void SetSavedPath(string val) + { + _savedPath = val.Replace("\\", "/"); + } + + // --------------------------------------- + + BuildTarget _buildTarget; + + public BuildTarget BuildTargetUsed + { + get { return _buildTarget; } + } + + public void SetBuildTargetUsed(BuildTarget val) + { + _buildTarget = val; + } + + // --------------------------------------- + + bool _refreshRequest; + + public void FlagOkToRefresh() + { + _refreshRequest = true; + } + + public void FlagFinishedRefreshing() + { + _refreshRequest = false; + } + + public bool RequestedToRefresh + { + get { return _refreshRequest; } + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildInfo_Commands.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildInfo_Commands.cs.meta new file mode 100644 index 00000000..966be42f --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildInfo_Commands.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 255e387177d750b4caac40a5459299f9 +timeCreated: 1557585214 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildPlatformType.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildPlatformType.cs new file mode 100644 index 00000000..dcfa91de --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildPlatformType.cs @@ -0,0 +1,82 @@ +namespace BuildReportTool +{ + /// + /// Per platform identification. + /// Needed to handle special cases. + /// Example: some platforms have a compressed build, some do not. + /// Also, native plugins are handled differently in each platform. + /// + /// + /// Meant to be similar to , + /// except here we don't mark any value obsolete, for backwards compatibility + /// with old Build Reports. + /// + public enum BuildPlatform + { + None = 0, + + // ------- + // Mobiles + // ------- + + Android = 1, + iOS, + tvOS, + Blackberry, + WindowsPhone8, + Tizen, + + + // -------- + // Web + // -------- + + Web = 100, + Flash, + WebGL, + + + // -------- + // Desktops + // -------- + + // distinctions between 32 or 64 bit need to be made to + // determine which existing native plugins are used or not + + MacOSX32 = 200, + MacOSX64, + MacOSXUniversal, + + Windows32 = 300, + Windows64, + WindowsStoreApp, + + Linux32 = 400, + Linux64, + LinuxUniversal, + LinuxHeadless, + EmbeddedLinux, + + + // ------ + // Consoles + // ------ + + // currently not handled in any special way (probably needs to be): + + Xbox360 = 500, + XboxOne, + XboxSeries, + + PS3 = 600, + PSVitaNative, + PSMobile, + PS4, + PS5, + + Wii = 700, + WiiU, + Nintendo3DS, + Switch, + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildPlatformType.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildPlatformType.cs.meta new file mode 100644 index 00000000..433c9694 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildPlatformType.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1f8c3277dd7544144be1fcb1a76b0c0c +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildSettingsCategoryType.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildSettingsCategoryType.cs new file mode 100644 index 00000000..0ad0f8be --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildSettingsCategoryType.cs @@ -0,0 +1,40 @@ +namespace BuildReportTool +{ + /// + /// Platforms that are shown in the Build Settings Screen + /// + public enum BuildSettingCategory + { + None = 0, + + WindowsDesktopStandalone = 100, + WindowsStoreApp, + MacStandalone = 200, + LinuxStandalone = 250, + + WebPlayer = 300, + FlashPlayer, + WebGL, + + iOS = 400, + tvOS, + Android = 500, + Blackberry = 600, + WindowsPhone8, + Tizen, + + Xbox360 = 700, + XboxOne, + XboxSeries, + + PS3 = 800, + PS4, + PSVita, + PSM, + PS5, + + Switch = 900, + + SamsungTV = 1000, + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildSettingsCategoryType.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildSettingsCategoryType.cs.meta new file mode 100644 index 00000000..63d5578f --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_BuildSettingsCategoryType.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1fb3aa40651b3a24eb3280438e0ca363 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_IDataFile.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_IDataFile.cs new file mode 100644 index 00000000..b790833b --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_IDataFile.cs @@ -0,0 +1,12 @@ + +namespace BuildReportTool +{ + public interface IDataFile + { + void OnBeforeSave(); + void OnAfterLoad(); + void SetSavedPath(string savedPath); + string SavedPath { get; } + string GetDefaultFilename(); + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_IDataFile.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_IDataFile.cs.meta new file mode 100644 index 00000000..98dc4dec --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_IDataFile.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 68ce3abd878aabc408cfe36da6d6f84c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_MeshData.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_MeshData.cs new file mode 100644 index 00000000..3c235407 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_MeshData.cs @@ -0,0 +1,261 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace BuildReportTool +{ + [System.Serializable, System.Xml.Serialization.XmlRoot("MeshData")] + public class MeshData : BuildReportTool.IDataFile + { + // ================================================================================== + + /// + /// Name of project folder. + /// Included as part of the filename when saved. + /// + public string ProjectName; + + /// + /// Type of build that the project was configured to, at the time that MeshData was collected. + /// Included as part of the filename when saved. + /// + public string BuildType; + + /// + /// When MeshData was collected. + /// Included as part of the filename when saved. + /// + public System.DateTime TimeGot; + + public string GetDefaultFilename() + { + return BuildReportTool.Util.GetMeshDataDefaultFilename(ProjectName, BuildType, TimeGot); + } + + public string GetAccompanyingBuildReportFilename() + { + return BuildReportTool.Util.GetBuildInfoDefaultFilename(ProjectName, BuildType, TimeGot); + } + + /// + /// Full path where this MeshData is saved in the local storage. + /// + string _savedPath; + + /// + public string SavedPath + { + get { return _savedPath; } + } + + public void SetSavedPath(string val) + { + _savedPath = val.Replace("\\", "/"); + } + + public bool HasContents + { + get { return _meshData.Count > 0; } + } + + public void Clear() + { + _meshData.Clear(); + } + + // ================================================================================== + + public enum DataId + { + None, + MeshFilterCount, + SkinnedMeshRendererCount, + SubMeshCount, + VertexCount, + TriangleCount, + AnimationType, + AnimationClipCount, + } + + public const string TOOLTIP_TEXT_MESH_FILTER_COUNT = @"Non-skinned Mesh Count + +Number of MeshFilter components in the asset."; + + public const string TOOLTIP_TEXT_SKINNED_MESH_RENDERER_COUNT = @"Skinned Mesh Count + +Number of SkinnedMeshRenderer components in the asset."; + + public const string TOOLTIP_TEXT_SUB_MESH_COUNT = @"Sub-Mesh Count + +Total number of sub-meshes in the asset."; + + public const string TOOLTIP_TEXT_VERTEX_COUNT = @"Vertex Count + +Total number of vertices from all meshes in the asset. + +This is the number of vertices used in the triangles. Some vertices are re-used, which means the number here will normally be higher than what 3d programs usually display. + +For example, a regular cube will have 24 in its vertex count, instead of 8 (4 vertices for each face, 6 faces in total, 4 x 6 = 24)."; + + public const string TOOLTIP_TEXT_TRIANGLE_COUNT = @"Face Count + +Total number of triangles from all meshes in the asset. + +If Keep Quads was turned on in the asset's Import Settings, then this count is a mix of triangles and quads."; + + public const string TOOLTIP_TEXT_ANIMATION_TYPE = @"Animation Type + +Whether this asset is set to use Humanoid, Generic, or Legacy type of animation."; + + public const string TOOLTIP_TEXT_ANIMATION_CLIP_COUNT = @"Animation Clip Count + +Number of imported Animation Clips in the asset."; + + public static string GetTooltipTextFromId(DataId textureDataId) + { + switch (textureDataId) + { + case DataId.MeshFilterCount: + return TOOLTIP_TEXT_MESH_FILTER_COUNT; + case DataId.SkinnedMeshRendererCount: + return TOOLTIP_TEXT_SKINNED_MESH_RENDERER_COUNT; + case DataId.SubMeshCount: + return TOOLTIP_TEXT_SUB_MESH_COUNT; + case DataId.VertexCount: + return TOOLTIP_TEXT_VERTEX_COUNT; + case DataId.TriangleCount: + return TOOLTIP_TEXT_TRIANGLE_COUNT; + case DataId.AnimationType: + return TOOLTIP_TEXT_ANIMATION_TYPE; + case DataId.AnimationClipCount: + return TOOLTIP_TEXT_ANIMATION_CLIP_COUNT; + default: + return null; + } + } + // ================================================================================== + + public struct Entry + { + /// + /// Number of MeshFilter components in the asset. + /// + public int MeshFilterCount; + + /// + /// Number of SkinnedMeshRenderer components in the asset. + /// + public int SkinnedMeshRendererCount; + + /// + /// Total number of meshes in the asset. + /// + public int SubMeshCount; + + /// + /// Number of vertices in the asset. + /// + /// + /// This is the number of vertices used in the triangles. + /// Some vertices are re-used, which means the number here will + /// normally be higher than what 3d programs usually display. + /// + /// For example, a regular cube will have 24 in its vertex count, instead of 8. + /// + /// 4 vertices for each face, 6 faces in total, 4 x 6 = 24 + /// + /// This is the total from all meshes in the asset. + /// + public int VertexCount; + + /// + /// Number of triangles in the asset. + /// + /// + /// This is the total triangles from all meshes in the asset. + /// + public int TriangleCount; + + public string AnimationType; + public int AnimationClipCount; + + public string ToDisplayedValue(DataId dataId) + { + switch (dataId) + { + case DataId.MeshFilterCount: + return MeshFilterCount.ToString("N0"); + case DataId.SkinnedMeshRendererCount: + return SkinnedMeshRendererCount.ToString("N0"); + case DataId.SubMeshCount: + return SubMeshCount.ToString("N0"); + case DataId.VertexCount: + return VertexCount.ToString("N0"); + case DataId.TriangleCount: + return TriangleCount.ToString("N0"); + case DataId.AnimationType: + return AnimationType; + case DataId.AnimationClipCount: + return AnimationClipCount.ToString("N0"); + // ------------------------ + default: + return string.Empty; + } + } + } + + // ================================================================================== + + Dictionary _meshData = new Dictionary(); + + public List Assets; + public List Data; + + public Dictionary GetMeshData() + { + return _meshData; + } + + // ================================================================================== + + public void OnBeforeSave() + { + if (Assets != null) + { + Assets.Clear(); + } + else + { + Assets = new List(); + } + + Assets.AddRange(_meshData.Keys); + + if (Data != null) + { + Data.Clear(); + } + else + { + Data = new List(); + } + + Data.AddRange(_meshData.Values); + } + + public void OnAfterLoad() + { + _meshData.Clear(); + + //var platformName = TextureData.GetPlatformNameFromBuildType(BuildType); + var len = Mathf.Min(Assets.Count, Data.Count); + for (int n = 0; n < len; ++n) + { + var entryToModify = Data[n]; + //entryToModify.UpdateShownSettings(platformName); + Data[n] = entryToModify; // have to assign it back, Entry is a struct + + _meshData.Add(Assets[n], Data[n]); + } + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_MeshData.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_MeshData.cs.meta new file mode 100644 index 00000000..fa3eeeeb --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_MeshData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: cf4f49671de37b7448425bc0da869f81 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_PrefabData.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_PrefabData.cs new file mode 100644 index 00000000..9b1f4471 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_PrefabData.cs @@ -0,0 +1,241 @@ +using System.Collections.Generic; +using UnityEngine; + +namespace BuildReportTool +{ + [System.Serializable, System.Xml.Serialization.XmlRoot("PrefabData")] + public class PrefabData : BuildReportTool.IDataFile + { + // ================================================================================== + + /// + /// Name of project folder. + /// Included as part of the filename when saved. + /// + public string ProjectName; + + /// + /// Type of build that the project was configured to, at the time that PrefabData was collected. + /// Included as part of the filename when saved. + /// + public string BuildType; + + /// + /// When PrefabData was collected. + /// Included as part of the filename when saved. + /// + public System.DateTime TimeGot; + + public string GetDefaultFilename() + { + return BuildReportTool.Util.GetPrefabDataDefaultFilename(ProjectName, BuildType, TimeGot); + } + + public string GetAccompanyingBuildReportFilename() + { + return BuildReportTool.Util.GetBuildInfoDefaultFilename(ProjectName, BuildType, TimeGot); + } + + /// + /// Full path where this PrefabData is saved in the local storage. + /// + string _savedPath; + + /// + public string SavedPath + { + get { return _savedPath; } + } + + public void SetSavedPath(string val) + { + _savedPath = val.Replace("\\", "/"); + } + + public bool HasContents + { + get { return _prefabData.Count > 0; } + } + + // ================================================================================== + + public const int FLAG_CONTRIBUTE_GI = 1; + public const int FLAG_OCCLUDER_STATIC = 1 << 1; + public const int FLAG_BATCHING_STATIC = 1 << 2; + public const int FLAG_NAVIGATION_STATIC = 1 << 3; + public const int FLAG_OCCLUDEE_STATIC = 1 << 4; + public const int FLAG_OFF_MESH_LINK_GENERATION = 1 << 5; + public const int FLAG_REFLECTION_PROBE_STATIC = 1 << 6; + + public struct Entry + { + /// + /// Value from of prefab's GameObject. + /// + /// + /// ContributeGI = 1
+ /// OccluderStatic = 2
+ /// BatchingStatic = 4
+ /// NavigationStatic = 8
+ /// OccludeeStatic = 16
+ /// OffMeshLinkGeneration = 32
+ /// ReflectionProbeStatic = 64

+ /// Note: NavigationStatic and OffMeshLinkGeneration has been removed in 2022, + /// They have since moved to a package and are in components. + ///
+ public int StaticEditorFlags; + public int ChildStaticEditorFlags; + + public bool HasContributeGI => (StaticEditorFlags & FLAG_CONTRIBUTE_GI) != 0; + public bool HasBatchingStatic => (StaticEditorFlags & FLAG_BATCHING_STATIC) != 0; + public bool HasReflectionProbeStatic => (StaticEditorFlags & FLAG_REFLECTION_PROBE_STATIC) != 0; + public bool HasOccluderStatic => (StaticEditorFlags & FLAG_OCCLUDER_STATIC) != 0; + public bool HasOccludeeStatic => (StaticEditorFlags & FLAG_OCCLUDEE_STATIC) != 0; + public bool HasNavigationStatic => (StaticEditorFlags & FLAG_NAVIGATION_STATIC) != 0; + public bool HasOffMeshLinkGeneration => (StaticEditorFlags & FLAG_OFF_MESH_LINK_GENERATION) != 0; + + bool ChildHasContributeGI => (ChildStaticEditorFlags & FLAG_CONTRIBUTE_GI) != 0; + bool ChildHasBatchingStatic => (ChildStaticEditorFlags & FLAG_BATCHING_STATIC) != 0; + bool ChildHasReflectionProbeStatic => (ChildStaticEditorFlags & FLAG_REFLECTION_PROBE_STATIC) != 0; + bool ChildHasOccluderStatic => (ChildStaticEditorFlags & FLAG_OCCLUDER_STATIC) != 0; + bool ChildHasOccludeeStatic => (ChildStaticEditorFlags & FLAG_OCCLUDEE_STATIC) != 0; + bool ChildHasNavigationStatic => (ChildStaticEditorFlags & FLAG_NAVIGATION_STATIC) != 0; + bool ChildHasOffMeshLinkGeneration => (ChildStaticEditorFlags & FLAG_OFF_MESH_LINK_GENERATION) != 0; + + // 2 means it has that flag at the root level, 1 means it has that flag in one of its child GameObjects + public int ContributeGIValue => HasContributeGI ? 2 : ChildHasContributeGI ? 1 : 0; + public int BatchingStaticValue => HasBatchingStatic ? 2 : ChildHasBatchingStatic ? 1 : 0; + public int ReflectionProbeStaticValue => HasReflectionProbeStatic ? 2 : ChildHasReflectionProbeStatic ? 1 : 0; + public int OccluderStaticValue => HasOccluderStatic ? 2 : ChildHasOccluderStatic ? 1 : 0; + public int OccludeeStaticValue => HasOccludeeStatic ? 2 : ChildHasOccludeeStatic ? 1 : 0; + public int NavigationStaticValue => HasNavigationStatic ? 2 : ChildHasNavigationStatic ? 1 : 0; + public int OffMeshLinkGenerationValue => HasOffMeshLinkGeneration ? 2 : ChildHasOffMeshLinkGeneration ? 1 : 0; + + public string HasValue(DataId prefabDataId) + { + switch (prefabDataId) + { + case DataId.ContributeGI: + return HasContributeGI ? "Yes" : ChildHasContributeGI ? "Yes (in child GameObject)" : "No"; + case DataId.BatchingStatic: + return HasBatchingStatic ? "Yes" : ChildHasBatchingStatic ? "Yes (in child GameObject)" : "No"; + case DataId.ReflectionProbeStatic: + return HasReflectionProbeStatic ? "Yes" : ChildHasReflectionProbeStatic ? "Yes (in child GameObject)" : "No"; + case DataId.OccluderStatic: + return HasOccluderStatic ? "Yes" : ChildHasOccluderStatic ? "Yes (in child GameObject)" : "No"; + case DataId.OccludeeStatic: + return HasOccludeeStatic ? "Yes" : ChildHasOccludeeStatic ? "Yes (in child GameObject)" : "No"; + case DataId.NavigationStatic: + return HasNavigationStatic ? "Yes" : ChildHasNavigationStatic ? "Yes (in child GameObject)" : "No"; + case DataId.OffMeshLinkGeneration: + return HasOffMeshLinkGeneration ? "Yes" : ChildHasOffMeshLinkGeneration ? "Yes (in child GameObject)" : "No"; + default: + return string.Empty; + } + } + } + + /// + /// Key is asset path. + /// + Dictionary _prefabData = new Dictionary(); + + public List Assets; + public List Data; + + public Dictionary GetPrefabData() + { + return _prefabData; + } + + public void Clear() + { + _prefabData.Clear(); + } + + // ================================================================================== + + public enum DataId + { + None, + ContributeGI, + BatchingStatic, + ReflectionProbeStatic, + OccluderStatic, + OccludeeStatic, + NavigationStatic, + OffMeshLinkGeneration, + } + + public static string GetTooltipTextFromId(DataId flag) + { + switch (flag) + { + case DataId.ContributeGI: + return "Contribute Global Illumination\n\nWhether the Mesh Renderers inside the GameObject are included in global illumination calculations."; + case DataId.BatchingStatic: + return "Static Batching\n\nWhether the GameObject's Mesh is combined with other eligible Meshes, to potentially reduce runtime rendering costs."; + case DataId.ReflectionProbeStatic: + return "Reflection Probe Static\n\nWhether the GameObject is included when precomputing data for Reflection Probes whose Type is Baked."; + case DataId.OccluderStatic: + return "Occluder Static\n\nWhether the GameObject is marked as a Static Occluder in the occlusion culling system."; + case DataId.OccludeeStatic: + return "Occludee Static\n\nWhether the GameObject is marked as a Static Occludee in the occlusion culling system."; + case DataId.NavigationStatic: +#if UNITY_2022_2_OR_NEWER + return "Navigation Static\n\nWhether the GameObject is included when precomputing navigation data.\n\nNote: This property is deprecated in Unity 2022.2 and beyond. The precise selection of the objects is now done using NavMeshBuilder.CollectSources() and NavMeshBuildMarkup."; +#else + return "Navigation Static\n\nWhether the GameObject is included when precomputing navigation data."; +#endif + case DataId.OffMeshLinkGeneration: +#if UNITY_2022_2_OR_NEWER + return "Off-Mesh Link Generation\n\nWhether to attempt generation of an Off-Mesh Link that starts from the GameObject when precomputing navigation data.\n\nNote: This property is deprecated in Unity 2022.2 and beyond. You can now use NavMeshBuilder.CollectSources() and NavMeshBuildMarkup to nominate the objects that will generate Off-Mesh Links."; +#else + return "Off-Mesh Link Generation\n\nWhether to attempt generation of an Off-Mesh Link that starts from the GameObject when precomputing navigation data."; +#endif + default: + return null; + } + } + + // ================================================================================== + + public void OnBeforeSave() + { + if (Assets != null) + { + Assets.Clear(); + } + else + { + Assets = new List(); + } + + Assets.AddRange(_prefabData.Keys); + + if (Data != null) + { + Data.Clear(); + } + else + { + Data = new List(); + } + + Data.AddRange(_prefabData.Values); + } + + public void OnAfterLoad() + { + _prefabData.Clear(); + + var len = Mathf.Min(Assets.Count, Data.Count); + for (int n = 0; n < len; ++n) + { + _prefabData.Add(Assets[n], Data[n]); + } + } + + // ================================================================================== + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_PrefabData.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_PrefabData.cs.meta new file mode 100644 index 00000000..2185e71d --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_PrefabData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: c895cb4eada54084898f13228101ac2e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_SizePart.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_SizePart.cs new file mode 100644 index 00000000..355ef39f --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_SizePart.cs @@ -0,0 +1,175 @@ +namespace BuildReportTool +{ + /// + /// Represents one entry in an asset list. + /// + [System.Serializable] + public class SizePart + { + /// + /// The filename with path, but relative to project's Assets folder + /// + public string Name; + + // ----------------------------------- + + /// + /// How much the asset takes up space in the final build, in percentage. + /// Value will be from the editor log if possible. If not, it will be calculated manually. + /// + public double Percentage; + + // ----------------------------------- + + /// + /// For Unused Assets, this is the raw file size as existing in the assets folder, expressed in human-readable format. + /// For Used Assets, this is the size upon being built, as found in the Editor log. + /// + public string Size; + + /// + /// The converted into bytes. + /// + public long SizeBytes = -1; + + // same as getting the `Size` but since we now have two size types, + // for consistency, we now refer to the size as either RawSize and ImportedSize + public string RawSize + { + get { return Size; } + set { Size = value; } + } + + public long RawSizeBytes + { + get { return SizeBytes; } + set { SizeBytes = value; } + } + + // ----------------------------------- + + /// + /// The file size as imported into Unity, expressed in human-readable format. + /// If this SizePart is for an asset that has no imported size (e.g. built-in asset) + /// this will be empty. + /// + public string ImportedSize; + + /// + /// The imported file size, expressed in bytes. + /// + public long ImportedSizeBytes; + + // ----------------------------------- + + /// + /// For Used Assets, this is the file size as existing in the assets folder, expressed in human-readable format. + /// + public string SizeInAssetsFolder; + + /// + /// The in bytes + /// + public long SizeInAssetsFolderBytes = -1; + + // ----------------------------------- + + /// + /// In cases where we don't have exact values of file size (we just got it from + /// editor log as string, which was converted to readable format already). + /// + /// Expressed in bytes (but with fractions because of the inaccuracies). + /// + /// This applies to the "Used Assets" list + /// + public double DerivedSize; + + // ----------------------------------- + + /// + /// Helper function to get the proper raw file size + /// + public double UsableSize + { + get + { + if (DerivedSize > 0) + return DerivedSize; + + if (SizeBytes > 0) + return SizeBytes; + + return ImportedSizeBytes; + } + } + + /// + /// Return value of imported size, but if unavailable, will return raw size instead. + /// + public double ImportedSizeOrRawSize + { + get + { + if (ImportedSizeBytes > 0) + return ImportedSizeBytes; + + if (DerivedSize > 0) + return DerivedSize; + + if (SizeBytes > 0) + return SizeBytes; + + return 0; + } + } + + // ----------------------------------- + + public bool IsTotal + { + get { return Name == "Complete size"; } + } + + public bool IsStreamingAssets + { + get { return Name == "Streaming Assets"; } + } + + public void SetNameToStreamingAssets() + { + Name = "Streaming Assets"; + } + + // ----------------------------------- + + string _auxTextData; + public string GetTextAuxData() + { + return _auxTextData; + } + public void SetTextAuxData(string newTextAuxData) + { + _auxTextData = newTextAuxData; + } + + int _auxIntData; + public int GetIntAuxData() + { + return _auxIntData; + } + public void SetIntAuxData(int newIntAuxData) + { + _auxIntData = newIntAuxData; + } + + float _auxFloatData; + public float GetFloatAuxData() + { + return _auxFloatData; + } + public void SetFloatAuxData(float newFloatAuxData) + { + _auxFloatData = newFloatAuxData; + } + } +} // namespace BuildReportTool \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_SizePart.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_SizePart.cs.meta new file mode 100644 index 00000000..f5db42cb --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_SizePart.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bd77e3ddfe6ee2740941954bc63b33ea +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_TextureData.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_TextureData.cs new file mode 100644 index 00000000..82cc483c --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_TextureData.cs @@ -0,0 +1,1298 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using UnityEngine; + +namespace BuildReportTool +{ + [System.Serializable, System.Xml.Serialization.XmlRoot("TextureData")] + public class TextureData : BuildReportTool.IDataFile + { + // ================================================================================== + + /// + /// Name of project folder. + /// Included as part of the filename when saved. + /// + public string ProjectName; + + /// + /// Type of build that the project was configured to, at the time that TextureData was collected. + /// Included as part of the filename when saved. + /// + public string BuildType; + + /// + /// When TextureData was collected. + /// Included as part of the filename when saved. + /// + public System.DateTime TimeGot; + + public string GetDefaultFilename() + { + return BuildReportTool.Util.GetTextureDataDefaultFilename(ProjectName, BuildType, TimeGot); + } + + public string GetAccompanyingBuildReportFilename() + { + return BuildReportTool.Util.GetBuildInfoDefaultFilename(ProjectName, BuildType, TimeGot); + } + + /// + /// Full path where this TextureData is saved in the local storage. + /// + string _savedPath; + + /// + public string SavedPath + { + get { return _savedPath; } + } + + public void SetSavedPath(string val) + { + _savedPath = val.Replace("\\", "/"); + } + + public bool HasContents + { + get { return _textureData.Count > 0; } + } + + // ================================================================================== + + public enum DataId + { + None, + TextureType, + IsSRGB, + AlphaSource, + AlphaIsTransparency, + IgnorePngGamma, + + NPotScale, + IsReadable, + MipMapGenerated, + MipMapFilter, + StreamingMipMaps, + BorderMipMaps, + PreserveCoverageMipMaps, + FadeOutMipMaps, + + SpriteImportMode, + SpritePackingTag, + SpritePixelsPerUnit, + QualifiesForSpritePacking, + + WrapMode, + WrapModeU, + WrapModeV, + WrapModeW, + FilterMode, + AnisoLevel, + + MaxTextureSize, + TextureResizeAlgorithm, + TextureFormat, + CompressionType, + CompressionIsCrunched, + CompressionQuality, + + ImportedWidthAndHeight, + RealWidthAndHeight, + } + + public const string TOOLTIP_TEXT_TEXTURE_TYPE = @"Texture Type + +Broad category whether this image is used as a Texture, GUI, Sprite, Cursor, Lightmap, etc."; + + public const string TOOLTIP_TEXT_IS_RGB = @"Is sRGB (Color Texture) + +Is this texture for color data?"; + + public const string TOOLTIP_TEXT_ALPHA_SOURCE = @"Alpha Source + +How the Alpha Channel is generated, if any. Whether it uses the actual Alpha Channel from the source file, or if it's generated from the image's grayscale."; + + public const string TOOLTIP_TEXT_ALPHA_IS_TRANSPARENCY = @"Alpha is Transparency + +If the image's Alpha Channel is used for transparency or not. This ensures the RGB channels are dilated to avoid filtering artifacts on the edges."; + +#if UNITY_2020_1_OR_NEWER + public const string TOOLTIP_TEXT_IGNORE_PNG_GAMMA = @"Ignore PNG Gamma + +Whether to ignore the Gamma attribute in the PNG file or not (only relevant for PNG files)."; +#else + public const string TOOLTIP_TEXT_IGNORE_PNG_GAMMA = @"Ignore PNG Gamma + +Whether to ignore the Gamma attribute in the PNG file or not (only relevant for PNG files). + +Only in Unity 2020.1+"; +#endif + + public const string TOOLTIP_TEXT_NPOT_SCALE = @"Non-Power of Two Scale + +How the image was resized, if width and/or height isn't a power of two. Possible values are: None, ToSmaller, ToLarger, or ToNearest. + +Width and height are resized independently, except for certain file formats (like PVRTC) where width and height values need to match (square dimensions)."; + + public const string TOOLTIP_TEXT_IS_READABLE = @"Read/Write Enabled + +Whether the image's pixel data is accessible from scripts."; + + public const string TOOLTIP_TEXT_MIPMAP_GENERATED = @"MipMap Generated + +Whether the image has mip-maps or not."; + + public const string TOOLTIP_TEXT_MIPMAP_FILTER = @"MipMap Filtering Mode + +Whether mip-maps are faded out with Box (simple, but can be blurry), or Kaiser (sharper)."; + +#if UNITY_2018_2_OR_NEWER + public const string TOOLTIP_TEXT_STREAMING_MIPMAPS = @"Streaming MipMaps + +Whether the image is configured (or not) to load larger mip-maps only as they're needed."; +#else + public const string TOOLTIP_TEXT_STREAMING_MIPMAPS = @"Streaming MipMaps + +Whether the image is configured (or not) to load larger mip-maps only as they're needed. + +Only in Unity 2018.2+"; +#endif + + public const string TOOLTIP_TEXT_BORDER_MIPMAPS = @"Border MipMaps + +Whether the texture borders were kept the same when the mip-maps were made. Avoids colors bleeding out to the edge of lower mip levels."; + + public const string TOOLTIP_TEXT_PRESERVE_COVERAGE_MIPMAPS = @"Preserve Coverage of Alpha MipMaps + +Whether the shape of alpha channel was preserved for the mip-maps or not."; + + public const string TOOLTIP_TEXT_FADE_MIPMAPS = @"Fade Out MipMaps + +Whether mip levels are faded out to grey color."; + + public const string TOOLTIP_TEXT_SPRITE_IMPORT_MODE = @"Sprite Import Mode + +Whether image is a single Sprite, a Spritesheet, or is a Sprite with custom polygonal shape."; + + public const string TOOLTIP_TEXT_SPRITE_PACKING_TAG = @"Sprite Packing Tag + +Name of the Atlas where this Sprite was packed into."; + + public const string TOOLTIP_TEXT_SPRITE_PIXELS_PER_UNIT = @"Sprite Pixels-Per-Unit + +How many pixels in the Sprite take up one world unit of distance in the scene."; + + public const string TOOLTIP_TEXT_SPRITE_QUALIFIES_FOR_PACKING = @"Sprite Qualifies for Packing"; + + public const string TOOLTIP_TEXT_WRAP_MODE = @"Wrap Mode + +Whether image repeats (tiled), mirrored (like tiling but is mirrored), clamped (edges are stretched), etc."; + + public const string TOOLTIP_TEXT_WRAP_MODE_U = @"Wrap Mode U + +Whether image repeats (tiled), mirrored (like tiling but is mirrored), clamped (edges are stretched), etc. in the U-axis (UV space)."; + + public const string TOOLTIP_TEXT_WRAP_MODE_V = @"Wrap Mode V + +Whether image repeats (tiled), mirrored (like tiling but is mirrored), clamped (edges are stretched), etc. in the V-axis (UV space)."; + + public const string TOOLTIP_TEXT_WRAP_MODE_W = @"Wrap Mode W + +Whether image repeats (tiled), mirrored (like tiling but is mirrored), clamped (edges are stretched), etc. in the W-axis (UVW space)."; + + public const string TOOLTIP_TEXT_FILTER_MODE = @"Filter Mode + +How filtering is handled when image gets stretched by 3d transformations. + +Can be Point (pixels become blocky when enlarged), Bilinear (texture samples are averaged), or Trilinear (texture samples are averaged, and also blended between mip-map levels)."; + + public const string TOOLTIP_TEXT_ANISO_LEVEL = @"Anisotropic Filtering Level + +How much visual quality is preserved when texture is viewed from a grazing angle (0 means disabled)."; + + public const string TOOLTIP_TEXT_MAX_SIZE = @"Max Texture Size + +Limit imposed on the width and height of the image."; + + public const string TOOLTIP_TEXT_RESIZE_ALGO = @"Resize Algorithm + +If image was downscaled due to Max Texture Size, this determines the quality of downscaling."; + + public const string TOOLTIP_TEXT_FORMAT = @"Texture Format + +Format that the image was converted into (DXT, PVRTC, RGBA32 uncompressed, etc.). + +These are formats for runtime use, and are a different set of formats from the image's original file type."; + + public const string TOOLTIP_TEXT_COMPRESSION_TYPE = @"Compression Type + +Whether the image, upon being converted for its Texture Format, was compressed, and how much compression was done (low, standard, high)."; + + public const string TOOLTIP_TEXT_COMPRESSION_CRUNCHED = @"Compression Crunched + +Whether crunch compression was used on the image or not. Crunch is lossy, and only reduces the size taken up on disk."; + + public const string TOOLTIP_TEXT_COMPRESSION_QUALITY = @"Compression Quality + +Level of quality upon compressing. +100 = Highest quality possible, but also biggest file size. +0 = Lowest quality, but also smallest file size."; + + public const string TOOLTIP_TEXT_IMPORTED_WIDTH_AND_HEIGHT = @"Imported Width and Height + +The width and height of the image after it was resized by the Max Texture Size limit and Non-Power of Two Scale restrictions."; + + public const string TOOLTIP_TEXT_REAL_WIDTH_AND_HEIGHT = @"Source Width and Height + +The original width and height of the image before it was resized by the Max Texture Size limit and Non-Power of Two Scale restrictions."; + + public static string GetTooltipTextFromId(DataId textureDataId) + { + switch (textureDataId) + { + case DataId.TextureType: + return TOOLTIP_TEXT_TEXTURE_TYPE; + case DataId.IsSRGB: + return TOOLTIP_TEXT_IS_RGB; + case DataId.AlphaSource: + return TOOLTIP_TEXT_ALPHA_SOURCE; + case DataId.AlphaIsTransparency: + return TOOLTIP_TEXT_ALPHA_IS_TRANSPARENCY; + case DataId.IgnorePngGamma: + return TOOLTIP_TEXT_IGNORE_PNG_GAMMA; + case DataId.NPotScale: + return TOOLTIP_TEXT_NPOT_SCALE; + case DataId.IsReadable: + return TOOLTIP_TEXT_IS_READABLE; + // ----------------------------------------------- + case DataId.MipMapGenerated: + return TOOLTIP_TEXT_MIPMAP_GENERATED; + case DataId.MipMapFilter: + return TOOLTIP_TEXT_MIPMAP_FILTER; + case DataId.StreamingMipMaps: + return TOOLTIP_TEXT_STREAMING_MIPMAPS; + case DataId.BorderMipMaps: + return TOOLTIP_TEXT_BORDER_MIPMAPS; + case DataId.PreserveCoverageMipMaps: + return TOOLTIP_TEXT_PRESERVE_COVERAGE_MIPMAPS; + case DataId.FadeOutMipMaps: + return TOOLTIP_TEXT_FADE_MIPMAPS; + // ----------------------------------------------- + case DataId.SpriteImportMode: + return TOOLTIP_TEXT_SPRITE_IMPORT_MODE; + case DataId.SpritePackingTag: + return TOOLTIP_TEXT_SPRITE_PACKING_TAG; + case DataId.SpritePixelsPerUnit: + return TOOLTIP_TEXT_SPRITE_PIXELS_PER_UNIT; + case DataId.QualifiesForSpritePacking: + return TOOLTIP_TEXT_SPRITE_QUALIFIES_FOR_PACKING; + // ----------------------------------------------- + case DataId.WrapMode: + return TOOLTIP_TEXT_WRAP_MODE; + case DataId.WrapModeU: + return TOOLTIP_TEXT_WRAP_MODE_U; + case DataId.WrapModeV: + return TOOLTIP_TEXT_WRAP_MODE_V; + case DataId.WrapModeW: + return TOOLTIP_TEXT_WRAP_MODE_W; + case DataId.FilterMode: + return TOOLTIP_TEXT_FILTER_MODE; + case DataId.AnisoLevel: + return TOOLTIP_TEXT_ANISO_LEVEL; + // ----------------------------------------------- + case DataId.MaxTextureSize: + return TOOLTIP_TEXT_MAX_SIZE; + case DataId.TextureResizeAlgorithm: + return TOOLTIP_TEXT_RESIZE_ALGO; + case DataId.TextureFormat: + return TOOLTIP_TEXT_FORMAT; + case DataId.CompressionType: + return TOOLTIP_TEXT_COMPRESSION_TYPE; + case DataId.CompressionIsCrunched: + return TOOLTIP_TEXT_COMPRESSION_CRUNCHED; + case DataId.CompressionQuality: + return TOOLTIP_TEXT_COMPRESSION_QUALITY; + // ----------------------------------------------- + case DataId.ImportedWidthAndHeight: + return TOOLTIP_TEXT_IMPORTED_WIDTH_AND_HEIGHT; + case DataId.RealWidthAndHeight: + return TOOLTIP_TEXT_REAL_WIDTH_AND_HEIGHT; + // ----------------------------------------------- + default: + return null; + } + } + + public const string NPOT_SCALE_NONE_NOT_POT = "None (Not Power of 2)"; + public const string NPOT_SCALE_NONE_IS_POT = "None (Is Power of 2)"; + + public struct Entry + { + /// + /// Broad category whether this image is used as a Texture, GUI, Sprite, Cursor, Lightmap, etc. + /// Maps to . + /// + /// See for possible values. + /// + public string TextureType; + + /// + /// true: sRGB false: Linear. + /// For Unity 5.4 and below: maps to UnityEditor.TextureImporter.linearTexture (inverted value). + /// For Unity 5.5 and above: maps to . + /// + /// + public bool IsSRGB; + + /// + /// Maps to . + /// + /// See for possible values. + /// + public string AlphaSource; + + /// + /// Maps to + /// + /// + public bool AlphaIsTransparency; + + /// + /// Added in Unity 2020.1. + /// Maps to + /// + /// + public bool IgnorePngGamma; + + // ---------------------------------------- + + /// + /// How the image is resized if height/width isn't a power of two, if at all. + /// (None, ToNearest, ToLarger, or ToSmaller). + /// Maps to + /// + /// See for possible values. + /// + public string NPotScale; + + /// + /// Maps to + /// + /// + public bool IsReadable; + + /// + /// Maps to + /// + /// + public bool MipMapGenerated; + + /// + /// Added in Unity 2018.2. + /// Maps to + /// + /// + public bool StreamingMipMaps; + + /// + /// Maps to + /// + /// + public bool BorderMipMaps; + + /// + /// Maps to + /// + /// See for possible values. + /// + public string MipMapFilter; + + /// + /// Maps to + /// Added in Unity 2017.1. + /// + /// + public bool PreserveCoverageMipMaps; + + /// + /// Maps to + /// + /// + public bool FadeOutMipMaps; + + // ---------------------------------------- + + /// + /// Maps to + /// + /// See for possible values. + /// + public string SpriteImportMode; + + /// + /// Maps to + /// + /// + public string SpritePackingTag; + + /// + /// Maps to + /// + /// + public float SpritePixelsPerUnit; + + /// + /// Maps to + /// + /// + public bool QualifiesForSpritePacking; + + // ---------------------------------------- + + /// + /// Whether repeated or clamped. + /// Maps to + /// + /// See for possible values. + /// + public string WrapMode; + + /// + /// Whether repeated or clamped in the U axis. + /// Maps to + /// + /// See for possible values. + /// + public string WrapModeU; + + /// + /// Whether repeated or clamped in the V axis. + /// Maps to + /// + /// See for possible values. + /// + public string WrapModeV; + + /// + /// Whether repeated or clamped in the W axis. + /// Maps to + /// + /// See for possible values. + /// + public string WrapModeW; + + /// + /// Point, Bilinear or Trilinear. Maps to . + /// + /// See for possible values. + /// + public string FilterMode; + + /// + /// Anisotropic filtering level. Maps to . + /// + /// + public int AnisoLevel; + + // ---------------------------------------- + + /// + /// Maps to + /// + /// + public int MaxTextureSize; + + /// + /// Maps to + /// + /// + public string TextureResizeAlgorithm; + + /// + /// Image format upon import (DXT, PVRTC, RGBA32 uncompressed, etc.). + /// Maps to , + /// but if that value is , + /// then it uses the value of . + /// + /// See (https://docs.unity3d.com/ScriptReference/TextureImporterFormat.html) and + /// (https://docs.unity3d.com/ScriptReference/TextureFormat.html) for possible values. + /// + public string TextureFormat; + + /// + /// (only in Unity 5.5+) + /// Whether it is low, medium, high compression, or none at all. + /// Maps to . + /// + /// See for possible values. + /// + public string CompressionType; + + /// + /// (only in Unity 5.5+) + /// Maps to + /// + /// + public bool CompressionIsCrunched; + + /// + /// Maps to . Goes from 0 to 100. + /// + /// + public int CompressionQuality; + + // ---------------------------------------- + + public bool PlatformSettingsOverriden; + + /// + /// Like but if the image's platform override was set, this is the overriding value. + /// Maps to + /// + /// + public int OverridingMaxTextureSize; + + /// + /// Like but if the image's platform override was set, this is the overriding value. + /// Added in Unity 2017.2. + /// Maps to + /// + /// + public string OverridingTextureResizeAlgorithm; + + /// + /// Like but if the image's platform override was set, this is the overriding value. + /// Maps to + /// + /// See for possible values. + /// + public string OverridingTextureFormat; + + /// + /// Like but if the image's platform override was set, this is the overriding value. + /// Maps to . + /// + /// See for possible values. + /// + public string OverridingCompressionType; + + /// + /// Like but if the image's platform override was set, this is the overriding value. + /// Maps to + /// + /// + public bool OverridingCompressionIsCrunched; + + /// + /// Like but if the image's platform override was set, this is the overriding value. + /// Maps to . Goes from 0 to 100. + /// + /// + public int OverridingCompressionQuality; + + // ---------------------------------------- + + /// + /// Image width, but if + /// and/or is used, + /// this will be the value that it was resized to. + /// + public int ImportedWidth; + + /// + /// Image height, but if + /// and/or is used, + /// this will be the value that it was resized to. + /// + public int ImportedHeight; + + /// + /// Actual image width, before the + /// and/or settings resized it. + /// + public int RealWidth; + + /// + /// Actual image height, before the + /// and/or settings resized it. + /// + public int RealHeight; + + // ---------------------------------------- + + /// + /// Either or , + /// depending on whether is true or not. + /// + int _shownMaxTextureSize; + + /// + /// Either or , + /// depending on whether is true or not. + /// This value is a string, for directly displaying in the GUI. + /// If value is using + /// and it is really different from , + /// it will have an asterisk at the end. + /// + string _shownMaxTextureSizeLabel; + + string _overridingMaxTextureSizeMessage; + + // --------------- + + /// + /// Either or , + /// depending on whether is true or not. + /// This value is a string, for directly displaying in the GUI. + /// If value is using + /// and it is really different from , + /// it will have an asterisk at the end. + /// + string _shownTextureResizeAlgorithm; + + string _overridingTextureResizeAlgorithmMessage; + + // --------------- + + /// + /// Either or , + /// depending on whether is true or not. + /// This value is a string, for directly displaying in the GUI. + /// If value is using + /// and it is really different from , + /// it will have an asterisk at the end. + /// + string _shownTextureFormat; + + string _overridingTextureFormatMessage; + + // --------------- + + /// + /// Either or , + /// depending on whether is true or not. + /// This value is a string, for directly displaying in the GUI. + /// If value is using + /// and it is really different from , + /// it will have an asterisk at the end. + /// + string _shownCompressionType; + + string _overridingCompressionTypeMessage; + + // --------------- + + /// + /// Either or , + /// depending on whether is true or not. + /// + bool _shownCompressionIsCrunched; + + /// + /// Either or , + /// depending on whether is true or not. + /// This value is a string, for directly displaying in the GUI. + /// If value is using + /// and it is really different from , + /// it will have an asterisk at the end. + /// + string _shownCompressionIsCrunchedLabel; + + string _overridingCompressionIsCrunchedMessage; + + // --------------- + + /// + /// Either or , + /// depending on whether is true or not. + /// + int _shownCompressionQuality; + + /// + /// Either or , + /// depending on whether is true or not. + /// This value is a string, for directly displaying in the GUI. + /// If value is using + /// and it is really different from , + /// it will have an asterisk at the end. + /// + string _shownCompressionQualityLabel; + + string _overridingCompressionQualityMessage; + + // ---------------------------------------- + + public int GetShownMaxTextureSize() + { + return _shownMaxTextureSize; + } + + public string GetShownTextureResizeAlgorithm() + { + return _shownTextureResizeAlgorithm; + } + + public string GetShownTextureFormat() + { + return _shownTextureFormat; + } + + public string GetShownCompressionType() + { + return _shownCompressionType; + } + + public bool GetShownCompressionIsCrunched() + { + return _shownCompressionIsCrunched; + } + + public int GetShownCompressionQuality() + { + return _shownCompressionQuality; + } + + public int GetImportedPixelCount() + { + return ImportedWidth * ImportedHeight; + } + + public int GetRealPixelCount() + { + return RealWidth * RealHeight; + } + + // ================================================================================== + + public Entry(string n = null) + { + TextureType = null; + IsSRGB = false; + AlphaSource = null; + AlphaIsTransparency = false; + IgnorePngGamma = false; + + NPotScale = null; + IsReadable = false; + MipMapGenerated = false; + MipMapFilter = null; + StreamingMipMaps = false; + BorderMipMaps = false; + PreserveCoverageMipMaps = false; + FadeOutMipMaps = false; + + SpriteImportMode = null; + SpritePackingTag = null; + SpritePixelsPerUnit = 0; + QualifiesForSpritePacking = false; + + WrapMode = null; + WrapModeU = null; + WrapModeV = null; + WrapModeW = null; + FilterMode = null; + AnisoLevel = 0; + + MaxTextureSize = 0; + TextureResizeAlgorithm = null; + TextureFormat = null; + CompressionType = null; + CompressionIsCrunched = false; + CompressionQuality = 0; + + PlatformSettingsOverriden = false; + OverridingMaxTextureSize = 0; + OverridingTextureResizeAlgorithm = null; + OverridingTextureFormat = null; + OverridingCompressionType = null; + OverridingCompressionIsCrunched = false; + OverridingCompressionQuality = 0; + + ImportedWidth = 0; + ImportedHeight = 0; + RealWidth = 0; + RealHeight = 0; + + _shownMaxTextureSize = 0; + _shownMaxTextureSizeLabel = null; + _shownTextureResizeAlgorithm = null; + _shownTextureFormat = null; + _shownCompressionType = null; + _shownCompressionIsCrunched = false; + _shownCompressionIsCrunchedLabel = null; + _shownCompressionQuality = 0; + _shownCompressionQualityLabel = null; + + _overridingMaxTextureSizeMessage = null; + _overridingTextureResizeAlgorithmMessage = null; + _overridingTextureFormatMessage = null; + _overridingCompressionTypeMessage = null; + _overridingCompressionIsCrunchedMessage = null; + _overridingCompressionQualityMessage = null; + } + + public void UpdateShownSettings(string platformName) + { + if (!PlatformSettingsOverriden) + { + _shownMaxTextureSize = MaxTextureSize; + _shownMaxTextureSizeLabel = MaxTextureSize.ToString(); + _overridingMaxTextureSizeMessage = null; + + _shownTextureResizeAlgorithm = TextureResizeAlgorithm; + _overridingTextureResizeAlgorithmMessage = null; + + _shownTextureFormat = TextureFormat; + _overridingTextureFormatMessage = null; + + _shownCompressionType = CompressionType; + _overridingCompressionTypeMessage = null; + + _shownCompressionIsCrunched = CompressionIsCrunched; + _shownCompressionIsCrunchedLabel = CompressionIsCrunched.ToYesNo(); + _overridingCompressionIsCrunchedMessage = null; + + _shownCompressionQuality = CompressionQuality; + _shownCompressionQualityLabel = CompressionQuality.ToString(); + _overridingCompressionQualityMessage = null; + + return; + } + + if (OverridingMaxTextureSize != MaxTextureSize) + { + _shownMaxTextureSize = OverridingMaxTextureSize; + _shownMaxTextureSizeLabel = string.Format("{0}*", OverridingMaxTextureSize.ToString()); + + if (string.IsNullOrEmpty(platformName)) + { + _overridingMaxTextureSizeMessage = + string.Format("Max Texture Size has been overriden from {0} to {1}", + MaxTextureSize.ToString(), OverridingMaxTextureSize.ToString()); + } + else + { + _overridingMaxTextureSizeMessage = + string.Format("Max Texture Size in {0} has been overriden from {1} to {2}", + platformName, MaxTextureSize.ToString(), OverridingMaxTextureSize.ToString()); + } + } + else + { + _shownMaxTextureSize = MaxTextureSize; + _shownMaxTextureSizeLabel = MaxTextureSize.ToString(); + _overridingMaxTextureSizeMessage = null; + } + + if (!string.IsNullOrEmpty(OverridingTextureResizeAlgorithm) && OverridingTextureResizeAlgorithm != TextureResizeAlgorithm) + { + _shownTextureResizeAlgorithm = string.Format("{0}*", OverridingTextureResizeAlgorithm); + + if (string.IsNullOrEmpty(platformName)) + { + _overridingTextureResizeAlgorithmMessage = + string.Format("Texture Resize Algorithm has been overriden from {0} to {1}", + TextureResizeAlgorithm, OverridingTextureResizeAlgorithm); + } + else + { + _overridingTextureResizeAlgorithmMessage = + string.Format("Texture Resize Algorithm in {0} has been overriden from {1} to {2}", + platformName, TextureResizeAlgorithm, OverridingTextureResizeAlgorithm); + } + } + else + { + _shownTextureResizeAlgorithm = TextureResizeAlgorithm; + _overridingTextureResizeAlgorithmMessage = null; + } + + if (!string.IsNullOrEmpty(OverridingTextureFormat) && OverridingTextureFormat != TextureFormat) + { + _shownTextureFormat = string.Format("{0}*", OverridingTextureFormat); + + if (string.IsNullOrEmpty(platformName)) + { + _overridingTextureFormatMessage = + string.Format("Texture Format has been overriden from {0} to {1}", + TextureFormat, OverridingTextureFormat); + } + else + { + _overridingTextureFormatMessage = + string.Format("Texture Format in {0} has been overriden from {1} to {2}", + platformName, TextureFormat, OverridingTextureFormat); + } + } + else + { + _shownTextureFormat = TextureFormat; + _overridingTextureFormatMessage = null; + } + + if (!string.IsNullOrEmpty(OverridingCompressionType) && OverridingCompressionType != CompressionType) + { + _shownCompressionType = string.Format("{0}*", OverridingCompressionType); + + if (string.IsNullOrEmpty(platformName)) + { + _overridingCompressionTypeMessage = + string.Format("Compression Type has been overriden from {0} to {1}", + CompressionType, OverridingCompressionType); + } + else + { + _overridingCompressionTypeMessage = + string.Format("Compression Type in {0} has been overriden from {1} to {2}", + platformName, CompressionType, OverridingCompressionType); + } + } + else + { + _shownCompressionType = CompressionType; + _overridingCompressionTypeMessage = null; + } + + if (OverridingCompressionIsCrunched != CompressionIsCrunched) + { + _shownCompressionIsCrunched = OverridingCompressionIsCrunched; + _shownCompressionIsCrunchedLabel = string.Format("{0}*", OverridingCompressionIsCrunched.ToYesNo()); + + if (string.IsNullOrEmpty(platformName)) + { + _overridingCompressionIsCrunchedMessage = + string.Format("Compression is Crunched has been overriden from {0} to {1}", + CompressionIsCrunched.ToYesNo(), OverridingCompressionIsCrunched.ToYesNo()); + } + else + { + _overridingCompressionIsCrunchedMessage = + string.Format("Compression is Crunched in {0} has been overriden from {1} to {2}", + platformName, CompressionIsCrunched.ToYesNo(), OverridingCompressionIsCrunched.ToYesNo()); + } + } + else + { + _shownCompressionIsCrunched = CompressionIsCrunched; + _shownCompressionIsCrunchedLabel = CompressionIsCrunched.ToYesNo(); + _overridingCompressionIsCrunchedMessage = null; + } + + if (OverridingCompressionQuality != CompressionQuality) + { + _shownCompressionQuality = OverridingCompressionQuality; + _shownCompressionQualityLabel = string.Format("{0}*", OverridingCompressionQuality.ToString()); + + if (string.IsNullOrEmpty(platformName)) + { + _overridingCompressionQualityMessage = + string.Format("Compression Quality has been overriden from {0} to {1}", + CompressionQuality.ToString(), OverridingCompressionQuality.ToString()); + } + else + { + _overridingCompressionQualityMessage = + string.Format("Compression Quality in {0} has been overriden from {1} to {2}", + platformName, CompressionQuality.ToString(), OverridingCompressionQuality.ToString()); + } + } + else + { + _shownCompressionQuality = CompressionQuality; + _shownCompressionQualityLabel = CompressionQuality.ToString(); + _overridingCompressionQualityMessage = null; + } + } + + // ================================================================================== + + public string ToDisplayedValue(DataId dataId) + { + switch (dataId) + { + case DataId.TextureType: + return TextureType; + case DataId.IsSRGB: + return IsSRGB.ToYesNo(); + case DataId.AlphaSource: + return AlphaSource; + case DataId.AlphaIsTransparency: + return AlphaIsTransparency.ToYesNo(); + case DataId.IgnorePngGamma: + return IgnorePngGamma.ToYesNo(); + case DataId.NPotScale: + return NPotScale; + case DataId.IsReadable: + return IsReadable.ToYesNo(); + // ------------------------ + case DataId.MipMapGenerated: + return MipMapGenerated.ToYesNo(); + case DataId.MipMapFilter: + return MipMapFilter; + case DataId.StreamingMipMaps: + return StreamingMipMaps.ToYesNo(); + case DataId.BorderMipMaps: + return BorderMipMaps.ToYesNo(); + case DataId.PreserveCoverageMipMaps: + return PreserveCoverageMipMaps.ToYesNo(); + case DataId.FadeOutMipMaps: + return FadeOutMipMaps.ToYesNo(); + // ------------------------ + case DataId.SpriteImportMode: + return SpriteImportMode; + case DataId.QualifiesForSpritePacking: + return QualifiesForSpritePacking.ToYesNo(); + case DataId.SpritePackingTag: + return SpritePackingTag; + case DataId.SpritePixelsPerUnit: + return SpritePixelsPerUnit.ToString(CultureInfo.InvariantCulture); + // ------------------------ + case DataId.WrapMode: + return WrapMode; + case DataId.WrapModeU: + return WrapModeU; + case DataId.WrapModeV: + return WrapModeV; + case DataId.WrapModeW: + return WrapModeW; + case DataId.FilterMode: + return FilterMode; + case DataId.AnisoLevel: + return AnisoLevel.ToString(); + // ------------------------ + case DataId.MaxTextureSize: + return _shownMaxTextureSizeLabel; + case DataId.TextureResizeAlgorithm: + return _shownTextureResizeAlgorithm; + case DataId.TextureFormat: + return _shownTextureFormat; + case DataId.CompressionType: + return _shownCompressionType; + case DataId.CompressionIsCrunched: + return _shownCompressionIsCrunchedLabel; + case DataId.CompressionQuality: + return _shownCompressionQualityLabel; + // ------------------------ + case DataId.ImportedWidthAndHeight: + return string.Format("{0}x{1}", ImportedWidth.ToString(), ImportedHeight.ToString()); + case DataId.RealWidthAndHeight: + return string.Format("{0}x{1}", RealWidth.ToString(), RealHeight.ToString()); + // ------------------------ + default: + return string.Empty; + } + } + + public bool IsImportedWidthAndHeightDifferentFromReal + { + get + { + return ImportedWidth != RealWidth || ImportedHeight != RealHeight; + } + } + + public bool IsOverriden(DataId dataId) + { + if (!PlatformSettingsOverriden) + { + return false; + } + + switch (dataId) + { + // ------------------------ + case DataId.MaxTextureSize: + return OverridingMaxTextureSize != MaxTextureSize; + case DataId.TextureResizeAlgorithm: + return OverridingTextureResizeAlgorithm != TextureResizeAlgorithm; + case DataId.TextureFormat: + return OverridingTextureFormat != TextureFormat; + case DataId.CompressionType: + return OverridingCompressionType != CompressionType; + case DataId.CompressionIsCrunched: + return OverridingCompressionIsCrunched != CompressionIsCrunched; + case DataId.CompressionQuality: + return OverridingCompressionQuality != CompressionQuality; + // ------------------------ + default: + return false; + } + } + + public string GetOverridingMessage(DataId dataId) + { + if (!PlatformSettingsOverriden) + { + return null; + } + + switch (dataId) + { + // ------------------------ + case DataId.MaxTextureSize: + return _overridingMaxTextureSizeMessage; + case DataId.TextureResizeAlgorithm: + return _overridingTextureResizeAlgorithmMessage; + case DataId.TextureFormat: + return _overridingTextureFormatMessage; + case DataId.CompressionType: + return _overridingCompressionTypeMessage; + case DataId.CompressionIsCrunched: + return _overridingCompressionIsCrunchedMessage; + case DataId.CompressionQuality: + return _overridingCompressionQualityMessage; + // ------------------------ + default: + return null; + } + } + } + + // ================================================================================== + + Dictionary _textureData = new Dictionary(); + + public List Assets; + public List Data; + + public Dictionary GetTextureData() + { + return _textureData; + } + + public void Clear() + { + _textureData.Clear(); + } + + // ================================================================================== + + public void OnBeforeSave() + { + if (Assets != null) + { + Assets.Clear(); + } + else + { + Assets = new List(); + } + + Assets.AddRange(_textureData.Keys); + + if (Data != null) + { + Data.Clear(); + } + else + { + Data = new List(); + } + + Data.AddRange(_textureData.Values); + } + + public void OnAfterLoad() + { + _textureData.Clear(); + + var platformName = GetPlatformNameFromBuildType(BuildType); + var len = Mathf.Min(Assets.Count, Data.Count); + for (int n = 0; n < len; ++n) + { + var entryToModify = Data[n]; + entryToModify.UpdateShownSettings(platformName); + Data[n] = entryToModify; // have to assign it back, Entry is a struct + + _textureData.Add(Assets[n], Data[n]); + } + } + + // ================================================================================== + + public static string GetPlatformNameFromBuildType(string buildType) + { + if (string.IsNullOrEmpty(buildType)) + { + return null; + } + + if (buildType.IndexOf("Windows", StringComparison.Ordinal) != -1 && + buildType.IndexOf("Store", StringComparison.Ordinal) != -1) + { + return "Windows Store Apps"; + } + + if (buildType.IndexOf("Windows", StringComparison.Ordinal) != -1 || + buildType.IndexOf("Linux", StringComparison.Ordinal) != -1 || + buildType.IndexOf("Mac", StringComparison.Ordinal) != -1) + { + return "Standalone"; + } + + if (buildType.IndexOf("Android", StringComparison.Ordinal) != -1) + { + return "Android"; + } + + if (buildType.IndexOf("iPhone", StringComparison.Ordinal) != -1 || + buildType.IndexOf("iOS", StringComparison.Ordinal) != -1) + { + return "iPhone"; + } + + if (buildType.IndexOf("Tizen", StringComparison.Ordinal) != -1) + { + return "Tizen"; + } + + if (buildType.IndexOf("WebPlayer", StringComparison.Ordinal) != -1) + { + return "Web"; + } + + if (buildType.IndexOf("WebGL", StringComparison.Ordinal) != -1) + { + return "WebGL"; + } + + if (buildType.IndexOf("XBoxOne", StringComparison.OrdinalIgnoreCase) != -1) + { + return "XboxOne"; + } + + if (buildType.IndexOf("PS4", StringComparison.OrdinalIgnoreCase) != -1) + { + return "PS4"; + } + + if (buildType.IndexOf("PSVitaNative", StringComparison.OrdinalIgnoreCase) != -1) + { + return "PSP2"; + } + + if (buildType.IndexOf("WiiU", StringComparison.OrdinalIgnoreCase) != -1) + { + return "WiiU"; + } + + if (buildType.IndexOf("Nintendo", StringComparison.OrdinalIgnoreCase) != -1 && + buildType.IndexOf("3DS", StringComparison.OrdinalIgnoreCase) != -1) + { + return "Nintendo 3DS"; + } + + if (buildType.IndexOf("Nintendo", StringComparison.OrdinalIgnoreCase) != -1 && + buildType.IndexOf("Switch", StringComparison.OrdinalIgnoreCase) != -1) + { + return "Nintendo Switch"; + } + + return buildType; + } + + // ================================================================================== + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_TextureData.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_TextureData.cs.meta new file mode 100644 index 00000000..d1538f3c --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_TextureData.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 48b80b2ac78470a4ab79a155399eaf96 +timeCreated: 1569202075 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildReport.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildReport.cs new file mode 100644 index 00000000..a0d71b89 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildReport.cs @@ -0,0 +1,481 @@ +using System; +using System.Collections.Generic; +using UnityEngine; + +namespace BuildReportTool +{ + /// + /// Any attempt to serialize results in errors:

+ /// + /// When using :
+ /// SerializationException: Type 'UnityEditor.Build.Reporting.BuildReport' in Assembly 'UnityEditor, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.

+ /// + /// When using :
+ /// ArgumentException: JsonUtility.ToJson does not support engine types.

+ /// + /// When using :
+ /// It works, but only and get serialized. The actual important data doesn't get saved.
+ /// Note: There is but that still can't serialize read-only properties. + /// unfortunately has some important read-only properties such as + /// and .

+ /// + /// So we have to make this dummy class that essentially mimics , but defined as properly serializable this time. + /// We also favor saving enums into strings since they are merely displayed for the user, and will not be further processed. + /// Converting them to string also helps with backwards compatibility in case a future version of Unity deletes an enum value or renames it. + ///
+ [System.Serializable] + public class UnityBuildReport : BuildReportTool.IDataFile + { + /// + /// Name of project folder. + /// Included as part of the filename when saved. + /// + public string ProjectName; + + /// + /// Type of build that the project was configured to, at the time that UnityBuildReport was collected. + /// Included as part of the filename when saved. + /// + public string BuildType; + + /// + /// When UnityBuildReport was collected. + /// Included as part of the filename when saved. + /// + public System.DateTime TimeGot; + + public ulong TotalSize; + + public System.DateTime BuildStartedAt; + public System.TimeSpan BuildTotalTime; + + public UnityEditor.BuildOptions BuildOptions; + + public bool HasBuildOption(UnityEditor.BuildOptions optionToCheck) + { + return (BuildOptions & optionToCheck) == optionToCheck; + } + + // ----------------------------------------- + + public OutputFile[] OutputFiles; + public BuildProcessStep[] BuildProcessSteps; + +#if UNITY_2018_1_OR_NEWER + public void SetFrom(UnityEditor.Build.Reporting.BuildReport buildReport) + { + TotalSize = buildReport.summary.totalSize; + BuildStartedAt = buildReport.summary.buildStartedAt; + BuildTotalTime = buildReport.summary.totalTime; + + string outputFolder = buildReport.summary.outputPath; + int outputPathLength; + + if (System.IO.Directory.Exists(outputFolder)) + { + if (outputFolder.EndsWith("/") || outputFolder.EndsWith("\\")) + { + outputPathLength = outputFolder.Length; + } + else + { + // +1 for the trailing slash, we want to remove + // the slash at the start of our file entries + outputPathLength = outputFolder.Length+1; + } + } + else if (System.IO.File.Exists(outputFolder)) + { + // output path is a file, likely the executable file + // so get the parent folder of that file + outputFolder = System.IO.Path.GetDirectoryName(outputFolder); + + if (!string.IsNullOrEmpty(outputFolder)) + { + // +1 for the trailing slash, we want to remove + // the slash at the start of our file entries + outputPathLength = outputFolder.Length+1; + } + else + { + // output file has no parent folder? + return; + } + } + else + { + // output path doesn't exist + outputPathLength = 0; + } + + BuildOptions = buildReport.summary.options; + + outputFolder = outputFolder.Replace("\\", "/"); + +#if !UNITY_2022_2_OR_NEWER + var files = buildReport.files; +#else + var files = buildReport.GetFiles(); +#endif + var outputFiles = new List(files.Length); + OutputFiles = new OutputFile[files.Length]; + for (int i = 0; i < files.Length; ++i) + { + if (!files[i].path.StartsWith(outputFolder)) + { + // file is not inside the build folder, likely a temporary or debug file (like a pdb file) + //Debug.Log($"Found file not in build {i}: {buildReport.files[i].path}"); + continue; + } + + OutputFile newEntry; + newEntry.FilePath = files[i].path.Substring(outputPathLength); + newEntry.Role = files[i].role; + newEntry.Size = files[i].size; + outputFiles.Add(newEntry); + } + OutputFiles = outputFiles.ToArray(); + + _totalBuildTime = new TimeSpan(0); + BuildProcessSteps = new BuildProcessStep[buildReport.steps.Length]; + for (int i = 0; i < BuildProcessSteps.Length; ++i) + { + BuildProcessSteps[i].Depth = buildReport.steps[i].depth; + BuildProcessSteps[i].Name = buildReport.steps[i].name; + BuildProcessSteps[i].Duration = buildReport.steps[i].duration; + + if (BuildProcessSteps[i].Depth == 1) + { + _totalBuildTime += BuildProcessSteps[i].Duration; + } + + BuildProcessSteps[i].SetInfoLogCount(0); + BuildProcessSteps[i].SetWarnLogCount(0); + BuildProcessSteps[i].SetErrorLogCount(0); + + BuildProcessSteps[i].SetCollapsedInfoLogCount(0); + BuildProcessSteps[i].SetCollapsedWarnLogCount(0); + BuildProcessSteps[i].SetCollapsedErrorLogCount(0); + + var messages = buildReport.steps[i].messages; + if (messages == null || messages.Length == 0) + { + BuildProcessSteps[i].BuildLogMessages = null; + BuildProcessSteps[i].SetCollapsedBuildLogMessages(null); + } + else + { + BuildProcessSteps[i].BuildLogMessages = new BuildLogMessage[messages.Length]; + var collapsedMessages = new List(); + for (int m = 0; m < messages.Length; ++m) + { + BuildProcessSteps[i].BuildLogMessages[m].Message = messages[m].content; + + var logType = messages[m].type; + BuildProcessSteps[i].BuildLogMessages[m].LogType = logType.ToString(); + if (logType == LogType.Log) + { + BuildProcessSteps[i].IncrementInfoLogCount(); + } + else if (logType == LogType.Warning) + { + BuildProcessSteps[i].IncrementWarnLogCount(); + } + else + { + BuildProcessSteps[i].IncrementErrorLogCount(); + } + + bool alreadyIn = false; + for (int c = 0; c < collapsedMessages.Count; ++c) + { + if (collapsedMessages[c].Message == messages[m].content) + { + var entryToModify = collapsedMessages[c]; + entryToModify.SetCount(collapsedMessages[c].Count+1); + collapsedMessages[c] = entryToModify; + alreadyIn = true; + break; + } + } + + if (alreadyIn) + { + continue; + } + + var entryToAdd = BuildProcessSteps[i].BuildLogMessages[m]; + entryToAdd.SetCount(1); + collapsedMessages.Add(entryToAdd); + + if (logType == LogType.Log) + { + BuildProcessSteps[i].IncrementCollapsedInfoLogCount(); + } + else if (logType == LogType.Warning) + { + BuildProcessSteps[i].IncrementCollapsedWarnLogCount(); + } + else + { + BuildProcessSteps[i].IncrementCollapsedErrorLogCount(); + } + } + + BuildProcessSteps[i].SetCollapsedBuildLogMessages(collapsedMessages.ToArray()); + } + } + } +#endif + + // ----------------------------------------- + + TimeSpan _totalBuildTime; + + public TimeSpan TotalBuildTime { get { return _totalBuildTime; } } + + public void OnBeforeSave() + { + } + + public void OnAfterLoad() + { + _totalBuildTime = new TimeSpan(0); + for (int i = 0; i < BuildProcessSteps.Length; ++i) + { + if (BuildProcessSteps[i].Depth == 1) + { + _totalBuildTime += BuildProcessSteps[i].Duration; + } + + var messages = BuildProcessSteps[i].BuildLogMessages; + + if (messages != null) + { + var collapsedMessages = new List(); + + BuildProcessSteps[i].SetInfoLogCount(0); + BuildProcessSteps[i].SetWarnLogCount(0); + BuildProcessSteps[i].SetErrorLogCount(0); + + BuildProcessSteps[i].SetCollapsedInfoLogCount(0); + BuildProcessSteps[i].SetCollapsedWarnLogCount(0); + BuildProcessSteps[i].SetCollapsedErrorLogCount(0); + + for (int m = 0; m < messages.Length; ++m) + { + var logType = GetLogType(messages[m].LogType); + + switch (logType) + { + case CheckLogType.Info: + BuildProcessSteps[i].IncrementInfoLogCount(); + break; + case CheckLogType.Warn: + BuildProcessSteps[i].IncrementWarnLogCount(); + break; + case CheckLogType.Error: + BuildProcessSteps[i].IncrementErrorLogCount(); + break; + } + + bool alreadyIn = false; + for (int c = 0; c < collapsedMessages.Count; ++c) + { + if (collapsedMessages[c].Message == messages[m].Message) + { + var entryToModify = collapsedMessages[c]; + entryToModify.SetCount(collapsedMessages[c].Count+1); + collapsedMessages[c] = entryToModify; + alreadyIn = true; + break; + } + } + + if (alreadyIn) + { + continue; + } + + var entryToAdd = messages[m]; + entryToAdd.SetCount(1); + collapsedMessages.Add(entryToAdd); + + switch (logType) + { + case CheckLogType.Info: + BuildProcessSteps[i].IncrementCollapsedInfoLogCount(); + break; + case CheckLogType.Warn: + BuildProcessSteps[i].IncrementCollapsedWarnLogCount(); + break; + case CheckLogType.Error: + BuildProcessSteps[i].IncrementCollapsedErrorLogCount(); + break; + } + } + + BuildProcessSteps[i].SetCollapsedBuildLogMessages(collapsedMessages.ToArray()); + } + } + } + + enum CheckLogType + { + Info, + Warn, + Error, + } + + static CheckLogType GetLogType(string logType) + { + if (logType.Contains("Warn")) + { + return CheckLogType.Warn; + } + else if (logType.Contains("Log")) + { + return CheckLogType.Info; + } + else + { + return CheckLogType.Error; + } + } + + string _savedPath; + + public void SetSavedPath(string savedPath) + { + _savedPath = savedPath.Replace("\\", "/"); + } + + public string SavedPath { get { return _savedPath; } } + + public string GetDefaultFilename() + { + return BuildReportTool.Util.GetUnityBuildReportDefaultFilename(ProjectName, BuildType, TimeGot); + } + } + + [System.Serializable] + public struct OutputFile + { + public string FilePath; + public string Role; + public ulong Size; + } + + [System.Serializable] + public struct BuildProcessStep + { + public int Depth; + public string Name; + public BuildLogMessage[] BuildLogMessages; + + int _infoLogCount; + int _warnLogCount; + int _errorLogCount; + + public int InfoLogCount { get { return _infoLogCount; } } + public int WarnLogCount { get { return _warnLogCount; } } + public int ErrorLogCount { get { return _errorLogCount; } } + + public void IncrementInfoLogCount() + { + ++_infoLogCount; + } + public void IncrementWarnLogCount() + { + ++_warnLogCount; + } + public void IncrementErrorLogCount() + { + ++_errorLogCount; + } + + public void SetInfoLogCount(int newInfoLogCount) + { + _infoLogCount = newInfoLogCount; + } + public void SetWarnLogCount(int newWarnLogCount) + { + _warnLogCount = newWarnLogCount; + } + public void SetErrorLogCount(int newErrorLogCount) + { + _errorLogCount = newErrorLogCount; + } + + BuildLogMessage[] _collapsedBuildLogMessages; + public BuildLogMessage[] CollapsedBuildLogMessages { get { return _collapsedBuildLogMessages; } } + public void SetCollapsedBuildLogMessages(BuildLogMessage[] newCollapsedBuildLogMessages) + { + _collapsedBuildLogMessages = newCollapsedBuildLogMessages; + } + + int _collapsedInfoLogCount; + int _collapsedWarnLogCount; + int _collapsedErrorLogCount; + + public int CollapsedInfoLogCount { get { return _collapsedInfoLogCount; } } + public int CollapsedWarnLogCount { get { return _collapsedWarnLogCount; } } + public int CollapsedErrorLogCount { get { return _collapsedErrorLogCount; } } + + public void IncrementCollapsedInfoLogCount() + { + ++_collapsedInfoLogCount; + } + public void IncrementCollapsedWarnLogCount() + { + ++_collapsedWarnLogCount; + } + public void IncrementCollapsedErrorLogCount() + { + ++_collapsedErrorLogCount; + } + + public void SetCollapsedInfoLogCount(int newInfoLogCount) + { + _collapsedInfoLogCount = newInfoLogCount; + } + public void SetCollapsedWarnLogCount(int newWarnLogCount) + { + _collapsedWarnLogCount = newWarnLogCount; + } + public void SetCollapsedErrorLogCount(int newErrorLogCount) + { + _collapsedErrorLogCount = newErrorLogCount; + } + + TimeSpan _duration; + + [System.Xml.Serialization.XmlIgnore] + public System.TimeSpan Duration + { + get { return _duration; } + set { _duration = value; } + } + + [System.Xml.Serialization.XmlElement("Duration")] + public long DurationTicks + { + get { return _duration.Ticks; } + set { _duration = new System.TimeSpan(value); } + } + } + + [System.Serializable] + public struct BuildLogMessage + { + public string LogType; + public string Message; + + int _count; + public int Count { get { return _count; } } + public void SetCount(int newCount) + { + _count = newCount; + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildReport.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildReport.cs.meta new file mode 100644 index 00000000..5e06e8ea --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildReport.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 03a282002dba381488048a845cde9c83 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildSettings.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildSettings.cs new file mode 100644 index 00000000..567e9673 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildSettings.cs @@ -0,0 +1,1234 @@ +using System.Collections.Generic; + +namespace BuildReportTool +{ + [System.Serializable] + public partial class UnityBuildSettings + { + // Project Settings + // --------------------------------------------------------------- + + /// + /// + /// + public string CompanyName; + + /// + /// + /// + public string ProductName; + + /// + /// + /// Can also be obtained using + /// + public bool UsingAdvancedLicense; + + /// + /// + /// + public string ApplicationIdentifier; + + + // Debug Settings + // --------------------------------------------------------------- + + /// + /// + /// Can also be obtained using + /// + public bool EnableDevelopmentBuild; + + /// + /// + /// + public bool EnableDebugLog; + + /// + /// + /// + public bool EnableSourceDebugging; + + /// + /// + /// Added in Unity 2019.3 + /// + public bool WaitForManagedDebugger; + + /// + /// + /// + public bool EnableExplicitNullChecks; + + /// + /// + /// Added in Unity 5.4 + /// + public bool EnableExplicitDivideByZeroChecks; + + /// + /// + /// Added in Unity 2018.1 + /// + public bool EnableArrayBoundsChecks; + + /// + /// + /// + public bool EnableCrashReportApi; + + /// + /// + /// + public bool EnableInternalProfiler; + + /// + /// + /// + public bool ConnectProfiler; + + /// + /// + /// Added in Unity 5 + /// + public string ActionOnDotNetUnhandledException; + + /// + /// using + /// + public string StackTraceForError; + + /// + /// using + /// + public string StackTraceForAssert; + + /// + /// using + /// + public string StackTraceForWarning; + + /// + /// using + /// + public string StackTraceForLog; + + /// + /// using + /// + public string StackTraceForException; + + /// + /// + /// Added in Unity 2018.3 + /// + public bool FrameTimingStats; + + + // Build Settings + // --------------------------------------------------------------- + + /// + /// + /// + public bool EnableHeadlessMode; + + /// + /// + /// + public bool InstallInBuildFolder; + + /// + /// + /// + public bool ForceInstallation; + + /// + /// + /// Added in Unity 5. + /// + public bool BakeCollisionMeshes; + + /// + /// + /// + public bool StripUnusedMeshComponents; + + /// + /// + /// + public bool StripEngineCode; + + /// + /// + /// Added in Unity 2020.1 + /// + public bool StripUnusedMips; + + + // Code Settings + // --------------------------------------------------------------- + + /// + /// + /// Added in Unity 2017.1 + /// + public string ScriptingBackend; + + /// + /// + /// Added in Unity 2021.2 + /// + public string[] AdditionalCompilerArguments; + + /// + /// + /// Added in Unity 2017.1 + /// + public string AdditionalIL2CPPArguments; + + /// + /// + /// Added in Unity 2022.1 + /// + public string IL2CPPCodeGeneration; + + /// + /// + /// Added in Unity 2018.1 + /// + public string IL2CPPCompilerConfig; + + /// + /// + /// + public string[] CompileDefines; + + /// + /// + /// + public string StrippingLevelUsed; + + /// + /// + /// + public string NETApiCompatibilityLevel; + + /// + /// + /// Added in Unity 2018.1 + /// + public bool AllowUnsafeCode; + + /// + /// + /// Added in Unity 2019.4 + /// + public bool SuppressCommonWarnings; + + /// + /// + /// Added in Unity 2019.1 + /// + public bool IncrementalGC; + + /// + /// + /// + public string AOTOptions; + + /// + /// + /// + public string LocationUsageDescription; + + /// + /// + /// Added in Unity 2022.1 + /// + public string InsecureHttpOption; + + /// + /// + /// Added in Unity 2019.4 + /// Marked as obsolete in Unity 2022.2 + /// + public bool AssemblyVersionValidation; + + + // Rendering Settings + // --------------------------------------------------------------- + + /// + /// + /// + public bool Use32BitDisplayBuffer; + + /// + /// + /// Added in Unity 5.6 + /// + public bool UseHDRDisplay; + + /// + /// + /// Added in Unity 2022.3 + /// + public bool AllowHDRDisplaySupport; + + /// + /// + /// Added in Unity 2022.2 + /// + public string HdrBitDepth; + + /// + /// + /// + public string ColorSpaceUsed; + + /// + /// + /// + public bool UseMultithreadedRendering; + + /// + /// + /// Added in Unity 2020.1 + /// + public bool VirtualTexturingSupportEnabled; + + /// + /// + /// Added in Unity 2020.2 + /// + public string NormalMapEncoding; + + /// + /// + /// Added in Unity 2021.3.12 + /// + public int ShaderChunkCountForPlatform; + + /// + /// + /// Added in Unity 2021.3.12 + /// + public int ShaderChunkSizeInMBForPlatform; + + /// + /// + /// Added in Unity 2020.2 + /// + public string ShaderPrecisionModel; + + /// + /// + /// Added in Unity 2022.1 + /// + public bool StrictShaderVariantMatching; + + /// + /// In Unity 4 onwards, this is . + /// In Unity 3, only xbox 360 has this with UnityEditor.PlayerSettings.xboxSkinOnGPU. + /// + public bool UseGPUSkinning; + + /// + /// + /// + public bool UseGraphicsJobs; + + /// + /// + /// + public string GraphicsJobsType; + + /// + /// + /// Added in Unity 4 + /// + public string RenderingPathUsed; + + /// + /// + /// + public bool VisibleInBackground; + + /// + /// + /// + public string[] AspectRatiosAllowed; + + /// + /// + /// Added in Unity 5.3 + /// + public string[] GraphicsAPIsUsed; + + /// + /// + /// + public bool EnableVirtualRealitySupport; + + /// + /// + /// Added in Unity 5.5 + /// + public string StereoRenderingPath; + + /// + /// + /// Added in Unity 2022.1 + /// + public int SpriteBatchVertexThreshold; + + /// + /// + /// Added in Unity 2018.1 + /// + public bool Enable360StereoCapture; + + /// + /// + /// Added in Unity 2018.3 + /// + public bool LegacyClampBlendShapeWeights; + + /// + /// + /// Added in Unity 2021.2 + /// + public int OverrideMaxTextureSize; + + /// + /// + /// Added in Unity 2021.2 + /// + public string OverrideTextureCompression; + + + // Vulkan Settings + // --------------------------------------------------------------- + + /// + /// + /// Added in Unity 2018.2 + /// + public bool VulkanEnableSetSRGBWrite; + + /// + /// + /// Added in Unity 2019.3 + /// + public uint vulkanNumSwapchainBuffers; + + /// + /// + /// Added in Unity 2019.4 + /// + public bool VulkanEnableLateAcquireNextImage; + + /// + /// + /// Only for Android + /// Added in Unity 2020.2 + /// + public bool VulkanEnablePreTransform; + + + // WebGL Settings + // --------------------------------------------------------------- + + /// + /// + /// Added in Unity 5.5 + /// + public string WebGLCompressionFormat; + + /// + /// + /// Added in Unity 5.5 + /// + public bool WebGLAutoCacheAssetsData; + + /// + /// + /// Added in Unity 2021.2 + /// + public bool WebGLCreateDebugSymbolsFile; + + /// + /// + /// Added in Unity 2021.2 + /// + public string WebGLDebugSymbolMode; + + /// + /// + /// Added in Unity 5.5 + /// + public string WebGLExceptionSupportType; + + /// + /// + /// Added in Unity 5.5 + /// + public int WebGLMemorySize; + + /// + /// + /// Added in Unity 5.5 + /// + public string WebGLTemplatePath; + + + // Settings shared by Web and Desktop + // --------------------------------------------------------------- + + /// + /// + /// + public bool RunInBackground; + + + // Desktop (Windows/Mac/Linux) Build Settings + // --------------------------------------------------------------- + + /// + /// + /// + public string StandaloneResolutionDialogSettingUsed; + + /// + /// + /// Added in Unity 2018.1 + /// + public string StandaloneFullScreenModeUsed; + + /// + /// + /// + public int StandaloneDefaultScreenWidth; + + /// + /// + /// + public int StandaloneDefaultScreenHeight; + + /// + /// + /// Removed in Unity 2018 in favor of + /// + public bool StandaloneFullScreenByDefault; + + /// + /// + /// Added in Unity 5.3 + /// + public bool StandaloneAllowFullScreenSwitch; + + /// + /// + /// + public bool StandaloneCaptureSingleScreen; + + /// + /// + /// Added in Unity 4 + /// + public bool StandaloneForceSingleInstance; + + /// + /// + /// Added in Unity 4 + /// + public bool StandaloneEnableResizableWindow; + + /// + /// + /// Marked as obsolete in Unity 5.4 + /// + public bool StandaloneUseStereoscopic3d; + + + // Windows-only Build Settings + // --------------------------------------------------------------- + + /// + /// + /// + public bool WinIncludeNativePdbFilesInBuild; + + /// + /// + /// + public bool WinCreateVisualStudioSolution; + + /// + /// + /// Added in Unity 4. + /// Marked as obsolete in Unity 5.2 in favor of + /// + public bool WinUseDirect3D11IfAvailable; + + /// + /// + /// Marked as obsolete in Unity 2017. + /// In 2018 use (stored in ) + /// + public string WinDirect3D9FullscreenModeUsed; + + /// + /// + /// Marked as obsolete in Unity 2018. + /// Use (stored in ) + /// + public string WinDirect3D11FullscreenModeUsed; + + /// + /// + /// Added in Unity 2019.1 + /// + public bool WinUseFlipModelSwapchain; + + /// + /// + /// Added in Unity 2021.3.13 + /// + public string WinGamepadInputHint; + + + // Mac OS X-only Build Settings + // --------------------------------------------------------------- + + /// + /// + /// Added in Unity 2017.2 + /// + public bool MacRetinaSupport; + + /// + /// + /// + public bool MacUseAppStoreValidation; + + /// + /// + /// Added in Unity 2021.2 + /// + public string MacXcodeBuildConfig; + + + // Mobile Build Settings + // --------------------------------------------------------------- + + /// + /// + /// "Bundle Identifier" in iOS and Mac, "Package Identifier" in Android + /// + public string MobileBundleIdentifier; + + /// + /// + /// "Bundle Version" in iOS, "Version Name" in Android + /// + public string MobileBundleVersion; + + /// + /// + /// + public bool MobileHideStatusBar; + + /// + /// + /// + public int MobileAccelerometerFrequency; + + /// + /// + /// + public string MobileDefaultOrientationUsed; + + /// + /// + /// + public bool MobileEnableAutorotateToPortrait; + + /// + /// + /// + public bool MobileEnableAutorotateToReversePortrait; + + /// + /// + /// + public bool MobileEnableAutorotateToLandscapeLeft; + + /// + /// + /// + public bool MobileEnableAutorotateToLandscapeRight; + + /// + /// + /// Formerly named UnityEditor.PlayerSettings.useOSAutorotation + /// + public bool MobileEnableOSAutorotation; + + /// + /// + /// Added in Unity 5.5 + /// + public bool MuteOtherAudioSources; + + + // iOS-only Build Settings + // --------------------------------------------------------------- + + /// + /// + /// + public string iOSAppDisplayName; + + /// + /// + /// + public string iOSScriptCallOptimizationUsed; + + /// + /// + /// + public string iOSSDKVersionUsed; + + /// + /// + /// + public string iOSTargetOSVersion; + + /// + /// + /// + public string iOSTargetDevice; + + /// + /// + /// Removed in Unity 5.3 + /// + public string iOSTargetResolution; + + /// + /// + /// Added in Unity 2021.2 + /// + public string iOSXcodeBuildConfig; + + /// + /// + /// + public bool iOSIsIconPrerendered; + + /// + /// + /// + public string iOSRequiresPersistentWiFi; + + /// + /// + /// + public string iOSStatusBarStyle; + + /// + /// + /// Formerly in Unity 4. + /// + public bool iOSExitOnSuspend; + + /// + /// + /// undocumented as of Unity 5.0.0f4 + /// + public string iOSAppInBackgroundBehavior; + + /// + /// + /// + public bool iOSLogObjCUncaughtExceptions; + + /// + /// + /// + public string iOSShowProgressBarInLoadingScreen; + + /// + /// + /// Removed in Unity 5.3 + /// + public string iOSTargetGraphics; + + + // Android-only Build Settings + // --------------------------------------------------------------- + + /// + /// + /// + public string AndroidBuildSubtarget; + + /// + /// + /// Added in Unity 2021.1 + /// + public string AndroidCreateSymbols; + + /// + /// + /// Added in Unity 2018.2 + /// + public bool AndroidBuildApkPerCpuArch; + + /// + /// + /// + public bool AndroidUseAPKExpansionFiles; + + /// + /// + /// + public bool AndroidAsAndroidProject; + + /// + /// + /// Added in Unity 2017.4 + /// + public bool AndroidAppBundle; + + /// + /// + /// + public bool AndroidUseLicenseVerification; + + /// + /// + /// Added in Unity 2022.2 + /// + public bool AndroidEnableArmV9SecurityFeatures; + + /// + /// + /// Added in Unity 5 + /// + public bool AndroidIsGame; + + /// + /// + /// Added in Unity 5 + /// + public bool AndroidTvCompatible; + + /// + /// + /// Replaced in Unity 5 with + /// + public bool AndroidUse24BitDepthBuffer; + + /// + /// + /// + public bool AndroidDisableDepthAndStencilBuffers; + + /// + /// + /// Added in Unity 2017.3 + /// + public bool AndroidPreserveFramebufferAlpha; + + /// + /// + /// + public int AndroidVersionCode; + + /// + /// + /// + public string AndroidMinSDKVersion; + + /// + /// + /// Added in Unity 5.6 + /// + public string AndroidTargetSDKVersion; + + /// + /// + /// Formerly + /// + public string AndroidTargetDevice; + + /// + /// + /// Added in Unity 2017.4 + /// + public string AndroidTargetArchitectures; + + /// + /// + /// + public string AndroidSplashScreenScaleMode; + + /// + /// + /// + public string AndroidPreferredInstallLocation; + + /// + /// + /// + public bool AndroidForceInternetPermission; + + /// + /// + /// + public bool AndroidForceSDCardPermission; + + /// + /// + /// + public string AndroidShowProgressBarInLoadingScreen; + + /// + /// + /// + public string AndroidKeyAliasName; + + /// + /// + /// + public string AndroidKeystoreName; + + + // XBox One Build Settings + // --------------------------------------------------------------- + + /// + /// + /// + public string XboxOneDeployMethod; + + /// + /// + /// + public string XboxOneTitleId; + + /// + /// + /// + public string XboxOneContentId; + + /// + /// + /// + public string XboxOneProductId; + + /// + /// + /// + public string XboxOneSandboxId; + + /// + /// + /// + public string XboxOneServiceConfigId; + + /// + /// + /// + public string XboxOneVersion; + + /// + /// + /// + public bool XboxOneIsContentPackage; + + /// + /// + /// + public string XboxOneDescription; + + /// + /// + /// + public string XboxOnePackagingEncryptionLevel; + + /// + /// + /// + public string[] XboxOneAllowedProductIds; + + /// + /// + /// + public bool XboxOneDisableKinectGpuReservation; + + /// + /// + /// + public bool XboxOneEnableVariableGPU; + + /// + /// + /// + public int XboxOneStreamingInstallLaunchRange; + + /// + /// + /// + public uint XboxOnePersistentLocalStorageSize; + + /// + /// + /// + public string[] XboxOneSocketNames; + + /// + /// + /// + public string XboxOneGameOsOverridePath; + + /// + /// + /// + public string XboxOneAppManifestOverridePath; + + /// + /// + /// + public string XboxOnePackagingOverridePath; + + + /// + /// + /// Used in PS3, but don't know which other Playstation platforms it also applies to. + /// + public bool NeedSubmissionMaterials; + + + // PS4 Build Settings + // --------------------------------------------------------------- + + /// + /// + /// + public string PS4BuildSubtarget; + + /// + /// + /// + public int PS4AppParameter1; + + /// + /// + /// + public int PS4AppParameter2; + + /// + /// + /// + public int PS4AppParameter3; + + /// + /// + /// + public int PS4AppParameter4; + + /// + /// + /// + public int PS4AppType; + + /// + /// + /// + public string PS4AppVersion; + + /// + /// + /// + public string PS4Category; + + /// + /// + /// + public string PS4ContentId; + + /// + /// + /// + public string PS4MasterVersion; + + /// + /// + /// + public string PS4EnterButtonAssignment; + + /// + /// + /// + public string PS4RemotePlayKeyAssignment; + + /// + /// + /// + public string PS4VideoOutPixelFormat; + + /// + /// + /// + public string PS4VideoOutResolution; + + /// + /// + /// + public string PS4MonoEnvVars; + + /// + /// + /// + public string PS4NpAgeRating; + + /// + /// + /// + public string PS4ParentalLevel; + + /// + /// + /// + public bool PS4EnablePlayerPrefsSupport; + + /// + /// + /// + public bool PS4EnableFriendPushNotifications; + + /// + /// + /// + public bool PS4EnablePresencePushNotifications; + + /// + /// + /// + public bool PS4EnableSessionPushNotifications; + + /// + /// + /// + public bool PS4EnableGameCustomDataPushNotifications; + + /// + /// + /// + public string PS4BgImagePath; + + /// + /// + /// + public string PS4BgMusicPath; + + /// + /// + /// + public string PS4StartupImagePath; + + /// + /// + /// + public string PS4ParamSfxPath; + + /// + /// + /// + public string PS4NpTitleDatPath; + + /// + /// + /// + public string PS4NpTrophyPackagePath; + + /// + /// + /// + public string PS4PronunciationSigPath; + + /// + /// + /// + public string PS4PronunciationXmlPath; + + /// + /// + /// + public string PS4SaveDataImagePath; + + /// + /// + /// + public string PS4ShareFilePath; + + // --------------------------------------------------------------- + + [System.Serializable] + public struct PackageEntry + { + /// + /// Name of package using reverse domain name notation. Serves as the unique identifier. + /// + public string PackageName; + + /// + /// User-friendly readable name of the package. + /// + public string DisplayName; + + /// + /// For normal packages, this is the version used.
+ /// For git packages, this is the commit id.
+ /// For local folder packages, this will be null. + ///
+ public string VersionUsed; + + /// + /// For normal packages, this will be the registry url that matches this package.
+ /// For git packages, this is the repo url.
+ /// For local folder packages, this is the path. + ///
+ public string Location; + + /// + /// Absolute path in local PC where package was found. + /// This will normally be in the project's "Library/PackageCache/" subfolder. + /// + public string LocalPath; + } + + public List PackageEntries = new List(); + + [System.Serializable] + public struct BuiltInPackageEntry + { + public string PackageName; + public string DisplayName; + } + + public List BuiltInPackageEntries = new List(); + + // Derived Values + // --------------------------------------------------------------- + + public bool HasValues + { + get { return !string.IsNullOrEmpty(CompanyName) && !string.IsNullOrEmpty(NETApiCompatibilityLevel); } + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildSettings.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildSettings.cs.meta new file mode 100644 index 00000000..17f0e2d9 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildSettings.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a455a7863b26e8b46bf0c0b6c3634ccb +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildSettings_BackwardsCompat.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildSettings_BackwardsCompat.cs new file mode 100644 index 00000000..bea898b5 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildSettings_BackwardsCompat.cs @@ -0,0 +1,701 @@ +using System.Collections.Generic; + +namespace BuildReportTool +{ + public partial class UnityBuildSettings + { + /// + /// + /// Added in Unity 5.2.2 + /// Marked as obsolete in Unity 2017.1. + /// + public bool ForceOptimizeScriptCompilation; + + /// + /// + /// No longer needed since we can use + /// + public bool BuildScriptsOnly; + + /// + /// + /// Added in Unity 4. Removed in Unity 5 + /// + public bool StripPhysicsCode; + + + // Web Player Settings + // --------------------------------------------------------------- + + /// + /// + /// Removed in Unity 5.6 + /// + public int WebPlayerDefaultScreenWidth; + /// + /// + /// Removed in Unity 5.6 + /// + public int WebPlayerDefaultScreenHeight; + + /// + /// + /// Removed in Unity 5.6 + /// + public bool WebPlayerEnableStreaming; + + /// + /// + /// Removed in Unity 5.6 + /// + public bool WebPlayerDeployOffline; + + /// + /// + /// Removed in Unity 5.3 + /// + public int WebPlayerFirstStreamedLevelWithResources; + + + // WebGL Settings + // --------------------------------------------------------------- + + /// + /// + /// Removed in Unity 5.4 + /// + public string WebGLOptimizationLevel; + + /// + /// + /// Added in Unity 5.4. + /// Marked as obsolete in 2019.1 onwards. + /// + public bool WebGLUsePreBuiltUnityEngine; + + + // Mac OS X-only Build Settings + // --------------------------------------------------------------- + + /// + /// + /// Marked as obsolete in Unity 2018. + /// Use (stored in ) + /// + public string MacFullscreenModeUsed; + + + // Windows Store App-only Build Settings + // --------------------------------------------------------------- + + /// + /// + /// Added in Unity 5. + /// Removed in Unity 2019.1. + /// + public bool WSAGenerateReferenceProjects; + + /// + /// + /// Marked as obsolete. + /// + public string WSASDK; + + + // iOS-only Build Settings + // --------------------------------------------------------------- + + /// + /// + /// Removed in Unity 5. + /// + public bool iOSAppendedToProject; + + /// + /// + /// Replaced by + /// + public bool iOSSymlinkLibraries; + + + // BlackBerry-only Build Settings + // --------------------------------------------------------------- + + /// + /// + /// Removed in Unity 5.4 + /// + public string BlackBerryBuildSubtarget; + + /// + /// + /// Removed in Unity 5.4 + /// + public string BlackBerryBuildType; + + /// + /// + /// Removed in Unity 5 + /// + public string BlackBerryAuthorID; + + /// + /// + /// Removed in Unity 5.4 + /// + public string BlackBerryDeviceAddress; + + /// + /// + /// Removed in Unity 5.4 + /// + public string BlackBerrySaveLogPath; + + /// + /// + /// Removed in Unity 5.4 + /// + public string BlackBerryTokenPath; + + /// + /// + /// Removed in Unity 5.4 + /// + public string BlackBerryTokenAuthor; + + /// + /// + /// Removed in Unity 5.4 + /// + public string BlackBerryTokenExpiration; + + /// + /// + /// Removed in Unity 5.4 + /// + public bool BlackBerryHasCamPermissions; + + /// + /// + /// Removed in Unity 5.4 + /// + public bool BlackBerryHasMicPermissions; + + /// + /// + /// Removed in Unity 5.4 + /// + public bool BlackBerryHasGpsPermissions; + + /// + /// + /// Removed in Unity 5.4 + /// + public bool BlackBerryHasIdPermissions; + + /// + /// + /// Removed in Unity 5.4 + /// + public bool BlackBerryHasSharedPermissions; + + + // XBox 360 Build Settings + // --------------------------------------------------------------- + + /// + /// + /// Removed in Unity 5.5 + /// + public string Xbox360BuildSubtarget; + + /// + /// + /// Removed in Unity 5.5 + /// + public string Xbox360RunMethod; + + /// + /// + /// Removed in Unity 5.5 + /// + public string Xbox360TitleId; + + /// + /// + /// Removed in Unity 5.5 + /// + public string Xbox360ImageXexFilePath; + + /// + /// + /// Removed in Unity 5.5 + /// + public string Xbox360SpaFilePath; + + /// + /// + /// Removed in Unity 5.5 + /// + public bool Xbox360AutoGenerateSpa; + + /// + /// + /// Removed in Unity 5.5 + /// + public bool Xbox360EnableKinect; + + /// + /// + /// Removed in Unity 5.5 + /// + public bool Xbox360EnableKinectAutoTracking; + + /// + /// + /// Removed in Unity 5.5 + /// + public bool Xbox360EnableSpeech; + + /// + /// + /// Removed in Unity 5.5 + /// + public bool Xbox360EnableAvatar; + + /// + /// + /// Removed in Unity 5.5 + /// + public uint Xbox360SpeechDB; + + /// + /// + /// Removed in Unity 5.5 + /// + public int Xbox360AdditionalTitleMemSize; + + /// + /// + /// Removed in Unity 5.5 + /// + public bool Xbox360DeployKinectResources; + + /// + /// + /// Removed in Unity 5.5 + /// + public bool Xbox360DeployKinectHeadOrientation; + + /// + /// + /// Removed in Unity 5.5 + /// + public bool Xbox360DeployKinectHeadPosition; + + + // PS3 Build Settings + // --------------------------------------------------------------- + + /// + /// + /// Marked as obsolete in Unity 2021.2 + /// + public bool CompressBuildWithPsArc; + + /// + /// + /// Removed in Unity 5.5 + /// + public string SCEBuildSubtarget; + + // paths + + /// + /// + /// Removed in Unity 5.5 + /// + public string PS3TitleConfigFilePath; + + /// + /// + /// Removed in Unity 5.5 + /// + public string PS3DLCConfigFilePath; + + /// + /// + /// Removed in Unity 5.5 + /// + public string PS3ThumbnailFilePath; + + /// + /// + /// Removed in Unity 5.5 + /// + public string PS3BackgroundImageFilePath; + + /// + /// + /// Removed in Unity 5.5 + /// + public string PS3BackgroundSoundFilePath; + + /// + /// + /// Removed in Unity 5.5 + /// + public string PS3TrophyPackagePath; + + /// + /// + /// Removed in Unity 5.5 + /// + public bool PS3InTrialMode; + + /// + /// + /// Added in Unity 5 + /// Removed in Unity 5.5 + /// + public bool PS3DisableDolbyEncoding; + + /// + /// + /// Added in Unity 5 + /// Removed in Unity 5.5 + /// + public bool PS3EnableMoveSupport; + + /// + /// + /// Added in Unity 5 + /// Removed in Unity 5.5 + /// + public bool PS3UseSPUForUmbra; + + /// + /// + /// Added in Unity 5 + /// Removed in Unity 5.5 + /// + public bool PS3EnableVerboseMemoryStats; + + /// + /// + /// Added in Unity 5 + /// Removed in Unity 5.5 + /// + public int PS3VideoMemoryForAudio; + + /// + /// + /// Removed in Unity 5.5 + /// + public int PS3VideoMemoryForVertexBuffers; + + /// + /// + /// Removed in Unity 5.5 + /// + public int PS3BootCheckMaxSaveGameSizeKB; + + /// + /// + /// Removed in Unity 5.5 + /// + public int PS3SaveGameSlots; + + /// + /// + /// Removed in Unity 5.5 + /// + public string PS3NpCommsId; + + /// + /// + /// Removed in Unity 5.5 + /// + public string PS3NpCommsSig; + + /// + /// + /// Added in Unity 5 + /// Removed in Unity 5.5 + /// + public int PS3NpAgeRating; + + + // PS Vita Build Settings + // --------------------------------------------------------------- + + /// + /// + /// Replaced in Unity 5 with + /// Removed in Unity 2018.3 + /// + public string PSVTrophyPackagePath; + + /// + /// + /// Replaced in Unity 5 with + /// Removed in Unity 2018.3 + /// + public string PSVParamSfxPath; + + /// + /// + /// Replaced in Unity 5 with + /// Removed in Unity 2018.3 + /// + public string PSVNpCommsId; + + /// + /// + /// Replaced in Unity 5 with + /// Removed in Unity 2018.3 + /// + public string PSVNpCommsSig; + + + // new values in Unity 5: + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVBuildSubtarget; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVShortTitle; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVAppVersion; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVMasterVersion; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVAppCategory; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVContentId; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVNpAgeRating; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVParentalLevel; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVDrmType; + + /// + /// + /// Removed in Unity 2018.3 + /// + public bool PSVUpgradable; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVTvBootMode; + + /// + /// + /// Removed in Unity 2018.3 + /// + public bool PSVAcquireBgm; + + /// + /// + /// Removed in Unity 2018.3 + /// + public bool PSVAllowTwitterDialog; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVMediaCapacity; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVStorageType; + + /// + /// + /// Removed in Unity 2018.3 + /// + public bool PSVTvDisableEmu; + + /// + /// + /// Removed in Unity 2018.3 + /// + public bool PSVNpSupportGbmOrGjp; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVPowerMode; + + /// + /// + /// Removed in Unity 2018.3 + /// + public bool PSVUseLibLocation; + + /// + /// + /// Removed in Unity 2018.3 + /// + public bool PSVHealthWarning; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVEnterButtonAssignment; + + /// + /// + /// Removed in Unity 2018.3 + /// + public bool PSVInfoBarColor; + + /// + /// + /// Removed in Unity 2018.3 + /// + public bool PSVShowInfoBarOnStartup; + + /// + /// + /// Removed in Unity 2018.3 + /// + public int PSVSaveDataQuota; + + // paths + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVPatchChangeInfoPath; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVPatchOriginalPackPath; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVKeystoneFilePath; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVLiveAreaBgImagePath; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVLiveAreaGateImagePath; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVCustomLiveAreaPath; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVLiveAreaTrialPath; + + /// + /// + /// Removed in Unity 2018.3 + /// + public string PSVManualPath; + + + // Samsung TV Build Settings + // --------------------------------------------------------------- + + /// + /// + /// Removed in Unity 2017.3 + /// + public string SamsungTVDeviceAddress; // + + /// + /// + /// Added in Unity 5 + /// Removed in Unity 2017.3 + /// + public string SamsungTVAuthor; + + /// + /// + /// Added in Unity 5 + /// Removed in Unity 2017.3 + /// + public string SamsungTVAuthorEmail; + + /// + /// + /// Added in Unity 5 + /// Removed in Unity 2017.3 + /// + public string SamsungTVAuthorWebsiteUrl; + + /// + /// + /// Added in Unity 5 + /// Removed in Unity 2017.3 + /// + public string SamsungTVCategory; + + /// + /// + /// Added in Unity 5 + /// Removed in Unity 2017.3 + /// + public string SamsungTVDescription; + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildSettings_BackwardsCompat.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildSettings_BackwardsCompat.cs.meta new file mode 100644 index 00000000..be994fd7 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportData/BRT_UnityBuildSettings_BackwardsCompat.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d17631212dc3ec94bb8381f70cd68e39 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration.meta new file mode 100644 index 00000000..7e089db1 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f18047722c58f9e419c8cb7cfbb5de8b diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_AssetDependencyGenerator.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_AssetDependencyGenerator.cs new file mode 100644 index 00000000..b990651f --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_AssetDependencyGenerator.cs @@ -0,0 +1,1078 @@ +//#define BRT_ASSET_DEPENDENCY_TEST_COMMANDS + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using UnityEditor; +using UnityEditor.Compilation; +using UnityEngine; +using UnityEngine.U2D; + +namespace BuildReportTool +{ + [System.Serializable] + public static class AssetDependencyGenerator + { +#if BRT_ASSET_DEPENDENCY_TEST_COMMANDS + [MenuItem("Window/Utility/BRT - Check Dependencies of Scenes in Build (Direct)")] + public static void TestCheckAllScenesDirect() + { + var assetDependencies = new AssetDependencies(); + CreateFromIncludedScenes(assetDependencies, true, false); + } + + [MenuItem("Window/Utility/BRT - Check Dependencies of Scenes in Build (Recursive)")] + public static void TestCheckAllScenesRecursive() + { + var assetDependencies = new AssetDependencies(); + CreateFromIncludedScenes(assetDependencies, true, true); + } + + [MenuItem("Assets/Check Dependencies Test (Direct)")] + public static void CheckSelectionDependenciesDirect() + { + var selectedAssetPath = AssetDatabase.GetAssetPath(Selection.activeObject); + + var startingOpenSet = new Queue(); + startingOpenSet.Enqueue(selectedAssetPath); + + var assetDependencies = new AssetDependencies(); + Create(assetDependencies, startingOpenSet, true, false); + } + + [MenuItem("Assets/Check Dependencies Test (Recursive)")] + public static void CheckSelectionDependenciesRecursive() + { + var selectedAssetPath = AssetDatabase.GetAssetPath(Selection.activeObject); + + var startingOpenSet = new Queue(); + startingOpenSet.Enqueue(selectedAssetPath); + + var assetDependencies = new AssetDependencies(); + Create(assetDependencies, startingOpenSet, true, true); + } + + [MenuItem("Assets/Check SerializedObject")] + public static void CheckSerializedObject() + { + var serializedAsset = new SerializedObject(Selection.activeObject); + var str = new StringBuilder(); + + var propertyIterator = serializedAsset.GetIterator(); + if (propertyIterator.NextVisible(true)) + { + do + { + str.AppendFormat("Property Name: {0}\n", propertyIterator.name); + str.AppendFormat("Property Path: {0}\n", propertyIterator.propertyPath); + str.AppendFormat("Depth: {0}\n", propertyIterator.depth.ToString()); + str.AppendFormat("Type: {0}\n", propertyIterator.propertyType); + str.Append("------------------------\n"); + } while (propertyIterator.NextVisible(true)); + } + + Debug.Log(str.ToString()); + } +#endif + + // ================================================================================== + + static string[] GetDependencies(string pathName, bool recursive = false) + { + // note: there's also EditorUtility.CollectDependencies() for UnityEngine.Object +#if UNITY_5_3_OR_NEWER + return AssetDatabase.GetDependencies(pathName, recursive); +#else + return AssetDatabase.GetDependencies(new[] {pathName}); +#endif + } + + // ================================================================================== + + public static void CreateFromIncludedScenes(AssetDependencies data, bool debugLog = false, + bool recursiveGetDependencies = false) + { + var startingOpenSet = new Queue(); + + // we'll start with the scenes to be included in the build: + var scenes = EditorBuildSettings.scenes; + for (int n = 0, len = scenes.Length; n < len; ++n) + { + if (scenes[n].enabled && !string.IsNullOrEmpty(scenes[n].path)) + { + startingOpenSet.Enqueue(scenes[n].path); + } + } + + Create(data, startingOpenSet, debugLog, recursiveGetDependencies); + } + + public static void Create(AssetDependencies data, BuildReportTool.BuildInfo.SceneInBuild[] scenes, + bool debugLog = false) + { + var startingOpenSet = new Queue(); + + // we'll start with the scenes to be included in the build: + for (int n = 0, len = scenes.Length; n < len; ++n) + { + if (scenes[n].Enabled && !string.IsNullOrEmpty(scenes[n].Path)) + { + startingOpenSet.Enqueue(scenes[n].Path); + } + } + + Create(data, startingOpenSet, debugLog); + } + + public static void CreateForUsedAssetsOnly(AssetDependencies data, BuildReportTool.BuildInfo buildInfo, + bool debugLog = false) + { + if (buildInfo == null) + { + return; + } + + var startingOpenSet = new Queue(); + + // we'll start with the scenes to be included in the build: + var scenes = buildInfo.ScenesInBuild; + if (scenes != null) + { + for (int n = 0, len = scenes.Length; n < len; ++n) + { + if (scenes[n].Enabled && !string.IsNullOrEmpty(scenes[n].Path)) + { + startingOpenSet.Enqueue(scenes[n].Path); + } + } + } + + // plus all Resources assets (since they are not referred + // to in any scenes, we have to add them explicitly) + if (buildInfo.UsedAssets != null) + { + if (buildInfo.UsedAssets.All != null) + { + var allUsedAssets = buildInfo.UsedAssets.All; + for (int n = 0, len = allUsedAssets.Length; n < len; ++n) + { + if (!string.IsNullOrEmpty(allUsedAssets[n].Name) && + allUsedAssets[n].Name.IndexOf("/Resources/", StringComparison.OrdinalIgnoreCase) > -1) + { + startingOpenSet.Enqueue(allUsedAssets[n].Name); + } + } + } + + // also include sprite atlases + int textureFilterIdx = buildInfo.FileFilters.GetFilterIdx("Textures"); + SizePart[] usedTextures; + if (buildInfo.HasUsedAssets && textureFilterIdx != -1) + { + usedTextures = buildInfo.UsedAssets.PerCategory[textureFilterIdx]; + } + else + { + usedTextures = null; + } + + if (usedTextures != null) + { + foreach (var texture in usedTextures) + { + if (texture.Name.IsSpriteAtlasFile()) + { + startingOpenSet.Enqueue(texture.Name); + } + } + } + } + + Create(data, startingOpenSet, debugLog); + CalculateScriptDependencies(data, buildInfo); + } + + public static void CreateForAllAssets(AssetDependencies data, BuildReportTool.BuildInfo buildInfo, + bool debugLog = false) + { + if (buildInfo == null) + { + return; + } + + var startingOpenSet = new Queue(); + + if (buildInfo.UsedAssets != null && buildInfo.UsedAssets.All != null) + { + var allUsedAssets = buildInfo.UsedAssets.All; + for (int n = 0, len = allUsedAssets.Length; n < len; ++n) + { + if (string.IsNullOrEmpty(allUsedAssets[n].Name)) + { + continue; + } + + startingOpenSet.Enqueue(allUsedAssets[n].Name); + } + } + + if (buildInfo.UnusedAssets != null && buildInfo.UnusedAssets.All != null) + { + var allUnusedAssets = buildInfo.UnusedAssets.All; + for (int n = 0, len = allUnusedAssets.Length; n < len; ++n) + { + if (string.IsNullOrEmpty(allUnusedAssets[n].Name)) + { + continue; + } + + startingOpenSet.Enqueue(allUnusedAssets[n].Name); + } + } + + Create(data, startingOpenSet, debugLog); + CalculateScriptDependencies(data, buildInfo); + } + + // ================================================================================== + + public static bool IsFileTypeBeforeAnother(List list, int idx, string fileTypeInPrevious, + string fileTypeInIdx, out int idxOfPrevious) + { + if (idx <= 0) + { + idxOfPrevious = -1; + // idx has to be at least 1 + return false; + } + + if (idx >= list.Count) + { + idxOfPrevious = -1; + return false; + } + + if (list[idx].IndentLevel <= 1) + { + idxOfPrevious = -1; + // no previous indent level to look for + return false; + } + + if (string.IsNullOrEmpty(list[idx].AssetPath)) + { + idxOfPrevious = -1; + return false; + } + + if (!list[idx].AssetPath.EndsWith(fileTypeInIdx, StringComparison.OrdinalIgnoreCase)) + { + idxOfPrevious = -1; + return false; + } + + // search for the previous indent level + // that's the asset using this one + for (int n = idx - 1; n >= 0; --n) + { + if (list[n].IndentLevel == list[idx].IndentLevel - 1) + { + idxOfPrevious = n; + return + list[n].AssetPath.EndsWith(fileTypeInPrevious, StringComparison.OrdinalIgnoreCase); + } + } + + idxOfPrevious = -1; + return false; + } + + static bool IsInstanceOfFbxUsingMaterial(string fbxAssetPath, string assetUsingFbxAssetPath, + string materialAssetPath, + Dictionary assetDependencies, bool debugLog = false) + { + if (!assetDependencies.ContainsKey(assetUsingFbxAssetPath)) + { + return false; + } + + var doesItUseTheMaterial = + assetDependencies[assetUsingFbxAssetPath].Uses.IndexOf(materialAssetPath) > -1; + + var doesItUseTheFbx = + assetDependencies[assetUsingFbxAssetPath].Uses.IndexOf(fbxAssetPath) > -1; + + if (assetUsingFbxAssetPath.EndsWith(".prefab", StringComparison.OrdinalIgnoreCase)) + { + // for prefabs, check that they only ever really use the material + if (doesItUseTheMaterial) + { + // yes, even though the material is assigned as the default when the fbx is + // instantiated at first, it really is being used by the prefab in question, + // meaning, it has not been overriden. + + if (debugLog) + { + Debug.LogFormat("Asset\n{0}\nuses material:\n{1}", + assetUsingFbxAssetPath, materialAssetPath); + } + + return true; + } + } + else if (assetUsingFbxAssetPath.EndsWith(".unity", StringComparison.OrdinalIgnoreCase)) + { + // the problem we have is that a scene that uses an fbx has no way of differentiating + // if the fbx is just using its default materials, or have been overriden to use no materials. + // we can open the scene and look at the instantiated fbx in question. + // + // other than opening the scene, our only other clue is that the Build Report has a + // list of all assets used in the build. if it's not there, then it wasn't used. + // if it's there, then it's been used, we're just not sure which game object + // inside the scene is using it. + + if (doesItUseTheMaterial || doesItUseTheFbx) + { + // yes, even though the material is assigned as the default when the fbx is + // instantiated at first, + // it really is being used by the asset in question + + if (debugLog) + { + if (doesItUseTheMaterial) + { + Debug.LogFormat("Asset\n{0}\nuses material:\n{1}", + assetUsingFbxAssetPath, materialAssetPath); + } + else if (doesItUseTheFbx) + { + Debug.LogFormat( + "Asset\n{0}\nuses fbx (whose default material has not been overriden):\n{1}", + assetUsingFbxAssetPath, materialAssetPath); + } + } + + return true; + } + } + else + { + if (doesItUseTheMaterial || doesItUseTheFbx) + { + // yes, even though the material is assigned as the default when the fbx is + // instantiated at first, + // it really is being used by the asset in question + + if (debugLog) + { + if (doesItUseTheMaterial) + { + Debug.LogFormat("Asset\n{0}\nuses material:\n{1}", + assetUsingFbxAssetPath, materialAssetPath); + } + else if (doesItUseTheFbx) + { + Debug.LogFormat( + "Asset\n{0}\nuses fbx (whose default material has not been overriden):\n{1}", + assetUsingFbxAssetPath, materialAssetPath); + } + } + + return true; + } + } + + return false; + } + + static bool AreInstancesOfFbxUsingMaterial(string fbxAssetPath, string materialAssetPath, + Dictionary assetDependencies, bool debugLog = false) + { + if (!assetDependencies.ContainsKey(fbxAssetPath)) + { + return false; + } + + var assetsThatUseTheFbx = assetDependencies[fbxAssetPath].Users; + + for (int n = 0, len = assetsThatUseTheFbx.Count; n < len; ++n) + { + if (debugLog) + { + Debug.LogFormat("assetsThatUseTheFbx {0}: {1}", n, assetsThatUseTheFbx[n]); + } + + if (IsInstanceOfFbxUsingMaterial(fbxAssetPath, assetsThatUseTheFbx[n], materialAssetPath, + assetDependencies, debugLog)) + { + return true; + } + } + + return false; + } + + /// + /// Get asset that's above the one specified by the idx, above meaning + /// it is one step higher in Indent Level. + /// + /// + /// + /// + static string GetAssetUsageParent(List list, int idx) + { + if (idx <= 0 || idx >= list.Count) + { + // idx has to be at least 1 and up to (count - 1) + return null; + } + + for (int n = idx - 1; n >= 0; --n) + { + if (list[n].IndentLevel == list[idx].IndentLevel - 1) + { + return list[n].AssetPath; + } + } + + return null; + } + + /// + /// Does list already have an entry similar to the one supplied? + /// Similar means same AssetPath, same IndentLevel, + /// same asset that has higher indent level above it (parent). + /// + /// + /// + /// + /// + static bool Contains(List list, AssetUserFlattened check, string assetParentOfCheck) + { + for (int n = list.Count - 1; n >= 0; --n) + { + if (list[n].IndentLevel < check.IndentLevel) + { + // we've gone past the indent level we need to check for + break; + } + + if (list[n].AssetPath.Equals(check.AssetPath, StringComparison.OrdinalIgnoreCase) && + list[n].IndentLevel == check.IndentLevel && + GetAssetUsageParent(list, n) == assetParentOfCheck) + { + return true; + } + } + + return false; + } + + // ================================================================================== + + static void Create(AssetDependencies data, Queue openSet, bool debugLog = false, + bool recursiveGetDependencies = false) + { + var assetDependencies = data.GetAssetDependencies(); + assetDependencies.Clear(); + + // ------------------------------------------------------------- + + // assets that we've finished inspecting + var closedSet = new HashSet(); + + // ==================================================================== + + // Populate the dependencies data for each asset + + while (openSet.Count > 0) + { + var newAssetToInspect = openSet.Dequeue(); + + if (string.IsNullOrEmpty(newAssetToInspect)) + { + continue; + } + + closedSet.Add(newAssetToInspect); + + string[] foundDependencies = GetDependencies(newAssetToInspect, recursiveGetDependencies); + + if (foundDependencies.Length <= 0) + { + // this asset doesn't use others + continue; + } + + StringBuilder stringBuilder = null; + if (debugLog) + { + stringBuilder = new StringBuilder(); + stringBuilder.Append("Assets used by "); + stringBuilder.Append(newAssetToInspect); + stringBuilder.Append(" ("); + stringBuilder.Append(foundDependencies.Length.ToString()); + stringBuilder.Append("):\n"); + } + + DependencyEntry assetsUsed; + if (assetDependencies.ContainsKey(newAssetToInspect)) + { + assetsUsed = assetDependencies[newAssetToInspect]; + } + else + { + assetsUsed = new DependencyEntry(); + assetDependencies.Add(newAssetToInspect, assetsUsed); + } + + // ------------------------------------------------------------- + + // we're looping through the assets that newAssetToInspect uses + // so add them to the `DependencyEntry.Uses` list + for (int n = 0, len = foundDependencies.Length; n < len; ++n) + { + if (string.IsNullOrEmpty(foundDependencies[n])) + { + continue; + } + + if (foundDependencies[n].Equals(newAssetToInspect, StringComparison.Ordinal)) + { + // for some reason, the API reports assets to be using their own selves + // so skip it when they have the same value + continue; + } + + // If newAssetToInspect is a material and foundDependencies[n] is a texture, + // we need to check if it's really used in the current shader assigned to the material, + // because when you assign a texture to a material, even when you change + // the shader, that assigned texture from the previous shader is kept intact. + // So when you do AssetDatabase.GetDependencies() on that material, it will output + // even textures that are not for the current shader. + // + // In the context of a build report, such textures need to be identified as + // NOT a dependency, because ultimately inside the build, they didn't get used + // by that material. + // + if (newAssetToInspect.IsMaterialFile() && foundDependencies[n].IsTextureFile()) + { + bool textureFound = false; +#if UNITY_5_6_OR_NEWER + var material = AssetDatabase.LoadAssetAtPath(newAssetToInspect); +#else + var material = (Material)AssetDatabase.LoadAssetAtPath(newAssetToInspect, typeof(Material)); +#endif + if (material == null) + { + // couldn't find material in current project + continue; + } + var shader = material.shader; + if (shader == null) + { + // no shader assigned to material + continue; + } + int shaderPropertyCount = ShaderUtil.GetPropertyCount(shader); + for (int pIdx = 0; pIdx < shaderPropertyCount; ++pIdx) + { + if (ShaderUtil.GetPropertyType(shader, pIdx) != ShaderUtil.ShaderPropertyType.TexEnv) + { + // go through texture properties only + continue; + } + + var texture = material.GetTexture(ShaderUtil.GetPropertyName(shader, pIdx)); + if (texture == null) + { + // no texture currently assigned to this texture property + continue; + } + + string textureAssetPath = AssetDatabase.GetAssetPath(texture); + if (string.IsNullOrEmpty(textureAssetPath)) + { + // Empty/null path for a loaded texture. + // This could mean texture was dynamically created. + // Since there's no project asset for the texture, + // we can ignore it. + continue; + } + + if (textureAssetPath == foundDependencies[n]) + { + textureFound = true; + break; + } + } + + if (!textureFound) + { + // Even though the texture is assigned to the material, + // the material is currently using a shader that doesn't + // make use of that texture. + // So in the context of a build report, this isn't a + // dependency, and therefore should be skipped. + continue; + } + } + + if (debugLog) + { + stringBuilder.Append(n.ToString()); + stringBuilder.Append(". "); + stringBuilder.Append(foundDependencies[n]); + stringBuilder.Append("\n"); + } + + // -------------------------------------------------------- + + if (!assetsUsed.Uses.Contains(foundDependencies[n])) + { + assetsUsed.Uses.Add(foundDependencies[n]); + } + + // -------------------------------------------------------- + + // now record that dependency as being used by `newAssetToInspect` + DependencyEntry assetsUsedByEdit; + if (assetDependencies.ContainsKey(foundDependencies[n])) + { + assetsUsedByEdit = assetDependencies[foundDependencies[n]]; + } + else + { + assetsUsedByEdit = new DependencyEntry(); + assetDependencies.Add(foundDependencies[n], assetsUsedByEdit); + } + + if (!assetsUsedByEdit.Users.Contains(newAssetToInspect)) + { + assetsUsedByEdit.Users.Add(newAssetToInspect); + } + + // -------------------------------------------------------- + + if (closedSet.Contains(foundDependencies[n])) + { + // this asset was already searched through. skip it. + continue; + } + + if (!openSet.Contains(foundDependencies[n])) + { + // add to list of assets to search through + openSet.Enqueue(foundDependencies[n]); + } + } + + if (debugLog) + { + Debug.Log(stringBuilder.ToString()); + } + } + + // ==================================================================== + // Create the Uses List for each scene in the SceneEntries list + + List openFlattenedSet = new List(); + + foreach (var pair in assetDependencies) + { + // ==================================================================== + // Create the AssetUserFlattened List + // This is the recursively calculated users of the asset. + // Indent Levels signify which asset uses which. + + var assetUsers = pair.Value.Users; + + if (assetUsers.Count == 0) + { + continue; + } + + var usersFlattened = new List(assetUsers.Count); + pair.Value.UsersFlattened = usersFlattened; + + openFlattenedSet.Clear(); + + for (int n = 0, len = assetUsers.Count; n < len; ++n) + { + AssetUserFlattened newEntry = new AssetUserFlattened(assetUsers[n], 1 +#if BRT_ASSET_DEPENDENCY_DEBUG + , "[initial]" +#endif + ); + + // put them in reverse since always take from the end of the openFlattenedSet + openFlattenedSet.Insert(0, newEntry); + } + + var endlessLoopGuard = 0; + while (openFlattenedSet.Count > 0) + { + ++endlessLoopGuard; + if (endlessLoopGuard >= 9999) // that ought to be enough for real-world usage (I hope) + { + break; + } + + + var userAsset = openFlattenedSet[openFlattenedSet.Count - 1]; + openFlattenedSet.RemoveAt(openFlattenedSet.Count - 1); + + + var assetUsed = GetAssetUsageParent(usersFlattened, usersFlattened.Count - 1); + if (Contains(usersFlattened, userAsset, assetUsed)) + { + // `userAsset` is already added previously in this list in same indent level and same parent + // can't add this because it would be a duplicate entry + + continue; + } + + usersFlattened.Add(userAsset); + + if (userAsset.AssetPath.Equals(pair.Key, StringComparison.OrdinalIgnoreCase)) + { + // no need to go inside this further because this is + // already what we're primarily going inside currently + userAsset.CyclicDependency = true; +#if BRT_ASSET_DEPENDENCY_DEBUG + userAsset.DebugInfo = "[selected cyclic]"; +#endif + usersFlattened[usersFlattened.Count - 1] = userAsset; + continue; + } + + var userAssetIsFbxUsingMaterial = false; + string materialAssignedAsDefault = null; + + if (usersFlattened.Count >= 2) + { + // note: usersFlattened[usersFlattened.Count - 1] is userAsset + // + + var noNeedToAddUsersOfUser = false; + + if (userAsset.IndentLevel > 1) + { + var currentIndentLevel = userAsset.IndentLevel - 1; + + if (debugLog && pair.Key.Contains("Runtime-Only DLL/TextMeshPro.dll") && + userAsset.AssetPath.Contains("AbilityEntry Settings.asset")) + { + Debug.LogFormat( + "=========================================================\nChecking for cyclic dependencies for {0} at index {1}\nLooking for Indent Level {2}", + userAsset.AssetPath, (usersFlattened.Count - 1).ToString(), currentIndentLevel); + } + + // start just before our own position in the list, then go backwards + for (int traceN = usersFlattened.Count - 2; traceN >= 0; --traceN) + { + if (usersFlattened[traceN].IndentLevel > currentIndentLevel) + { + // not the indent level we're looking for + + if (debugLog && pair.Key.Contains("Runtime-Only DLL/TextMeshPro.dll") && + userAsset.AssetPath.Contains("AbilityEntry Settings.asset")) + { + Debug.LogFormat("Skipped element {0} since its indent level is: {1} (looking for {2})", + traceN, usersFlattened[traceN].IndentLevel.ToString(), currentIndentLevel); + } + + continue; + } + + // at this point, the current element is above our indent level, meaning it's what the asset uses + + if (debugLog && pair.Key.Contains("Runtime-Only DLL/TextMeshPro.dll") && + userAsset.AssetPath.Contains("AbilityEntry Settings.asset")) + { + Debug.LogFormat("Now at element {0}: {1} at indent level {2}. Checking if same as {3}", + traceN, usersFlattened[traceN].AssetPath, usersFlattened[traceN].IndentLevel.ToString(), + userAsset.AssetPath); + } + + currentIndentLevel = usersFlattened[traceN].IndentLevel - 1; + + if (usersFlattened[traceN].AssetPath + .Equals(userAsset.AssetPath, StringComparison.OrdinalIgnoreCase)) + { + // this is an asset we've been in earlier. + // should not add users of this asset, because that includes the + // one we've already been in, and it would be an endless recursion + userAsset.CyclicDependency = true; +#if BRT_ASSET_DEPENDENCY_DEBUG + userAsset.DebugInfo = "[earlier indent cyclic]"; +#endif + usersFlattened[usersFlattened.Count - 1] = userAsset; + noNeedToAddUsersOfUser = true; + + + if (debugLog && pair.Key.Contains("Runtime-Only DLL/TextMeshPro.dll") && + userAsset.AssetPath.Contains("AbilityEntry Settings.asset")) + { + Debug.LogFormat( + "Element {0} is found to be same so latest entry is marked as cyclic dependency. check is done.", + traceN); + } + + break; + } + + if (usersFlattened[traceN].IndentLevel <= 1) + { + // went through the last asset in this usage chain, no need to look further + + if (debugLog && pair.Key.Contains("Runtime-Only DLL/TextMeshPro.dll") && + userAsset.AssetPath.Contains("AbilityEntry Settings.asset")) + { + Debug.LogFormat("Element {0} has indent level of {1} so aborting the check", + traceN, usersFlattened[traceN].IndentLevel.ToString()); + } + + break; + } + } + + if (debugLog && pair.Key.Contains("Runtime-Only DLL/TextMeshPro.dll") && + userAsset.AssetPath.Contains("AbilityEntry Settings.asset")) + { + Debug.LogFormat( + "=========================================================\nDone checking for cyclic dependencies for {0} at index {1}", + userAsset.AssetPath, (usersFlattened.Count - 1).ToString()); + } + } + + if (!noNeedToAddUsersOfUser) + { + for (int n = usersFlattened.Count - 2; n >= 0; --n) + { + if (usersFlattened[n].AssetPath == userAsset.AssetPath) + { + // users of this user has already been shown in earlier entries + // although from a different usage chain + +#if BRT_ASSET_DEPENDENCY_DEBUG + userAsset.DebugInfo += " [already visited]"; +#endif + // update the entry + usersFlattened[usersFlattened.Count - 1] = userAsset; + + noNeedToAddUsersOfUser = true; + + break; + } + } + } + + int idxOfPrevious; + if (!noNeedToAddUsersOfUser && + IsFileTypeBeforeAnother(usersFlattened, usersFlattened.Count - 1, + ".mat", ".fbx", out idxOfPrevious)) + { + // a Material being used by an FBX is only as a default, initial value for that FBX. + // after the FBX is instantiated, we have no guarantee that Material is still being + // used, so additional checks are needed + + // check the assets that use the FBX file, meaning check the places where that FBX + // is instantiated or referenced, which are either prefabs, scenes, or scriptable objects. + // + // do those prefabs/scenes/scriptable objects really use that default material, or has it + // been overriden? + + userAssetIsFbxUsingMaterial = true; + + materialAssignedAsDefault = usersFlattened[idxOfPrevious].AssetPath; + var fbxUsingTheMaterialAsDefault = userAsset.AssetPath; + + if (debugLog) + { + Debug.LogFormat("Detected fbx using a material.\n" + + "Material:\n{0}\n" + + "Fbx:\n{1}\n" + + "Checking the assets that use the fbx if they really also use the material...", + materialAssignedAsDefault, fbxUsingTheMaterialAsDefault); + } + + var isMaterialReallyBeingUsed = + AreInstancesOfFbxUsingMaterial(fbxUsingTheMaterialAsDefault, materialAssignedAsDefault, + assetDependencies, debugLog); + + if (!isMaterialReallyBeingUsed) + { +#if BRT_ASSET_DEPENDENCY_DEBUG + userAsset.DebugInfo += " [using as default for material]"; +#endif + usersFlattened[usersFlattened.Count - 1] = userAsset; + noNeedToAddUsersOfUser = true; + } + } + + if (!noNeedToAddUsersOfUser && + userAsset.AssetPath.EndsWith(".cs", StringComparison.OrdinalIgnoreCase)) + { + // something being used by a .cs script file is only as a default, initial value for that script + // after the script is instantiated, we have no guarantee that something is still being + // used, so it doesn't make sense to go further +#if BRT_ASSET_DEPENDENCY_DEBUG + userAsset.DebugInfo += " [using as default for script]"; +#endif + usersFlattened[usersFlattened.Count - 1] = userAsset; + noNeedToAddUsersOfUser = true; + } + + if (noNeedToAddUsersOfUser) + { + continue; + } + } + + if (assetDependencies.ContainsKey(userAsset.AssetPath)) + { + var usersOfUser = assetDependencies[userAsset.AssetPath].Users; + for (int n = 0, len = usersOfUser.Count; n < len; ++n) + { + AssetUserFlattened newEntry = new AssetUserFlattened(usersOfUser[n], userAsset.IndentLevel + 1); + + if (userAssetIsFbxUsingMaterial) + { + if (!IsInstanceOfFbxUsingMaterial(userAsset.AssetPath, usersOfUser[n], + materialAssignedAsDefault, assetDependencies, debugLog)) + { + continue; + } + + if (usersOfUser[n].EndsWith(".unity", StringComparison.OrdinalIgnoreCase)) + { + // userAsset is an fbx which uses a material + // newEntry is a scene that uses (an instance of) that fbx + // BUT we are not sure that + newEntry.IndentLevel = userAsset.IndentLevel; + + if (Contains(usersFlattened, newEntry, userAsset.AssetPath)) + { + // already added + continue; + } + } + +#if BRT_ASSET_DEPENDENCY_DEBUG + newEntry.DebugInfo = " [uses fbx which uses material]"; +#endif + } + else if (userAsset.AssetPath.EndsWith(".unity", StringComparison.OrdinalIgnoreCase)) + { + if (usersOfUser[n].EndsWith("LightingData.asset", StringComparison.OrdinalIgnoreCase)) + { + // Scenes that have baked lighting use a LightingData.asset (each scene has one). + // The LightingData.asset has a cyclic dependency with its corresponding scene. + // We can ignore this, since this is useless information for the `pair.Key` asset. + + if (debugLog) + { + Debug.LogFormat("Ignoring \"LightingData.asset\" of scene: {0}", + userAsset.AssetPath); + } + + continue; + } + } + + openFlattenedSet.Add(newEntry); + } + } + } + } + + if (debugLog) + { + Debug.Log("==================================================="); + + foreach (var pair in assetDependencies) + { + var stringBuilder = new StringBuilder(); + + stringBuilder.Append(pair.Key); + + stringBuilder.Append(" used by:\n"); + + for (int n = 0, len = pair.Value.Users.Count; n < len; ++n) + { + stringBuilder.Append(n.ToString()); + stringBuilder.Append(". "); + stringBuilder.Append(pair.Value.Users[n]); + stringBuilder.Append("\n"); + } + + Debug.Log(stringBuilder.ToString()); + } + } + } + + // ================================================================================== + + static void CalculateScriptDependencies(AssetDependencies data, BuildReportTool.BuildInfo buildInfo) + { + int scriptsFilterIdx = buildInfo.FileFilters.GetFilterIdx("Scripts"); + SizePart[] usedScripts; + if (buildInfo.HasUsedAssets && scriptsFilterIdx != -1) + { + usedScripts = buildInfo.UsedAssets.PerCategory[scriptsFilterIdx]; + } + else + { + return; + } + + var assetDependencies = data.GetAssetDependencies(); + + var assemblies = CompilationPipeline.GetAssemblies(); + foreach (Assembly assembly in assemblies) + { + string assemblyFilename = Path.GetFileName(assembly.outputPath); + + if (!buildInfo.ScriptDLLs.Exists(assemblyFilename) && !buildInfo.UnityEngineDLLs.Exists(assemblyFilename)) + { + continue; + } + + foreach (string sourceFile in assembly.sourceFiles) + { + if (!usedScripts.Exists(sourceFile)) + { + continue; + } + + DependencyEntry assetDependency; + if (assetDependencies.ContainsKey(sourceFile)) + { + assetDependency = assetDependencies[sourceFile]; + } + else + { + assetDependency = new DependencyEntry(); + assetDependencies.Add(sourceFile, assetDependency); + } + + assetDependency.Users.Add(assemblyFilename); + + var usersFlattened = new List(assetDependency.Users.Count); + assetDependency.UsersFlattened = usersFlattened; + + var newEntry = new AssetUserFlattened(assemblyFilename, 1 +#if BRT_ASSET_DEPENDENCY_DEBUG + , "[initial]" +#endif + ); + usersFlattened.Add(newEntry); + } + } + } + + // ================================================================================== + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_AssetDependencyGenerator.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_AssetDependencyGenerator.cs.meta new file mode 100644 index 00000000..da61930e --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_AssetDependencyGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d254566b71214ab4ab8bbb6b6e1ac4be +timeCreated: 1558257280 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_MeshDataGenerator.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_MeshDataGenerator.cs new file mode 100644 index 00000000..4c1d17d5 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_MeshDataGenerator.cs @@ -0,0 +1,175 @@ + +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace BuildReportTool +{ + public static class MeshDataGenerator + { + public static void CreateForUsedAssetsOnly(MeshData data, BuildReportTool.BuildInfo buildInfo, bool debugLog = false) + { + if (buildInfo == null) + { + if (debugLog) Debug.LogError("Can't create MeshData for Used Assets, BuildInfo is null"); + return; + } + if (debugLog) Debug.Log("Will create MeshData for Used Assets"); + + var meshDataEntries = data.GetMeshData(); + meshDataEntries.Clear(); + + AppendMeshData(data, buildInfo.UsedAssets.All, false, debugLog); + } + + public static void CreateForAllAssets(MeshData data, BuildReportTool.BuildInfo buildInfo, bool debugLog = false) + { + if (buildInfo == null) + { + if (debugLog) Debug.LogError("Can't create MeshData for Used & Unused Assets, BuildInfo is null"); + return; + } + if (debugLog) Debug.Log("Will create MeshData for Used & Unused Assets"); + + var meshDataEntries = data.GetMeshData(); + meshDataEntries.Clear(); + + AppendMeshData(data, buildInfo.UsedAssets.All, false, debugLog); + AppendMeshData(data, buildInfo.UnusedAssets.All, false, debugLog); + } + + static void AppendMeshData(MeshData data, IList assets, bool overwriteExistingEntries, bool debugLog = false) + { + if (debugLog) Debug.LogFormat("Creating Mesh Data for {0} assets", assets.Count.ToString()); + + var meshDataEntries = data.GetMeshData(); + + for (int n = 0; n < assets.Count; ++n) + { + if (!Util.IsMeshFile(assets[n].Name)) + { + // this asset is not a mesh, skip it + continue; + } + + if (meshDataEntries.ContainsKey(assets[n].Name)) + { + if (!overwriteExistingEntries) + { + continue; + } + else + { + var newEntry = CreateEntry(assets[n].Name, debugLog); + meshDataEntries[assets[n].Name] = newEntry; + } + } + else + { + var newEntry = CreateEntry(assets[n].Name, debugLog); + meshDataEntries.Add(assets[n].Name, newEntry); + } + } + } + + static readonly List MeshFilters = new List(); + static readonly List SkinnedMeshRenderers = new List(); +#if UNITY_5_5_OR_NEWER + static readonly List TriangleBuffer = new List(); +#endif + + static MeshData.Entry CreateEntry(string assetPath, bool debugLog = false) + { + var assetImporter = AssetImporter.GetAtPath(assetPath); + if (assetImporter == null) + { + if (debugLog) Debug.LogErrorFormat("AssetImporter.GetAtPath returned null for {0}", assetPath); + return new MeshData.Entry(); + } + + var modelImporter = assetImporter as ModelImporter; + if (modelImporter == null) + { + if (debugLog) Debug.LogErrorFormat("AssetImporter is not a ModelImporter for {0}", assetPath); + return new MeshData.Entry(); + } + + // ----------------------------------------------------------------------- + + if (debugLog) Debug.LogFormat("Inspecting Model: {0}", assetPath); + + var result = new MeshData.Entry(); + + result.AnimationType = modelImporter.animationType.ToString(); + if (modelImporter.clipAnimations != null && modelImporter.clipAnimations.Length > 0) + { + result.AnimationClipCount = modelImporter.clipAnimations.Length; + } + else + { + result.AnimationClipCount = modelImporter.defaultClipAnimations.Length; + } + + int totalSubMeshCount = 0; + int totalVertexCount = 0; + int totalTriangleCount = 0; + result.MeshFilterCount = 0; + result.SkinnedMeshRendererCount = 0; + var loadedModel = AssetDatabase.LoadAssetAtPath(assetPath, typeof(GameObject)) as GameObject; + if (loadedModel != null) + { + loadedModel.GetComponentsInChildren(true, MeshFilters); + result.MeshFilterCount = MeshFilters.Count; + for (int n = 0; n < MeshFilters.Count; ++n) + { + int subMeshCount = MeshFilters[n].sharedMesh.subMeshCount; + totalSubMeshCount += subMeshCount; + totalVertexCount += MeshFilters[n].sharedMesh.vertexCount; + + for (int m = 0; m < subMeshCount; ++m) + { +#if UNITY_2017_3_OR_NEWER + MeshFilters[n].sharedMesh.GetTriangles(TriangleBuffer, m, false); + totalTriangleCount += TriangleBuffer.Count/3; +#elif UNITY_5_5_OR_NEWER + MeshFilters[n].sharedMesh.GetTriangles(TriangleBuffer, m); + totalTriangleCount += TriangleBuffer.Count/3; +#else + var triangles = MeshFilters[n].sharedMesh.GetTriangles(m); + totalTriangleCount += triangles.Length/3; +#endif + } + } + + loadedModel.GetComponentsInChildren(true, SkinnedMeshRenderers); + result.SkinnedMeshRendererCount = SkinnedMeshRenderers.Count; + for (int n = 0; n < SkinnedMeshRenderers.Count; ++n) + { + int subMeshCount = SkinnedMeshRenderers[n].sharedMesh.subMeshCount; + totalSubMeshCount += subMeshCount; + totalVertexCount += SkinnedMeshRenderers[n].sharedMesh.vertexCount; + + for (int m = 0; m < subMeshCount; ++m) + { +#if UNITY_2017_3_OR_NEWER + SkinnedMeshRenderers[n].sharedMesh.GetTriangles(TriangleBuffer, m, false); + totalTriangleCount += TriangleBuffer.Count/3; +#elif UNITY_5_5_OR_NEWER + SkinnedMeshRenderers[n].sharedMesh.GetTriangles(TriangleBuffer, m); + totalTriangleCount += TriangleBuffer.Count/3; +#else + var triangles = SkinnedMeshRenderers[n].sharedMesh.GetTriangles(m); + totalTriangleCount += triangles.Length/3; +#endif + } + } + } + + result.SubMeshCount = totalSubMeshCount; + result.VertexCount = totalVertexCount; + result.TriangleCount = totalTriangleCount; + + return result; + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_MeshDataGenerator.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_MeshDataGenerator.cs.meta new file mode 100644 index 00000000..75be38ec --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_MeshDataGenerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d10c934291eb6f44c8a1e76c63795dfc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_PrefabDataGenerator.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_PrefabDataGenerator.cs new file mode 100644 index 00000000..bd1ffba1 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_PrefabDataGenerator.cs @@ -0,0 +1,162 @@ +using System; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace BuildReportTool +{ + public static class PrefabDataGenerator + { + public static void CreateForUsedAssetsOnly(PrefabData data, BuildReportTool.BuildInfo buildInfo, bool debugLog = false) + { + if (buildInfo == null) + { + if (debugLog) Debug.LogError("Can't create MeshData for Used Assets, BuildInfo is null"); + return; + } + if (debugLog) Debug.Log("Will create MeshData for Used Assets"); + + var prefabDataEntries = data.GetPrefabData(); + prefabDataEntries.Clear(); + + AppendPrefabData(data, buildInfo.UsedAssets.All, false, debugLog); + } + + static void AppendPrefabData(PrefabData data, IList assets, bool overwriteExistingEntries, bool debugLog = false) + { + var prefabDataEntries = data.GetPrefabData(); + + for (int n = 0; n < assets.Count; ++n) + { + if (!assets[n].Name.EndsWith(".prefab", StringComparison.OrdinalIgnoreCase)) + { + continue; + } + + if (prefabDataEntries.ContainsKey(assets[n].Name)) + { + if (!overwriteExistingEntries) + { + continue; + } + else + { + var newEntry = CreateEntry(assets[n].Name, debugLog); + prefabDataEntries[assets[n].Name] = newEntry; + } + } + else + { + var newEntry = CreateEntry(assets[n].Name, debugLog); + prefabDataEntries.Add(assets[n].Name, newEntry); + } + } + } + + static PrefabData.Entry CreateEntry(string assetPath, bool debugLog = false) + { + var prefabAsset = AssetDatabase.LoadAssetAtPath(assetPath); + if (prefabAsset == null) + { + return new PrefabData.Entry(); + } + + var newEntry = new PrefabData.Entry(); + StaticEditorFlags flags = GameObjectUtility.GetStaticEditorFlags(prefabAsset); + newEntry.StaticEditorFlags = GetIntFlags(flags); + + int childStaticEditorFlags = 0; + childStaticEditorFlags = UpdateChildStaticEditorFlags(newEntry.StaticEditorFlags, childStaticEditorFlags, PrefabData.FLAG_CONTRIBUTE_GI, prefabAsset.transform); + childStaticEditorFlags = UpdateChildStaticEditorFlags(newEntry.StaticEditorFlags, childStaticEditorFlags, PrefabData.FLAG_BATCHING_STATIC, prefabAsset.transform); + childStaticEditorFlags = UpdateChildStaticEditorFlags(newEntry.StaticEditorFlags, childStaticEditorFlags, PrefabData.FLAG_OCCLUDER_STATIC, prefabAsset.transform); + childStaticEditorFlags = UpdateChildStaticEditorFlags(newEntry.StaticEditorFlags, childStaticEditorFlags, PrefabData.FLAG_OCCLUDEE_STATIC, prefabAsset.transform); + childStaticEditorFlags = UpdateChildStaticEditorFlags(newEntry.StaticEditorFlags, childStaticEditorFlags, PrefabData.FLAG_REFLECTION_PROBE_STATIC, prefabAsset.transform); +#if !UNITY_2022_2_OR_NEWER + childStaticEditorFlags = UpdateChildStaticEditorFlags(newEntry.StaticEditorFlags, childStaticEditorFlags, PrefabData.FLAG_NAVIGATION_STATIC, prefabAsset.transform); + childStaticEditorFlags = UpdateChildStaticEditorFlags(newEntry.StaticEditorFlags, childStaticEditorFlags, PrefabData.FLAG_OFF_MESH_LINK_GENERATION, prefabAsset.transform); +#endif + newEntry.ChildStaticEditorFlags = childStaticEditorFlags; + + return newEntry; + } + + static int UpdateChildStaticEditorFlags(int rootLevelStaticEditorFlags, int childStaticEditorFlags, int flagValue, Transform rootTransform) + { + if ((rootLevelStaticEditorFlags & flagValue) != 0) + { + // root level is already on + return childStaticEditorFlags; + } + + // check children of rootTransform to see if flag is turned on for any of them + var stack = new Stack(); + stack.Push(rootTransform); + + while (stack.Count > 0) + { + Transform iterator = stack.Pop(); + + for (int i = 0; i < iterator.childCount; i++) + { + Transform child = iterator.GetChild(i); + StaticEditorFlags childFlags = GameObjectUtility.GetStaticEditorFlags(child.gameObject); + int intChildFlags = GetIntFlags(childFlags); + if ((intChildFlags & flagValue) != 0) + { + // this child has the flag + childStaticEditorFlags |= flagValue; + return childStaticEditorFlags; + } + stack.Push(child); + } + } + return childStaticEditorFlags; + } + + static int GetIntFlags(StaticEditorFlags flags) + { + // Unity might change the value of these flags in a future version, so we explicitly convert it ourselves + int intFlags = 0; + + if (flags.Has(StaticEditorFlags.ContributeGI)) + { + intFlags |= PrefabData.FLAG_CONTRIBUTE_GI; + } + if (flags.Has(StaticEditorFlags.OccluderStatic)) + { + intFlags |= PrefabData.FLAG_OCCLUDER_STATIC; + } + if (flags.Has(StaticEditorFlags.BatchingStatic)) + { + intFlags |= PrefabData.FLAG_BATCHING_STATIC; + } +#if !UNITY_2022_2_OR_NEWER + if (flags.Has(StaticEditorFlags.NavigationStatic)) + { + intFlags |= PrefabData.FLAG_NAVIGATION_STATIC; + } +#endif + if (flags.Has(StaticEditorFlags.OccludeeStatic)) + { + intFlags |= PrefabData.FLAG_OCCLUDEE_STATIC; + } +#if !UNITY_2022_2_OR_NEWER + if (flags.Has(StaticEditorFlags.OffMeshLinkGeneration)) + { + intFlags |= PrefabData.FLAG_OFF_MESH_LINK_GENERATION; + } +#endif + if (flags.Has(StaticEditorFlags.ReflectionProbeStatic)) + { + intFlags |= PrefabData.FLAG_REFLECTION_PROBE_STATIC; + } + + return intFlags; + } + + static bool Has(this StaticEditorFlags f, StaticEditorFlags flagToCheck) + { + return (f & flagToCheck) != 0; + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_PrefabDataGenerator.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_PrefabDataGenerator.cs.meta new file mode 100644 index 00000000..d40adfab --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_PrefabDataGenerator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 38b06f03b322c3f4ca4d44824c124682 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_ReportGenerator.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_ReportGenerator.cs new file mode 100644 index 00000000..2d328f45 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_ReportGenerator.cs @@ -0,0 +1,3419 @@ +//#define BUILD_REPORT_TOOL_EXPERIMENTS + +using UnityEngine; +using UnityEditor; +#if UNITY_5_3_OR_NEWER +using UnityEditor.SceneManagement; +using UnityEngine.SceneManagement; +#endif +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using System.Threading; +using DldUtil; +using UnityEditor.Compilation; + +/* + +Editor +Editor log can be brought up through the Open Editor Log button in Unity's Console window. + +Mac OS X ~/Library/Logs/Unity/Editor.log (or /Users/username/Library/Logs/Unity/Editor.log) +Windows XP * C:\Documents and Settings\username\Local Settings\Application Data\Unity\Editor\Editor.log +Windows Vista/7 * C:\Users\username\AppData\Local\Unity\Editor\Editor.log + +(*) On Windows the Editor log file is stored in the local application data folder: %LOCALAPPDATA%\Unity\Editor\Editor.log, where LOCALAPPDATA is defined by CSIDL_LOCAL_APPDATA. + + + + + +need to parse contents of editor log. +this part is what we're interested in: + +[quote] +Textures 196.4 kb 3.4% +Meshes 0.0 kb 0.0% +Animations 0.0 kb 0.0% +Sounds 0.0 kb 0.0% +Shaders 0.0 kb 0.0% +Other Assets 37.4 kb 0.6% +Levels 8.5 kb 0.1% +Scripts 228.4 kb 3.9% +Included DLLs 5.2 mb 91.7% +File headers 12.5 kb 0.2% +Complete size 5.7 mb 100.0% + +Used Assets, sorted by uncompressed size: + 39.1 kb 0.7% Assets/BTX/GUI/Skin/Window.png + 21.0 kb 0.4% Assets/BTX/GUI/BehaviourTree/Resources/BehaviourTreeGuiSkin.guiskin + 20.3 kb 0.3% Assets/BTX/Fonts/DejaVuSans-SmallSize.ttf + 20.2 kb 0.3% Assets/BTX/Fonts/DejaVuSans-Bold.ttf + 20.1 kb 0.3% Assets/BTX/Fonts/DejaVuSansCondensed 1.ttf + 12.0 kb 0.2% Assets/BTX/Fonts/DejaVuSansCondensed.ttf + 10.8 kb 0.2% Assets/BTX/GUI/BehaviourTree/Nodes2/White.png + 8.1 kb 0.1% Assets/BTX/GUI/BehaviourTree/Nodes/RoundedBox.png + 8.1 kb 0.1% Assets/BTX/GUI/BehaviourTree/Nodes/Decorator.png + 4.9 kb 0.1% Assets/BTX/GUI/Skin/Box.png + 4.6 kb 0.1% Assets/BTX/GUI/BehaviourTree/GlovedHand.png + 4.5 kb 0.1% Assets/BTX/GUI/Skin/TextField_Normal.png + 4.5 kb 0.1% Assets/BTX/GUI/Skin/Button_Toggled.png + 4.5 kb 0.1% Assets/BTX/GUI/Skin/Button_Normal.png + 4.5 kb 0.1% Assets/BTX/GUI/Skin/Button_Active.png + 4.1 kb 0.1% Assets/BTX/GUI/BehaviourTree/RunState/Visiting.png + 4.1 kb 0.1% Assets/BTX/GUI/BehaviourTree/RunState/Success.png + 4.1 kb 0.1% Assets/BTX/GUI/BehaviourTree/RunState/Running.png + (etc. goes on and on until all files used are listed) +[/quote] + + +This part can also be helpful: + +[quote] +Mono dependencies included in the build +Boo.Lang.dll +Mono.Security.dll +System.Core.dll +System.Xml.dll +System.dll +UnityScript.Lang.dll +mscorlib.dll +Assembly-CSharp.dll +Assembly-UnityScript.dll + +[/quote] + + +so we're gonna flex our string parsing skills here. + +just get this string since it seems to be constant enough: +"Used Assets, sorted by uncompressed size:" + +then starting from that line going upwards, get the line that begins with "Textures" + +we're relying on the assumption that this format won't get changed + +in short, this is all complete hackery that won't be futureproof + +hopefully UT would provide proper script access to this + +*/ + +namespace BuildReportTool +{ + public struct ExtraData + { + public string SavedPath; + public string Contents; + } + + [System.Serializable] +#if UNITY_2018_1_OR_NEWER + public partial class ReportGenerator : UnityEditor.Build.IPreprocessBuildWithReport, UnityEditor.Build.IPostprocessBuildWithReport +#elif UNITY_5_6_OR_NEWER + public partial class ReportGenerator : UnityEditor.Build.IPreprocessBuild, UnityEditor.Build.IPostprocessBuild +#else + public partial class ReportGenerator +#endif + { + public int callbackOrder { get { return 99999; } } + + static BuildReportTool.BuildInfo _lastKnownBuildInfo; + static BuildReportTool.AssetDependencies _lastKnownAssetDependencies; + static BuildReportTool.TextureData _lastKnownTextureData; + static BuildReportTool.MeshData _lastKnownMeshData; + static BuildReportTool.PrefabData _lastKnownPrefabData; + static BuildReportTool.UnityBuildReport _lastKnownUnityBuildReport; + + static Assembly[] _lastAssemblies; + + public static BuildReportTool.UnityBuildReport LastKnownUnityBuildReport { get { return _lastKnownUnityBuildReport; } } + + static bool _shouldCalculateBuildSize = true; + + static string _lastEditorLogPath = ""; + + static string _lastPathToBuiltProject = string.Empty; + + /// + /// Used to collect all prefabs used in scenes that are included in build. + /// + /// We need to manually track prefabs (and 3d model files, which are + /// considered implicit prefabs) used in scenes, because if they are marked + /// as Static in the scenes they're used in, they will not end up being + /// reported as included in the build. + /// + /// That's because static meshes are merged into one big mesh. + /// That one big mesh is considered a new asset, and has no + /// connection to the prefabs/3d model files that its parts originally came from. + /// + static readonly HashSet PrefabsUsedInScenes = new HashSet(); + + /// + /// converted into a list, for quick iteration. + /// + /// + static readonly List PrefabsUsedInScenesList = new List(); + + + static string _lastSavePath = ""; + + public const string TIME_OF_BUILD_FORMAT = "yyyy MMM dd ddd h:mm:ss tt UTCz"; + + static bool _gotCommandLineArguments; + static bool _unityHasNoLogArgument; + + + static BuildInfo CreateNewBuildInfo() + { + return new BuildInfo(); + //return ScriptableObject.CreateInstance(); + } + + /// + /// Called to get project's values from the Unity Editor API after the project is built. + /// Has to be called from the main thread. + /// + static void Init() + { + Init(true, ref _lastKnownBuildInfo, null); + } + + /// + /// Get and store data that are only allowed to be accessed + /// from the main thread here so it won't generate errors + /// when we access them from threads. + /// + /// Which means this function has to be called from the main + /// thread. + /// True: this method is called after a build is made. + /// False: this method is called after user pressed the "Get Log" button. + /// The BuildInfo to save the values to. + /// You can specify a custom list of scenes, + /// if project was built with a custom build script. + /// Otherwise, leave null so that it will just use + /// UnityEditor.EditorBuildSettings.scenes instead. + static void Init(bool fromBuild, ref BuildInfo buildInfo, string[] scenes) + { + // -------------------- + + if (buildInfo == null) + { + buildInfo = CreateNewBuildInfo(); + } + + // -------------------- + + //Debug.LogFormat("BuildReportTool.ReportGenerator.Init() called"); + + buildInfo.SetBuildTargetUsed(BuildReportTool.Util.BuildTargetOfLastBuild); + + // -------------------- + + if (scenes != null) + { + buildInfo.SetScenes(scenes); + } + else + { + buildInfo.SetScenes(BuildReportTool.Util.GetAllScenesInBuild()); + } + + //for (int n = 0, len = buildInfo.ScenesIncludedInProject.Length; n < len; ++n) + //{ + // Debug.Log("scene " + n + ": " + buildInfo.ScenesIncludedInProject[n]); + //} + + // -------------------- + + if (!string.IsNullOrEmpty(_lastPathToBuiltProject)) + { + buildInfo.BuildFilePath = _lastPathToBuiltProject; + } + else + { + buildInfo.BuildFilePath = + EditorUserBuildSettings.GetBuildLocation(BuildReportTool.Util.BuildTargetOfLastBuild); + } + //Debug.Log("BuildTargetOfLastBuild: " + BuildReportTool.Util.BuildTargetOfLastBuild); + + // -------------------- + + buildInfo.EditorAppContentsPath = EditorApplication.applicationContentsPath; + buildInfo.ProjectAssetsPath = Application.dataPath; + + // -------------------- + + buildInfo.UnityVersion = string.Format("Unity {0}", Application.unityVersion); + + buildInfo.IncludedSvnInUnused = BuildReportTool.Options.IncludeSvnInUnused; + buildInfo.IncludedGitInUnused = BuildReportTool.Options.IncludeGitInUnused; + buildInfo.IncludedBuildReportToolAssetsInUnused = BuildReportTool.Options.IncludeBuildReportToolAssetsInUnused; + + var ignorePatternCopy = new List(BuildReportTool.Options.IgnorePatternsForUnused.Count); + for (int n = 0, len = BuildReportTool.Options.IgnorePatternsForUnused.Count; n < len; ++n) + { + ignorePatternCopy.Add(BuildReportTool.Options.IgnorePatternsForUnused[n]); + } + buildInfo.IgnorePatternsForUnused = ignorePatternCopy; + + buildInfo.ProcessUnusedAssetsInBatches = BuildReportTool.Options.ProcessUnusedAssetsInBatches; + buildInfo.UnusedAssetsEntriesPerBatch = BuildReportTool.Options.UnusedAssetsEntriesPerBatch; + + // -------------------- + +#if UNITY_2023_1_OR_NEWER + BuildTarget buildTarget = EditorUserBuildSettings.activeBuildTarget; + BuildTargetGroup targetGroup = BuildPipeline.GetBuildTargetGroup(buildTarget); + var namedBuildTarget = UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup(targetGroup); + + buildInfo.MonoLevel = + PlayerSettings.GetApiCompatibilityLevel(namedBuildTarget); +#elif UNITY_5_6_OR_NEWER + buildInfo.MonoLevel = + PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.selectedBuildTargetGroup); +#else + buildInfo.MonoLevel = PlayerSettings.apiCompatibilityLevel; +#endif + +#if !UNITY_2018_3_OR_NEWER + buildInfo.CodeStrippingLevel = PlayerSettings.strippingLevel; +#endif + + // -------------------- + + if (BuildReportTool.Options.GetProjectSettings) + { + buildInfo.HasUnityBuildSettings = true; + buildInfo.UnityBuildSettings = new UnityBuildSettings(); + UnityBuildSettingsUtility.Populate(buildInfo.UnityBuildSettings); + } + else + { + buildInfo.HasUnityBuildSettings = false; + buildInfo.UnityBuildSettings = null; + } + + // -------------------- + +#if UNITY_2023_1_OR_NEWER + buildInfo.AndroidUseAPKExpansionFiles = PlayerSettings.Android.splitApplicationBinary; +#else + buildInfo.AndroidUseAPKExpansionFiles = PlayerSettings.Android.useAPKExpansionFiles; +#endif + + buildInfo.AndroidCreateProject = buildInfo.BuildTargetUsed == BuildTarget.Android && + !Util.IsFileOfType(buildInfo.BuildFilePath, ".apk"); + + //Debug.Log("buildInfo.AndroidCreateProject: " + buildInfo.AndroidCreateProject); + //Debug.Log("PlayerSettings.Android.useAPKExpansionFiles: " + PlayerSettings.Android.useAPKExpansionFiles); + //Debug.Log("BuildOptions.AcceptExternalModificationsToPlayer: " + BuildOptions.AcceptExternalModificationsToPlayer); + + // -------------------- + + buildInfo.UsedAssetsIncludedInCreation = BuildReportTool.Options.IncludeUsedAssetsInReportCreation; + buildInfo.UnusedAssetsIncludedInCreation = BuildReportTool.Options.IncludeUnusedAssetsInReportCreation; + buildInfo.UnusedPrefabsIncludedInCreation = BuildReportTool.Options.IncludeUnusedPrefabsInReportCreation; + + // -------------------- + + _shouldCalculateBuildSize = BuildReportTool.Options.IncludeBuildSizeInReportCreation; + + // -------------------- + + // clear old values if any + buildInfo.ProjectName = null; + buildInfo.UsedAssets = null; + buildInfo.UnusedAssets = null; + + // -------------------- + + bool gotExtraBuildData = false; + + string regularEditorLogPath = BuildReportTool.Util.UsedEditorLogPath; + if (!DoesEditorLogHaveBuildInfo(regularEditorLogPath)) + { + string lastSuccessfulBuildEditorLog = + BuildReportTool.Util.LastSuccessfulBuildFilePath(Application.dataPath); + if (DoesEditorLogHaveBuildInfo(lastSuccessfulBuildEditorLog)) + { + bool playerDataNotRebuilt = DoesEditorLogHaveNoBuildInfoDueToNoPlayerRebuilt(regularEditorLogPath); + + _lastEditorLogPath = lastSuccessfulBuildEditorLog; + if (playerDataNotRebuilt) + { + Debug.LogWarning($"No new build was created since no changes were detected. Do a clean build to force creation of a new build.\nReusing last successful build's Editor.log file from: {lastSuccessfulBuildEditorLog}"); + } + else + { + Debug.LogWarning($"No build data found in {regularEditorLogPath}\nReusing last successful build's Editor.log file from: {lastSuccessfulBuildEditorLog}"); + } + + BuildReportTool.Util.LastBuildExtraData extraData = + BuildReportTool.Util.OpenSerialized( + BuildReportTool.Util.LastSuccessfulBuildExtraDataFilePath(Application.dataPath)); + if (extraData != null && !playerDataNotRebuilt) + { + buildInfo.BuildDurationTime = extraData.GetBuildDuration(); + + buildInfo.BuildTimeGot = extraData.GetBuildTimeStarted(); + buildInfo.BuildTimeGotReadable = buildInfo.BuildTimeGot.ToString(TIME_OF_BUILD_FORMAT); + gotExtraBuildData = true; + } + } + } + else + { + _lastEditorLogPath = regularEditorLogPath; + } + + if (!gotExtraBuildData) + { + if (fromBuild && BuildReportTool.Util.HasBuildTime()) + { + var timeBuildStarted = BuildReportTool.Util.LoadBuildTime(); + buildInfo.BuildDurationTime = BuildReportTool.Util.LoadBuildTimeDuration(); + + buildInfo.BuildTimeGot = timeBuildStarted; + buildInfo.BuildTimeGotReadable = timeBuildStarted.ToString(TIME_OF_BUILD_FORMAT); + } + else + { + buildInfo.BuildDurationTime = new TimeSpan(0); + buildInfo.BuildTimeGot = new DateTime(); + buildInfo.BuildTimeGotReadable = string.Empty; + } + } + + _lastSavePath = BuildReportTool.Options.BuildReportSavePath; + _lastAssemblies = CompilationPipeline.GetAssemblies(); + } + +#if UNITY_2018_1_OR_NEWER + public void OnPreprocessBuild(UnityEditor.Build.Reporting.BuildReport report) +#else + public void OnPreprocessBuild(BuildTarget target, string pathToBuiltProject) +#endif + { + if (!BuildReportTool.Options.CollectBuildInfo) + { + return; + } + + OnPreBuild(); + } + +#if UNITY_2018_1_OR_NEWER + public void OnPostprocessBuild(UnityEditor.Build.Reporting.BuildReport report) +#elif UNITY_5_6_OR_NEWER + public void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) +#else + [UnityEditor.Callbacks.PostProcessBuildAttribute(1)] + public static void OnPostprocessBuild(BuildTarget target, string pathToBuiltProject) +#endif + { + if (!Application.isEditor || Application.isPlaying) + { + return; + } + + //Debug.Log("post process build called in editor. pathToBuiltProject: " + pathToBuiltProject); + +#if UNITY_2018_1_OR_NEWER + if (!string.IsNullOrEmpty(report.summary.outputPath)) + { + _lastPathToBuiltProject = report.summary.outputPath; + } +#else + if (!string.IsNullOrEmpty(pathToBuiltProject)) + { + _lastPathToBuiltProject = pathToBuiltProject; + } +#endif + + BuildReportTool.Util.BuildTargetOfLastBuild = EditorUserBuildSettings.activeBuildTarget; + //Debug.Log("OnPostprocessBuild: got new BuildTargetOfLastBuild: " + BuildReportTool.Util.BuildTargetOfLastBuild); + + if (!BuildReportTool.Options.CollectBuildInfo) + { + return; + } + + // Note: useless to call Init() and CommitAdditionalInfoToCache() here since an assembly reload will happen + + // Record the time it took to get from OnPreprocessBuild to now (OnPostprocessBuild) + // (this value is saved in an xml file, so it will survive the assembly reload). + // Note: There's a report.summary.totalTime, but oftentimes it has a value of 00:00:00 + // because report.summary.buildStartedAt and report.summary.buildEndedAt have the same value, + // so we rely on our own time recording instead. There's still the option to use the BuildSummary + // using the BRT_USE_BUILD_SUMMARY_TIME scripting define. +#if UNITY_2018_1_OR_NEWER +#if BRT_USE_BUILD_SUMMARY_TIME + BuildReportTool.Util.SaveBuildTime(report.summary.buildStartedAt); + BuildReportTool.Util.SaveBuildTimeDuration(report.summary.totalTime); +#else + BuildReportTool.Util.SaveBuildTimeDuration(); +#endif + + //BuildReportTool.Util.DebugLogBuildReport(report); + + // Since there will be an assembly reload, we can't just store `report` into a variable + // and expect to be able to access it using that variable later. + // We have to save the data to a file then read that file later. + BuildReportTool.Util.SaveUnityBuildReportToCurrent(report); +#else + BuildReportTool.Util.SaveBuildTimeDuration(); +#endif + + // Later on, in BRT_BuildReportWindow.Update(), + // when `BuildReportTool.ReportGenerator.IsFinishedGettingValuesFromThread` is true, + // the code will finally save the created build report + // (this value is saved in an xml file, so it will survive the assembly reload). + BuildReportTool.Util.SaveGetBuildReportNow(); + + if (BRT_BuildReportWindow.IsOpen || BuildReportTool.Options.ShouldShowWindowAfterBuild) + { + ShowBuildReportWithLastValues(); + } + + //Debug.Log("post process build finished"); + } + + static void AddAllPrefabsUsedInScene(string sceneFilename) + { +#if UNITY_5_3_OR_NEWER + string[] assetsUsedInScene = AssetDatabase.GetDependencies(sceneFilename); +#else + string[] assetsUsedInScene = AssetDatabase.GetDependencies(new []{sceneFilename}); +#endif + + //Debug.Log(string.Format("AddAllPrefabsUsedInScene() {0}: {1}", sceneFilename, assetsUsedInScene.Length.ToString())); + + for (int n = 0, len = assetsUsedInScene.Length; n < len; ++n) + { + var assetInScene = assetsUsedInScene[n]; + //Debug.Log($" {n.ToString()}: {assetInScene}"); + + // check for prefab and all known 3d model file types that Unity supports + if (assetInScene.EndsWith(".prefab", StringComparison.OrdinalIgnoreCase) || + assetInScene.EndsWith(".fbx", StringComparison.OrdinalIgnoreCase) || + assetInScene.EndsWith(".dae", StringComparison.OrdinalIgnoreCase) || + assetInScene.EndsWith(".mb", StringComparison.OrdinalIgnoreCase) || + assetInScene.EndsWith(".ma", StringComparison.OrdinalIgnoreCase) || + assetInScene.EndsWith(".max", StringComparison.OrdinalIgnoreCase) || + assetInScene.EndsWith(".blend", StringComparison.OrdinalIgnoreCase) || + assetInScene.EndsWith(".obj", StringComparison.OrdinalIgnoreCase) || + assetInScene.EndsWith(".3ds", StringComparison.OrdinalIgnoreCase) || + assetInScene.EndsWith(".dxf", StringComparison.OrdinalIgnoreCase)) + { + if (!PrefabsUsedInScenes.Contains(assetInScene)) + { + //Debug.Log($" added prefab used: {assetInScene} from scene {sceneFilename}"); + PrefabsUsedInScenes.Add(assetInScene); + } + } + } + } + + static void ClearListOfAllPrefabsUsedInAllScenes() + { + PrefabsUsedInScenes.Clear(); + } + + static void RefreshListOfAllPrefabsUsedInAllScenesIncludedInBuild() + { + ClearListOfAllPrefabsUsedInAllScenes(); + + foreach (EditorBuildSettingsScene scene in EditorBuildSettings.scenes) + { + //Debug.Log(S.path); + if (scene != null && !string.IsNullOrEmpty(scene.path) && scene.enabled) // is checkbox for this scene in build settings checked? + { + AddAllPrefabsUsedInScene(scene.path); + } + } + } + + static void CommitAdditionalInfoToCache() + { + if (PrefabsUsedInScenes != null) + { + //Debug.Log("addInfo: " + (addInfo != null)); + + //buildInfo.PrefabsUsedInScenes = new string[_prefabsUsedInScenes.Keys.Count]; + //_prefabsUsedInScenes.Keys.CopyTo(buildInfo.PrefabsUsedInScenes, 0); + + PrefabsUsedInScenesList.Clear(); + PrefabsUsedInScenesList.AddRange(PrefabsUsedInScenes); + + //Debug.Log("assigned to addInfo.PrefabsUsedInScenes: " + addInfo.PrefabsUsedInScenes.Length); + } + } + + // ------------------------------------------------------------------------------------------------- + + + public static string GetBuildTypeFromEditorLog(string editorLogPath) + { + if (!File.Exists(editorLogPath)) + { + return null; + } + + const string BUILD_TYPE_KEY = "*** Completed 'Build."; + const string CANCELED_BUILD_TYPE_KEY = "*** Canceled 'Build."; + + string returnValue = GetBuildTypeFromEditorLog(editorLogPath, BUILD_TYPE_KEY); + if (string.IsNullOrEmpty(returnValue)) + { + returnValue = GetBuildTypeFromEditorLog(editorLogPath, CANCELED_BUILD_TYPE_KEY); + } + + return returnValue; + } + + static string GetBuildTypeFromEditorLog(string editorLogPath, string buildTypeKey) + { + if (!File.Exists(editorLogPath)) + { + return null; + } + + //Debug.Log("GetBuildTypeFromEditorLog path: " + editorLogPath); + var gotLines = DldUtil.BigFileReader.SeekAllText(editorLogPath, buildTypeKey); + + if (gotLines.Count == 0) + { + //Debug.LogFormat("no buildType got"); + return string.Empty; + } + + var lastLine = gotLines[gotLines.Count - 1].Text; + + if (!string.IsNullOrEmpty(lastLine)) + { + //Debug.LogFormat("GetBuildTypeFromEditorLog line: {0} for key: {1}", line, buildTypeKey); + + int buildTypeIdx = lastLine.LastIndexOf(buildTypeKey, StringComparison.Ordinal); + //Debug.Log("buildTypeIdx: " + buildTypeIdx); + + if (buildTypeIdx == -1) + { + return string.Empty; + } + + int buildTypeEndIdx = lastLine.IndexOf("' in ", buildTypeIdx, StringComparison.Ordinal); + //Debug.Log("buildTypeEndIdx: " + buildTypeEndIdx); + + string buildType = lastLine.Substring(buildTypeIdx + buildTypeKey.Length, + buildTypeEndIdx - buildTypeIdx - buildTypeKey.Length); + + int anotherDotIdx = buildType.IndexOf(".", StringComparison.Ordinal); + if (anotherDotIdx > -1) + { + buildType = buildType.Substring(anotherDotIdx + 1, buildType.Length - anotherDotIdx - 1); + } + + //Debug.LogFormat("buildType got: {0}", buildType); + return buildType; + } + //else + //{ + // Debug.LogFormat("no buildType got"); + //} + + return string.Empty; + } + + static bool HasInvalidPercentValue(string line) + { + return line.IndexOf("inf%", StringComparison.Ordinal) >= 0 || + line.IndexOf("nan%", StringComparison.Ordinal) >= 0 || + line.IndexOf("-1.$%", StringComparison.Ordinal) >= 0 || + line.IndexOf("1.$%", StringComparison.Ordinal) >= 0; + } + + const string DATE_TIME_PREFIX = + @"\d{4}-(0[1-9]|1[012])-([012]\d|3[01])T([01]\d|2[0-3]):([0-5]\d):([0-5]\d)\.\d{3}Z\|0x[\da-f]{4}\|"; + + static BuildReportTool.SizePart[] ParseSizePartsFromString(string editorLogPath) + { + // now parse the build parts to an array of `BuildReportTool.SizePart` + List buildSizes = new List(); + + + const string SIZE_PARTS_KEY = "Textures "; + + bool gotDateTimePrefix = false; + int dateTimePrefixLen = 0; + + foreach (string line in DldUtil.BigFileReader.ReadFile(editorLogPath, false, SIZE_PARTS_KEY)) + { + // blank line signifies end of list + if (string.IsNullOrEmpty(line) || line == "\n" || line == "\r\n") + { + break; + } + //Debug.LogFormat("ParseSizePartsFromString: line:\n{0}", line); + + string b = line; + + string gotName = "???"; + string gotSize = "?"; + string gotPercent; + + if (!gotDateTimePrefix) + { + Match dateTime = Regex.Match(b, DATE_TIME_PREFIX, RegexOptions.IgnoreCase); + if (dateTime.Success) + { + dateTimePrefixLen = dateTime.Groups[0].Value.Length; + gotDateTimePrefix = true; + b = b.Substring(dateTimePrefixLen); + } + } + else + { + b = b.Substring(dateTimePrefixLen); + } + + Match match = Regex.Match(b, @"[a-z \t]+[^0-9]", RegexOptions.IgnoreCase); + if (match.Success) + { + gotName = match.Groups[0].Value; + gotName = gotName.Trim(); + + if (gotName == "Included DLLs") + { + gotName = "System DLLs"; + } + + if (gotName == "Total User Assets") + { + // No need for this, we calculate our own total size. + // The "Total User Assets" entry also signifies the + // last part has been parsed already, so no need + // to process further. + break; + } + + //Debug.LogFormat(" got name: {0}", gotName); + } + + match = Regex.Match(b, @"[0-9.]+ (kb|mb|b|gb)", RegexOptions.IgnoreCase); + if (match.Success) + { + gotSize = match.Groups[0].Value.ToUpper(); + //Debug.LogFormat(" got size: {0}", gotSize); + } + + if (HasInvalidPercentValue(b)) + { + gotPercent = "0"; + //Debug.LogFormat(" got percent (inf): {0}", gotPercent); + } + else + { + match = Regex.Match(b, @"[0-9.]+%", RegexOptions.IgnoreCase); + if (match.Success) + { + gotPercent = match.Groups[0].Value; + gotPercent = gotPercent.Substring(0, gotPercent.Length - 1); + //Debug.LogFormat(" got percent: {0}", gotPercent); + } + else + { + gotPercent = "0"; + } + } + + BuildReportTool.SizePart inPart = new BuildReportTool.SizePart(); + inPart.Name = gotName; + inPart.Size = gotSize; + inPart.Percentage = Double.Parse(gotPercent, CultureInfo.InvariantCulture); + inPart.DerivedSize = BuildReportTool.Util.GetApproxSizeFromString(gotSize); + + //Debug.LogFormat("SizePart: {0} size: {1} percent: {2}", inPart.Name, inPart.Size, inPart.Percentage); + + buildSizes.Add(inPart); + + if (line.IndexOf("100.0%", StringComparison.Ordinal) != -1 || + line.IndexOf("nan%", StringComparison.Ordinal) != -1 || + gotName.IndexOf("Complete size", StringComparison.Ordinal) != -1 || + gotName.IndexOf("Complete build size", StringComparison.Ordinal) != -1) + { + // that was the final part of the list + break; + } + } + + BuildReportTool.SizePart streamingAssetsSize = new BuildReportTool.SizePart(); + streamingAssetsSize.SetNameToStreamingAssets(); + streamingAssetsSize.Size = "0"; + streamingAssetsSize.SizeBytes = 0; + streamingAssetsSize.Percentage = 0; + + buildSizes.Add(streamingAssetsSize); + + return buildSizes.ToArray(); + } + + const string ASSET_SIZES_KEY = "Used Assets, sorted by uncompressed size:"; + const string ASSET_SIZES_KEY_2 = "Used Assets and files from the Resources folder, sorted by uncompressed size:"; + + static List ParseAssetSizesFromEditorLog(string editorLogPath, + List prefabsUsedInScenes) + { + List assetSizes = new List(); + HashSet prefabsInBuildDict = new HashSet(); + + + // note: list gotten from editor log is already sorted by raw size, descending + + foreach (string line in DldUtil.BigFileReader.ReadFile(editorLogPath, ASSET_SIZES_KEY, ASSET_SIZES_KEY_2)) + { + if (string.IsNullOrEmpty(line) || line == "\n" || line == "\r\n") + { + break; + } + + var input = line.Replace("\\", "/"); + + //Debug.LogFormat("from line: {0}", line); + + Match match = Regex.Match(input, @"^.* [0-9]+\.[0-9]+ (kb|mb|b|gb|tb)\s+[0-9.]+%\s+.+", RegexOptions.IgnoreCase); + if (match.Success) + { + // it's an asset entry. parse it + //string b = match.Groups[0].Value; + + string gotName = "???"; + string gotSize = "?"; + string gotPercent = "?"; + + match = Regex.Match(input, @"Assets/.+", RegexOptions.IgnoreCase); + if (match.Success) + { + gotName = match.Groups[0].Value; + gotName = gotName.Trim(); + //Debug.Log(" name? " + gotName); + } + else + { + match = Regex.Match(input, @"Built-in.+:.+", RegexOptions.IgnoreCase); + if (match.Success) + { + gotName = match.Groups[0].Value; + gotName = gotName.Trim(); + //Debug.Log(" built-in?: " + gotName); + } + else + { + match = Regex.Match(input, @"Resources/.+", RegexOptions.IgnoreCase); + if (match.Success) + { + gotName = match.Groups[0].Value; + gotName = gotName.Trim(); + //Debug.Log(" built-in?: " + gotName); + } + else + { + match = Regex.Match(input, @"UnityExtensions/.+", RegexOptions.IgnoreCase); + if (match.Success) + { + gotName = match.Groups[0].Value; + gotName = gotName.Trim(); + //Debug.Log(" extension?: " + gotName); + } + else + { + match = Regex.Match(input, @"Packages/.+", RegexOptions.IgnoreCase); + if (match.Success) + { + gotName = match.Groups[0].Value; + gotName = gotName.Trim(); + //Debug.Log(" extension?: " + gotName); + } + } + } + } + } + + match = Regex.Match(input, @"[0-9.]+ (kb|mb|b|gb|tb)", RegexOptions.IgnoreCase); + if (match.Success) + { + gotSize = match.Groups[0].Value.ToUpper(); + //Debug.Log(" size? " + gotSize); + } + else + { + Debug.Log("didn't find size for :" + input); + } + + if (HasInvalidPercentValue(input)) + { + gotPercent = "0"; + } + else + { + match = Regex.Match(input, @"[0-9.]+%", RegexOptions.IgnoreCase); + if (match.Success) + { + gotPercent = match.Groups[0].Value; + gotPercent = gotPercent.Substring(0, gotPercent.Length - 1); + //Debug.Log(" percent? " + gotPercent); + } + else + { + Debug.Log("didn't find percent for :" + input); + } + } + //Debug.LogFormat("got: {0} size: {1} percent: {2}", gotName, gotSize, gotPercent); + + // UnityEngine dll files show up in the used assets list so don't add them in + // (those will be in a separate list) + var filename = gotName.GetFileNameOnly(); + if (filename.IsFileOfType(".dll") && BuildReportTool.Util.IsAUnityEngineDLL(filename)) + { + //Debug.Log("Found UnityEngine dll in Used Assets: " + filename); + } + else + { + BuildReportTool.SizePart inPart = new BuildReportTool.SizePart(); + inPart.Name = System.Security.SecurityElement.Escape(gotName); + inPart.Size = gotSize; + inPart.SizeBytes = -1; + inPart.DerivedSize = BuildReportTool.Util.GetApproxSizeFromString(gotSize); + inPart.Percentage = Double.Parse(gotPercent, CultureInfo.InvariantCulture); + + + // since this is a used asset, the size we got from the editor log *is* already the imported size + // so don't bother computing imported size. + long importedSizeBytes = -1; + inPart.ImportedSizeBytes = importedSizeBytes; + inPart.ImportedSize = BuildReportTool.Util.GetBytesReadable(importedSizeBytes); + + assetSizes.Add(inPart); + + //if (inPart.Name.IndexOf("Rocks_lighup.tif") > -1) + //{ + // Debug.LogFormat("Rocks_lighup.tif: got Size: {0} Imported Size: {1}", inPart.Size, inPart.ImportedSize); + //} + + if (gotName.EndsWith(".prefab", StringComparison.OrdinalIgnoreCase) || + gotName.EndsWith(".fbx", StringComparison.OrdinalIgnoreCase) || + gotName.EndsWith(".dae", StringComparison.OrdinalIgnoreCase) || + gotName.EndsWith(".mb", StringComparison.OrdinalIgnoreCase) || + gotName.EndsWith(".ma", StringComparison.OrdinalIgnoreCase) || + gotName.EndsWith(".max", StringComparison.OrdinalIgnoreCase) || + gotName.EndsWith(".blend", StringComparison.OrdinalIgnoreCase) || + gotName.EndsWith(".obj", StringComparison.OrdinalIgnoreCase) || + gotName.EndsWith(".3ds", StringComparison.OrdinalIgnoreCase) || + gotName.EndsWith(".dxf", StringComparison.OrdinalIgnoreCase)) + { + prefabsInBuildDict.Add(gotName); + } + } + } + else + { + break; + } + } + + // Additional Step: + // include prefabs that are instantiated in scenes (they are not by default) + //Debug.Log("addInfo.PrefabsUsedInScenes: " + addInfo.PrefabsUsedInScenes.Length); + foreach (string p in prefabsUsedInScenes) + { + if (p.IndexOf("/Resources/", StringComparison.Ordinal) != -1) + continue; // prefabs in resources folder are already included in the editor log build info + + if (prefabsInBuildDict.Contains(p)) continue; // if already in assetSizes, continue + + BuildReportTool.SizePart inPart = new BuildReportTool.SizePart(); + inPart.Name = p; + inPart.Size = "N/A"; + inPart.Percentage = -1; + + //Debug.Log(" prefab added in used assets: " + p); + + assetSizes.Add(inPart); + } + + return assetSizes; + } + + + public static BuildReportTool.SizePart[][] SegregateAssetSizesPerCategory( + BuildReportTool.SizePart[] assetSizesAll, FileFilterGroup filters) + { + if (assetSizesAll == null || assetSizesAll.Length == 0) return null; + + // we do filters.Count+1 for Unrecognized category + List> ret = new List>(filters.Count + 1); + for (int n = 0, len = filters.Count + 1; n < len; ++n) + { + ret.Add(new List()); + } + + for (int idxAll = 0, lenAll = assetSizesAll.Length; idxAll < lenAll; ++idxAll) + { + BRT_BuildReportWindow.GetValueMessage = + string.Format("Segregating assets {0} of {1}...", (idxAll + 1).ToString(), assetSizesAll.Length.ToString()); + + var foundAtLeastOneMatch = false; + for (int n = 0, len = filters.Count; n < len; ++n) + { + if (filters[n].IsFileInFilter(assetSizesAll[idxAll].Name)) + { + foundAtLeastOneMatch = true; + ret[n].Add(assetSizesAll[idxAll]); + } + } + + if (!foundAtLeastOneMatch) + { + ret[ret.Count - 1].Add(assetSizesAll[idxAll]); + } + } + + BRT_BuildReportWindow.GetValueMessage = ""; + + BuildReportTool.SizePart[][] retArr = new BuildReportTool.SizePart[filters.Count + 1][]; + for (int n = 0, len = filters.Count + 1; n < len; ++n) + { + retArr[n] = ret[n].ToArray(); + } + + return retArr; + } + + + public static void MoveUnusedAssetsBatchToNext(BuildInfo buildInfo, FileFilterGroup filtersToUse) + { + buildInfo.MoveUnusedAssetsBatchNumToNext(); + RefreshUnusedAssetsBatch(buildInfo, filtersToUse); + } + + public static void MoveUnusedAssetsBatchToPrev(BuildInfo buildInfo, FileFilterGroup filtersToUse) + { + if (buildInfo.UnusedAssetsBatchIdx == 0) + { + return; + } + + buildInfo.MoveUnusedAssetsBatchNumToPrev(); + RefreshUnusedAssetsBatch(buildInfo, filtersToUse); + } + + static void RefreshUnusedAssetsBatch(BuildInfo buildInfo, FileFilterGroup filtersToUse) + { + if (buildInfo.UnusedAssetsIncludedInCreation) + { + BRT_BuildReportWindow.GetValueMessage = "Getting list of unused assets..."; + + List allUsed = buildInfo.UsedAssets.GetAllAsList(); + + BuildReportTool.SizePart[] allUnused; + BuildReportTool.SizePart[][] perCategoryUnused; + + BuildPlatform buildPlatform = GetBuildPlatformFromString(buildInfo.BuildType, buildInfo.BuildTargetUsed); + + + allUnused = GetAllUnusedAssets(buildInfo, buildInfo.ProjectAssetsPath, buildPlatform, allUsed); + + if (allUnused != null && allUnused.Length > 0) + { + perCategoryUnused = SegregateAssetSizesPerCategory(allUnused, filtersToUse); + + AssetList.SortType previousUnusedSortType = buildInfo.UnusedAssets.LastSortType; + AssetList.SortOrder previousUnusedSortOrder = buildInfo.UnusedAssets.LastSortOrder; + + buildInfo.UnusedAssets = new AssetList(); + buildInfo.UnusedAssets.Init(allUnused, perCategoryUnused, + BuildReportTool.Options.NumberOfTopLargestUnusedAssetsToShow, filtersToUse, + previousUnusedSortType, previousUnusedSortOrder); + buildInfo.UnusedAssets.PopulateImportedSizes(); + + if (allUsed.Count != buildInfo.UsedAssets.AllCount) + { + // it means GetAllUnusedAssets() found new used assets + // (something from the StreamingAssets or Resources folder, a dll, etc.) + // re-assign it to the all used list in the build report, and re-sort + BuildReportTool.SizePart[] newAllUsedArray = allUsed.ToArray(); + + BuildReportTool.SizePart[][] newPerCategoryUsed = + SegregateAssetSizesPerCategory(newAllUsedArray, filtersToUse); + + + AssetList.SortType previousUsedSortType = buildInfo.UsedAssets.LastSortType; + AssetList.SortOrder previousUsedSortOrder = buildInfo.UsedAssets.LastSortOrder; + + buildInfo.UsedAssets = new AssetList(); + buildInfo.UsedAssets.Init(newAllUsedArray, newPerCategoryUsed, + BuildReportTool.Options.NumberOfTopLargestUsedAssetsToShow, filtersToUse, + previousUsedSortType, previousUsedSortOrder); + buildInfo.UsedAssets.PopulateImportedSizes(); + } + } + else + { + // no assets found. this only happens when we tried to move to next batch but it turns out to be the last + // so we move back + buildInfo.MoveUnusedAssetsBatchNumToPrev(); + } + + + BRT_BuildReportWindow.GetValueMessage = ""; + + buildInfo.FlagOkToRefresh(); + } + } + + static BuildReportTool.SizePart[] GetAllUnusedAssets( + BuildReportTool.BuildInfo buildInfo, + string projectAssetsPath, + BuildPlatform buildPlatform, + List inOutAllUsedAssets) + { + BuildReportTool.SizePart[] scriptDLLs = buildInfo.ScriptDLLs; + bool includeSvn = buildInfo.IncludedSvnInUnused; + bool includeGit = buildInfo.IncludedGitInUnused; + bool includeBrt = buildInfo.IncludedBuildReportToolAssetsInUnused; + List ignorePatterns = buildInfo.IgnorePatternsForUnused; + bool includeUnusedPrefabs = buildInfo.UnusedPrefabsIncludedInCreation; + bool processInBatches = buildInfo.ProcessUnusedAssetsInBatches; + int fileCountLimit = buildInfo.UnusedAssetsEntriesPerBatch; + + List unusedAssets = new List(); + + + // now loop through all assets in the whole project, + // check if that file exists in the usedAssetsDict, + // if not, include it in the unusedAssets list, + // then sort by size + + int projectStringLen = projectAssetsPath.Length - "Assets".Length; + + bool has32BitPluginsFolder = Directory.Exists(projectAssetsPath + "/Plugins/x86"); + bool has64BitPluginsFolder = Directory.Exists(projectAssetsPath + "/Plugins/x86_64"); + + string currentAsset; + bool prevSkipped = false; + + int assetNum = 0; + + int fileCountOffset; + if (buildInfo.UnusedAssetsBatchIdx > 0 && + buildInfo.UnusedAssetsBatchIdx <= buildInfo.UnusedAssetsBatchFinalNum.Count) + { + // use the asset num of the previous batch + fileCountOffset = buildInfo.UnusedAssetsBatchFinalNum[buildInfo.UnusedAssetsBatchIdx-1]; + } + else + { + // just guess based on the batch count + fileCountOffset = buildInfo.UnusedAssetsBatchIdx * fileCountLimit; + } + + foreach (string fullAssetPath in DldUtil.TraverseDirectory.Do(projectAssetsPath)) + { + ++assetNum; + + if (processInBatches && assetNum <= fileCountOffset) + { + prevSkipped = true; + continue; + } + + if (prevSkipped) + { + prevSkipped = false; + } + + BRT_BuildReportWindow.GetValueMessage = + string.Format("Getting list of used assets {0} ...", assetNum.ToString()); + + //string fullAssetPath = allAssets[assetIdx]; + + // get the path but starting from the "Assets/" folder + currentAsset = fullAssetPath.Substring(projectStringLen, fullAssetPath.Length - projectStringLen).Replace("\\", "/"); + + //Debug.Log(currentAsset); + + // -------------------------- + // Unity .meta files are not considered part of the assets + // Unity .mask (Avatar masks): whether a .mask file is used or not currently cannot be reliably found out, so they are skipped + if (Util.IsFileOfType(currentAsset, ".meta") || + Util.IsFileOfType(currentAsset, ".mask")) + { + continue; + } + + // -------------------------- + // anything in a /Resources/ folder will always be in the build, as long as it's not in an Editor folder + if (Util.IsFileInAPath(currentAsset, "/Resources/") && !Util.IsFileInAnEditorFolder(currentAsset)) + { + // ensure this Resources asset is in the used assets list + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add(BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + continue; + } + + // -------------------------- + // Include version control files only if requested to do so + if (!includeSvn && Util.IsFileInAPath(currentAsset, "/.svn/")) + { + continue; + } + + if (!includeGit && Util.IsFileInAPath(currentAsset, "/.git/")) + { + continue; + } + + if (!includeBrt && Util.IsFileInAPath(currentAsset, "/BuildReport/")) + { + continue; + } + + if (ignorePatterns != null && ignorePatterns.Count > 0) + { + bool currentAssetMatchedIgnore = false; + for (int p = 0, pLen = ignorePatterns.Count; p < pLen; ++p) + { + if (string.IsNullOrEmpty(ignorePatterns[p].Pattern)) + { + continue; + } + + bool match; + switch (ignorePatterns[p].SearchType) + { + case SavedOptions.SEARCH_METHOD_REGEX: + try + { + match = System.Text.RegularExpressions.Regex.IsMatch(currentAsset, ignorePatterns[p].Pattern, RegexOptions.CultureInvariant); + } + catch (ArgumentException) + { + match = false; + } + break; + default: + // default SearchType is Basic + match = System.Text.RegularExpressions.Regex.IsMatch(currentAsset, BuildReportTool.Util.WildCardToRegex(ignorePatterns[p].Pattern), RegexOptions.CultureInvariant); + break; + } + + if (match) + { + currentAssetMatchedIgnore = true; + break; + } + } + + if (currentAssetMatchedIgnore) + { + continue; + } + } + + // -------------------------- + // NOTE: if a .dll is present in the Script DLLs list, that means + // it is a managed DLL, and thus, is always used in the build + + if (Util.IsFileOfType(currentAsset, ".dll")) + { + string assetFilenameOnly = currentAsset.GetFileNameOnly(); + //Debug.Log(assetFilenameOnly); + + bool foundMatch = false; + + // is current asset found in the script/managed DLLs list? + for (int mdllIdx = 0; mdllIdx < scriptDLLs.Length; ++mdllIdx) + { + if (scriptDLLs[mdllIdx].Name == assetFilenameOnly) + { + // it's a managed DLL. Managed DLLs are always included in the build. + foundMatch = true; + var sizePartForThisScriptDLL = + BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath); + + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add(sizePartForThisScriptDLL); + } + + // update the file size in the build report with the values that we found + scriptDLLs[mdllIdx].Percentage = sizePartForThisScriptDLL.Percentage; + scriptDLLs[mdllIdx].RawSize = sizePartForThisScriptDLL.RawSize; + scriptDLLs[mdllIdx].RawSizeBytes = sizePartForThisScriptDLL.RawSizeBytes; + scriptDLLs[mdllIdx].DerivedSize = sizePartForThisScriptDLL.DerivedSize; + scriptDLLs[mdllIdx].ImportedSize = sizePartForThisScriptDLL.ImportedSize; + scriptDLLs[mdllIdx].ImportedSizeBytes = sizePartForThisScriptDLL.ImportedSizeBytes; + + break; + } + } + + if (foundMatch) + { + // this DLL file has been taken into account since it was detected to be a managed DLL + // so move on to the next file + continue; + } + } + + + // per platform special cases + // involving native plugins + + // in windows and linux, the issue gets dicey as we have to check if its a 32 bit, 64 bit, or universal build + + // so for windows/linux 32 bit, if Assets/Plugins/x86 exists, it will include all dll/so in those. if that folder does not exist, all dll/so in Assets/Plugins are included instead. + // + // what if there's a 64 bit dll/so in Assets/Plugins? surely it would not get included in a 32 bit build? + + // for windows/linux 64 bit, if Assets/Plugins/x86_64 exists, it will include all dll/so in those. if that folder does not exist, all dll/so in Assets/Plugins are included instead. + + // right now there is no such thing as a windows universal build + + // For linux universal build, any .so in Assets/Plugins/x86 and Assets/Plugins/x86_64 are included. No .so in Assets/Plugins will be included (as it wouldn't be able to determine if such an .so in that folder is 32 or 64 bit) i.e. it relies on the .so being in the x86 or x86_64 subfolder to determine which is the 32 bit and which is the 64 bit version + + + // NOTE: in Unity 3.x there is no Linux build target, but there is Windows 32/64 bit + +/* + from http://docs.unity3d.com/Documentation/Manual/PluginsForDesktop.html + + On Windows and Linux, plugins can be managed manually (e.g, before building a 64-bit player, you copy the 64-bit library into the Assets/Plugins folder, and before building a 32-bit player, you copy the 32-bit library into the Assets/Plugins folder) + + OR you can place the 32-bit version of the plugin in Assets/Plugins/x86 and the 64-bit version of the plugin in Assets/Plugins/x86_64. + + By default the editor will look in the architecture-specific sub-directory first, and if that directory does not exist, it will use plugins from the root Assets/Plugins folder instead. + + Note that for the Universal Linux build, you are required to use the architecture-specific sub-directories (when building a Universal Linux build, the Editor will not copy any plugins from the root Assets/Plugins folder). + + For Mac OS X, you should build your plugin as a universal binary that contains both 32-bit and 64-bit architectures. +*/ + + switch (buildPlatform) + { + case BuildPlatform.Android: + // .jar files inside /Assets/Plugins/Android/ are always included in the build if built for Android + if (Util.DoesFileStartIn(currentAsset, "Assets/Plugins/Android/") && + (Util.IsFileOfType(currentAsset, ".jar") || + Util.IsFileOfType(currentAsset, ".so"))) + { + //Debug.Log(".jar file in android " + currentAsset); + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add( + BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + continue; + } + + break; + + case BuildPlatform.iOS: + if (Util.IsFileOfType(currentAsset, ".a") || + Util.IsFileOfType(currentAsset, ".m") || + Util.IsFileOfType(currentAsset, ".mm") || + Util.IsFileOfType(currentAsset, ".c") || + Util.IsFileOfType(currentAsset, ".cpp")) + { + // any .a, .m, .mm, .c, or .cpp files inside Assets/Plugins/iOS are automatically symlinked/used + if (Util.DoesFileStartIn(currentAsset, "Assets/Plugins/iOS/")) + { + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add( + BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + } + + // if there are any .a, .m, .mm, .c, or .cpp files outside of Assets/Plugins/iOS + // we can't determine if they are really used or not because the user may manually copy them to the Xcode project, or a post-process .sh script may copy them to the Xcode project. + // so we don't put them in the unused assets list + continue; + } + + break; + + + case BuildPlatform.MacOSX32: + // when in mac build, .bundle files that are in Assets/Plugins are always included + // supposedly, Unity expects all .bundle files as universal builds (even if this is only a 32-bit build?) + if (Util.DoesFileStartIn(currentAsset, "Assets/Plugins/") && + Util.IsFileOfType(currentAsset, ".bundle")) + { + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add( + BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + continue; + } + + break; + case BuildPlatform.MacOSX64: + // when in mac build, .bundle files that are in Assets/Plugins are always included + // supposedly, Unity expects all .bundle files as universal builds (even if this is only a 64-bit build?) + if (Util.DoesFileStartIn(currentAsset, "Assets/Plugins/") && + Util.IsFileOfType(currentAsset, ".bundle")) + { + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add( + BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + continue; + } + + break; + case BuildPlatform.MacOSXUniversal: + // when in mac build, .bundle files that are in Assets/Plugins are always included + // supposedly, Unity expects all .bundle files as universal builds + if (Util.DoesFileStartIn(currentAsset, "Assets/Plugins/") && + Util.IsFileOfType(currentAsset, ".bundle")) + { + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add( + BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + continue; + } + + break; + + + case BuildPlatform.Windows32: + if (Util.IsFileOfType(currentAsset, ".dll")) + { + if (Util.DoesFileStartIn(currentAsset, "Assets/Plugins/x86/") && + !Util.IsFileInAnEditorFolder(currentAsset)) + { + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add( + BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + continue; + } + // Unity only makes use of Assets/Plugins/ if Assets/Plugins/x86/ does not exist + else if (Util.DoesFileStartIn(currentAsset, "Assets/Plugins/") && + !Util.IsFileInAnEditorFolder(currentAsset) && !has32BitPluginsFolder) + { + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add( + BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + continue; + } + } + + break; + + case BuildPlatform.Windows64: + if (Util.IsFileOfType(currentAsset, ".dll")) + { + if (Util.DoesFileStartIn(currentAsset, "Assets/Plugins/x86_64/") && + !Util.IsFileInAnEditorFolder(currentAsset)) + { + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add( + BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + continue; + } + // Unity only makes use of Assets/Plugins/ if Assets/Plugins/x86_64/ does not exist + else if (Util.DoesFileStartIn(currentAsset, "Assets/Plugins/") && + !Util.IsFileInAnEditorFolder(currentAsset) && !has64BitPluginsFolder) + { + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add( + BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + continue; + } + } + + break; + + + case BuildPlatform.Linux32: + if (Util.IsFileOfType(currentAsset, ".so")) + { + if (Util.DoesFileStartIn(currentAsset, "Assets/Plugins/x86/")) + { + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add( + BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + continue; + } + // Unity only makes use of Assets/Plugins/ if Assets/Plugins/x86/ does not exist + else if (Util.DoesFileStartIn(currentAsset, "Assets/Plugins/") && !has32BitPluginsFolder) + { + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add( + BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + continue; + } + } + + break; + + case BuildPlatform.Linux64: + if (Util.IsFileOfType(currentAsset, ".so")) + { + if (Util.DoesFileStartIn(currentAsset, "Assets/Plugins/x86_64/")) + { + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add( + BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + continue; + } + // Unity only makes use of Assets/Plugins/ if Assets/Plugins/x86_64/ does not exist + else if (Util.DoesFileStartIn(currentAsset, "Assets/Plugins/") && !has64BitPluginsFolder) + { + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add( + BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + continue; + } + } + + break; + + case BuildPlatform.LinuxUniversal: + if (Util.IsFileOfType(currentAsset, ".so")) + { + if (Util.DoesFileStartIn(currentAsset, "Assets/Plugins/x86/") || + Util.DoesFileStartIn(currentAsset, "Assets/Plugins/x86_64/")) + { + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add( + BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + continue; + } + } + + break; + } + + // check prefabs only when requested to do so + if (Util.IsFileOfType(currentAsset, ".prefab")) + { + //Debug.Log("GetAllUnusedAssets: found prefab: " + currentAsset.GetFileNameOnly()); + if (!includeUnusedPrefabs) + { + continue; + } + } + + // assets in StreamingAssets folder are always included + if (Util.DoesFileStartIn(currentAsset, "Assets/StreamingAssets/")) + { + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + inOutAllUsedAssets.Add(BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + continue; + } + + // add asset to unused list, but only if it's not in the used list + //if (!usedAssetsDict.ContainsKey(currentAsset)) + if (!inOutAllUsedAssets.Exists(part => + string.Equals(part.Name, currentAsset, StringComparison.InvariantCultureIgnoreCase))) + { + // when all other checks pass through, then that simply means this asset is unused + unusedAssets.Add(BuildReportTool.Util.CreateSizePartFromFile(currentAsset, fullAssetPath)); + } + + if (processInBatches && unusedAssets.Count >= fileCountLimit) + { + break; + } + } + + while (buildInfo.UnusedAssetsBatchFinalNum.Count <= buildInfo.UnusedAssetsBatchIdx) + { + buildInfo.UnusedAssetsBatchFinalNum.Add(0); + } + buildInfo.UnusedAssetsBatchFinalNum[buildInfo.UnusedAssetsBatchIdx] = assetNum; + + return unusedAssets.ToArray(); + } + + + static void ParseDLLs(string editorLogPath, bool wasWebBuild, bool wasWebGLBuild, string buildFilePath, + string projectAssetsPath, string editorAppContentsPath, ApiCompatibilityLevel monoLevel, + StrippingLevel codeStrippingLevel, out BuildReportTool.SizePart[] systemDLLs, + out BuildReportTool.SizePart[] unityEngineDLLs, out BuildReportTool.SizePart[] scriptDLLs) + { + List systemDLLsList = new List(); + List unityEngineDLLsList = new List(); + List scriptDLLsList = new List(); + + string buildManagedDLLsFolder = BuildReportTool.Util.GetBuildManagedFolder(buildFilePath); + string buildScriptDLLsFolder = buildManagedDLLsFolder; + string buildManagedDLLsFolderHigherPriority; + + bool wasAndroidApkBuild = buildFilePath.EndsWith(".apk", StringComparison.OrdinalIgnoreCase); + + if (wasWebBuild || wasWebGLBuild) + { + string tryPath; + bool success = BuildReportTool.Util.AttemptGetWebTempStagingArea(projectAssetsPath, out tryPath); + if (success) + { + buildManagedDLLsFolder = tryPath; + buildScriptDLLsFolder = tryPath; + } + } + else if (wasAndroidApkBuild) + { + string tryPath; + bool success = BuildReportTool.Util.AttemptGetAndroidTempStagingArea(projectAssetsPath, out tryPath); + if (success) + { + buildManagedDLLsFolder = tryPath; + buildScriptDLLsFolder = tryPath; + } + } + + BuildReportTool.SizePart inPart; + + if (!string.IsNullOrEmpty(buildManagedDLLsFolder) && Directory.Exists(buildManagedDLLsFolder)) + { + foreach (string filepath in DldUtil.TraverseDirectory.Do(buildManagedDLLsFolder)) + { + var filename = filepath.GetFileNameOnly(); + + if (BuildReportTool.Util.IsFileOfType(filename, ".dll")) + { + inPart = BuildReportTool.Util.CreateSizePartFromFile(filename, filepath); + + if (BuildReportTool.Util.IsAUnityEngineDLL(filename)) + { + unityEngineDLLsList.Add(inPart); + } + else if (BuildReportTool.Util.IsAScriptDLL(filename)) + { + scriptDLLsList.Add(inPart); + } + else if (BuildReportTool.Util.IsAKnownSystemDLL(filename)) + { + systemDLLsList.Add(inPart); + } + else + { + scriptDLLsList.Add(inPart); + } + } + } + } + else + { + // folder inside the Unity installation where mono system dlls are + string unityFolderManagedDLLs; + + bool unityfoldersSuccess = BuildReportTool.Util.AttemptGetUnityFolderMonoDLLs(wasWebBuild, + wasAndroidApkBuild, editorAppContentsPath, monoLevel, + codeStrippingLevel, out unityFolderManagedDLLs, + out buildManagedDLLsFolderHigherPriority); + + + //Debug.Log("buildManagedDLLsFolder: " + buildManagedDLLsFolder); + //Debug.Log("Application.dataPath: " + Application.dataPath); + + if (unityfoldersSuccess && + (string.IsNullOrEmpty(buildManagedDLLsFolder) || !Directory.Exists(buildManagedDLLsFolder))) + { +#if BRT_SHOW_MINOR_WARNINGS + Debug.LogWarning("Could not find build folder. Using Unity install folder instead for getting mono DLL file sizes."); +#endif + buildManagedDLLsFolder = unityFolderManagedDLLs; + } + +#if BRT_SHOW_MINOR_WARNINGS + if (!Directory.Exists(buildManagedDLLsFolder)) + { + Debug.LogWarning("Could not find folder for getting DLL file sizes. Got: \"" + buildManagedDLLsFolder + "\""); + } +#endif + + + const string PREFIX_REMOVE = "Dependency assembly - "; + + + const string MONO_DLL_KEY = "Mono dependencies included in the build"; + + bool gotDateTimePrefix = false; + int dateTimePrefixLen = 0; + + foreach (string line in DldUtil.BigFileReader.ReadFile(editorLogPath, MONO_DLL_KEY)) + { + // blank line signifies end of dll list + if (string.IsNullOrEmpty(line) || line == "\n" || line == "\r\n") + { + break; + } + + if (line.IndexOf(MONO_DLL_KEY, StringComparison.Ordinal) != -1) + { + continue; + } + + string filename = line; + if (!gotDateTimePrefix) + { + Match dateTime = Regex.Match(filename, DATE_TIME_PREFIX, RegexOptions.IgnoreCase); + if (dateTime.Success) + { + dateTimePrefixLen = dateTime.Groups[0].Value.Length; + gotDateTimePrefix = true; + filename = filename.Substring(dateTimePrefixLen); + } + } + else + { + filename = filename.Substring(dateTimePrefixLen); + } + + if (!filename.StartsWith(PREFIX_REMOVE)) + { + continue; + } + + filename = BuildReportTool.Util.RemovePrefix(PREFIX_REMOVE, filename); + + string filepath; + if (BuildReportTool.Util.IsAScriptDLL(filename)) + { + filepath = buildScriptDLLsFolder + filename; + //Debug.LogWarning("Script \"" + filepath + "\"."); + } + else + { + filepath = buildManagedDLLsFolder + filename; + + if (!File.Exists(filepath) && unityfoldersSuccess && + (buildManagedDLLsFolder != unityFolderManagedDLLs)) + { +#if BRT_SHOW_MINOR_WARNINGS + Debug.LogWarning("Failed to find file \"" + filepath + "\". Attempting to get from Unity folders."); +#endif + filepath = unityFolderManagedDLLs + filename; + + if (!string.IsNullOrEmpty(buildManagedDLLsFolderHigherPriority) && + File.Exists(buildManagedDLLsFolderHigherPriority + filename)) + { + filepath = buildManagedDLLsFolderHigherPriority + filename; + } + } + } + + if ((buildManagedDLLsFolder == unityFolderManagedDLLs) && + !string.IsNullOrEmpty(buildManagedDLLsFolderHigherPriority) && + File.Exists(buildManagedDLLsFolderHigherPriority + filename)) + { + filepath = buildManagedDLLsFolderHigherPriority + filename; + } + + //Debug.Log(filename + " " + filepath); + + inPart = BuildReportTool.Util.CreateSizePartFromFile(filename, filepath); + + //gotTotalSizeBytes += inPart.SizeBytes; + + if (BuildReportTool.Util.IsAUnityEngineDLL(filename)) + { + unityEngineDLLsList.Add(inPart); + } + else if (BuildReportTool.Util.IsAKnownSystemDLL(filename)) + { + systemDLLsList.Add(inPart); + } + else if (BuildReportTool.Util.IsAScriptDLL(filename) || !File.Exists(unityFolderManagedDLLs + filename)) + { + scriptDLLsList.Add(inPart); + } + else + { + systemDLLsList.Add(inPart); + } + } + + // somehow, the editor logfile + // doesn't include UnityEngine.dll + // even though it gets included in the final build (for desktop builds) + // + // for web builds though, it makes sense not to put UnityEngine.dll in the build. and it isn't. + // Instead, it's likely residing in the browser plugin to save bandwidth. + // + // begs the question though, why not have the whole Mono Web Subset DLLs be + // installed alongside the Unity web browser plugin? + // no need to bundle Mono DLLs in the web build itself. + // would have shaved 1 whole MB when a game uses System.Xml.dll for example + // + //if (!wasWebBuild) + { + string filename = "UnityEngine.dll"; + string filepath = buildManagedDLLsFolder + filename; + + if (File.Exists(filepath)) + { + inPart = BuildReportTool.Util.CreateSizePartFromFile(filename, filepath); + //gotTotalSizeBytes += inPart.SizeBytes; + unityEngineDLLsList.Add(inPart); + } + } + + + //Debug.Log("total size: " + EditorUtility.FormatBytes(gotTotalSizeBytes) + " (" + gotTotalSizeBytes + " bytes)"); + //Debug.Log("total assembly size: " + EditorUtility.FormatBytes(gotScriptTotalSizeBytes) + " (" + gotScriptTotalSizeBytes + " bytes)"); + //Debug.Log("total size without assembly: " + EditorUtility.FormatBytes(gotTotalSizeBytes - gotScriptTotalSizeBytes) + " (" + (gotTotalSizeBytes-gotScriptTotalSizeBytes) + " bytes)"); + } + + systemDLLs = systemDLLsList.ToArray(); + unityEngineDLLs = unityEngineDLLsList.ToArray(); + scriptDLLs = scriptDLLsList.ToArray(); + } + + + const string NO_BUILD_INFO_WARNING = + "Build Report Tool: No build info found. Build the project first. If you have more than one instance of the Unity Editor open, close all of them and open only one."; + + const string NO_BUILD_INFO_NO_LOG_WARNING = + "Build Report Tool: No build info found. Unity was launched with the -nolog argument. Build Report Tool can't obtain build info if there are no logs. Please relaunch Unity without the -nolog argument."; + + const string NO_BUILD_INFO_OVERRIDDEN_LOG_WARNING = + "Build Report Tool: No build info found.\n\nWarning: Build Report Tool is configured to use a custom log file to obtain build data from ({0}). Perhaps this was not intended?\n\nClear the override log in Build Report Tool's Options, or set the EditorLogOverridePath tag to empty in {1}.\n\n"; + + const string NO_BUILD_INFO_NO_PLAYER_REBUILT = + "Information on used Assets is not available, since player data was not rebuilt."; + + public static bool DoesEditorLogHaveBuildInfo(string editorLogPath) + { + return DldUtil.BigFileReader.FileHasText(editorLogPath, ASSET_SIZES_KEY, ASSET_SIZES_KEY_2); + } + + public static bool DoesEditorLogHaveNoBuildInfoDueToNoPlayerRebuilt(string editorLogPath) + { + return DldUtil.BigFileReader.FileHasText(editorLogPath, NO_BUILD_INFO_NO_PLAYER_REBUILT); + } + + public static BuildSettingCategory GetBuildSettingCategoryFromBuildValues(BuildInfo buildReport) + { + if (!BuildReportTool.Util.BuildInfoHasContents(buildReport)) + { + return BuildSettingCategory.None; + } + + return GetBuildSettingCategoryFromBuildValues(buildReport.BuildType, buildReport.BuildTargetUsed); + } + + public static BuildSettingCategory GetBuildSettingCategoryFromBuildValues(string gotBuildType, + BuildTarget buildTarget) + { + BuildPlatform b = GetBuildPlatformFromString(gotBuildType, buildTarget); + + switch (b) + { + case BuildPlatform.Windows32: + return BuildSettingCategory.WindowsDesktopStandalone; + case BuildPlatform.Windows64: + return BuildSettingCategory.WindowsDesktopStandalone; + + + case BuildPlatform.MacOSX64: + return BuildSettingCategory.MacStandalone; + case BuildPlatform.MacOSXUniversal: + return BuildSettingCategory.MacStandalone; + + + case BuildPlatform.Linux32: + return BuildSettingCategory.LinuxStandalone; + case BuildPlatform.Linux64: + return BuildSettingCategory.LinuxStandalone; + case BuildPlatform.LinuxUniversal: + return BuildSettingCategory.LinuxStandalone; + + + case BuildPlatform.Web: + return BuildSettingCategory.WebPlayer; + case BuildPlatform.Flash: + return BuildSettingCategory.FlashPlayer; + case BuildPlatform.WebGL: + return BuildSettingCategory.WebGL; + + + case BuildPlatform.iOS: + return BuildSettingCategory.iOS; + case BuildPlatform.tvOS: + return BuildSettingCategory.tvOS; + case BuildPlatform.Android: + return BuildSettingCategory.Android; + case BuildPlatform.Blackberry: + return BuildSettingCategory.Blackberry; + + + case BuildPlatform.Xbox360: + return BuildSettingCategory.Xbox360; + case BuildPlatform.XboxOne: + return BuildSettingCategory.XboxOne; + case BuildPlatform.XboxSeries: + return BuildSettingCategory.XboxSeries; + case BuildPlatform.PS3: + return BuildSettingCategory.PS3; + case BuildPlatform.PS4: + return BuildSettingCategory.PS4; + case BuildPlatform.PS5: + return BuildSettingCategory.PS5; + case BuildPlatform.Switch: + return BuildSettingCategory.Switch; + } + + return BuildSettingCategory.None; + } + + public static BuildPlatform GetBuildPlatformFromString(string gotBuildType, BuildTarget buildTarget) + { + BuildPlatform buildPlatform = BuildPlatform.None; + + + if (string.IsNullOrEmpty(gotBuildType)) + { + // log has no build type + // have to resort to looking at current build settings + // which may be inaccurate (if generating report from custom log file) + buildPlatform = BuildReportTool.Util.GetBuildPlatformBasedOnUnityBuildTarget(buildTarget); + } + + // mobile + + else if (gotBuildType.IndexOf("Android", StringComparison.Ordinal) != -1) + { + buildPlatform = BuildPlatform.Android; + } + else if (gotBuildType.IndexOf("iPhone", StringComparison.Ordinal) != -1) + { + buildPlatform = BuildPlatform.iOS; + } + else if (gotBuildType.IndexOf("iOS", StringComparison.Ordinal) != -1) + { + buildPlatform = BuildPlatform.iOS; + } + else if (gotBuildType.IndexOf("tvOS", StringComparison.Ordinal) != -1) + { + buildPlatform = BuildPlatform.tvOS; + } + + // browser + + else if (gotBuildType.IndexOf("WebPlayer", StringComparison.Ordinal) != -1) + { + buildPlatform = BuildPlatform.Web; + } + else if (gotBuildType.IndexOf("Flash", StringComparison.Ordinal) != -1) + { + buildPlatform = BuildPlatform.Flash; + } + else if (gotBuildType.IndexOf("WebGL", StringComparison.Ordinal) != -1) + { + buildPlatform = BuildPlatform.WebGL; + } + + // Windows + + else if (gotBuildType.IndexOf("Windows64", StringComparison.Ordinal) != -1) + { + buildPlatform = BuildPlatform.Windows64; + } + else if (gotBuildType.IndexOf("Windows", StringComparison.Ordinal) != -1) + { + buildPlatform = BuildPlatform.Windows32; + } + + // Linux + + else if (gotBuildType.IndexOf("Linux64", StringComparison.Ordinal) != -1) + { + buildPlatform = BuildPlatform.Linux64; + } + else if (gotBuildType.IndexOf("Linux", StringComparison.Ordinal) != -1) + { + // unfortunately we don't know if this is a 32-bit or universal build + // we'll have to rely on current build settings which may be inaccurate + buildPlatform = BuildReportTool.Util.GetBuildPlatformBasedOnUnityBuildTarget(buildTarget); + + if (buildPlatform != BuildPlatform.Linux32 && + buildPlatform != BuildPlatform.Linux64 && + buildPlatform != BuildPlatform.LinuxUniversal && + buildPlatform != BuildPlatform.LinuxHeadless && + buildPlatform != BuildPlatform.EmbeddedLinux) + { + // build platform was not detected properly + // default to 64-bit Linux + buildPlatform = BuildPlatform.Linux64; + } + } + + // Mac OS X + + else if (gotBuildType.IndexOf("Mac", StringComparison.Ordinal) != -1) + { + // unfortunately we don't know if this is a 32-bit, 64-bit, or universal build + // we'll have to rely on current build settings which may be inaccurate + buildPlatform = BuildReportTool.Util.GetBuildPlatformBasedOnUnityBuildTarget(buildTarget); + + if (buildPlatform != BuildPlatform.MacOSX32 && + buildPlatform != BuildPlatform.MacOSX64 && + buildPlatform != BuildPlatform.MacOSXUniversal) + { + // build platform was not detected properly + // default to 64-bit Mac + buildPlatform = BuildPlatform.MacOSX64; + } + } + + // ??? + + else + { + //Debug.LogFormat("Could not determine build type from: {0}", gotBuildType); + // could not determine from log + // have to resort to looking at current build settings + // which may be inaccurate + buildPlatform = BuildReportTool.Util.GetBuildPlatformBasedOnUnityBuildTarget(buildTarget); + } + + return buildPlatform; + } + + + /// + /// Note: This doesn't work anymore in Unity 5.3.2 + /// + /// + public static string GetCompressedSizeReadingFromLog() + { + const string COMPRESSED_BUILD_SIZE_STA_KEY = "Total compressed size "; + const string COMPRESSED_BUILD_SIZE_END_KEY = ". Total uncompressed size "; + + string result = string.Empty; + + string line = DldUtil.BigFileReader.SeekText(_lastEditorLogPath, COMPRESSED_BUILD_SIZE_STA_KEY); + + if (!string.IsNullOrEmpty(line)) + { + int compressedBuildSizeIdx = line.LastIndexOf(COMPRESSED_BUILD_SIZE_STA_KEY, StringComparison.Ordinal); + if (compressedBuildSizeIdx != -1) + { + // this data in the editor log only shows in web builds so far + // meaning we do not get a compressed result in other builds (except android, where we can check the file size of the .apk itself) + // + int compressedBuildSizeEndIdx = line.IndexOf(COMPRESSED_BUILD_SIZE_END_KEY, compressedBuildSizeIdx, + StringComparison.Ordinal); + + result = line.Substring(compressedBuildSizeIdx + COMPRESSED_BUILD_SIZE_STA_KEY.Length, + compressedBuildSizeEndIdx - compressedBuildSizeIdx - COMPRESSED_BUILD_SIZE_STA_KEY.Length); + } + } + + //Debug.Log("compressed size from log: " + result); + + return result; + } + + + /// + /// Used for Windows and Linux builds to get build size. + /// + /// Path to build as given by + /// + /// Size of build in bytes + static double GetStandaloneBuildSize(string buildFilePath, string unityVersion) + { + if (string.IsNullOrEmpty(buildFilePath)) + { + return 0; + } + + if (Directory.Exists(buildFilePath)) + { + //Debug.LogFormat("{0} is a folder", buildFilePath); + + // build location is a folder. normally it would be a file instead (the executable file for the build) + // in the latest versions of Unity, it's a folder + + // For Windows, attempt to find the .exe file within this folder and use that. + // What if there are multiple unity builds in this folder??? Unfortunately, + // we have no way of figuring out which .exe file is the one we want. + string[] potentialBuildExeFiles = + Directory.GetFiles(buildFilePath, "*.exe", SearchOption.TopDirectoryOnly); + + if (potentialBuildExeFiles.Length > 0) + { + for (int n = 0, len = potentialBuildExeFiles.Length; n < len; ++n) + { + if (IsUnityExecutableFile(potentialBuildExeFiles[n])) + { + //Debug.LogFormat("found unity .exe file: {0}", potentialBuildExeFiles[n]); + return GetStandaloneBuildWithDataFolderSize(potentialBuildExeFiles[n], unityVersion); + } + } + } + + // -------------------------- + + string[] potentialBuildLinux32BitFiles = + Directory.GetFiles(buildFilePath, "*.x86", SearchOption.TopDirectoryOnly); + + if (potentialBuildLinux32BitFiles.Length > 0) + { + for (int n = 0, len = potentialBuildLinux32BitFiles.Length; n < len; ++n) + { + if (IsUnityExecutableFile(potentialBuildLinux32BitFiles[n])) + { + //Debug.Log("found unity .x86 file: " + potentialBuildLinux32BitFiles[n]); + return GetStandaloneBuildWithDataFolderSize(potentialBuildLinux32BitFiles[n], unityVersion); + } + } + } + + // -------------------------- + + string[] potentialBuildLinux64BitFiles = + Directory.GetFiles(buildFilePath, "*.x86_64", SearchOption.TopDirectoryOnly); + + if (potentialBuildLinux64BitFiles.Length > 0) + { + for (int n = 0, len = potentialBuildLinux64BitFiles.Length; n < len; ++n) + { + if (IsUnityExecutableFile(potentialBuildLinux64BitFiles[n])) + { + //Debug.Log("found unity .x86_64 file: " + potentialBuildLinux64BitFiles[n]); + return GetStandaloneBuildWithDataFolderSize(potentialBuildLinux64BitFiles[n], unityVersion); + } + } + } + + // just return size of whole folder. + //Debug.LogFormat("Getting size of whole folder: {0}", buildFilePath); + return BuildReportTool.Util.GetPathSizeInBytes(buildFilePath); + } + + //Debug.LogFormat("{0} is a file", buildFilePath); + + // build location is a file + return GetStandaloneBuildWithDataFolderSize(buildFilePath, unityVersion); + } + + /// + /// Used for Windows and Linux builds to get build size. + /// + /// Path to build as given by + /// + /// Size of build in bytes + static double GetStandaloneBuildWithDataFolderSize(string buildFilePath, string unityVersion) + { + if (string.IsNullOrEmpty(buildFilePath)) + { + return 0; + } + + var folderOfBuildFile = Directory.Exists(buildFilePath) ? buildFilePath : Path.GetDirectoryName(buildFilePath); + + if (IsSingleStandaloneBuildInPath(folderOfBuildFile)) + { + // then just get the total size of the parent folder + + //Debug.LogFormat("GetStandaloneBuildWithDataFolderSize: Getting size of whole folder {0}", folderOfBuildFile); + + double parentFolderByteSize = BuildReportTool.Util.GetPathSizeInBytes(folderOfBuildFile); + + return parentFolderByteSize; + } + // else: there's multiple unity builds in the path, + // so we should only get the size of the build we're interested in + + if (IsUnityExecutableFile(buildFilePath)) + { + //Debug.LogFormat("GetStandaloneBuildWithDataFolderSize: Getting size of executable and its _Data folder {0}", buildFilePath); + + double exeFileByteSize = BuildReportTool.Util.GetPathSizeInBytes(buildFilePath); + + // get the exe file but remove the file type and add _Data. that's the folder name + string dataFolderPath = BuildReportTool.Util.ReplaceFileType(buildFilePath, "_Data"); + //Debug.Log("dataFolderPath: " + dataFolderPath); + + double dataFolderByteSize = BuildReportTool.Util.GetPathSizeInBytes(dataFolderPath); + + if (buildFilePath.EndsWith(".x86", StringComparison.OrdinalIgnoreCase)) + { + // check if accompanying 64-bit executable is also there (i.e. if it's a universal build) + // and include that in file size too + + // get the .x86 file file but change the file type to ".x86_64" + string exe64Path = BuildReportTool.Util.ReplaceFileType(buildFilePath, ".x86_64"); + + if (File.Exists(exe64Path)) + { + // gets the size of 64-bit executable + double exe64SizeBytes = BuildReportTool.Util.GetPathSizeInBytes(exe64Path); + + return (exeFileByteSize + exe64SizeBytes + dataFolderByteSize); + } + } + + return (exeFileByteSize + dataFolderByteSize); + } + + // buildFilePath doesn't have a path we can use to determine the build size + return 0; + } + + /// + /// Does the path contain only one Unity standalone build? + /// + /// + static bool IsSingleStandaloneBuildInPath(string buildFilePath) + { + // check if there are multiple .exe or .x86 or .x86_64 files in the folder + if (!Directory.Exists(buildFilePath)) + { + // not a folder + return false; + } + + string parentFolderPath = Path.GetDirectoryName(buildFilePath); + if (string.IsNullOrEmpty(parentFolderPath)) + { + return false; + } + + //Debug.LogFormat("IsSingleStandaloneBuildInPath: Checking {0}", parentFolderPath); + + if (Directory.Exists(parentFolderPath)) + { + var exeFilesInFolder = Directory.GetFiles(parentFolderPath, "*.exe", SearchOption.TopDirectoryOnly); + var manyExeFiles = exeFilesInFolder.Length >= 2; + if (manyExeFiles) + { + var foundUnityBuildExeFiles = 0; + for (int n = 0, len = exeFilesInFolder.Length; n < len; ++n) + { + // new in Unity 2017 and above + // even though these are .exe files, they're not a build's executable + if (exeFilesInFolder[n].Contains("UnityCrashHandler64.exe") || + exeFilesInFolder[n].Contains("UnityCrashHandler32.exe")) + { + continue; + } + + if (IsUnityExecutableFile(exeFilesInFolder[n])) + { + ++foundUnityBuildExeFiles; + } + } + + //Debug.LogFormat("IsSingleStandaloneBuildInPath: .exe files found in {0}: {1}", + // parentFolderPath, foundUnityBuildExeFiles.ToString()); + + if (foundUnityBuildExeFiles > 1) + { + return false; + } + + // note: Even if there's only 1 unity build exe file in this folder, + // one of the subfolders in here may have an .exe file and build folder too + // But it's tricky to check for this. + // Newer versions of Unity add new files into the build like UnityCrashHandler64.exe, + // and WinPixEventRuntime.dll (these are beside the game's exe file), + // so an explicit approach (get size only of particular files and folders) + // can potentially miss out on newly added files/folders of builds from newer versions of Unity. + // + // So the current approach of just getting the entire folder's size is preferable. + // It's just that the user has to be mindful to always set the build location to a + // folder where that build is the only thing in that folder. + } + + // ------------------- + + var linuxExeFilesInFolder = Directory.GetFiles(parentFolderPath, "*.x86", SearchOption.TopDirectoryOnly); + var manyLinuxExeFiles = linuxExeFilesInFolder.Length >= 2; + if (manyLinuxExeFiles) + { + //Debug.LogFormat("IsSingleStandaloneBuildInPath: Many .x86 files found in {0}", parentFolderPath); + + var foundUnityBuildExeFiles = 0; + for (int n = 0, len = linuxExeFilesInFolder.Length; n < len; ++n) + { + if (IsUnityExecutableFile(linuxExeFilesInFolder[n])) + { + ++foundUnityBuildExeFiles; + } + } + + if (foundUnityBuildExeFiles > 1) + { + return false; + } + } + + // ------------------- + + var linuxExe64FilesInFolder = + Directory.GetFiles(parentFolderPath, "*.x86_64", SearchOption.TopDirectoryOnly); + var manyLinuxExe64Files = linuxExe64FilesInFolder.Length >= 2; + if (manyLinuxExe64Files) + { + //Debug.LogFormat("IsSingleStandaloneBuildInPath: Many .x86_64 files found in {0}", parentFolderPath); + + var foundUnityBuildExeFiles = 0; + for (int n = 0, len = linuxExe64FilesInFolder.Length; n < len; ++n) + { + if (IsUnityExecutableFile(linuxExe64FilesInFolder[n])) + { + ++foundUnityBuildExeFiles; + } + } + + if (foundUnityBuildExeFiles > 1) + { + return false; + } + } + } + + return true; + } + + /// + /// Does the specified executable file also have an accompanying "_Data" folder in the same path? + /// + /// + /// + static bool IsUnityExecutableFile(string filepath) + { + if (File.Exists(filepath)) + { + string dataFolderPath; + + if (BuildReportTool.Util.IsFileOfType(filepath, ".exe") || + BuildReportTool.Util.IsFileOfType(filepath, ".x86") || + BuildReportTool.Util.IsFileOfType(filepath, ".x86_64")) + { + dataFolderPath = BuildReportTool.Util.ReplaceFileType(filepath, "_Data"); + } + else + { + // file doesn't have .exe or .x86 or .x86_64. + // this happens in linux build where executable has no file type extension + // just append "_Data" to it then + dataFolderPath = filepath + "_Data"; + } + + if (Directory.Exists(dataFolderPath)) + { + return true; + } + } + + return false; + } + + public static bool CheckIfUnityHasNoLogArgument() + { + if (!_gotCommandLineArguments) + { + string[] args = System.Environment.GetCommandLineArgs(); + + _unityHasNoLogArgument = false; + for (int i = 0; i < args.Length; i++) + { + //Debug.Log(args[i]); + if (args[i] == "-nolog") + { + _unityHasNoLogArgument = true; + break; + } + } + + _gotCommandLineArguments = true; + } + + return _unityHasNoLogArgument; + } + + // ================================================================================================================================================================================================================== + // main function for generating a report + + public static void GetValues(BuildInfo buildInfo, string buildFilePath, string projectAssetsPath, + string editorAppContentsPath, bool calculateBuildSize) + { + BRT_BuildReportWindow.GetValueMessage = "Getting values..."; + + if (!DoesEditorLogHaveBuildInfo(_lastEditorLogPath)) + { + string lastSuccessfulBuildEditorLog = BuildReportTool.Util.LastSuccessfulBuildFilePath(projectAssetsPath); + if (DoesEditorLogHaveBuildInfo(lastSuccessfulBuildEditorLog)) + { + _lastEditorLogPath = lastSuccessfulBuildEditorLog; + Debug.Log($"Reusing last successful build editor log file from: {lastSuccessfulBuildEditorLog}"); + } + else + { + if (BuildReportTool.Util.IsDefaultEditorLogPathOverridden) + { + Debug.LogWarning(string.Format(NO_BUILD_INFO_OVERRIDDEN_LOG_WARNING, _lastEditorLogPath, + BuildReportTool.Options.FoundPathForSavedOptions)); + } + else if (CheckIfUnityHasNoLogArgument()) + { + Debug.LogWarning(NO_BUILD_INFO_NO_LOG_WARNING); + } + else + { + Debug.LogWarning(NO_BUILD_INFO_WARNING); + } + + return; + } + } + + if (BuildReportTool.Options.KeepCopyOfLogOfLastSuccessfulBuild && + !BuildReportTool.Util.IsDefaultEditorLogPathOverridden && + !BuildReportTool.Util.IsUsingLastSuccessfulEditorLog(_lastEditorLogPath)) + { + // make a copy of the Editor log file first + // save it in the Library as Editor-LastSuccessfulBuild.log + string lastSuccessfulBuildEditorLog = BuildReportTool.Util.LastSuccessfulBuildFilePath(projectAssetsPath); + File.Copy(_lastEditorLogPath, lastSuccessfulBuildEditorLog, true); + Debug.Log($"Copied: {_lastEditorLogPath} to: {lastSuccessfulBuildEditorLog}"); + + // also save other pertinent information like build time + var buildExtraData = new BuildReportTool.Util.LastBuildExtraData(); + buildExtraData.SetBuildTimeStarted(buildInfo.BuildTimeGot); + buildExtraData.SetBuildDuration(buildInfo.BuildDurationTime); + + BuildReportTool.Util.Serialize(buildExtraData, BuildReportTool.Util.LastSuccessfulBuildExtraDataFilePath(projectAssetsPath)); + } + + // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + // determining build platform based on editor log + // much more reliable especially when using an override log + // if no build platform found from editor log, it will just use `buildInfo.BuildTargetUsed` + + string gotBuildType = GetBuildTypeFromEditorLog(_lastEditorLogPath); + BuildPlatform buildPlatform = GetBuildPlatformFromString(gotBuildType, buildInfo.BuildTargetUsed); + + //Debug.LogFormat("Build Type found in Editor Log: \"{0}\"\nDetermined build platform: {1}", + // gotBuildType, buildPlatform); + + if (string.IsNullOrEmpty(gotBuildType)) + { + buildInfo.BuildType = buildPlatform.ToString(); + } + else + { + buildInfo.BuildType = gotBuildType; + } + + + buildInfo.ProjectName = BuildReportTool.Util.GetProjectName(projectAssetsPath); + + // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + + string unityBuildReportFilePath = string.Format("{0}/{1}", _lastSavePath, + BuildReportTool.Util.GetUnityBuildReportDefaultFilename(buildInfo.ProjectName, buildInfo.BuildType, buildInfo.BuildTimeGot)); + _lastKnownUnityBuildReport = BuildReportTool.Util.OpenSerialized(unityBuildReportFilePath); +#if BRT_UNITY_BUILD_REPORT_DEBUG + BuildReportTool.Util.DebugLogBuildReport(_lastKnownUnityBuildReport); +#endif + + // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + // DLLs + + BRT_BuildReportWindow.GetValueMessage = "Getting list of DLLs..."; + + bool wasWebBuild = buildInfo.BuildType == "WebPlayer"; + bool wasWebGLBuild = buildInfo.BuildType == "WebGLSupport" || buildInfo.BuildType == "WebGL"; + + //Debug.Log("going to call parseDLLs"); + ParseDLLs(_lastEditorLogPath, wasWebBuild, wasWebGLBuild, buildFilePath, projectAssetsPath, + editorAppContentsPath, buildInfo.MonoLevel, buildInfo.CodeStrippingLevel, + out buildInfo.MonoDLLs, out buildInfo.UnityEngineDLLs, out buildInfo.ScriptDLLs); + + + //Debug.Log("ParseDLLs done"); + + + // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + // build sizes per category + + BRT_BuildReportWindow.GetValueMessage = "Getting build sizes..."; + + //Debug.Log("ParseSizePartsFromString sta"); + + buildInfo.BuildSizes = ParseSizePartsFromString(_lastEditorLogPath); + + //Debug.Log("ParseSizePartsFromString end"); + + + // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + // getting total asset size (uncompressed) + + buildInfo.UsedTotalSize = ""; + + foreach (BuildReportTool.SizePart b in buildInfo.BuildSizes) + { + if (b.IsTotal) + { + buildInfo.UsedTotalSize = b.Size; + break; + } + } + + + // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + // getting streaming assets size (uncompressed) + + BRT_BuildReportWindow.GetValueMessage = "Getting Streaming Assets size..."; + + var streamingAssetsPath = projectAssetsPath + "/StreamingAssets"; + + if (calculateBuildSize) // BuildReportTool.Options.IncludeBuildSizeInReportCreation + { + buildInfo.StreamingAssetsSize = BuildReportTool.Util.GetFolderSizeReadable(streamingAssetsPath); + } + + foreach (BuildReportTool.SizePart b in buildInfo.BuildSizes) + { + if (b.IsStreamingAssets) + { + b.DerivedSize = BuildReportTool.Util.GetFolderSizeInBytes(streamingAssetsPath); + b.Size = BuildReportTool.Util.GetBytesReadable(b.DerivedSize); + break; + } + } + + + // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + // getting compressed total build size + + buildInfo.TotalBuildSize = ""; + + if (calculateBuildSize) + { + BRT_BuildReportWindow.GetValueMessage = "Getting final build size..."; + //Debug.LogFormat("trying to get size for {0} of {1} ({2})", + // buildPlatform, buildFilePath, buildInfo.UnityVersion); + + // note: buildFilePath is the path to the build, as given by EditorUserBuildSettings.GetBuildLocation() + + if (buildPlatform == BuildPlatform.Flash) + { + // in Flash builds, `buildFilePath` is the .swf file + + buildInfo.TotalBuildSize = BuildReportTool.Util.GetPathSizeReadable(buildFilePath); + } + else if (buildPlatform == BuildPlatform.Android) + { + //Debug.Log("trying to get size of: " + buildFilePath); + + // in Unity 4, Android can generate an Eclipse project if set so in the build settings + // or an .apk with an accompanying .obb file, which we should take into account + + // check if an .obb file was generated and get its file size + + + if (!buildInfo.AndroidCreateProject && !buildInfo.AndroidUseAPKExpansionFiles) + { + // .apk without an .obb + + buildInfo.TotalBuildSize = BuildReportTool.Util.GetPathSizeReadable(buildFilePath); + } + else if (!buildInfo.AndroidCreateProject && buildInfo.AndroidUseAPKExpansionFiles) + { + // .apk with .obb + + // get the .apk file but remove the file type + string obbPath = BuildReportTool.Util.ReplaceFileType(buildFilePath, ".main.obb"); + + double obbSize = BuildReportTool.Util.GetPathSizeInBytes(obbPath); + double apkSize = BuildReportTool.Util.GetPathSizeInBytes(buildFilePath); + + buildInfo.TotalBuildSize = BuildReportTool.Util.GetBytesReadable(apkSize + obbSize); + buildInfo.AndroidApkFileBuildSize = BuildReportTool.Util.GetBytesReadable(apkSize); + buildInfo.AndroidObbFileBuildSize = BuildReportTool.Util.GetBytesReadable(obbSize); + } + else if (buildInfo.AndroidCreateProject) + { + // total build size is size of the eclipse project folder + buildInfo.TotalBuildSize = BuildReportTool.Util.GetPathSizeReadable(buildFilePath); + + // if there is .obb, find it + if (buildInfo.AndroidUseAPKExpansionFiles) + { + // the .obb is inside this folder + buildInfo.AndroidObbFileBuildSize = + BuildReportTool.Util.GetObbSizeInEclipseProjectReadable(buildFilePath); + } + } + else + { + // ??? + buildInfo.TotalBuildSize = BuildReportTool.Util.GetPathSizeReadable(buildFilePath); + } + } + else if (buildPlatform == BuildPlatform.Web) + { + // in web builds, `buildFilePath` is the folder + buildInfo.TotalBuildSize = BuildReportTool.Util.GetPathSizeReadable(buildFilePath); + + if (Directory.Exists(buildFilePath)) + { + // find a .unity3d file inside the build folder and get its file size + foreach ( + var file in TraverseDirectory + .Do(buildFilePath).Where(file => BuildReportTool.Util.IsFileOfType(file, ".unity3d")) + ) + { + buildInfo.WebFileBuildSize = BuildReportTool.Util.GetPathSizeReadable(file); + break; + } + } + } + else if ( + buildPlatform == BuildPlatform.Windows32 || + buildPlatform == BuildPlatform.Windows64 || + buildPlatform == BuildPlatform.Linux32 || + buildPlatform == BuildPlatform.Linux64 || + buildPlatform == BuildPlatform.LinuxUniversal || + (buildPlatform == BuildPlatform.None && + (buildFilePath.EndsWith(".exe", StringComparison.OrdinalIgnoreCase) || + buildFilePath.EndsWith(".x86", StringComparison.OrdinalIgnoreCase) || + buildFilePath.EndsWith(".x86_64", StringComparison.OrdinalIgnoreCase)))) + { + //Debug.LogFormat( + // "BuildReportTool.ReportGenerator: Getting Total Build Size: Detected Windows/Linux buildFilePath: {0}", + // buildFilePath); + + // in Windows/Linux builds, `buildFilePath` is only the executable file (.exe, .x86, or .x86_64 file). + // we still need to get the size of the Data folder + + buildInfo.TotalBuildSize = + BuildReportTool.Util.GetBytesReadable(GetStandaloneBuildSize(buildFilePath, buildInfo.UnityVersion)); + } + else if ( + buildPlatform == BuildPlatform.MacOSX32 || + buildPlatform == BuildPlatform.MacOSX64 || + buildPlatform == BuildPlatform.MacOSXUniversal) + { + //Debug.LogFormat( + // "BuildReportTool.ReportGenerator: Getting Total Build Size: Detected Mac OS X buildFilePath: {0}", + // buildFilePath); + + // in Mac builds, `buildFilePath` is the .app file (which is really just a folder) + buildInfo.TotalBuildSize = BuildReportTool.Util.GetPathSizeReadable(buildFilePath); + } + else if (buildPlatform == BuildPlatform.iOS) + { + // in iOS builds, `buildFilePath` is the Xcode project folder + buildInfo.TotalBuildSize = BuildReportTool.Util.GetPathSizeReadable(buildFilePath); + } + else + { + //Debug.LogFormat( + // "BuildReportTool.ReportGenerator: Getting Total Build Size: Unknown build platform: {0}", + // buildFilePath); + + // in console builds, `buildFilePath` is ??? + // last resort for unknown build platforms + buildInfo.TotalBuildSize = BuildReportTool.Util.GetPathSizeReadable(buildFilePath); + } + } + + + // for debug + //GetCompressedSizeReadingFromLog(); + + // ensure this is not used anymore on new reports + // (it's still there for old build report XML files) + //buildInfo.CompressedBuildSize = ""; + + + buildInfo.UnusedTotalSize = ""; + + + // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + // assets list + + if (buildInfo.UsedAssetsIncludedInCreation) + { + BRT_BuildReportWindow.GetValueMessage = "Getting list of used assets..."; + + // asset list + + buildInfo.FileFilters = BuildReportTool.FiltersUsed.GetProperFileFilterGroupToUse(_lastSavePath); + + + var allUsed = ParseAssetSizesFromEditorLog(_lastEditorLogPath, PrefabsUsedInScenesList); + + var scenes = buildInfo.ScenesInBuild; + if (scenes != null) + { + // add Unity scene files into the Used Assets list even though technically they do not show up there + + string projectPath = BuildReportTool.Util.GetProjectPath(buildInfo.ProjectAssetsPath); + + string buildDataFolderPath = BuildReportTool.Util.GetBuildDataFolder(buildFilePath); + + int enabledSceneIdx = 0; + for (int n = 0, len = scenes.Length; n < len; ++n) + { + if (!scenes[n].Enabled) + { + // disabled scene means it was not included in the build + continue; + } + + //Debug.Log("Scene " + n + ": " + projectPath + scenes[n].path + " enabled: " + scenes[n].enabled + " level" + enabledSceneIdx); + + var sceneSizePart = + BuildReportTool.Util.CreateSizePartFromFile(scenes[n].Path, projectPath + scenes[n].Path, false); + + if (!string.IsNullOrEmpty(buildDataFolderPath)) + { + // in standalone builds, a unity scene file is found in the _Data folder as files with filename level0 ... leveln + // the number index there being the scene's index in the build + + var fileInBuild = string.Format("{0}/level{1}", buildDataFolderPath, enabledSceneIdx); + + if (File.Exists(fileInBuild)) + { + long fileSizeBytes = BuildReportTool.Util.GetFileSizeInBytes(fileInBuild); + sceneSizePart.RawSizeBytes = fileSizeBytes; + sceneSizePart.RawSize = BuildReportTool.Util.GetBytesReadable(fileSizeBytes); + } + } + + allUsed.Add(sceneSizePart); + ++enabledSceneIdx; + } + } + + // remove scripts that aren't included in the build + // by checking if the assembly they belong to is not in the build + if (_lastAssemblies != null) + { + foreach (Assembly assembly in _lastAssemblies) + { + string assemblyFilename = Path.GetFileName(assembly.outputPath); + + if (buildInfo.ScriptDLLs.Exists(assemblyFilename) || + buildInfo.UnityEngineDLLs.Exists(assemblyFilename)) + { + continue; + } + + // this is an assembly that isn't included in the build + // any source file of this assembly shouldn't be in the used list + foreach (string sourceFile in assembly.sourceFiles) + { + int sourceFileIdxInAllUsed = allUsed.FindIdx(sourceFile); + if (sourceFileIdxInAllUsed == -1) + { + continue; + } + + allUsed.RemoveAt(sourceFileIdxInAllUsed); + } + } + } + + //Debug.Log("buildInfo.UsedAssets.All: " + buildInfo.UsedAssets.All.Length); + + if (buildInfo.UnusedAssetsIncludedInCreation) + { + BRT_BuildReportWindow.GetValueMessage = "Getting list of unused assets..."; + + BuildReportTool.SizePart[] allUnused; + BuildReportTool.SizePart[][] perCategoryUnused; + + buildInfo.ResetUnusedAssetsBatchData(); + allUnused = GetAllUnusedAssets(buildInfo, projectAssetsPath, buildPlatform, allUsed); + + perCategoryUnused = SegregateAssetSizesPerCategory(allUnused, buildInfo.FileFilters); + + buildInfo.UnusedAssets = new AssetList(); + buildInfo.UnusedAssets.Init(allUnused, perCategoryUnused, + BuildReportTool.Options.NumberOfTopLargestUnusedAssetsToShow, buildInfo.FileFilters); + + buildInfo.UnusedTotalSize = + BuildReportTool.Util.GetBytesReadable(buildInfo.UnusedAssets.GetTotalSizeInBytes()); + } + + BuildReportTool.SizePart[] allUsedArray = allUsed.ToArray(); + + BuildReportTool.SizePart[][] perCategoryUsed = + SegregateAssetSizesPerCategory(allUsedArray, buildInfo.FileFilters); + buildInfo.UsedAssets = new AssetList(); + buildInfo.UsedAssets.Init(allUsedArray, perCategoryUsed, + BuildReportTool.Options.NumberOfTopLargestUsedAssetsToShow, buildInfo.FileFilters); + } + + + buildInfo.SortSizes(); + + Array.Sort(buildInfo.MonoDLLs, delegate(BuildReportTool.SizePart b1, BuildReportTool.SizePart b2) + { + if (b1.SizeBytes > b2.SizeBytes) return -1; + if (b1.SizeBytes < b2.SizeBytes) return 1; + return string.Compare(b1.Name, b2.Name, StringComparison.Ordinal); + }); + Array.Sort(buildInfo.UnityEngineDLLs, delegate(BuildReportTool.SizePart b1, BuildReportTool.SizePart b2) + { + if (b1.SizeBytes > b2.SizeBytes) return -1; + if (b1.SizeBytes < b2.SizeBytes) return 1; + return string.Compare(b1.Name, b2.Name, StringComparison.Ordinal); + }); + Array.Sort(buildInfo.ScriptDLLs, delegate(BuildReportTool.SizePart b1, BuildReportTool.SizePart b2) + { + if (b1.SizeBytes > b2.SizeBytes) return -1; + if (b1.SizeBytes < b2.SizeBytes) return 1; + return string.Compare(b1.Name, b2.Name, StringComparison.Ordinal); + }); + + //foreach (string d in EditorUserBuildSettings.activeScriptCompilationDefines) + //{ + // Debug.Log("define: " + d); + //} + + // ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ + // duration of build generation + + System.TimeSpan timeNow = new System.TimeSpan(System.DateTime.Now.Ticks); + buildInfo.ReportGenerationTime = timeNow - new System.TimeSpan(buildInfo.TimeGot.Ticks); + + BRT_BuildReportWindow.GetValueMessage = ""; + + buildInfo.FlagOkToRefresh(); + } + + //public static void ChangeSavePathToUserPersonalFolder() + //{ + //BuildReportTool.Options.BuildReportSavePath = BuildReportTool.Util.GetUserHomeFolder(); + //} + + public static string GetSavePathToProjectFolder() + { + string projectParent; + if (_lastKnownBuildInfo != null) + { + projectParent = _lastKnownBuildInfo.ProjectAssetsPath; + } + else + { + projectParent = Application.dataPath; + } + + const string SUFFIX_STRING_TO_REMOVE = "/Assets"; + projectParent = BuildReportTool.Util.RemoveSuffix(SUFFIX_STRING_TO_REMOVE, projectParent); + + int lastSlashIdx = projectParent.LastIndexOf("/", StringComparison.Ordinal); + projectParent = projectParent.Substring(0, lastSlashIdx); + return projectParent; + //BuildReportTool.Options.BuildReportSavePath = projectParent; + //Debug.Log("projectParent: " + projectParent); + } + + + /// + /// Called by to start creating a build report. + /// + /// + /// Called when the "Get Log" button is pressed by the user in the BRT_BuildReportWindow. + /// + /// Can also be called due to BRT_BuildReportWindow's , + /// when it has detected that a build has completed, and a Build Report creation was scheduled + /// (). This was scheduled for us + /// when was called, which gets called automatically by Unity + /// when a build has finished. + /// + /// + /// + /// + /// + public static bool RefreshData(bool fromBuild, ref BuildReportTool.BuildInfo buildInfo, + ref BuildReportTool.AssetDependencies assetDependencies, ref BuildReportTool.TextureData textureData, + ref BuildReportTool.MeshData meshData, ref BuildReportTool.PrefabData prefabData) + { + // this would have been set to true in BuildReportTool.ReportGenerator.OnPostprocessBuild + // which allowed BRT_BuildReportWindow.OnInspectorUpdate() to get here + BuildReportTool.Util.ClearShouldGetBuildReportNow(); + + if (!DoesEditorLogHaveBuildInfo(BuildReportTool.Util.UsedEditorLogPath)) + { + string lastSuccessfulBuildEditorLog = BuildReportTool.Util.LastSuccessfulBuildFilePath(Application.dataPath); + if (DoesEditorLogHaveBuildInfo(lastSuccessfulBuildEditorLog)) + { + _lastEditorLogPath = lastSuccessfulBuildEditorLog; + } + else + { + if (BuildReportTool.Util.IsDefaultEditorLogPathOverridden) + { + Debug.LogWarning(string.Format(NO_BUILD_INFO_OVERRIDDEN_LOG_WARNING, + BuildReportTool.Util.UsedEditorLogPath, BuildReportTool.Options.FoundPathForSavedOptions)); + } + else if (CheckIfUnityHasNoLogArgument()) + { + Debug.LogWarning(NO_BUILD_INFO_NO_LOG_WARNING); + } + else + { + Debug.LogWarning(NO_BUILD_INFO_WARNING); + } + + return false; + } + } + + // -------------------- + + var timeNow = System.DateTime.Now; + + // -------------------- + + // get important values from the Unity API + // (which can only be retrieved in the main thread) + Init(fromBuild, ref buildInfo, null); + buildInfo.TimeGot = timeNow; + buildInfo.TimeGotReadable = timeNow.ToString(TIME_OF_BUILD_FORMAT); + + System.DateTime timeBuildStarted; + if (fromBuild && BuildReportTool.Util.HasBuildTime()) + { + timeBuildStarted = BuildReportTool.Util.LoadBuildTime(); + } + else + { + timeBuildStarted = timeNow; + } + + if (BuildReportTool.Options.CalculateAssetDependencies) + { + if (assetDependencies == null) + { + assetDependencies = new BuildReportTool.AssetDependencies(); + } + + assetDependencies.TimeGot = timeBuildStarted; + } + + if (BuildReportTool.Options.CollectTextureImportSettings) + { + if (textureData == null) + { + textureData = new BuildReportTool.TextureData(); + } + + textureData.TimeGot = timeBuildStarted; + } + else + { + if (textureData != null) + { + textureData.Clear(); + } + } + + if (BuildReportTool.Options.CollectMeshData) + { + if (meshData == null) + { + meshData = new BuildReportTool.MeshData(); + } + + meshData.TimeGot = timeBuildStarted; + } + else + { + if (meshData != null) + { + meshData.Clear(); + } + } + + if (BuildReportTool.Options.CollectPrefabData) + { + if (prefabData == null) + { + prefabData = new BuildReportTool.PrefabData(); + } + + prefabData.TimeGot = timeBuildStarted; + } + else + { + if (prefabData != null) + { + prefabData.Clear(); + } + } + + // -------------------- + + // getting prefabs has to be done in the main thread + // since it uses the Unity API (AssetDatabase.GetDependencies) + if (BuildReportTool.Options.IncludeUnusedPrefabsInReportCreation) + { + RefreshListOfAllPrefabsUsedInAllScenesIncludedInBuild(); + } + else + { + ClearListOfAllPrefabsUsedInAllScenes(); + } + + CommitAdditionalInfoToCache(); + + // -------------------- + + CreateBuildReportInBackgroundIfNeeded(buildInfo, assetDependencies); + + return true; + } + + /// + /// Called by to create the Build Report. + /// + /// + /// It will be done either on the main thread or on a new one, depending + /// on the value of . + /// + /// Once it's done, will be set to + /// , to signal the rest of the code to continue. + /// Specifically, keeps checking + /// that state and when it does, it calls + /// as the next step. + /// + static void CreateBuildReportInBackgroundIfNeeded(BuildReportTool.BuildInfo buildInfo, + BuildReportTool.AssetDependencies assetDependencies) + { + //Debug.Log("starting thread"); + _shouldCalculateBuildSize = BuildReportTool.Options.IncludeBuildSizeInReportCreation; + + _gettingValuesCurrentState = GettingValues.Yes; + + if (BuildReportTool.Options.UseThreadedReportGeneration) + { + // the only things we do is get values from the Editor.log txt file + // so it's safe to do it in a separate thread, nothing in the Unity API + // is used. + + Thread thread = new Thread(() => CreateBuildReport(buildInfo)); + thread.Start(); + } + else + { + CreateBuildReport(buildInfo); + } + } + + /// + /// Finally go and create the contents of the Build Report, based on + /// the values given in the Editor.log text file, and other info prepared + /// beforehand. + /// + /// + /// Once it's done, will be set to + /// , to signal the rest of the code to continue. + /// Specifically, keeps checking + /// that state and when it does, it calls + /// as the next step. + /// + /// The BuildInfo to populate. + static void CreateBuildReport(BuildReportTool.BuildInfo buildInfo) + { + //Debug.Log("in thread"); + + GetValues(buildInfo, buildInfo.BuildFilePath, buildInfo.ProjectAssetsPath, buildInfo.EditorAppContentsPath, + _shouldCalculateBuildSize); + + //Debug.Log("done thread"); + _gettingValuesCurrentState = GettingValues.Finished; + + // the next part of the code that gets executed is BRT_BuildReportWindow.OnFinishGeneratingBuildReport() + } + + public static string OnFinishedGetValues(BuildReportTool.BuildInfo buildInfo, + BuildReportTool.AssetDependencies assetDependencies, BuildReportTool.TextureData textureData, + BuildReportTool.MeshData meshData, BuildReportTool.PrefabData prefabData, string customSavePath = null) + { + string resultingFilePath = null; + + if (buildInfo.HasUsedAssets) + { + if (BuildReportTool.Options.ShowImportedSizeForUsedAssets) + { + buildInfo.UsedAssets.PopulateImportedSizes(); + } + + if (BuildReportTool.Options.GetSizeBeforeBuildForUsedAssets) + { + buildInfo.UsedAssets.PopulateSizeInAssetsFolder(); + } + } + + if (buildInfo.HasUnusedAssets && BuildReportTool.Options.GetImportedSizesForUnusedAssets) + { + buildInfo.UnusedAssets.PopulateImportedSizes(); + } + + buildInfo.FixReport(); + + // ------------------------------ + + // Asset dependency calculation has to be done *after* build report has been created, + // but it also has to be done in the main thread, since it makes use of the Unity Editor API + // (UnityEditor.AssetDatabase.GetDependencies()). + if (BuildReportTool.Options.CalculateAssetDependencies) + { + assetDependencies.ProjectName = buildInfo.ProjectName; + assetDependencies.BuildType = buildInfo.BuildType; + + if (BuildReportTool.Options.CalculateAssetDependenciesOnUnusedToo) + { + BuildReportTool.AssetDependencyGenerator.CreateForAllAssets(assetDependencies, buildInfo, +#if BRT_ASSET_DEPENDENCY_DEBUG + true +#else + false +#endif + ); + } + else + { + BuildReportTool.AssetDependencyGenerator.CreateForUsedAssetsOnly(assetDependencies, buildInfo, +#if BRT_ASSET_DEPENDENCY_DEBUG + true +#else + false +#endif + ); + } + } + + // ------------------------------ + + if (BuildReportTool.Options.CollectTextureImportSettings) + { + textureData.ProjectName = buildInfo.ProjectName; + textureData.BuildType = buildInfo.BuildType; + + if (BuildReportTool.Options.CollectTextureImportSettingsOnUnusedToo) + { + BuildReportTool.TextureDataGenerator.CreateForAllAssets(textureData, buildInfo, +#if BRT_TEXTURE_DATA_DEBUG + true +#else + false +#endif + ); + } + else + { + BuildReportTool.TextureDataGenerator.CreateForUsedAssetsOnly(textureData, buildInfo, +#if BRT_TEXTURE_DATA_DEBUG + true +#else + false +#endif + ); + } + } + + // ------------------------------ + + if (BuildReportTool.Options.CollectMeshData) + { + meshData.ProjectName = buildInfo.ProjectName; + meshData.BuildType = buildInfo.BuildType; + + if (BuildReportTool.Options.CollectMeshDataOnUnusedToo) + { + BuildReportTool.MeshDataGenerator.CreateForAllAssets(meshData, buildInfo, +#if BRT_MESH_DATA_DEBUG + true +#else + false +#endif + ); + } + else + { + BuildReportTool.MeshDataGenerator.CreateForUsedAssetsOnly(meshData, buildInfo, +#if BRT_MESH_DATA_DEBUG + true +#else + false +#endif + ); + } + } + + // ------------------------------ + + if (BuildReportTool.Options.CollectPrefabData) + { + prefabData.ProjectName = buildInfo.ProjectName; + prefabData.BuildType = buildInfo.BuildType; + + BuildReportTool.PrefabDataGenerator.CreateForUsedAssetsOnly(prefabData, buildInfo); + } + + // ------------------------------ + // BuildReportTool.Util.ShouldSaveGottenBuildReportNow was set to true on + // BuildReportTool.ReportGenerator.OnPostprocessBuild, + // which is called automatically after a build + // so by this time, it should be true + if (BuildReportTool.Util.ShouldSaveGottenBuildReportNow) + { + BuildReportTool.Util.ShouldSaveGottenBuildReportNow = false; + + string savePathToUse = string.IsNullOrEmpty(customSavePath) + ? _lastSavePath + : customSavePath; + + resultingFilePath = BuildReportTool.Util.SerializeAtFolder(buildInfo, savePathToUse); + + if (BuildReportTool.Options.CalculateAssetDependencies) + { + BuildReportTool.Util.SerializeAtFolder(assetDependencies, savePathToUse); + } + + if (BuildReportTool.Options.CollectTextureImportSettings) + { + BuildReportTool.Util.SerializeAtFolder(textureData, savePathToUse); + } + + if (BuildReportTool.Options.CollectMeshData) + { + BuildReportTool.Util.SerializeAtFolder(meshData, savePathToUse); + } + + if (BuildReportTool.Options.CollectPrefabData) + { + BuildReportTool.Util.SerializeAtFolder(prefabData, savePathToUse); + } + } + + _gettingValuesCurrentState = GettingValues.No; + + FixZeroSizeUsedAssetEntries(buildInfo); + + return resultingFilePath; + } + + static void FixZeroSizeUsedAssetEntries(BuildInfo buildInfo) + { + if (!buildInfo.UsedAssetsIncludedInCreation) + { + return; + } + + AssetList usedAssetsList = buildInfo.UsedAssets; + + SizePart[] usedAssets = usedAssetsList.All; + + bool sizeWasChangedAtLeastOnce = false; + + string projectPath = BuildReportTool.Util.GetProjectPath(buildInfo.ProjectAssetsPath); + + for (int n = 0, len = usedAssets.Length; n < len; ++n) + { + // files in StreamingAssets folder do not get imported in the 1st place + // so skip them + if (Util.IsFileStreamingAsset(usedAssets[n].Name)) + { + continue; + } + + if (usedAssets[n].Size == "N/A") + { + continue; + } + + if (usedAssets[n].DerivedSize <= 0.0 && usedAssets[n].SizeBytes <= 0) + { + // got size from log was 0? + // likely the asset was so small, Unity rounded off the value to 0 + // then we forcibly get the imported size + + long realSize = BuildReportTool.Util.GetFileSizeInBytes(projectPath + usedAssets[n].Name); + + // but check first if real file size really is 0, then we need to indicate to the user that "hey, this file actually is empty" + if (realSize <= 0) + { + continue; + } + + sizeWasChangedAtLeastOnce = true; + + // here's the weird thing: + // when the asset is text, Unity reports the file size based on the .txt file's real size on disk + // when it's a texture image, Unity reports the file size based on the imported size + // when it's a material, seems Unity does some extra compressing because it ends up smaller than either raw size or imported size + // + // seems it's really different per asset type + // + // so we'll make our own rules: + // just use whichever value is smaller: raw or imported size. + + long importedSize = BRT_LibCacheUtil.GetImportedFileSize(usedAssets[n].Name); + + long sizeToUse = Math.Min(realSize, importedSize); + + usedAssets[n].SizeBytes = sizeToUse; + usedAssets[n].Size = BuildReportTool.Util.GetBytesReadable(usedAssets[n].SizeBytes); + + //Debug.Log("asset \"" + usedAssets[n].Name + "\" size from log is " + usedAssets[n].DerivedSize + " so we calculated imported size and got: " + usedAssets[n].SizeBytes + " real size is " + BuildReportTool.Util.GetBytesReadable(realSize)); + } + } + + if (sizeWasChangedAtLeastOnce) + { + // resort asset list since sizes were changed + usedAssetsList.ResortDefault(BuildReportTool.Options.NumberOfTopLargestUsedAssetsToShow); + } + } + + + enum GettingValues + { + /// + /// Initial state, not doing anything. + /// + No, + + /// + /// Currently in the middle of creating a report. + /// + Yes, + + /// + /// Just finished generating a build report and is ready to be saved. + /// + Finished + } + + static GettingValues _gettingValuesCurrentState = GettingValues.No; + + public static bool IsStillGettingValues + { + get { return _gettingValuesCurrentState == GettingValues.Yes; } + } + + public static bool IsFinishedGettingValues + { + get { return _gettingValuesCurrentState == GettingValues.Finished; } + } + + + public static void RecategorizeAssetList(BuildInfo buildInfo) + { + buildInfo.RecategorizeAssetLists(); + buildInfo.FlagOkToRefresh(); + } + + const string EDITOR_WINDOW_TITLE = "Build Report"; + + [MenuItem("Window/Show Build Report")] + public static void ShowBuildReport() + { + //RefreshData(ref _lastKnownBuildInfo); + + // close any existing window first, in case it's stuck in an error + BRT_BuildReportWindow brtWindow = + (BRT_BuildReportWindow) EditorWindow.GetWindow(typeof(BRT_BuildReportWindow), false, EDITOR_WINDOW_TITLE, + true); + brtWindow.Close(); + + ShowBuildReportWithLastValues(); + } + + // has to be called in main thread + static void ShowBuildReportWithLastValues() + { + //BRT_BuildReportWindow window = ScriptableObject.CreateInstance(); + //window.ShowUtility(); + + //Debug.Log("showing build report window..."); + + //BRT_BuildReportWindow brtWindow = EditorWindow.GetWindow("Build Report", true, typeof(SceneView)); + BRT_BuildReportWindow brtWindow = + (BRT_BuildReportWindow) EditorWindow.GetWindow(typeof(BRT_BuildReportWindow), false, EDITOR_WINDOW_TITLE, + true); + //BRT_BuildReportWindow brtWindow = EditorWindow.GetWindow(typeof(BRT_BuildReportWindow), false, "Build Report", true) as BRT_BuildReportWindow; + brtWindow.Init(_lastKnownBuildInfo); + } + } +} // namespace BuildReportTool \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_ReportGenerator.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_ReportGenerator.cs.meta new file mode 100644 index 00000000..29546983 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_ReportGenerator.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 2fa31ef0bf24b9d49be86ab12b9e59e2 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_ReportGenerator_PublicAPI.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_ReportGenerator_PublicAPI.cs new file mode 100644 index 00000000..86554672 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_ReportGenerator_PublicAPI.cs @@ -0,0 +1,251 @@ +using UnityEngine; +using UnityEditor; + +namespace BuildReportTool +{ + public partial class ReportGenerator + { + public static void OnPreBuild() + { + BuildReportTool.Util.SaveBuildTime(); + } + + /// + /// Create and save a Build Report. This is meant to be used for users who have a + /// custom build script, or is automating a project build command from the command line. + /// + /// The Editor log needs to have build data for this to work, + /// so only call this after . + /// + /// + /// + /// This overload will make use of the project's current build settings. + /// + /// Specifically, that means it will retrieve the list of scenes from + /// , the build location using + /// , and the build target + /// using . + /// + /// If your build scripts are overriding the project's current build settings, + /// you should use + /// instead. + /// + /// + /// If your Unity Editor log file is not in + /// the default path, specify it here. Otherwise, leave this null so that + /// BuildReportTool will just use the default location of the Editor.log file. + /// + /// Path to folder where the Build Report XML file will be saved. + /// Leave this null so that BuildReportTool will just use the path specified in the saved options. + /// + /// The full path and filename of the created Build Report XML file, + /// or null if no Build Report was created. + public static string CreateReport(string customEditorLogPath = null, string customSavePath = null) + { + return CreateReport(null, null, EditorUserBuildSettings.activeBuildTarget, + customEditorLogPath, customSavePath); + } + +#if UNITY_5_5_OR_NEWER + /// + /// Create and save a Build Report. This is meant to be used for users who have a + /// custom build script, or is automating a project build command from the command line. + /// + /// The Editor log needs to have build data for this to work, + /// so only call this after . + /// + /// + /// + /// This overload will retrieve the list of scenes, the build location, and the + /// build target from the that you pass. + /// If your custom build script makes a BuildPlayerOptions, you can use this method + /// to re-use that BuildPlayerOptions for generating the Build Report. + /// + /// can be set to the build folder's absolute path, + /// but if there are multiple builds in that path, this should be set to the + /// absolute path to the build file itself instead + /// (e.g. exe file for Windows Standalone, apk file for Android, etc.). + /// + /// + /// The + /// that was used to create the build. + /// + /// If your Unity Editor log file is not in + /// the default path, specify it here. Otherwise, leave this null so that + /// BuildReportTool will just use the default location of the Editor.log file. + /// + /// Path to folder where the Build Report XML file will be saved. + /// Leave this null so that BuildReportTool will just use the path specified in the saved options. + /// + /// The full path and filename of the created Build Report XML file, + /// or null if no Build Report was created. + public static string CreateReport(BuildPlayerOptions buildPlayerOptions, + string customEditorLogPath = null, string customSavePath = null) + { + return CreateReport(buildPlayerOptions.scenes, buildPlayerOptions.locationPathName, buildPlayerOptions.target, + customEditorLogPath, customSavePath); + } +#endif + + /// + /// Create and save a Build Report. This is meant to be used for users who have a + /// custom build script, or is automating a project build command from the command line. + /// + /// The Editor log needs to have build data for this to work, + /// so only call this after . + /// + /// + /// + /// If your custom build scripts override the project's build settings, + /// this overload allows you to explicitly specify the list of scenes, the build + /// location, and the build target yourself. + /// + /// But if your build scripts didn't override the project's build settings, + /// you can instead use . + /// + /// + /// Which scenes were included in the build. Can be set to null + /// so that BuildReportTool will just use UnityEditor.EditorBuildSettings.scenes instead. + /// If you specified your own list of scenes when building, you should pass them here. + /// + /// Absolute path where the build was saved to. Can be set to null so that + /// BuildReportTool will just use Unity's + /// instead. If you specified your own build location, you should set it here. + /// + /// You can specify only the path to the build folder, but if there are multiple builds + /// in that folder, it is best to specify the path to the build file itself + /// (e.g. exe file for Windows Standalone, apk file for Android, etc.). + /// + /// Type of build platform being made. You can just pass + /// UnityEditor.EditorUserBuildSettings.activeBuildTarget if you didn't explicitly + /// set this. If you specified your own build target, you should pass it here. + /// + /// If your Unity Editor log file is not in the + /// default path, specify it here. Otherwise, leave this null so that BuildReportTool + /// will just use the default location of the Editor.log file. + /// + /// Path to folder where the Build Report XML file will be saved. + /// Leave this null so that BuildReportTool will just use the path specified in the saved options. + /// + /// The full path and filename of the created Build Report XML file, + /// or null if no Build Report was created. + public static string CreateReport(string[] scenes, string buildLocation, BuildTarget buildTarget, + string customEditorLogPath = null, string customSavePath = null) + { + BuildReportTool.Util.BuildTargetOfLastBuild = buildTarget; + + var editorLogPathToUse = !string.IsNullOrEmpty(customEditorLogPath) + ? customEditorLogPath + : BuildReportTool.Util.UsedEditorLogPath; + + if (!DoesEditorLogHaveBuildInfo(editorLogPathToUse)) + { + if (BuildReportTool.Util.IsDefaultEditorLogPathOverridden) + { + Debug.LogWarning(string.Format(NO_BUILD_INFO_OVERRIDDEN_LOG_WARNING, editorLogPathToUse, + BuildReportTool.Options.FoundPathForSavedOptions)); + } + else if (CheckIfUnityHasNoLogArgument()) + { + Debug.LogWarning(NO_BUILD_INFO_NO_LOG_WARNING); + } + else + { + Debug.LogWarning(NO_BUILD_INFO_WARNING); + } + + return null; + } + + var timeNow = System.DateTime.Now; + _lastPathToBuiltProject = buildLocation; + + Init(true, ref _lastKnownBuildInfo, scenes); + _lastKnownBuildInfo.TimeGot = timeNow; + _lastKnownBuildInfo.TimeGotReadable = timeNow.ToString(TIME_OF_BUILD_FORMAT); + + System.DateTime timeBuildStarted; + if (BuildReportTool.Util.HasBuildTime()) + { + timeBuildStarted = BuildReportTool.Util.LoadBuildTime(); + } + else + { + timeBuildStarted = timeNow; + } + + if (BuildReportTool.Options.CalculateAssetDependencies) + { + if (_lastKnownAssetDependencies == null) + { + _lastKnownAssetDependencies = new BuildReportTool.AssetDependencies(); + } + + _lastKnownAssetDependencies.TimeGot = timeBuildStarted; + } + + if (BuildReportTool.Options.CollectTextureImportSettings) + { + if (_lastKnownTextureData == null) + { + _lastKnownTextureData = new BuildReportTool.TextureData(); + } + + _lastKnownTextureData.TimeGot = timeBuildStarted; + } + + if (BuildReportTool.Options.CollectMeshData) + { + if (_lastKnownMeshData == null) + { + _lastKnownMeshData = new BuildReportTool.MeshData(); + } + + _lastKnownMeshData.TimeGot = timeBuildStarted; + } + else + { + if (_lastKnownMeshData != null) + { + _lastKnownMeshData.Clear(); + } + } + + if (BuildReportTool.Options.CollectPrefabData) + { + if (_lastKnownPrefabData == null) + { + _lastKnownPrefabData = new BuildReportTool.PrefabData(); + } + + _lastKnownPrefabData.TimeGot = timeBuildStarted; + } + else + { + if (_lastKnownPrefabData != null) + { + _lastKnownPrefabData.Clear(); + } + } + + _lastEditorLogPath = editorLogPathToUse; + + if (BuildReportTool.Options.IncludeUnusedPrefabsInReportCreation) + { + RefreshListOfAllPrefabsUsedInAllScenesIncludedInBuild(); + } + else + { + ClearListOfAllPrefabsUsedInAllScenes(); + } + + CommitAdditionalInfoToCache(); + + CreateBuildReport(_lastKnownBuildInfo); + + var savedFilePath = OnFinishedGetValues(_lastKnownBuildInfo, _lastKnownAssetDependencies, _lastKnownTextureData, _lastKnownMeshData, _lastKnownPrefabData, customSavePath); + + return savedFilePath; + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_ReportGenerator_PublicAPI.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_ReportGenerator_PublicAPI.cs.meta new file mode 100644 index 00000000..bc8ce575 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_ReportGenerator_PublicAPI.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 5d7223604cc43df4689a667b69fa4101 +timeCreated: 1559195468 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_TextureDataGenerator.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_TextureDataGenerator.cs new file mode 100644 index 00000000..76aa6ff2 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_TextureDataGenerator.cs @@ -0,0 +1,586 @@ +#define BRT_USE_INTERNAL_TEXTURE_IMPORTER_METHODS + +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace BuildReportTool +{ + public static class TextureDataGenerator + { + public static void CreateForUsedAssetsOnly(TextureData data, BuildReportTool.BuildInfo buildInfo, bool debugLog = false) + { + if (buildInfo == null) + { + if (debugLog) Debug.LogError("Can't create TextureData for Used Assets, BuildInfo is null"); + return; + } + if (debugLog) Debug.Log("Will create TextureData for Used Assets"); + + BuildReportTool.BuildPlatform buildPlatform = BuildReportTool.ReportGenerator.GetBuildPlatformFromString(buildInfo.BuildType, buildInfo.BuildTargetUsed); + + var textureDataEntries = data.GetTextureData(); + textureDataEntries.Clear(); + + AppendTextureData(data, buildPlatform, buildInfo.UsedAssets.All, false, debugLog); + } + + public static void CreateForAllAssets(TextureData data, BuildReportTool.BuildInfo buildInfo, bool debugLog = false) + { + if (buildInfo == null) + { + if (debugLog) Debug.LogError("Can't create TextureData for Used & Unused Assets, BuildInfo is null"); + return; + } + if (debugLog) Debug.Log("Will create TextureData for Used & Unused Assets"); + + BuildReportTool.BuildPlatform buildPlatform = BuildReportTool.ReportGenerator.GetBuildPlatformFromString(buildInfo.BuildType, buildInfo.BuildTargetUsed); + + var textureDataEntries = data.GetTextureData(); + textureDataEntries.Clear(); + + AppendTextureData(data, buildPlatform, buildInfo.UsedAssets.All, false, debugLog); + AppendTextureData(data, buildPlatform, buildInfo.UnusedAssets.All, false, debugLog); + } + + static void AppendTextureData(TextureData data, BuildReportTool.BuildPlatform buildPlatform, IList assets, bool overwriteExistingEntries, bool debugLog = false) + { + if (debugLog) Debug.LogFormat("Creating Texture Data for {0} assets", assets.Count.ToString()); + + var platformString = GetPlatformString(buildPlatform); + var textureDataEntries = data.GetTextureData(); + + for (int n = 0; n < assets.Count; ++n) + { + if (!Util.IsTextureFile(assets[n].Name)) + { + // this asset is not an image, skip it + continue; + } + + if (textureDataEntries.ContainsKey(assets[n].Name)) + { + if (!overwriteExistingEntries) + { + continue; + } + else + { + var newEntry = CreateEntry(assets[n].Name, platformString, debugLog); + textureDataEntries[assets[n].Name] = newEntry; + } + } + else + { + var newEntry = CreateEntry(assets[n].Name, platformString, debugLog); + textureDataEntries.Add(assets[n].Name, newEntry); + } + } + } + + const int ANISO_LEVEL_IF_VALUE_IS_NEGATIVE_ONE = 1; + const int COMPRESSION_QUALITY_IF_VALUE_IS_NEGATIVE_ONE = 50; + const string WRAP_MODE_IF_VALUE_IS_NEGATIVE_ONE = "Repeat"; + + static TextureData.Entry CreateEntry(string assetPath, string platform, bool debugLog = false) + { + var assetImporter = AssetImporter.GetAtPath(assetPath); + if (assetImporter == null) + { + if (debugLog) Debug.LogErrorFormat("AssetImporter.GetAtPath returned null for {0}", assetPath); + return new TextureData.Entry(); + } + + var textureImporter = assetImporter as TextureImporter; + if (textureImporter == null) + { + if (debugLog) Debug.LogErrorFormat("AssetImporter is not a TextureImporter for {0}", assetPath); + return new TextureData.Entry(); + } + + // ----------------------------------------------------------------------- + + if (debugLog) Debug.LogFormat("Inspecting Texture: {0}", assetPath); + + var result = new TextureData.Entry(); + + // ----------------------------------------------------------------------- + + // textureImporter.textureType: enum (whether it's GUI, lightmap, normal map, sprite, etc.) + result.TextureType = TextureTypeToReadableString(textureImporter.textureType); + +#if UNITY_5_5_OR_NEWER + result.IsSRGB = textureImporter.sRGBTexture; +#else + result.IsSRGB = !textureImporter.linearTexture; // obsolete in Unity 5.5 +#endif + if (result.IsSRGB) + { + switch (textureImporter.textureType) + { +#if UNITY_5_5_OR_NEWER + case TextureImporterType.NormalMap: +#else + case TextureImporterType.Bump: +#endif + case TextureImporterType.Lightmap: +#if UNITY_5_5_OR_NEWER + case TextureImporterType.SingleChannel: +#endif + if (debugLog) Debug.LogWarningFormat("Texture: {0} was marked as sRGB but it is a {1}", assetPath, result.TextureType); + result.IsSRGB = false; + break; + } + } + +#if UNITY_5_5_OR_NEWER + result.AlphaSource = textureImporter.alphaSource.ToString(); +#else + result.AlphaSource = null; +#endif + result.AlphaIsTransparency = textureImporter.alphaIsTransparency; +#if UNITY_2020_1_OR_NEWER + result.IgnorePngGamma = textureImporter.ignorePngGamma; +#else + result.IgnorePngGamma = false; // doesn't exist yet in Unity 2019 and below +#endif + + // ----------------------------------------------------------------------- + + result.IsReadable = textureImporter.isReadable; + result.MipMapGenerated = textureImporter.mipmapEnabled; + result.MipMapFilter = textureImporter.mipmapFilter.ToString(); +#if UNITY_2018_2_OR_NEWER + result.StreamingMipMaps = textureImporter.streamingMipmaps; +#else + result.StreamingMipMaps = false; // doesn't exist yet in Unity 2018.1 and below +#endif + result.BorderMipMaps = textureImporter.borderMipmap; +#if UNITY_2017_1_OR_NEWER + result.PreserveCoverageMipMaps = textureImporter.mipMapsPreserveCoverage; +#else + result.PreserveCoverageMipMaps = false; +#endif + result.FadeOutMipMaps = textureImporter.fadeout; + + // ----------------------------------------------------------------------- + + result.SpriteImportMode = textureImporter.spriteImportMode.ToString(); +#if !UNITY_2022_2_OR_NEWER + result.SpritePackingTag = textureImporter.spritePackingTag; +#else + result.SpritePackingTag = null; // Sprite Packing Tag removed, replaced with Sprite Atlas assets +#endif + result.SpritePixelsPerUnit = textureImporter.spritePixelsPerUnit; + result.QualifiesForSpritePacking = textureImporter.qualifiesForSpritePacking; + + // ----------------------------------------------------------------------- + + result.WrapMode = WrapModeToReadableString(textureImporter.wrapMode); +#if UNITY_2017_1_OR_NEWER + result.WrapModeU = WrapModeToReadableString(textureImporter.wrapModeU); + result.WrapModeV = WrapModeToReadableString(textureImporter.wrapModeV); + result.WrapModeW = WrapModeToReadableString(textureImporter.wrapModeW); +#else + result.WrapModeU = null; + result.WrapModeV = null; + result.WrapModeW = null; +#endif + + result.FilterMode = textureImporter.filterMode.ToString(); + + result.AnisoLevel = textureImporter.anisoLevel; + + if (result.AnisoLevel == -1) + { + result.AnisoLevel = ANISO_LEVEL_IF_VALUE_IS_NEGATIVE_ONE; + } + + // ----------------------------------------------------------------------- + + result.MaxTextureSize = textureImporter.maxTextureSize; +#if UNITY_5_5_OR_NEWER + var defaultSettings = textureImporter.GetDefaultPlatformTextureSettings(); + +#if UNITY_2017_2_OR_NEWER + result.TextureResizeAlgorithm = defaultSettings.resizeAlgorithm.ToString(); +#else + result.TextureResizeAlgorithm = string.Empty; +#endif + if (defaultSettings.format == TextureImporterFormat.Automatic) + { + result.TextureFormat = textureImporter.GetAutomaticFormat(platform).ToString(); + } + else + { + result.TextureFormat = defaultSettings.format.ToString(); + } + result.CompressionType = CompressionTypeToReadableString(defaultSettings.textureCompression); + result.CompressionIsCrunched = defaultSettings.crunchedCompression; +#else + // Unity 5.4 and below + result.TextureResizeAlgorithm = null; + result.TextureFormat = TextureFormatToReadableString(textureImporter.textureFormat); + result.CompressionType = null; // no compression type in Unity 5.4 and below + result.CompressionIsCrunched = false; // no crunch compression in Unity 5.4 and below +#endif + result.CompressionQuality = textureImporter.compressionQuality; + if (result.CompressionQuality == -1) + { + result.CompressionQuality = COMPRESSION_QUALITY_IF_VALUE_IS_NEGATIVE_ONE; + } + + // ----------------------------------------------------------------------- + +#if UNITY_5_5_OR_NEWER + var overrideSettings = !string.IsNullOrEmpty(platform) ? textureImporter.GetPlatformTextureSettings(platform) : null; + if (overrideSettings != null && overrideSettings.overridden) + { + result.PlatformSettingsOverriden = true; + result.OverridingMaxTextureSize = overrideSettings.maxTextureSize; +#if UNITY_2017_2_OR_NEWER + result.OverridingTextureResizeAlgorithm = overrideSettings.resizeAlgorithm.ToString(); +#else + result.OverridingTextureResizeAlgorithm = string.Empty; +#endif + if (overrideSettings.format == TextureImporterFormat.Automatic) + { + result.OverridingTextureFormat = textureImporter.GetAutomaticFormat(platform).ToString(); + } + else + { + result.OverridingTextureFormat = overrideSettings.format.ToString(); + } + result.OverridingCompressionType = CompressionTypeToReadableString(overrideSettings.textureCompression); + result.OverridingCompressionIsCrunched = overrideSettings.crunchedCompression; + result.OverridingCompressionQuality = overrideSettings.compressionQuality; + if (result.OverridingCompressionQuality == -1) + { + result.OverridingCompressionQuality = COMPRESSION_QUALITY_IF_VALUE_IS_NEGATIVE_ONE; + } + + if (debugLog && result.TextureFormat != result.OverridingTextureFormat) + Debug.LogFormat("TextureDataGenerator: {0} for {1} format overriden from {2} to {3}", + platform, assetPath, result.TextureFormat, result.OverridingTextureFormat); + + if (debugLog && result.MaxTextureSize != result.OverridingMaxTextureSize) + Debug.LogFormat("TextureDataGenerator: {0} for {1} max size overriden from {2} to {3}", + platform, assetPath, result.MaxTextureSize.ToString(), result.OverridingMaxTextureSize.ToString()); + } + else +#endif + { + result.PlatformSettingsOverriden = false; + result.OverridingMaxTextureSize = 0; + result.OverridingTextureResizeAlgorithm = null; + result.OverridingTextureFormat = null; + result.OverridingCompressionType = null; + result.OverridingCompressionIsCrunched = false; + result.OverridingCompressionQuality = 0; + } + + // ----------------------------------------------------------------------- + + // Note: there are two import settings can make the + // imported width/height different from the real width/height: + // MaxTextureSize (which is a max limit on the value), + // and NPotScale (which will resize to a power-of-two value if specified) + + var loadedTexture = AssetDatabase.LoadAssetAtPath(assetPath, typeof(Texture)) as Texture; + + if (loadedTexture != null) + { + result.ImportedWidth = loadedTexture.width; + result.ImportedHeight = loadedTexture.height; + + if (debugLog) + Debug.LogFormat("Got imported dimensions (using AssetDatabase.LoadAssetAtPath Texture) for {0} {1}x{2}", + assetPath, result.ImportedWidth.ToString(), result.ImportedHeight.ToString()); + } + else + { + if (debugLog) + Debug.LogErrorFormat("Could not get imported width and height, AssetDatabase.LoadAssetAtPath returned null for {0}", assetPath); + + // could not load texture, so we can't get imported width and height + result.ImportedWidth = 0; + result.ImportedHeight = 0; + } + + result.UpdateShownSettings(platform); + + if (textureImporter.npotScale == TextureImporterNPOTScale.None) + { + if (Mathf.IsPowerOfTwo(result.ImportedWidth) && Mathf.IsPowerOfTwo(result.ImportedHeight)) + { + result.NPotScale = BuildReportTool.TextureData.NPOT_SCALE_NONE_IS_POT; + } + else + { + result.NPotScale = BuildReportTool.TextureData.NPOT_SCALE_NONE_NOT_POT; + } + } + else + { + result.NPotScale = textureImporter.npotScale.ToString(); + } + + var gotDimensions = GetImageRealWidthAndHeight(assetPath, textureImporter, debugLog); + result.RealWidth = gotDimensions.Width; + result.RealHeight = gotDimensions.Height; + + return result; + } + + // ======================================================================================== + +#if !UNITY_5_5_OR_NEWER + static string TextureFormatToReadableString(TextureImporterFormat textureFormat) + { + return textureFormat.ToString(); + } +#endif + + static string TextureTypeToReadableString(TextureImporterType textureType) + { + switch (textureType) + { +#if UNITY_5_5_OR_NEWER + case TextureImporterType.Default: + return "Default"; + case TextureImporterType.SingleChannel: + return "Single Channel"; + case TextureImporterType.NormalMap: + return "Normal Map"; +#else + case TextureImporterType.Bump: + return "Normal Map"; +#endif + case TextureImporterType.GUI: + return "GUI"; + case TextureImporterType.Sprite: + return "Sprite"; + case TextureImporterType.Cursor: + return "Cursor"; + case TextureImporterType.Cookie: + return "Cookie"; + case TextureImporterType.Lightmap: + return "Lightmap"; +#if UNITY_2020_2_OR_NEWER + case TextureImporterType.DirectionalLightmap: + return "Directional Lightmap"; +#endif + default: + return textureType.ToString(); + } + } + + static string WrapModeToReadableString(TextureWrapMode wrapMode) + { + switch (wrapMode) + { + case TextureWrapMode.Repeat: + return "Repeat"; + case TextureWrapMode.Clamp: + return "Clamp"; +#if UNITY_2017_1_OR_NEWER + case TextureWrapMode.Mirror: + return "Mirror"; + case TextureWrapMode.MirrorOnce: + return "MirrorOnce"; +#endif + default: + if ((int)wrapMode == -1) + { + return WRAP_MODE_IF_VALUE_IS_NEGATIVE_ONE; + } + return string.Format("Unrecognized ({0})", wrapMode.ToString()); + } + } + +#if UNITY_5_5_OR_NEWER + static string CompressionTypeToReadableString(TextureImporterCompression compression) + { + switch (compression) + { + case TextureImporterCompression.Uncompressed: + return "Uncompressed"; + case TextureImporterCompression.Compressed: + return "Standard Compression"; + case TextureImporterCompression.CompressedHQ: + return "High Quality, Low Compression"; + case TextureImporterCompression.CompressedLQ: + return "Low Quality, High Compression"; + default: + return compression.ToString(); + } + } +#endif + + public static string GetPlatformString(BuildPlatform buildPlatform) + { + // options for the platform string are: + // in Unity 5.5: "Standalone", "Web", "iPhone", "Android", "WebGL", "Windows Store Apps", "Tizen", "PSP2", "PS4", "XboxOne", "Samsung TV", "Nintendo 3DS", "WiiU" and "tvOS" + // in Unity 2017.4: "Standalone", "Web", "iPhone", "Android", "WebGL", "Windows Store Apps", "PSP2", "PS4", "XboxOne", "Nintendo 3DS", "WiiU" and "tvOS". Tizen & Samsung TV removed + // in Unity 2018.1: "Standalone", "Web", "iPhone", "Android", "WebGL", "Windows Store Apps", "PSP2", "PS4", "XboxOne", "Nintendo 3DS" and "tvOS". WiiU removed + // in Unity 2018.2: "Standalone", "Web", "iPhone", "Android", "WebGL", "Windows Store Apps", "PSP2", "PS4", "XboxOne", "Nintendo 3DS" and "tvOS". no change + // in Unity 2018.3: "Standalone", "Web", "iPhone", "Android", "WebGL", "Windows Store Apps", "PS4", "XboxOne", "Nintendo 3DS" and "tvOS". PSP2 (i.e. PS Vita) removed + // in Unity 2018.4: "Standalone", "Web", "iPhone", "Android", "WebGL", "Windows Store Apps", "PS4", "XboxOne", "Nintendo 3DS" and "tvOS". no change + // in Unity 2019.3: "Standalone", "Web", "iPhone", "Android", "WebGL", "Windows Store Apps", "PS4", "XboxOne", "Nintendo 3DS" and "tvOS". no change + // in Unity 2019.4: "Standalone", "Web", "iPhone", "Android", "WebGL", "Windows Store Apps", "PS4", "XboxOne", "Nintendo Switch" and "tvOS". 3DS removed, Switch added + // in Unity 2020.3: "Standalone", "Web", "iPhone", "Android", "WebGL", "Windows Store Apps", "PS4", "XboxOne", "Nintendo Switch" and "tvOS". no change + // in Unity 2021.1: "Standalone", "Web", "iPhone", "Android", "WebGL", "Windows Store Apps", "PS4", "XboxOne", "Nintendo Switch" and "tvOS". no change + + switch (buildPlatform) + { + case BuildPlatform.Android: + return "Android"; + case BuildPlatform.iOS: + return "iPhone"; + case BuildPlatform.Tizen: + return "Tizen"; + case BuildPlatform.Web: + return "Web"; + case BuildPlatform.WebGL: + return "WebGL"; + case BuildPlatform.MacOSX32: + case BuildPlatform.MacOSX64: + case BuildPlatform.MacOSXUniversal: + case BuildPlatform.Linux32: + case BuildPlatform.Linux64: + case BuildPlatform.LinuxUniversal: + case BuildPlatform.Windows32: + case BuildPlatform.Windows64: + return "Standalone"; + case BuildPlatform.WindowsStoreApp: + return "Windows Store Apps"; + case BuildPlatform.XboxOne: + return "XboxOne"; + case BuildPlatform.XboxSeries: + return "GameCoreXboxSeries"; + case BuildPlatform.PS4: + return "PS4"; + case BuildPlatform.PS5: + return "PS5"; + case BuildPlatform.PSVitaNative: + return "PSP2"; + case BuildPlatform.WiiU: + return "WiiU"; + case BuildPlatform.Nintendo3DS: + return "Nintendo 3DS"; + case BuildPlatform.Switch: + return "Nintendo Switch"; + default: + return null; + } + } + + // ======================================================================================== + +#if BRT_USE_INTERNAL_TEXTURE_IMPORTER_METHODS +#if UNITY_2018_1_OR_NEWER + /// + /// for getting image's real width and height. + /// This method is private, at least as of Unity 2020.1.17f1. + /// + static readonly System.Reflection.MethodInfo TextureImporterGetSourceTextureInformation = + typeof(TextureImporter).GetMethod("GetSourceTextureInformation", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); +#endif + + /// + /// for getting image's real width and height. + /// This method is internal, at least as of Unity 2020.1.17f1. + /// + static readonly System.Reflection.MethodInfo TextureImporterGetWidthAndHeight = + typeof(TextureImporter).GetMethod("GetWidthAndHeight", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + + static object[] _getWidthAndHeightParameters; +#endif + + static ImageUtility.Dimensions GetImageRealWidthAndHeight(string assetPath, TextureImporter textureImporter, bool debugLog = false) + { + // Using UnityEditor.TextureImporter.GetSourceTextureInformation is preferred, since it will work with all Unity-supported image types. + // But since it's a private method, Unity makes no guarantee that it will still be available in future versions. + // It's only available starting at Unity 2018.1 (doesn't exist in Unity 2017 and below). + // Also, for Unity versions 2018.1 up to 2020.1, the return value itself (the SourceTextureInformation struct), + // is in the UnityEditor.Experimental namespace. But starting 2020.2, it has moved out of the Experimental namespace. + // + // This is why we have multiple fallbacks in case GetSourceTextureInformation doesn't work. + // + // UnityEditor.TextureImporter.GetWidthAndHeight is a little better, since we don't need to + // deal with the UnityEditor.Experimental namespace that way, it also works with all + // Unity-supported image types (just like GetSourceTextureInformation), and it exists in Unity 2017. + // The only disadvantage is that it requires allocation since it uses ref parameters. + // + // If for any reason, GetWidthAndHeight doesn't work, ImageUtility.Dimension.Get is our last resort. + // It will attempt to open the file, and find the data inside that relates to width and height + // (it doesn't require loading the entire image into memory). + // + // The disadvantage is that among the image types that Unity uses, and the image types + // that ImageUtility.Dimension.Get knows, this last resort currently only works + // for jpg (currently jfif only), png, gif, and bmp files. + // +#if BRT_USE_INTERNAL_TEXTURE_IMPORTER_METHODS +#if UNITY_2018_1_OR_NEWER + if (TextureImporterGetSourceTextureInformation != null) + { +#if UNITY_2020_2_OR_NEWER // SourceTextureInformation was moved out of Experimental namespace in Unity 2020.2 + var sourceTextureInfo = (UnityEditor.AssetImporters.SourceTextureInformation) +#else + var sourceTextureInfo = (UnityEditor.Experimental.AssetImporters.SourceTextureInformation) +#endif + TextureImporterGetSourceTextureInformation.Invoke(textureImporter, null); + + if (debugLog) Debug.LogFormat("Got dimensions (using GetSourceTextureInformation) for {0} {1}x{2}", + assetPath, sourceTextureInfo.width.ToString(), sourceTextureInfo.height.ToString()); + + ImageUtility.Dimensions returnValue; + returnValue.Width = sourceTextureInfo.width; + returnValue.Height = sourceTextureInfo.height; + return returnValue; + } +#endif + + if (TextureImporterGetWidthAndHeight != null) + { + if (_getWidthAndHeightParameters == null) + { + _getWidthAndHeightParameters = new object[] { new int(), new int() }; + } + TextureImporterGetWidthAndHeight.Invoke(textureImporter, _getWidthAndHeightParameters); + + ImageUtility.Dimensions returnValue; + returnValue.Width = (int)_getWidthAndHeightParameters[0]; + returnValue.Height = (int)_getWidthAndHeightParameters[1]; + + if (debugLog) Debug.LogFormat("Got dimensions (using GetWidthAndHeight) for {0} {1}x{2}", + assetPath, returnValue.Width.ToString(), returnValue.Height.ToString()); + + return returnValue; + } +#endif + if (assetPath.EndsWith(".jpg", System.StringComparison.OrdinalIgnoreCase) || + assetPath.EndsWith(".jpeg", System.StringComparison.OrdinalIgnoreCase) || + assetPath.EndsWith(".png", System.StringComparison.OrdinalIgnoreCase) || + assetPath.EndsWith(".bmp", System.StringComparison.OrdinalIgnoreCase) || + assetPath.EndsWith(".gif", System.StringComparison.OrdinalIgnoreCase)) + { + // remove 6 for the "Assets" at the start, before prefixing it with the project path + var assetFullPath = string.Format("{0}{1}", Application.dataPath, assetPath.Substring(6)); + //if (debugLog) Debug.LogFormat("Full path of: {0}\n{1}", assetPath, assetFullPath); + + var returnValue = ImageUtility.Dimension.Get(assetFullPath); + + if (debugLog) Debug.LogFormat("Got dimensions (using ImageDimensions.Get.AsTuple) for {0} {1}x{2}", + assetPath, returnValue.Width.ToString(), returnValue.Height.ToString()); + + return returnValue; + } + + // none of the options worked. no choice but to return error values + return ImageUtility.Dimensions.ErrorValue; + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_TextureDataGenerator.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_TextureDataGenerator.cs.meta new file mode 100644 index 00000000..20d486bd --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_TextureDataGenerator.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 76966f4a178ba2846b53e3c1ff9ce031 +timeCreated: 1569214588 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_UnityBuildSettingsUtility.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_UnityBuildSettingsUtility.cs new file mode 100644 index 00000000..e8bc98f9 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_UnityBuildSettingsUtility.cs @@ -0,0 +1,2117 @@ +using System; +using System.Collections.Generic; +#if UNITY_5_3_OR_NEWER // 5.2 and greater +using System.Linq; +#endif +using UnityEditor; +using UnityEngine; + +namespace BuildReportTool +{ + public static class UnityBuildSettingsUtility + { + // ================================================================================================ + + public static GUIContent[] GetBuildSettingsCategoryListForDropdownBox() + { + // WARNING! changing contents here will require changing code in: + // + // GetIdxFromBuildReportValues + // GetSettingsCategoryFromIdx + // + // as they rely on the array indices + // + return new[] + { + /* 0 */ new GUIContent("Windows"), + /* 1 */ new GUIContent("Mac"), + /* 2 */ new GUIContent("Linux"), + + /* 3 */ new GUIContent("Web"), + /* 4 */ new GUIContent("Web GL"), + + /* 5 */ new GUIContent("iOS"), + /* 6 */ new GUIContent("tvOS"), + /* 7 */ new GUIContent("Android"), + /* 8 */ new GUIContent("Blackberry"), + + /* 9 */ new GUIContent("Xbox 360"), + /* 10 */ new GUIContent("Xbox One"), + /* 11 */ new GUIContent("Xbox Series"), + /* 12 */ new GUIContent("Playstation 3"), + /* 13 */ new GUIContent("Playstation 4"), + /* 14 */ new GUIContent("Playstation 5"), + + /* 15 */ new GUIContent("Playstation Vita (Native)"), + + /* 16 */ new GUIContent("Samsung TV"), + }; + } + + + public static int GetIdxFromBuildReportValues(BuildInfo buildReportToDisplay) + { + BuildSettingCategory b = ReportGenerator.GetBuildSettingCategoryFromBuildValues(buildReportToDisplay); + + switch (b) + { + case BuildSettingCategory.WindowsDesktopStandalone: + return 0; + case BuildSettingCategory.MacStandalone: + return 1; + case BuildSettingCategory.LinuxStandalone: + return 2; + + case BuildSettingCategory.WebPlayer: + return 3; + case BuildSettingCategory.WebGL: + return 4; + + case BuildSettingCategory.iOS: + return 5; + case BuildSettingCategory.tvOS: + return 6; + case BuildSettingCategory.Android: + return 7; + case BuildSettingCategory.Blackberry: + return 8; + + case BuildSettingCategory.Xbox360: + return 9; + case BuildSettingCategory.XboxOne: + return 10; + case BuildSettingCategory.XboxSeries: + return 11; + case BuildSettingCategory.PS3: + return 12; + case BuildSettingCategory.PS4: + return 13; + case BuildSettingCategory.PS5: + return 14; + + case BuildSettingCategory.PSVita: + return 15; + + case BuildSettingCategory.SamsungTV: + return 16; + } + + return -1; + } + + public static BuildSettingCategory GetSettingsCategoryFromIdx(int idx) + { + switch (idx) + { + case 0: + return BuildSettingCategory.WindowsDesktopStandalone; + case 1: + return BuildSettingCategory.MacStandalone; + case 2: + return BuildSettingCategory.LinuxStandalone; + + case 3: + return BuildSettingCategory.WebPlayer; + case 4: + return BuildSettingCategory.WebGL; + + case 5: + return BuildSettingCategory.iOS; + case 6: + return BuildSettingCategory.tvOS; + case 7: + return BuildSettingCategory.Android; + case 8: + return BuildSettingCategory.Blackberry; + + case 9: + return BuildSettingCategory.Xbox360; + case 10: + return BuildSettingCategory.XboxOne; + case 11: + return BuildSettingCategory.XboxSeries; + case 12: + return BuildSettingCategory.PS3; + case 13: + return BuildSettingCategory.PS4; + case 14: + return BuildSettingCategory.PS5; + + case 15: + return BuildSettingCategory.PSVita; + + case 16: + return BuildSettingCategory.SamsungTV; + } + + return BuildSettingCategory.None; + } + + public static string GetReadableBuildSettingCategory(BuildSettingCategory b) + { + switch (b) + { + case BuildSettingCategory.WindowsDesktopStandalone: + return "Windows"; + + case BuildSettingCategory.WindowsStoreApp: + return "Windows Store App"; + + case BuildSettingCategory.WindowsPhone8: + return "Windows Phone 8"; + + case BuildSettingCategory.MacStandalone: + return "Mac"; + + case BuildSettingCategory.LinuxStandalone: + return "Linux"; + + + case BuildSettingCategory.WebPlayer: + return "Web Player"; + + + case BuildSettingCategory.Xbox360: + return "Xbox 360"; + case BuildSettingCategory.XboxOne: + return "Xbox One"; + case BuildSettingCategory.XboxSeries: + return "Xbox Series"; + + case BuildSettingCategory.PS3: + return "Playstation 3"; + case BuildSettingCategory.PS4: + return "Playstation 4"; + case BuildSettingCategory.PS5: + return "Playstation 5"; + + case BuildSettingCategory.PSVita: + return "Playstation Vita (Native)"; + + case BuildSettingCategory.PSM: + return "Playstation Mobile"; + + case BuildSettingCategory.WebGL: + return "Web GL"; + } + + return b.ToString(); + } + + + public static string GetReadableWebGLOptimizationLevel(string optimizationLevelCode) + { + switch (optimizationLevelCode) + { + case "1": + return "1: Slow (fast builds)"; + case "2": + return "2: Fast"; + case "3": + return "3: Fastest (very slow builds)"; + } + + return optimizationLevelCode; + } + + public static string GetReadableStackTraceType(string stackTraceType) + { + switch (stackTraceType) + { + case "ScriptOnly": + return "Show stack trace of scripts only (no native code)"; + case "Full": + return "Show stack trace of native code + scripts"; + default: + return stackTraceType; + } + } + + // ================================================================================================ + + public static void Populate(UnityBuildSettings settings) + { + PopulateGeneralSettings(settings); + PopulateWebSettings(settings); + PopulateStandaloneSettings(settings); + PopulateMobileSettings(settings); + PopulateTvDeviceSettings(settings); + PopulateBigConsoleGen07Settings(settings); + PopulateBigConsoleGen08Settings(settings); + PopulatePackageSettings(settings); + } + + + public static void PopulateGeneralSettings(UnityBuildSettings settings) + { + settings.CompanyName = PlayerSettings.companyName; + settings.ProductName = PlayerSettings.productName; + + settings.UsingAdvancedLicense = PlayerSettings.advancedLicense; + +#if UNITY_5_6_OR_NEWER + settings.ApplicationIdentifier = PlayerSettings.applicationIdentifier; +#endif + + // debug settings + // --------------------------------------------------------------- + settings.EnableDevelopmentBuild = EditorUserBuildSettings.development; + settings.EnableDebugLog = PlayerSettings.usePlayerLog; + settings.EnableSourceDebugging = EditorUserBuildSettings.allowDebugging; +#if UNITY_2019_3_OR_NEWER + settings.WaitForManagedDebugger = EditorUserBuildSettings.waitForManagedDebugger; +#endif + settings.EnableExplicitNullChecks = EditorUserBuildSettings.explicitNullChecks; + +#if UNITY_EDITOR_WIN +#if UNITY_5_6_OR_NEWER + settings.WinIncludeNativePdbFilesInBuild = UnityEditor.WindowsStandalone.UserBuildSettings.copyPDBFiles; +#else + settings.WinIncludeNativePdbFilesInBuild = false; +#endif +#if UNITY_2017_1_OR_NEWER + settings.WinCreateVisualStudioSolution = UnityEditor.WindowsStandalone.UserBuildSettings.createSolution; +#else + settings.WinCreateVisualStudioSolution = false; +#endif +#endif + +#if UNITY_5_4_OR_NEWER + settings.EnableExplicitDivideByZeroChecks = EditorUserBuildSettings.explicitDivideByZeroChecks; +#endif +#if UNITY_2018_1_OR_NEWER + settings.EnableArrayBoundsChecks = EditorUserBuildSettings.explicitArrayBoundsChecks; +#endif + +#if !UNITY_4 + settings.EnableCrashReportApi = PlayerSettings.enableCrashReportAPI; + settings.EnableInternalProfiler = PlayerSettings.enableInternalProfiler; + settings.ActionOnDotNetUnhandledException = PlayerSettings.actionOnDotNetUnhandledException.ToString(); +#endif + + settings.ConnectProfiler = EditorUserBuildSettings.connectProfiler; + +#if UNITY_5_3_OR_NEWER && !UNITY_2017_1_OR_NEWER + // this setting actually started appearing in Unity 5.2.2 (it is not present in 5.2.1) + // but our script compilation defines can't detect the patch number in the version, + // so we have no choice but to restrict this to 5.3 + settings.ForceOptimizeScriptCompilation = EditorUserBuildSettings.forceOptimizeScriptCompilation; +#endif + +#if UNITY_5_4_OR_NEWER + settings.StackTraceForError = PlayerSettings.GetStackTraceLogType(LogType.Error).ToString(); + settings.StackTraceForAssert = PlayerSettings.GetStackTraceLogType(LogType.Assert).ToString(); + settings.StackTraceForWarning = PlayerSettings.GetStackTraceLogType(LogType.Warning).ToString(); + settings.StackTraceForLog = PlayerSettings.GetStackTraceLogType(LogType.Log).ToString(); + settings.StackTraceForException = PlayerSettings.GetStackTraceLogType(LogType.Exception).ToString(); +#endif + + + // build settings + // --------------------------------------------------------------- +#if UNITY_2021_2_OR_NEWER + settings.EnableHeadlessMode = EditorUserBuildSettings.standaloneBuildSubtarget == StandaloneBuildSubtarget.Server; +#else + settings.EnableHeadlessMode = EditorUserBuildSettings.enableHeadlessMode; +#endif + settings.InstallInBuildFolder = EditorUserBuildSettings.installInBuildFolder; +#if !UNITY_4 + settings.ForceInstallation = EditorUserBuildSettings.forceInstallation; + settings.BuildScriptsOnly = EditorUserBuildSettings.buildScriptsOnly; + settings.BakeCollisionMeshes = PlayerSettings.bakeCollisionMeshes; +#endif + +#if UNITY_4 + settings.StripPhysicsCode = PlayerSettings.stripPhysics; +#endif + settings.StripUnusedMeshComponents = PlayerSettings.stripUnusedMeshComponents; + +#if UNITY_5_3_OR_NEWER // 5.2 and greater (but Unity 5.2 doesn't have a define so we use 5.3) + settings.StripEngineCode = PlayerSettings.stripEngineCode; +#endif + +#if UNITY_2020_1_OR_NEWER + settings.StripUnusedMips = PlayerSettings.mipStripping; +#endif + + + // code settings + // --------------------------------------------------------------- + + Dictionary customDefines = DldUtil.GetRspDefines.GetDefines(); + + List defines = new List(); + defines.AddRange(EditorUserBuildSettings.activeScriptCompilationDefines); + + + foreach (KeyValuePair customDefine in customDefines) + { + if (customDefine.Value.TimesDefinedInBuiltIn == 0) + { + defines.Add(customDefine.Key); + } + } + + settings.CompileDefines = defines.ToArray(); + +#if UNITY_2019_1_OR_NEWER + settings.IncrementalGC = PlayerSettings.gcIncremental; +#endif +#if UNITY_2019_4_OR_NEWER + settings.SuppressCommonWarnings = PlayerSettings.suppressCommonWarnings; +#endif + + BuildTarget buildTarget = EditorUserBuildSettings.activeBuildTarget; + BuildTargetGroup targetGroup = BuildPipeline.GetBuildTargetGroup(buildTarget); +#if UNITY_2021_2_OR_NEWER + var namedBuildTarget = UnityEditor.Build.NamedBuildTarget.FromBuildTargetGroup(targetGroup); +#endif + +#if UNITY_2021_2_OR_NEWER + settings.ScriptingBackend = PlayerSettings.GetScriptingBackend(namedBuildTarget).ToString(); +#elif UNITY_2017_1_OR_NEWER + settings.ScriptingBackend = PlayerSettings.GetScriptingBackend(targetGroup).ToString(); +#endif + +#if UNITY_2017_1_OR_NEWER + settings.AdditionalIL2CPPArguments = PlayerSettings.GetAdditionalIl2CppArgs(); +#endif + +#if UNITY_2021_2_OR_NEWER + settings.AdditionalCompilerArguments = PlayerSettings.GetAdditionalCompilerArguments(namedBuildTarget); +#endif + +#if UNITY_2021_3_OR_NEWER + settings.StrippingLevelUsed = PlayerSettings + .GetManagedStrippingLevel(namedBuildTarget) + .ToString(); +#elif UNITY_2018_3_OR_NEWER + settings.StrippingLevelUsed = PlayerSettings + .GetManagedStrippingLevel(EditorUserBuildSettings.selectedBuildTargetGroup) + .ToString(); +#else + settings.StrippingLevelUsed = PlayerSettings.strippingLevel.ToString(); +#endif + + ApiCompatibilityLevel apiCompat; +#if UNITY_2021_3_OR_NEWER + apiCompat = PlayerSettings.GetApiCompatibilityLevel(namedBuildTarget); +#elif UNITY_5_6_OR_NEWER + apiCompat = PlayerSettings.GetApiCompatibilityLevel(EditorUserBuildSettings.selectedBuildTargetGroup); +#else + apiCompat = PlayerSettings.apiCompatibilityLevel; +#endif + + switch (apiCompat) + { + case ApiCompatibilityLevel.NET_Standard_2_0: + // NET_Standard_2_0 is deprecated, change to NET_Standard instead + // both NET_Standard_2_0 and NET_Standard have the same int value, so we have to force the change + settings.NETApiCompatibilityLevel = "NET_Standard"; + break; + case ApiCompatibilityLevel.NET_4_6: + // NET_4_6 is deprecated, change to NET_Unity_4_8 instead + // both NET_4_6 and NET_Unity_4_8 have the same int value, so we have to force the change + settings.NETApiCompatibilityLevel = "NET_Unity_4_8"; + break; + default: + settings.NETApiCompatibilityLevel = apiCompat.ToString(); + break; + } + +#if UNITY_2022_1_OR_NEWER + settings.IL2CPPCodeGeneration = PlayerSettings.GetIl2CppCodeGeneration(namedBuildTarget).ToString(); +#elif UNITY_2021_2_OR_NEWER + // Added in 2021.2, marked as obsolete in 2022.1 + settings.IL2CPPCodeGeneration = EditorUserBuildSettings.il2CppCodeGeneration.ToString(); +#endif + +#if UNITY_2022_1_OR_NEWER + settings.InsecureHttpOption = PlayerSettings.insecureHttpOption.ToString(); +#endif + +#if UNITY_2021_2_OR_NEWER + settings.IL2CPPCompilerConfig = PlayerSettings.GetIl2CppCompilerConfiguration(namedBuildTarget).ToString(); +#elif UNITY_2018_1_OR_NEWER + settings.IL2CPPCompilerConfig = PlayerSettings.GetIl2CppCompilerConfiguration(targetGroup).ToString(); +#endif + +#if UNITY_2018_1_OR_NEWER + settings.AllowUnsafeCode = PlayerSettings.allowUnsafeCode; +#endif + +#if UNITY_2022_2_OR_NEWER +#elif UNITY_2019_4_OR_NEWER + // Added in Unity 2019.4, marked as obsolete in Unity 2022.2 + settings.AssemblyVersionValidation = PlayerSettings.assemblyVersionValidation; +#endif + + settings.AOTOptions = PlayerSettings.aotOptions; + +#if UNITY_5_5_OR_NEWER + settings.LocationUsageDescription = PlayerSettings.iOS.locationUsageDescription; +#else + settings.LocationUsageDescription = PlayerSettings.locationUsageDescription; +#endif + + + // rendering settings + // --------------------------------------------------------------- + + settings.Use32BitDisplayBuffer = PlayerSettings.use32BitDisplayBuffer; + settings.UseHDRDisplay = PlayerSettings.useHDRDisplay; + settings.ColorSpaceUsed = PlayerSettings.colorSpace.ToString(); + settings.UseMultithreadedRendering = PlayerSettings.MTRendering; + settings.UseGPUSkinning = PlayerSettings.gpuSkinning; + settings.VisibleInBackground = PlayerSettings.visibleInBackground; + +#if UNITY_2022_3_OR_NEWER + settings.AllowHDRDisplaySupport = PlayerSettings.allowHDRDisplaySupport; +#endif + +#if UNITY_2022_2_OR_NEWER + settings.HdrBitDepth = PlayerSettings.hdrBitDepth.ToString(); +#endif + +#if UNITY_2018_3_OR_NEWER + settings.LegacyClampBlendShapeWeights = PlayerSettings.legacyClampBlendShapeWeights; +#endif + +#if UNITY_2021_2_OR_NEWER + settings.OverrideMaxTextureSize = EditorUserBuildSettings.overrideMaxTextureSize; + settings.OverrideTextureCompression = EditorUserBuildSettings.overrideTextureCompression.ToString(); +#endif + +#if UNITY_2020_1_OR_NEWER + settings.VirtualTexturingSupportEnabled = PlayerSettings.GetVirtualTexturingSupportEnabled(); +#endif + +#if UNITY_2020_2_OR_NEWER + settings.NormalMapEncoding = PlayerSettings.GetNormalMapEncoding(namedBuildTarget).ToString(); + settings.ShaderPrecisionModel = PlayerSettings.GetShaderPrecisionModel().ToString(); +#endif + +#if UNITY_2021_3_OR_NEWER && !UNITY_2021_3_0 && !UNITY_2021_3_1 && !UNITY_2021_3_2 && !UNITY_2021_3_3 && !UNITY_2021_3_4 && !UNITY_2021_3_5 && !UNITY_2021_3_6 && !UNITY_2021_3_7 && !UNITY_2021_3_8 && !UNITY_2021_3_9 && !UNITY_2021_3_10 && !UNITY_2021_3_11 + settings.ShaderChunkCountForPlatform = PlayerSettings.GetShaderChunkCountForPlatform(buildTarget); + settings.ShaderChunkSizeInMBForPlatform = PlayerSettings.GetShaderChunkSizeInMBForPlatform(buildTarget); +#endif + +#if UNITY_2022_1_OR_NEWER + settings.StrictShaderVariantMatching = PlayerSettings.strictShaderVariantMatching; + settings.SpriteBatchVertexThreshold = PlayerSettings.spriteBatchVertexThreshold; +#endif + +#if UNITY_5_4_OR_NEWER + settings.UseGraphicsJobs = PlayerSettings.graphicsJobs; +#endif +#if UNITY_5_5_OR_NEWER + settings.GraphicsJobsType = PlayerSettings.graphicsJobMode.ToString(); + settings.StereoRenderingPath = PlayerSettings.stereoRenderingPath.ToString(); +#endif + +#if (UNITY_EDITOR_WIN || UNITY_EDITOR_OSX) +#if UNITY_5_5_OR_NEWER + settings.RenderingPathUsed = UnityEditor.Rendering.EditorGraphicsSettings + .GetTierSettings(EditorUserBuildSettings.selectedBuildTargetGroup, + Graphics.activeTier).renderingPath.ToString(); +#else + settings.RenderingPathUsed = PlayerSettings.renderingPath.ToString(); +#endif +#endif + +#if UNITY_5_3_OR_NEWER && !UNITY_2019_3_OR_NEWER // 5.2 (but Unity 5.2 doesn't have a define so we use 5.3) to 2019.2 + settings.EnableVirtualRealitySupport = PlayerSettings.virtualRealitySupported; +#elif UNITY_2019_3_OR_NEWER + settings.EnableVirtualRealitySupport = UnityEngine.XR.XRSettings.enabled; +#endif + +#if !UNITY_2022_2_OR_NEWER + // collect all aspect ratios + UnityEditor.AspectRatio[] aspectRatios = + { + UnityEditor.AspectRatio.Aspect4by3, + UnityEditor.AspectRatio.Aspect5by4, + UnityEditor.AspectRatio.Aspect16by9, + UnityEditor.AspectRatio.Aspect16by10, + UnityEditor.AspectRatio.AspectOthers + }; + List aspectRatiosList = new List(); + for (int n = 0, len = aspectRatios.Length; n < len; ++n) + { + if (PlayerSettings.HasAspectRatio(aspectRatios[n])) + { + aspectRatiosList.Add(aspectRatios[n].ToString()); + } + } + + if (aspectRatiosList.Count == 0) + { + aspectRatiosList.Add("none"); + } + + settings.AspectRatiosAllowed = aspectRatiosList.ToArray(); +#else + settings.AspectRatiosAllowed = new string[]{"N/A"}; // AspectRatio enum removed in Unity 2022.2 +#endif + +#if UNITY_5_3_OR_NEWER // 5.2 and greater (but Unity 5.2 doesn't have a define so we use 5.3) + settings.GraphicsAPIsUsed = PlayerSettings.GetGraphicsAPIs(EditorUserBuildSettings.activeBuildTarget) + .Select(type => type.ToString()).ToArray(); +#endif + + +#if UNITY_2018_2_OR_NEWER + settings.VulkanEnableSetSRGBWrite = PlayerSettings.vulkanEnableSetSRGBWrite; +#endif + +#if UNITY_2019_3_OR_NEWER + settings.vulkanNumSwapchainBuffers = PlayerSettings.vulkanNumSwapchainBuffers; +#endif + +#if UNITY_2019_4_OR_NEWER + settings.VulkanEnableLateAcquireNextImage = PlayerSettings.vulkanEnableLateAcquireNextImage; +#endif + +#if UNITY_2020_2_OR_NEWER + settings.VulkanEnablePreTransform = PlayerSettings.vulkanEnablePreTransform; +#endif + + // shared settings + // --------------------------------------------------------------- + + // shared between web and standalone + settings.RunInBackground = PlayerSettings.runInBackground; + } + + public static void PopulateWebSettings(UnityBuildSettings settings) + { + // web player settings + // --------------------------------------------------------------- +#if UNITY_5_6_OR_NEWER + settings.WebPlayerDefaultScreenWidth = 0; + settings.WebPlayerDefaultScreenHeight = 0; + + settings.WebPlayerEnableStreaming = false; + settings.WebPlayerDeployOffline = false; +#else + settings.WebPlayerDefaultScreenWidth = PlayerSettings.defaultWebScreenWidth; + settings.WebPlayerDefaultScreenHeight = PlayerSettings.defaultWebScreenHeight; + + settings.WebPlayerEnableStreaming = EditorUserBuildSettings.webPlayerStreamed; + settings.WebPlayerDeployOffline = EditorUserBuildSettings.webPlayerOfflineDeployment; +#endif + +#if UNITY_5_3_OR_NEWER + settings.WebPlayerFirstStreamedLevelWithResources = 0; +#else + settings.WebPlayerFirstStreamedLevelWithResources = PlayerSettings.firstStreamedLevelWithResources; +#endif + + // Web GL settings + // --------------------------------------------------------------- + +#if !UNITY_5_4_OR_NEWER + settings.WebGLOptimizationLevel = EditorUserBuildSettings.webGLOptimizationLevel.ToString(); +#endif +#if UNITY_5_4_OR_NEWER && !UNITY_2019_1_OR_NEWER + settings.WebGLUsePreBuiltUnityEngine = EditorUserBuildSettings.webGLUsePreBuiltUnityEngine; +#endif +#if UNITY_5_5_OR_NEWER + settings.WebGLCompressionFormat = PlayerSettings.WebGL.compressionFormat.ToString(); + settings.WebGLAutoCacheAssetsData = PlayerSettings.WebGL.dataCaching; +#if UNITY_2021_2_OR_NEWER + settings.WebGLDebugSymbolMode = PlayerSettings.WebGL.debugSymbolMode.ToString(); + settings.WebGLCreateDebugSymbolsFile = PlayerSettings.WebGL.debugSymbolMode != WebGLDebugSymbolMode.Off; +#else + settings.WebGLDebugSymbolMode = null; + settings.WebGLCreateDebugSymbolsFile = PlayerSettings.WebGL.debugSymbols; +#endif + settings.WebGLExceptionSupportType = PlayerSettings.WebGL.exceptionSupport.ToString(); + settings.WebGLMemorySize = PlayerSettings.WebGL.memorySize; + settings.WebGLTemplatePath = PlayerSettings.WebGL.template; +#endif + } + + public static void PopulateStandaloneSettings(UnityBuildSettings settings) + { + // standalone (windows/mac/linux) build settings + // --------------------------------------------------------------- +#if !UNITY_2019_1_OR_NEWER + settings.StandaloneResolutionDialogSettingUsed = PlayerSettings.displayResolutionDialog.ToString(); +#endif +#if UNITY_2018_1_OR_NEWER + settings.StandaloneFullScreenModeUsed = PlayerSettings.fullScreenMode.ToString(); +#endif + + settings.StandaloneDefaultScreenWidth = PlayerSettings.defaultScreenWidth; + settings.StandaloneDefaultScreenHeight = PlayerSettings.defaultScreenHeight; + +#if !UNITY_2019_1_OR_NEWER + settings.StandaloneFullScreenByDefault = PlayerSettings.defaultIsFullScreen; +#endif +#if UNITY_5_3_OR_NEWER + settings.StandaloneAllowFullScreenSwitch = PlayerSettings.allowFullscreenSwitch; +#endif + + settings.StandaloneCaptureSingleScreen = PlayerSettings.captureSingleScreen; + + settings.StandaloneForceSingleInstance = PlayerSettings.forceSingleInstance; + settings.StandaloneEnableResizableWindow = PlayerSettings.resizableWindow; + + + // windows only build settings + // --------------------------------------------------------------- +#if !UNITY_5_3_OR_NEWER + settings.WinUseDirect3D11IfAvailable = PlayerSettings.useDirect3D11; +#endif + +#if !UNITY_2017_3_OR_NEWER + settings.WinDirect3D9FullscreenModeUsed = PlayerSettings.d3d9FullscreenMode.ToString(); +#endif + +#if !UNITY_4 && !UNITY_2019_1_OR_NEWER + settings.WinDirect3D11FullscreenModeUsed = PlayerSettings.d3d11FullscreenMode.ToString(); +#endif + +#if !UNITY_5_4_OR_NEWER + settings.StandaloneUseStereoscopic3d = PlayerSettings.stereoscopic3D; +#endif + +#if UNITY_2019_1_OR_NEWER + settings.WinUseFlipModelSwapchain = PlayerSettings.useFlipModelSwapchain; +#endif + +#if UNITY_2021_3_OR_NEWER && !UNITY_2021_3_0 && !UNITY_2021_3_1 && !UNITY_2021_3_2 && !UNITY_2021_3_3 && !UNITY_2021_3_4 && !UNITY_2021_3_5 && !UNITY_2021_3_6 && !UNITY_2021_3_7 && !UNITY_2021_3_8 && !UNITY_2021_3_9 && !UNITY_2021_3_10 && !UNITY_2021_3_11 && !UNITY_2021_3_12 + settings.WinGamepadInputHint = PlayerSettings.windowsGamepadBackendHint.ToString(); + + // simplify value + switch (settings.WinGamepadInputHint) + { + case "WindowsGamepadBackendHintDefault": + settings.WinGamepadInputHint = "Default"; + break; + case "WindowsGamepadBackendHintXInput": + settings.WinGamepadInputHint = "XInput API"; + break; + case "WindowsGamepadBackendHintWindowsGamingInput": + settings.WinGamepadInputHint = "GamingInput API"; + break; + } +#endif + + // Windows Store App only build settings + // --------------------------------------------------------------- +#if !UNITY_4 && !UNITY_2019_1_OR_NEWER + settings.WSAGenerateReferenceProjects = EditorUserBuildSettings.wsaGenerateReferenceProjects; +#endif +#if UNITY_5_3_OR_NEWER && !UNITY_2017_1_OR_NEWER + settings.WSASDK = EditorUserBuildSettings.wsaSDK.ToString(); +#endif + + + // mac only build settings + // --------------------------------------------------------------- + +#if UNITY_2017_2_OR_NEWER + settings.MacRetinaSupport = PlayerSettings.macRetinaSupport; +#endif + +#if UNITY_2021_2_OR_NEWER + settings.MacXcodeBuildConfig = EditorUserBuildSettings.macOSXcodeBuildConfig.ToString(); +#endif + + settings.MacUseAppStoreValidation = PlayerSettings.useMacAppStoreValidation; +#if !UNITY_2019_1_OR_NEWER + settings.MacFullscreenModeUsed = PlayerSettings.macFullscreenMode.ToString(); +#endif + } + + + public static void PopulateMobileSettings(UnityBuildSettings settings) + { + // Mobile build settings + // --------------------------------------------------------------- + + // ("Bundle Identifier" in iOS, "Package Identifier" in Android) +#if UNITY_5_6_OR_NEWER + settings.MobileBundleIdentifier = PlayerSettings.applicationIdentifier; +#else + settings.MobileBundleIdentifier = PlayerSettings.bundleIdentifier; +#endif + // ("Bundle Version" in iOS, "Version Name" in Android) + settings.MobileBundleVersion = PlayerSettings.bundleVersion; + settings.MobileHideStatusBar = PlayerSettings.statusBarHidden; + + settings.MobileAccelerometerFrequency = PlayerSettings.accelerometerFrequency; + + settings.MobileDefaultOrientationUsed = PlayerSettings.defaultInterfaceOrientation.ToString(); + settings.MobileEnableAutorotateToPortrait = PlayerSettings.allowedAutorotateToPortrait; + settings.MobileEnableAutorotateToReversePortrait = PlayerSettings.allowedAutorotateToPortraitUpsideDown; + settings.MobileEnableAutorotateToLandscapeLeft = PlayerSettings.allowedAutorotateToLandscapeLeft; + settings.MobileEnableAutorotateToLandscapeRight = PlayerSettings.allowedAutorotateToLandscapeRight; + settings.MobileEnableOSAutorotation = PlayerSettings.useAnimatedAutorotation; + settings.MuteOtherAudioSources = PlayerSettings.muteOtherAudioSources; + + + // iOS only build settings + // --------------------------------------------------------------- + + // Unity 5: EditorUserBuildSettings.appendProject is removed +#if UNITY_4 + settings.iOSAppendedToProject = EditorUserBuildSettings.appendProject; +#endif + +#if UNITY_5_5_OR_NEWER + settings.iOSTargetOSVersion = PlayerSettings.iOS.targetOSVersionString; +#else + settings.iOSTargetOSVersion = PlayerSettings.iOS.targetOSVersion.ToString(); +#endif +#if UNITY_2021_2_OR_NEWER + settings.iOSSymlinkLibraries = EditorUserBuildSettings.symlinkSources; +#else + settings.iOSSymlinkLibraries = EditorUserBuildSettings.symlinkLibraries; +#endif + settings.iOSAppDisplayName = PlayerSettings.iOS.applicationDisplayName; + settings.iOSScriptCallOptimizationUsed = PlayerSettings.iOS.scriptCallOptimization.ToString(); + settings.iOSSDKVersionUsed = PlayerSettings.iOS.sdkVersion.ToString(); + settings.iOSTargetDevice = PlayerSettings.iOS.targetDevice.ToString(); + +#if UNITY_2021_2_OR_NEWER + settings.iOSXcodeBuildConfig = EditorUserBuildSettings.iOSXcodeBuildConfig.ToString(); +#endif + +#if !UNITY_5_3_OR_NEWER + settings.iOSTargetResolution = PlayerSettings.iOS.targetResolution.ToString(); +#else + // not sure what the equivalent is for PlayerSettings.iOS.targetResolution in Unity 5.3 + // Unity 5.3 has a Screen.resolutions but I don't know which of those in the array would be the iOS target resolution +#endif + + settings.iOSIsIconPrerendered = PlayerSettings.iOS.prerenderedIcon; + settings.iOSRequiresPersistentWiFi = PlayerSettings.iOS.requiresPersistentWiFi.ToString(); + settings.iOSStatusBarStyle = PlayerSettings.iOS.statusBarStyle.ToString(); + +#if UNITY_4 + settings.iOSExitOnSuspend = PlayerSettings.iOS.exitOnSuspend; +#else + settings.iOSAppInBackgroundBehavior = PlayerSettings.iOS.appInBackgroundBehavior.ToString(); +#endif + + settings.iOSShowProgressBarInLoadingScreen = PlayerSettings.iOS.showActivityIndicatorOnLoading.ToString(); + +#if !UNITY_4 + settings.iOSLogObjCUncaughtExceptions = PlayerSettings.logObjCUncaughtExceptions; +#endif + +#if !UNITY_5_3_OR_NEWER + settings.iOSTargetGraphics = PlayerSettings.targetIOSGraphics.ToString(); +#else + settings.iOSTargetGraphics = string.Join(",", + PlayerSettings.GetGraphicsAPIs(BuildTarget.iOS).Select(type => type.ToString()).ToArray()); +#endif + + // Android only build settings + // --------------------------------------------------------------- + + settings.AndroidBuildSubtarget = EditorUserBuildSettings.androidBuildSubtarget.ToString(); + +#if UNITY_2018_2_OR_NEWER + settings.AndroidBuildApkPerCpuArch = PlayerSettings.Android.buildApkPerCpuArchitecture; +#endif + +#if UNITY_2021_1_OR_NEWER + settings.AndroidCreateSymbols = EditorUserBuildSettings.androidCreateSymbols.ToString(); +#endif + +#if UNITY_2023_1_OR_NEWER + settings.AndroidUseAPKExpansionFiles = PlayerSettings.Android.splitApplicationBinary; +#else + settings.AndroidUseAPKExpansionFiles = PlayerSettings.Android.useAPKExpansionFiles; +#endif + +#if !UNITY_4 + settings.AndroidAsAndroidProject = EditorUserBuildSettings.exportAsGoogleAndroidProject; + settings.AndroidIsGame = PlayerSettings.Android.androidIsGame; + settings.AndroidTvCompatible = PlayerSettings.Android.androidTVCompatibility; +#endif + +#if UNITY_2017_4_OR_NEWER + settings.AndroidAppBundle = EditorUserBuildSettings.buildAppBundle; +#endif + + settings.AndroidUseLicenseVerification = PlayerSettings.Android.licenseVerification; + +#if UNITY_2022_2_OR_NEWER + settings.AndroidEnableArmV9SecurityFeatures = PlayerSettings.Android.enableArmv9SecurityFeatures; +#endif + + +#if UNITY_4 + settings.AndroidUse24BitDepthBuffer = PlayerSettings.Android.use24BitDepthBuffer; +#else + settings.AndroidDisableDepthAndStencilBuffers = PlayerSettings.Android.disableDepthAndStencilBuffers; +#endif + +#if UNITY_2017_3_OR_NEWER + settings.AndroidPreserveFramebufferAlpha = PlayerSettings.preserveFramebufferAlpha; +#endif + + settings.AndroidVersionCode = PlayerSettings.Android.bundleVersionCode; + + settings.AndroidMinSDKVersion = PlayerSettings.Android.minSdkVersion.ToString(); + +#if UNITY_5_6_OR_NEWER + settings.AndroidTargetSDKVersion = PlayerSettings.Android.targetSdkVersion.ToString(); +#endif + +#if UNITY_2019_4_OR_NEWER + settings.AndroidTargetDevice = PlayerSettings.Android.androidTargetDevices.ToString(); +#else + settings.AndroidTargetDevice = PlayerSettings.Android.targetDevice.ToString(); +#endif + +#if UNITY_2017_4_OR_NEWER + settings.AndroidTargetArchitectures = PlayerSettings.Android.targetArchitectures.ToString(); +#endif + + settings.AndroidSplashScreenScaleMode = PlayerSettings.Android.splashScreenScale.ToString(); + + settings.AndroidPreferredInstallLocation = PlayerSettings.Android.preferredInstallLocation.ToString(); + + settings.AndroidForceInternetPermission = PlayerSettings.Android.forceInternetPermission; + settings.AndroidForceSDCardPermission = PlayerSettings.Android.forceSDCardPermission; + + settings.AndroidShowProgressBarInLoadingScreen = + PlayerSettings.Android.showActivityIndicatorOnLoading.ToString(); + + settings.AndroidKeyAliasName = PlayerSettings.Android.keyaliasName; + settings.AndroidKeystoreName = PlayerSettings.Android.keystoreName; + + +#if !UNITY_5_4_OR_NEWER // blackberry build option no longer in Unity 5.4 + // BlackBerry only build settings + // --------------------------------------------------------------- + + settings.BlackBerryBuildSubtarget = EditorUserBuildSettings.blackberryBuildSubtarget.ToString(); + settings.BlackBerryBuildType = EditorUserBuildSettings.blackberryBuildType.ToString(); + +#if !UNITY_5 + settings.BlackBerryAuthorID = PlayerSettings.BlackBerry.authorId; +#endif + settings.BlackBerryDeviceAddress = PlayerSettings.BlackBerry.deviceAddress; + + settings.BlackBerrySaveLogPath = PlayerSettings.BlackBerry.saveLogPath; + settings.BlackBerryTokenPath = PlayerSettings.BlackBerry.tokenPath; + + settings.BlackBerryTokenAuthor = PlayerSettings.BlackBerry.tokenAuthor; + settings.BlackBerryTokenExpiration = PlayerSettings.BlackBerry.tokenExpires; + + settings.BlackBerryHasCamPermissions = PlayerSettings.BlackBerry.HasCameraPermissions(); + settings.BlackBerryHasMicPermissions = PlayerSettings.BlackBerry.HasMicrophonePermissions(); + settings.BlackBerryHasGpsPermissions = PlayerSettings.BlackBerry.HasGPSPermissions(); + settings.BlackBerryHasIdPermissions = PlayerSettings.BlackBerry.HasIdentificationPermissions(); + settings.BlackBerryHasSharedPermissions = PlayerSettings.BlackBerry.HasSharedPermissions(); +#endif + } + + + public static void PopulateTvDeviceSettings(UnityBuildSettings settings) + { + // no more Samsung TV in Unity 2017.3 or greater + +#if UNITY_4 || UNITY_5 || (UNITY_2017 && !UNITY_2017_3_OR_NEWER) + settings.SamsungTVDeviceAddress = PlayerSettings.SamsungTV.deviceAddress; +#if !UNITY_4 + settings.SamsungTVAuthor = PlayerSettings.SamsungTV.productAuthor; + settings.SamsungTVAuthorEmail = PlayerSettings.SamsungTV.productAuthorEmail; + settings.SamsungTVAuthorWebsiteUrl = PlayerSettings.SamsungTV.productLink; + settings.SamsungTVCategory = PlayerSettings.SamsungTV.productCategory.ToString(); + settings.SamsungTVDescription = PlayerSettings.SamsungTV.productDescription; +#endif +#endif + } + + + public static void PopulateBigConsoleGen07Settings(UnityBuildSettings settings) + { + // XBox 360 build settings + // --------------------------------------------------------------- + +#if UNITY_5_5_OR_NEWER + // In Unity 5.5, API for Xbox 360 is still there but build options + // do not allow Xbox 360 anymore, so we don't bother with it +#else + settings.Xbox360BuildSubtarget = EditorUserBuildSettings.xboxBuildSubtarget.ToString(); + settings.Xbox360RunMethod = EditorUserBuildSettings.xboxRunMethod.ToString(); + + settings.Xbox360TitleId = PlayerSettings.xboxTitleId; + settings.Xbox360ImageXexFilePath = PlayerSettings.xboxImageXexFilePath; + settings.Xbox360SpaFilePath = PlayerSettings.xboxSpaFilePath; + + settings.Xbox360AutoGenerateSpa = PlayerSettings.xboxGenerateSpa; + settings.Xbox360EnableKinect = PlayerSettings.xboxEnableKinect; + settings.Xbox360EnableKinectAutoTracking = PlayerSettings.xboxEnableKinectAutoTracking; + settings.Xbox360EnableSpeech = PlayerSettings.xboxEnableSpeech; + settings.Xbox360EnableAvatar = PlayerSettings.xboxEnableAvatar; + + settings.Xbox360SpeechDB = PlayerSettings.xboxSpeechDB; + + settings.Xbox360AdditionalTitleMemSize = PlayerSettings.xboxAdditionalTitleMemorySize; + + settings.Xbox360DeployKinectResources = PlayerSettings.xboxDeployKinectResources; + settings.Xbox360DeployKinectHeadOrientation = PlayerSettings.xboxDeployKinectHeadOrientation; + settings.Xbox360DeployKinectHeadPosition = PlayerSettings.xboxDeployKinectHeadPosition; +#endif + + + // Playstation devices build settings + // --------------------------------------------------------------- + +#if UNITY_5_5_OR_NEWER + // In Unity 5.5, EditorUserBuildSettings.sceBuildSubtarget is removed +#else + settings.SCEBuildSubtarget = EditorUserBuildSettings.sceBuildSubtarget.ToString(); +#endif + +#if !UNITY_4 +#if UNITY_2021_2_OR_NEWER + settings.CompressBuildWithPsArc = false; +#else + settings.CompressBuildWithPsArc = EditorUserBuildSettings.compressWithPsArc; +#endif + settings.NeedSubmissionMaterials = EditorUserBuildSettings.needSubmissionMaterials; +#endif + + // PS3 build settings + // --------------------------------------------------------------- + + // paths +#if UNITY_5_5_OR_NEWER + // no more PS3 support in Unity 5.5 and greater + +#elif !UNITY_5 + settings.PS3TitleConfigFilePath = PlayerSettings.ps3TitleConfigPath; + settings.PS3DLCConfigFilePath = PlayerSettings.ps3DLCConfigPath; + settings.PS3ThumbnailFilePath = PlayerSettings.ps3ThumbnailPath; + settings.PS3BackgroundImageFilePath = PlayerSettings.ps3BackgroundPath; + settings.PS3BackgroundSoundFilePath = PlayerSettings.ps3SoundPath; + settings.PS3TrophyPackagePath = PlayerSettings.ps3TrophyPackagePath; + + settings.PS3InTrialMode = PlayerSettings.ps3TrialMode; + + settings.PS3BootCheckMaxSaveGameSizeKB = PlayerSettings.ps3BootCheckMaxSaveGameSizeKB; + + settings.PS3SaveGameSlots = PlayerSettings.ps3SaveGameSlots; + + settings.PS3NpCommsId = PlayerSettings.ps3TrophyCommId; + settings.PS3NpCommsSig = PlayerSettings.ps3TrophyCommSig; + settings.PS3VideoMemoryForVertexBuffers = PlayerSettings.PS3.videoMemoryForVertexBuffers; +#else + settings.PS3TitleConfigFilePath = PlayerSettings.PS3.titleConfigPath; + settings.PS3DLCConfigFilePath = PlayerSettings.PS3.dlcConfigPath; + settings.PS3ThumbnailFilePath = PlayerSettings.PS3.thumbnailPath; + settings.PS3BackgroundImageFilePath = PlayerSettings.PS3.backgroundPath; + settings.PS3BackgroundSoundFilePath = PlayerSettings.PS3.soundPath; + settings.PS3TrophyPackagePath = PlayerSettings.PS3.npTrophyPackagePath; + + settings.PS3InTrialMode = PlayerSettings.PS3.trialMode; + + settings.PS3NpCommsId = PlayerSettings.PS3.npTrophyCommId; + settings.PS3NpCommsSig = PlayerSettings.PS3.npTrophyCommSig; + + settings.PS3DisableDolbyEncoding = PlayerSettings.PS3.DisableDolbyEncoding; + settings.PS3EnableMoveSupport = PlayerSettings.PS3.EnableMoveSupport; + settings.PS3UseSPUForUmbra = PlayerSettings.PS3.UseSPUForUmbra; + settings.PS3EnableVerboseMemoryStats = PlayerSettings.PS3.EnableVerboseMemoryStats; + settings.PS3VideoMemoryForAudio = PlayerSettings.PS3.videoMemoryForAudio; + settings.PS3BootCheckMaxSaveGameSizeKB = PlayerSettings.PS3.bootCheckMaxSaveGameSizeKB; + + settings.PS3SaveGameSlots = PlayerSettings.PS3.saveGameSlots; + settings.PS3NpAgeRating = PlayerSettings.PS3.npAgeRating; + settings.PS3VideoMemoryForVertexBuffers = PlayerSettings.PS3.videoMemoryForVertexBuffers; +#endif + + + // PS Vita build settings + // --------------------------------------------------------------- + +#if !UNITY_2018_3_OR_NEWER // PS Vita removed in 2018.3 +#if UNITY_4 + settings.PSVTrophyPackagePath = PlayerSettings.psp2NPTrophyPackPath; + settings.PSVParamSfxPath = PlayerSettings.psp2ParamSfxPath; + + settings.PSVNpCommsId = PlayerSettings.psp2NPCommsID; + settings.PSVNpCommsSig = PlayerSettings.psp2NPCommsSig; +#else + settings.PSVTrophyPackagePath = PlayerSettings.PSVita.npTrophyPackPath; + settings.PSVParamSfxPath = PlayerSettings.PSVita.paramSfxPath; + + settings.PSVNpCommsId = PlayerSettings.PSVita.npCommunicationsID; + settings.PSVNpCommsSig = PlayerSettings.PSVita.npCommsSig; + + + settings.PSVBuildSubtarget = EditorUserBuildSettings.psp2BuildSubtarget.ToString(); + + settings.PSVShortTitle = PlayerSettings.PSVita.shortTitle; + settings.PSVAppVersion = PlayerSettings.PSVita.appVersion; + settings.PSVMasterVersion = PlayerSettings.PSVita.masterVersion; + settings.PSVAppCategory = PlayerSettings.PSVita.category.ToString(); + settings.PSVContentId = PlayerSettings.PSVita.contentID; + + settings.PSVNpAgeRating = PlayerSettings.PSVita.npAgeRating.ToString(); + settings.PSVParentalLevel = PlayerSettings.PSVita.parentalLevel.ToString(); + + settings.PSVDrmType = PlayerSettings.PSVita.drmType.ToString(); + settings.PSVUpgradable = PlayerSettings.PSVita.upgradable; + settings.PSVTvBootMode = PlayerSettings.PSVita.tvBootMode.ToString(); + settings.PSVAcquireBgm = PlayerSettings.PSVita.acquireBGM; +#if !UNITY_5_3_OR_NEWER + settings.PSVAllowTwitterDialog = PlayerSettings.PSVita.AllowTwitterDialog; +#endif + + settings.PSVMediaCapacity = PlayerSettings.PSVita.mediaCapacity.ToString(); + settings.PSVStorageType = PlayerSettings.PSVita.storageType.ToString(); + settings.PSVTvDisableEmu = PlayerSettings.PSVita.tvDisableEmu; + settings.PSVNpSupportGbmOrGjp = PlayerSettings.PSVita.npSupportGBMorGJP; + settings.PSVPowerMode = PlayerSettings.PSVita.powerMode.ToString(); +#if !UNITY_5_3_OR_NEWER + settings.PSVUseLibLocation = PlayerSettings.PSVita.useLibLocation; +#endif + + settings.PSVHealthWarning = PlayerSettings.PSVita.healthWarning; + settings.PSVEnterButtonAssignment = PlayerSettings.PSVita.enterButtonAssignment.ToString(); + + settings.PSVInfoBarColor = PlayerSettings.PSVita.infoBarColor; + settings.PSVShowInfoBarOnStartup = PlayerSettings.PSVita.infoBarOnStartup; + settings.PSVSaveDataQuota = PlayerSettings.PSVita.saveDataQuota; + + // paths + settings.PSVPatchChangeInfoPath = PlayerSettings.PSVita.patchChangeInfoPath; + settings.PSVPatchOriginalPackPath = PlayerSettings.PSVita.patchOriginalPackage; + settings.PSVKeystoneFilePath = PlayerSettings.PSVita.keystoneFile; + settings.PSVLiveAreaBgImagePath = PlayerSettings.PSVita.liveAreaBackroundPath; + settings.PSVLiveAreaGateImagePath = PlayerSettings.PSVita.liveAreaGatePath; + settings.PSVCustomLiveAreaPath = PlayerSettings.PSVita.liveAreaPath; + settings.PSVLiveAreaTrialPath = PlayerSettings.PSVita.liveAreaTrialPath; + + settings.PSVManualPath = PlayerSettings.PSVita.manualPath; +#endif +#endif + } + + public static void PopulateBigConsoleGen08Settings(UnityBuildSettings settings) + { +#if !UNITY_4 +#if !UNITY_2021_1_OR_NEWER + // Xbox One build settings + // --------------------------------------------------------------- + settings.XboxOneDeployMethod = EditorUserBuildSettings.xboxOneDeployMethod.ToString(); + settings.XboxOneTitleId = PlayerSettings.XboxOne.TitleId; + settings.XboxOneContentId = PlayerSettings.XboxOne.ContentId; + settings.XboxOneProductId = PlayerSettings.XboxOne.ProductId; + +#if !UNITY_5_6_OR_NEWER + settings.XboxOneSandboxId = PlayerSettings.XboxOne.SandboxId; +#endif + + settings.XboxOneServiceConfigId = PlayerSettings.XboxOne.SCID; + settings.XboxOneVersion = PlayerSettings.XboxOne.Version; + settings.XboxOneIsContentPackage = PlayerSettings.XboxOne.IsContentPackage; + + settings.XboxOneDescription = PlayerSettings.XboxOne.Description; + + settings.XboxOnePackagingEncryptionLevel = PlayerSettings.XboxOne.PackagingEncryption.ToString(); + + settings.XboxOneAllowedProductIds = PlayerSettings.XboxOne.AllowedProductIds; + + settings.XboxOneDisableKinectGpuReservation = PlayerSettings.XboxOne.DisableKinectGpuReservation; + settings.XboxOneEnableVariableGPU = PlayerSettings.XboxOne.EnableVariableGPU; + settings.XboxOneStreamingInstallLaunchRange = EditorUserBuildSettings.streamingInstallLaunchRange; + settings.XboxOnePersistentLocalStorageSize = PlayerSettings.XboxOne.PersistentLocalStorageSize; + + settings.XboxOneSocketNames = PlayerSettings.XboxOne.SocketNames; + + settings.XboxOneGameOsOverridePath = PlayerSettings.XboxOne.GameOsOverridePath; + settings.XboxOneAppManifestOverridePath = PlayerSettings.XboxOne.AppManifestOverridePath; + settings.XboxOnePackagingOverridePath = PlayerSettings.XboxOne.PackagingOverridePath; +#endif + + + // PS4 build settings + // --------------------------------------------------------------- + settings.PS4BuildSubtarget = EditorUserBuildSettings.ps4BuildSubtarget.ToString(); + + settings.PS4AppParameter1 = PlayerSettings.PS4.applicationParameter1; + settings.PS4AppParameter2 = PlayerSettings.PS4.applicationParameter2; + settings.PS4AppParameter3 = PlayerSettings.PS4.applicationParameter3; + settings.PS4AppParameter4 = PlayerSettings.PS4.applicationParameter4; + + settings.PS4AppType = PlayerSettings.PS4.appType; + settings.PS4AppVersion = PlayerSettings.PS4.appVersion; + settings.PS4Category = PlayerSettings.PS4.category.ToString(); + settings.PS4ContentId = PlayerSettings.PS4.contentID; + settings.PS4MasterVersion = PlayerSettings.PS4.masterVersion; + + settings.PS4EnterButtonAssignment = PlayerSettings.PS4.enterButtonAssignment.ToString(); + settings.PS4RemotePlayKeyAssignment = PlayerSettings.PS4.remotePlayKeyAssignment.ToString(); + + settings.PS4VideoOutPixelFormat = PlayerSettings.PS4.videoOutPixelFormat.ToString(); +#if UNITY_5_5_OR_NEWER + settings.PS4VideoOutResolution = string.Format("Width: {0} ReprojectionRate: {1}", + PlayerSettings.PS4.videoOutInitialWidth, PlayerSettings.PS4.videoOutReprojectionRate); +#else + settings.PS4VideoOutResolution = PlayerSettings.PS4.videoOutResolution.ToString(); +#endif + + settings.PS4MonoEnvVars = PlayerSettings.PS4.monoEnv; + + settings.PS4NpAgeRating = PlayerSettings.PS4.npAgeRating.ToString(); + settings.PS4ParentalLevel = PlayerSettings.PS4.parentalLevel.ToString(); + + settings.PS4EnablePlayerPrefsSupport = PlayerSettings.PS4.playerPrefsSupport; + + settings.PS4EnableFriendPushNotifications = PlayerSettings.PS4.pnFriends; + settings.PS4EnablePresencePushNotifications = PlayerSettings.PS4.pnPresence; + settings.PS4EnableSessionPushNotifications = PlayerSettings.PS4.pnSessions; + settings.PS4EnableGameCustomDataPushNotifications = PlayerSettings.PS4.pnGameCustomData; + + // paths + settings.PS4BgImagePath = PlayerSettings.PS4.BackgroundImagePath; + settings.PS4BgMusicPath = PlayerSettings.PS4.BGMPath; + settings.PS4StartupImagePath = PlayerSettings.PS4.StartupImagePath; + settings.PS4ParamSfxPath = PlayerSettings.PS4.paramSfxPath; + settings.PS4NpTitleDatPath = PlayerSettings.PS4.NPtitleDatPath; + settings.PS4NpTrophyPackagePath = PlayerSettings.PS4.npTrophyPackPath; + settings.PS4PronunciationSigPath = PlayerSettings.PS4.PronunciationSIGPath; + settings.PS4PronunciationXmlPath = PlayerSettings.PS4.PronunciationXMLPath; + settings.PS4SaveDataImagePath = PlayerSettings.PS4.SaveDataImagePath; + settings.PS4ShareFilePath = PlayerSettings.PS4.ShareFilePath; +#endif + } + + static void PopulatePackageSettings(UnityBuildSettings settings) + { + var packageList = settings.PackageEntries; + packageList.Clear(); + + var builtInPackageList = settings.BuiltInPackageEntries; + builtInPackageList.Clear(); + + string projectPath = Application.dataPath; + + // remove the "Assets" so that we go to the parent folder + projectPath = projectPath.Substring(0, projectPath.Length - 6); + + string manifestJsonPath = string.Format("{0}Packages/manifest.json", projectPath); + if (!System.IO.File.Exists(manifestJsonPath)) + { + // no manifest.json in project + return; + } + string manifestJsonText = System.IO.File.ReadAllText(manifestJsonPath); + + string packagesLockJsonText; + string packagesLockJsonPath = string.Format("{0}Packages/packages-lock.json", projectPath); + if (System.IO.File.Exists(packagesLockJsonPath)) + { + packagesLockJsonText = System.IO.File.ReadAllText(packagesLockJsonPath); + } + else + { + packagesLockJsonText = null; + } + + PopulatePackageList(manifestJsonText, packagesLockJsonText, packageList, builtInPackageList); + } + + public const string DEFAULT_REGISTRY_URL = "https://packages.unity.com"; + + static void PopulatePackageList(string manifestJsonText, string packagesLockJsonText, + List packageList, List builtInPackageList) + { + //Debug.Log($"Exists: {manifestJsonPath}"); + var manifest = MiniJSON.Json.Deserialize(manifestJsonText) as Dictionary; + if (manifest == null) + { + return; + } + + string mainRegistry; + if (manifest.ContainsKey("registry")) + { + mainRegistry = manifest["registry"] as string; + } + else + { + // this is the default value when no registry is specified + mainRegistry = DEFAULT_REGISTRY_URL; + } + + List scopedRegistries; + if (manifest.ContainsKey("scopedRegistries")) + { + scopedRegistries = manifest["scopedRegistries"] as List; + } + else + { + scopedRegistries = null; + } + + Dictionary externalLock; + if (!string.IsNullOrEmpty(packagesLockJsonText)) + { + var locks = MiniJSON.Json.Deserialize(packagesLockJsonText) as Dictionary; + if (locks != null && locks.ContainsKey("dependencies")) + { + externalLock = locks["dependencies"] as Dictionary; + } + else + { + externalLock = null; + } + } + else + { + externalLock = null; + } + + if (manifest.ContainsKey("dependencies")) + { + Dictionary embeddedLockUsed; + if (manifest.ContainsKey("lock")) + { + embeddedLockUsed = manifest["lock"] as Dictionary; + } + else + { + embeddedLockUsed = null; + } + + var dependencies = manifest["dependencies"] as Dictionary; + if (dependencies != null) + { + + var projectPackagesCachePath = Application.dataPath; + projectPackagesCachePath = projectPackagesCachePath.Substring(0, projectPackagesCachePath.Length - 6); + projectPackagesCachePath = string.Format("{0}Library/PackageCache/", projectPackagesCachePath); + + foreach (var pair in dependencies) + { + //Debug.Log($"package name: {pair.Key} version: {pair.Value}"); + if (string.IsNullOrEmpty(pair.Key)) + { + continue; + } + + if (pair.Key.StartsWith("com.unity.modules.")) + { + BuildReportTool.UnityBuildSettings.BuiltInPackageEntry newBuiltInEntry; + newBuiltInEntry.PackageName = pair.Key; + newBuiltInEntry.DisplayName = null; + builtInPackageList.Add(newBuiltInEntry); + continue; + } + + BuildReportTool.UnityBuildSettings.PackageEntry newEntry; + newEntry.PackageName = pair.Key; + newEntry.DisplayName = null; + newEntry.VersionUsed = null; + newEntry.LocalPath = null; + + var gotValue = pair.Value as string; + if (embeddedLockUsed != null && embeddedLockUsed.ContainsKey(newEntry.PackageName)) + { + // if this is a git package, it should have an entry in the manifest's lock + + newEntry.Location = gotValue; + var lockEntry = embeddedLockUsed[newEntry.PackageName] as Dictionary; + if (lockEntry != null && lockEntry.ContainsKey("hash")) + { + string rev = lockEntry["hash"] as string; + if (rev != null) + { + newEntry.VersionUsed = rev; + } + } + } + else if (externalLock != null && externalLock.ContainsKey(newEntry.PackageName)) + { + var lockEntry = externalLock[newEntry.PackageName] as Dictionary; + if (lockEntry != null && lockEntry.ContainsKey("source")) + { + string source = lockEntry["source"] as string; + if (source == "git" && lockEntry.ContainsKey("hash")) + { + string rev = lockEntry["hash"] as string; + if (rev != null) + { + newEntry.VersionUsed = rev; + } + + // for git packages, the git url is the value in the manifest + newEntry.Location = gotValue; + } + else if (source == "registry" && lockEntry.ContainsKey("url")) + { + string packageUrl = lockEntry["url"] as string; + if (packageUrl != null) + { + newEntry.Location = packageUrl; + } + else + { + newEntry.Location = null; + } + } + else + { + newEntry.Location = null; + } + } + else + { + newEntry.Location = null; + } + } + else + { + newEntry.Location = null; + } + + if (string.IsNullOrEmpty(newEntry.VersionUsed)) + { + if (gotValue != null && + (gotValue.StartsWith("file://") || + gotValue.StartsWith("https://") || + gotValue.StartsWith("git://") || + gotValue.StartsWith("ssh://") || + gotValue.StartsWith("git+https://") || + gotValue.StartsWith("git+ssh://") || + gotValue.StartsWith("git+file://"))) + { + // git package, but no entry in the manifest's lock + + // check if commit hash is specified in the url + var lastHash = gotValue.LastIndexOf('#'); + if (lastHash > -1) + { + var afterHash = gotValue.Substring(lastHash); + newEntry.VersionUsed = afterHash; + newEntry.Location = gotValue.Substring(0, lastHash); + } + else + { + // no commit hash specified + newEntry.VersionUsed = null; + newEntry.Location = gotValue; + } + } + else if (gotValue != null && gotValue.StartsWith("file:") && !gotValue.StartsWith("file://")) + { + // local package + newEntry.VersionUsed = null; + newEntry.Location = gotValue; + } + else + { + // regular package + newEntry.VersionUsed = gotValue; + if (scopedRegistries != null) + { + newEntry.Location = GetMatchingRegistry(newEntry.PackageName, scopedRegistries); + } + + if (string.IsNullOrEmpty(newEntry.Location)) + { + newEntry.Location = mainRegistry; + } + } + } + + // attempt to get the package's display name by loading its package.json file + + // we need the VersionUsed since that's used as part of the folder name + if (!string.IsNullOrEmpty(newEntry.VersionUsed)) + { + newEntry.LocalPath = GetPackageCachePath(newEntry, projectPackagesCachePath); + + if (!string.IsNullOrEmpty(newEntry.LocalPath)) + { + string packageManifestPath = string.Format("{0}package.json", newEntry.LocalPath); + if (System.IO.File.Exists(packageManifestPath)) + { + var packageManifest = MiniJSON.Json.Deserialize(System.IO.File.ReadAllText(packageManifestPath)) as Dictionary; + if (packageManifest != null && packageManifest.ContainsKey("displayName")) + { + newEntry.DisplayName = packageManifest["displayName"] as string; + } + else + { + // no package.json, or package.json has no displayName + // we can hardcode some detections here + if (newEntry.PackageName == "com.unity.ads") + { + newEntry.DisplayName = "Advertisement"; + } + } + } + } + } + + packageList.Add(newEntry); + } + } + } + +#if BRT_PACKAGE_PARSE_DEBUG + for (int n = 0, len = packageList.Count; n < len; ++n) + { + Debug.Log($"{packageList[n].PackageName} {packageList[n].VersionUsed}\n{packageList[n].DisplayName}\n{packageList[n].Location}"); + } +#endif + } + + const int DEFAULT_SHORT_HASH_LENGTH = 10; + + static string GetPackageCachePath(BuildReportTool.UnityBuildSettings.PackageEntry entry, string projectPackagesCachePath) + { + string packageCachePath = string.Format("{0}{1}@{2}/", projectPackagesCachePath, entry.PackageName, entry.VersionUsed); + if (System.IO.Directory.Exists(packageCachePath)) + { + return packageCachePath; + } + + if (entry.VersionUsed.Length > DEFAULT_SHORT_HASH_LENGTH) + { + // in Unity 2019+, git packages now only use the first 10 characters of the commit hash, so try that + // in case this is a git package + packageCachePath = string.Format("{0}{1}@{2}/", + projectPackagesCachePath, entry.PackageName, + entry.VersionUsed.Substring(0, DEFAULT_SHORT_HASH_LENGTH)); + + if (System.IO.Directory.Exists(packageCachePath)) + { + return packageCachePath; + } + } + + // Not found in project's packageCache. Now Try finding from user's AppData + + if (string.IsNullOrEmpty(entry.Location)) + { + // we need the url found in Location since that's used as the folder name + // if we don't have it, we can't determine the package cache path + return null; + } + + // get the registry url and remove the url, that will be the folder name + string registryName; + int registrySlashIdx = entry.Location.LastIndexOf("//", StringComparison.Ordinal); + if (registrySlashIdx > -1) + { + registryName = entry.Location.Substring(registrySlashIdx+2); + } + else + { + return null; + } + + if (string.IsNullOrEmpty(registryName)) + { + return null; + } + +#if UNITY_EDITOR_WIN + string localAppDataVar = System.Environment.GetEnvironmentVariable("LOCALAPPDATA"); + if (string.IsNullOrEmpty(localAppDataVar)) + { + return null; + } + + localAppDataVar = localAppDataVar.Replace("\\", "/"); +#else + string localAppDataVar = "~/Users/Library"; +#endif + + packageCachePath = string.Format("{0}/Unity/cache/packages/{1}/{2}@{3}/", + localAppDataVar, registryName, entry.PackageName, entry.VersionUsed); + + if (System.IO.Directory.Exists(packageCachePath)) + { + return packageCachePath; + } + + if (entry.VersionUsed.Length > DEFAULT_SHORT_HASH_LENGTH) + { + // in Unity 2019+, git packages now only use the first 10 characters of the commit hash, so try that + // in case this is a git package + packageCachePath = string.Format("{0}/Unity/cache/packages/{1}/{2}@{3}/", + localAppDataVar, registryName, entry.PackageName, + entry.VersionUsed.Substring(0, DEFAULT_SHORT_HASH_LENGTH)); + + if (System.IO.Directory.Exists(packageCachePath)) + { + return packageCachePath; + } + } + + return null; + } + + static string GetMatchingRegistry(string packageName, List scopedRegistries) + { + if (string.IsNullOrEmpty(packageName)) + { + return null; + } + + if (scopedRegistries == null) + { + return null; + } + + int closestMatchScore = 0; + string closestMatch = null; + + for (int r = 0, rLen = scopedRegistries.Count; r < rLen; ++r) + { + if (scopedRegistries[r] == null) + { + continue; + } + + var scopedRegistry = scopedRegistries[r] as Dictionary; + if (scopedRegistry == null) + { + continue; + } + + if (!scopedRegistry.ContainsKey("scopes")) + { + continue; + } + + if (!scopedRegistry.ContainsKey("url")) + { + continue; + } + + var registryUrl = scopedRegistry["url"] as string; + + var scopes = scopedRegistry["scopes"] as List; + if (scopes == null) + { + continue; + } + + for (int s = 0, sLen = scopes.Count; s < sLen; ++s) + { + var scope = scopes[s] as string; + if (string.IsNullOrEmpty(scope)) + { + continue; + } + + if (packageName.Equals(scope, StringComparison.OrdinalIgnoreCase)) + { + // exact match, use it right away + return registryUrl; + } + + if (packageName.StartsWith(scope)) + { + var currentScopeMatchScore = scope.Length; + if (currentScopeMatchScore > closestMatchScore) + { + closestMatch = registryUrl; + closestMatchScore = currentScopeMatchScore; + } + } + } + } + + return closestMatch; + } + +#if BRT_PACKAGE_PARSE_DEBUG + [MenuItem("Window/TestPopulatePackageList1")] + public static void TestPopulatePackageList1() + { + const string TEST_SCOPED_REGISTRY_TEXT = @"{ + ""scopedRegistries"": [ + { + ""name"": ""General"", + ""url"": ""https://example.com/registry"", + ""scopes"": [ + ""com.example"", ""com.example.tools.physics"" + ] + }, + { + ""name"": ""Tools"", + ""url"": ""https://mycompany.example.com/tools-registry"", + ""scopes"": [ + ""com.example.mycompany.tools"" + ] + } + ], + ""dependencies"": { + ""com.unity.animation"": ""1.0.0"", + ""com.example.mycompany.tools.animation"": ""1.0.0"", + ""com.example.tools.physics"": ""1.0.0"", + ""com.example.animation"": ""1.0.0"" +} +}"; + var packageList = new List(); + var builtInPackageList = new List(); + PopulatePackageList(TEST_SCOPED_REGISTRY_TEXT, null, packageList, builtInPackageList); + } + + [MenuItem("Window/TestPopulatePackageList2")] + public static void TestPopulatePackageList2() + { + const string TEST_MANIFEST_TEXT = @"{ + ""dependencies"": { + ""com.marijnzwemmer.unity-toolbar-extender"": ""https://github.com/marijnz/unity-toolbar-extender.git"", + ""com.unity.editorcoroutines"": ""1.0.0"", + ""com.unity.package-manager-ui"": ""2.0.13"", + ""com.unity.postprocessing"": ""https://github.com/AnomalousUnderdog/UnityPostProcessingStack.git"", + ""com.unity.textmeshpro"": ""1.4.1"", + ""com.vladfaust.unitywakatime"": ""https://github.com/AnomalousUnderdog/unity-wakatime.git#package"", + ""com.unity.modules.ai"": ""1.0.0"", + ""com.unity.modules.animation"": ""1.0.0"", + ""com.unity.modules.assetbundle"": ""1.0.0"", + ""com.unity.modules.audio"": ""1.0.0"", + ""com.unity.modules.cloth"": ""1.0.0"", + ""com.unity.modules.director"": ""1.0.0"", + ""com.unity.modules.imageconversion"": ""1.0.0"", + ""com.unity.modules.imgui"": ""1.0.0"", + ""com.unity.modules.jsonserialize"": ""1.0.0"", + ""com.unity.modules.particlesystem"": ""1.0.0"", + ""com.unity.modules.physics"": ""1.0.0"", + ""com.unity.modules.screencapture"": ""1.0.0"", + ""com.unity.modules.terrain"": ""1.0.0"", + ""com.unity.modules.terrainphysics"": ""1.0.0"", + ""com.unity.modules.tilemap"": ""1.0.0"", + ""com.unity.modules.ui"": ""1.0.0"", + ""com.unity.modules.uielements"": ""1.0.0"", + ""com.unity.modules.umbra"": ""1.0.0"", + ""com.unity.modules.unitywebrequest"": ""1.0.0"", + ""com.unity.modules.unitywebrequestassetbundle"": ""1.0.0"", + ""com.unity.modules.unitywebrequestaudio"": ""1.0.0"", + ""com.unity.modules.unitywebrequesttexture"": ""1.0.0"", + ""com.unity.modules.unitywebrequestwww"": ""1.0.0"", + ""com.unity.modules.vehicles"": ""1.0.0"", + ""com.unity.modules.video"": ""1.0.0"", + ""com.unity.modules.wind"": ""1.0.0"" + }, + ""lock"": { + ""com.vladfaust.unitywakatime"": { + ""revision"": ""package"", + ""hash"": ""34ad206dfa61e282cc3f31f2a32a6b07e0a8cbf5"" + }, + ""com.marijnzwemmer.unity-toolbar-extender"": { + ""revision"": ""HEAD"", + ""hash"": ""c106680bbd730a66ec8745d606f7a7ccbcbae18c"" + }, + ""com.unity.postprocessing"": { + ""revision"": ""HEAD"", + ""hash"": ""bb15f6b6ec3b93cb25981a7018ba0a61d78f3be6"" + } + } +} +"; + var packageList = new List(); + var builtInPackageList = new List(); + PopulatePackageList(TEST_MANIFEST_TEXT, null, packageList, builtInPackageList); + } + + [MenuItem("Window/TestPopulatePackageList3")] + public static void TestPopulatePackageList3() + { + const string TEST_MANIFEST_TEXT = @"{ + ""dependencies"": { + ""com.marijnzwemmer.unity-toolbar-extender"": ""https://github.com/marijnz/unity-toolbar-extender.git"", + ""com.unity.collab-proxy"": ""1.6.0"", + ""com.unity.ide.rider"": ""1.2.1"", + ""com.unity.ide.visualstudio"": ""2.0.9"", + ""com.unity.ide.vscode"": ""1.2.3"", + ""com.unity.test-framework"": ""1.1.27"", + ""com.unity.textmeshpro"": ""2.1.4"", + ""com.unity.timeline"": ""1.2.18"", + ""com.unity.ugui"": ""1.0.0"", + ""com.unity.modules.ai"": ""1.0.0"", + ""com.unity.modules.androidjni"": ""1.0.0"", + ""com.unity.modules.animation"": ""1.0.0"", + ""com.unity.modules.assetbundle"": ""1.0.0"", + ""com.unity.modules.audio"": ""1.0.0"", + ""com.unity.modules.cloth"": ""1.0.0"", + ""com.unity.modules.director"": ""1.0.0"", + ""com.unity.modules.imageconversion"": ""1.0.0"", + ""com.unity.modules.imgui"": ""1.0.0"", + ""com.unity.modules.jsonserialize"": ""1.0.0"", + ""com.unity.modules.particlesystem"": ""1.0.0"", + ""com.unity.modules.physics"": ""1.0.0"", + ""com.unity.modules.physics2d"": ""1.0.0"", + ""com.unity.modules.screencapture"": ""1.0.0"", + ""com.unity.modules.terrain"": ""1.0.0"", + ""com.unity.modules.terrainphysics"": ""1.0.0"", + ""com.unity.modules.tilemap"": ""1.0.0"", + ""com.unity.modules.ui"": ""1.0.0"", + ""com.unity.modules.uielements"": ""1.0.0"", + ""com.unity.modules.umbra"": ""1.0.0"", + ""com.unity.modules.unityanalytics"": ""1.0.0"", + ""com.unity.modules.unitywebrequest"": ""1.0.0"", + ""com.unity.modules.unitywebrequestassetbundle"": ""1.0.0"", + ""com.unity.modules.unitywebrequestaudio"": ""1.0.0"", + ""com.unity.modules.unitywebrequesttexture"": ""1.0.0"", + ""com.unity.modules.unitywebrequestwww"": ""1.0.0"", + ""com.unity.modules.vehicles"": ""1.0.0"", + ""com.unity.modules.video"": ""1.0.0"", + ""com.unity.modules.vr"": ""1.0.0"", + ""com.unity.modules.wind"": ""1.0.0"", + ""com.unity.modules.xr"": ""1.0.0"" + } +} +"; + const string TEST_PACKAGES_LOCK_TEXT = @"{ + ""dependencies"": { + ""com.marijnzwemmer.unity-toolbar-extender"": { + ""version"": ""https://github.com/marijnz/unity-toolbar-extender.git"", + ""depth"": 0, + ""source"": ""git"", + ""dependencies"": {}, + ""hash"": ""df8031d46275ab1e0efc1225c33f58cda2f74872"" + }, + ""com.unity.collab-proxy"": { + ""version"": ""1.6.0"", + ""depth"": 0, + ""source"": ""registry"", + ""dependencies"": {}, + ""url"": ""https://packages.unity.com"" + }, + ""com.unity.ext.nunit"": { + ""version"": ""1.0.6"", + ""depth"": 1, + ""source"": ""registry"", + ""dependencies"": {}, + ""url"": ""https://packages.unity.com"" + }, + ""com.unity.ide.rider"": { + ""version"": ""1.2.1"", + ""depth"": 0, + ""source"": ""registry"", + ""dependencies"": { + ""com.unity.test-framework"": ""1.1.1"" + }, + ""url"": ""https://packages.unity.com"" + }, + ""com.unity.ide.visualstudio"": { + ""version"": ""2.0.9"", + ""depth"": 0, + ""source"": ""registry"", + ""dependencies"": { + ""com.unity.test-framework"": ""1.1.9"" + }, + ""url"": ""https://packages.unity.com"" + }, + ""com.unity.ide.vscode"": { + ""version"": ""1.2.3"", + ""depth"": 0, + ""source"": ""registry"", + ""dependencies"": {}, + ""url"": ""https://packages.unity.com"" + }, + ""com.unity.test-framework"": { + ""version"": ""1.1.27"", + ""depth"": 0, + ""source"": ""registry"", + ""dependencies"": { + ""com.unity.ext.nunit"": ""1.0.6"", + ""com.unity.modules.imgui"": ""1.0.0"", + ""com.unity.modules.jsonserialize"": ""1.0.0"" + }, + ""url"": ""https://packages.unity.com"" + }, + ""com.unity.textmeshpro"": { + ""version"": ""2.1.4"", + ""depth"": 0, + ""source"": ""registry"", + ""dependencies"": { + ""com.unity.ugui"": ""1.0.0"" + }, + ""url"": ""https://packages.unity.com"" + }, + ""com.unity.timeline"": { + ""version"": ""1.2.18"", + ""depth"": 0, + ""source"": ""registry"", + ""dependencies"": { + ""com.unity.modules.director"": ""1.0.0"", + ""com.unity.modules.animation"": ""1.0.0"", + ""com.unity.modules.audio"": ""1.0.0"", + ""com.unity.modules.particlesystem"": ""1.0.0"" + }, + ""url"": ""https://packages.unity.com"" + }, + ""com.unity.ugui"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.ui"": ""1.0.0"", + ""com.unity.modules.imgui"": ""1.0.0"" + } + }, + ""com.unity.modules.ai"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.androidjni"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.animation"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.assetbundle"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.audio"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.cloth"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.physics"": ""1.0.0"" + } + }, + ""com.unity.modules.director"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.audio"": ""1.0.0"", + ""com.unity.modules.animation"": ""1.0.0"" + } + }, + ""com.unity.modules.imageconversion"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.imgui"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.jsonserialize"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.particlesystem"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.physics"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.physics2d"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.screencapture"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.imageconversion"": ""1.0.0"" + } + }, + ""com.unity.modules.subsystems"": { + ""version"": ""1.0.0"", + ""depth"": 1, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.jsonserialize"": ""1.0.0"" + } + }, + ""com.unity.modules.terrain"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.terrainphysics"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.physics"": ""1.0.0"", + ""com.unity.modules.terrain"": ""1.0.0"" + } + }, + ""com.unity.modules.tilemap"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.physics2d"": ""1.0.0"" + } + }, + ""com.unity.modules.ui"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.uielements"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.imgui"": ""1.0.0"", + ""com.unity.modules.jsonserialize"": ""1.0.0"" + } + }, + ""com.unity.modules.umbra"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.unityanalytics"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.unitywebrequest"": ""1.0.0"", + ""com.unity.modules.jsonserialize"": ""1.0.0"" + } + }, + ""com.unity.modules.unitywebrequest"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.unitywebrequestassetbundle"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.assetbundle"": ""1.0.0"", + ""com.unity.modules.unitywebrequest"": ""1.0.0"" + } + }, + ""com.unity.modules.unitywebrequestaudio"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.unitywebrequest"": ""1.0.0"", + ""com.unity.modules.audio"": ""1.0.0"" + } + }, + ""com.unity.modules.unitywebrequesttexture"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.unitywebrequest"": ""1.0.0"", + ""com.unity.modules.imageconversion"": ""1.0.0"" + } + }, + ""com.unity.modules.unitywebrequestwww"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.unitywebrequest"": ""1.0.0"", + ""com.unity.modules.unitywebrequestassetbundle"": ""1.0.0"", + ""com.unity.modules.unitywebrequestaudio"": ""1.0.0"", + ""com.unity.modules.audio"": ""1.0.0"", + ""com.unity.modules.assetbundle"": ""1.0.0"", + ""com.unity.modules.imageconversion"": ""1.0.0"" + } + }, + ""com.unity.modules.vehicles"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.physics"": ""1.0.0"" + } + }, + ""com.unity.modules.video"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.audio"": ""1.0.0"", + ""com.unity.modules.ui"": ""1.0.0"", + ""com.unity.modules.unitywebrequest"": ""1.0.0"" + } + }, + ""com.unity.modules.vr"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.jsonserialize"": ""1.0.0"", + ""com.unity.modules.physics"": ""1.0.0"", + ""com.unity.modules.xr"": ""1.0.0"" + } + }, + ""com.unity.modules.wind"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": {} + }, + ""com.unity.modules.xr"": { + ""version"": ""1.0.0"", + ""depth"": 0, + ""source"": ""builtin"", + ""dependencies"": { + ""com.unity.modules.physics"": ""1.0.0"", + ""com.unity.modules.jsonserialize"": ""1.0.0"", + ""com.unity.modules.subsystems"": ""1.0.0"" + } + } + } +} +"; + + var packageList = new List(); + var builtInPackageList = new List(); + PopulatePackageList(TEST_MANIFEST_TEXT, TEST_PACKAGES_LOCK_TEXT, packageList, builtInPackageList); + } +#endif + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_UnityBuildSettingsUtility.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_UnityBuildSettingsUtility.cs.meta new file mode 100644 index 00000000..6df61ca5 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/ReportGeneration/BRT_UnityBuildSettingsUtility.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 90bf8676d542e63418cadd96fce890c4 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility.meta new file mode 100644 index 00000000..12796de7 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cefd81bed49305a4dbe050c93846560e diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort.cs new file mode 100644 index 00000000..7145aa08 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort.cs @@ -0,0 +1,236 @@ +using System; + +namespace BuildReportTool +{ + public static partial class AssetListUtility + { + public static void SortAssetList(BuildReportTool.SizePart[] assetList, BuildReportTool.AssetList.SortType sortType, BuildReportTool.AssetList.SortOrder sortOrder) + { + switch (sortType) + { + case BuildReportTool.AssetList.SortType.RawSize: + SortRawSize(assetList, sortOrder); + break; + case BuildReportTool.AssetList.SortType.ImportedSize: + SortImportedSize(assetList, sortOrder); + break; + case BuildReportTool.AssetList.SortType.ImportedSizeOrRawSize: + SortImportedSizeOrRawSize(assetList, sortOrder); + break; + case BuildReportTool.AssetList.SortType.SizeBeforeBuild: + SortSizeBeforeBuild(assetList, sortOrder); + break; + case BuildReportTool.AssetList.SortType.PercentSize: + SortPercentSize(assetList, sortOrder); + break; + case BuildReportTool.AssetList.SortType.AssetFullPath: + SortAssetFullPath(assetList, sortOrder); + break; + case BuildReportTool.AssetList.SortType.AssetFilename: + SortAssetName(assetList, sortOrder); + break; + } + } + + static void SortRawSize(BuildReportTool.SizePart[] assetList, BuildReportTool.AssetList.SortOrder sortOrder) + { + if (sortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + if (entry1.UsableSize > entry2.UsableSize) return -1; + if (entry1.UsableSize < entry2.UsableSize) return 1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameDescending(entry1, entry2); + }); + } + else + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + if (entry1.UsableSize > entry2.UsableSize) return 1; + if (entry1.UsableSize < entry2.UsableSize) return -1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameAscending(entry1, entry2); + }); + } + } + + static void SortImportedSizeOrRawSize(BuildReportTool.SizePart[] assetList, BuildReportTool.AssetList.SortOrder sortOrder) + { + if (sortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + if (entry1.ImportedSizeOrRawSize > entry2.ImportedSizeOrRawSize) return -1; + if (entry1.ImportedSizeOrRawSize < entry2.ImportedSizeOrRawSize) return 1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameDescending(entry1, entry2); + }); + } + else + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + if (entry1.ImportedSizeOrRawSize > entry2.ImportedSizeOrRawSize) return 1; + if (entry1.ImportedSizeOrRawSize < entry2.ImportedSizeOrRawSize) return -1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameAscending(entry1, entry2); + }); + } + } + + static void SortImportedSize(BuildReportTool.SizePart[] assetList, BuildReportTool.AssetList.SortOrder sortOrder) + { + if (sortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + if (entry1.ImportedSizeBytes > entry2.ImportedSizeBytes) return -1; + if (entry1.ImportedSizeBytes < entry2.ImportedSizeBytes) return 1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameDescending(entry1, entry2); + }); + } + else + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + if (entry1.ImportedSizeBytes > entry2.ImportedSizeBytes) return 1; + if (entry1.ImportedSizeBytes < entry2.ImportedSizeBytes) return -1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameAscending(entry1, entry2); + }); + } + } + + static void SortSizeBeforeBuild(BuildReportTool.SizePart[] assetList, BuildReportTool.AssetList.SortOrder sortOrder) + { + if (sortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + if (entry1.SizeInAssetsFolderBytes > entry2.SizeInAssetsFolderBytes) return -1; + if (entry1.SizeInAssetsFolderBytes < entry2.SizeInAssetsFolderBytes) return 1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameDescending(entry1, entry2); + }); + } + else + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + if (entry1.SizeInAssetsFolderBytes > entry2.SizeInAssetsFolderBytes) return 1; + if (entry1.SizeInAssetsFolderBytes < entry2.SizeInAssetsFolderBytes) return -1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameAscending(entry1, entry2); + }); + } + } + + static void SortPercentSize(BuildReportTool.SizePart[] assetList, BuildReportTool.AssetList.SortOrder sortOrder) + { + if (sortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + if (entry1.Percentage > entry2.Percentage) return -1; + if (entry1.Percentage < entry2.Percentage) return 1; + + // same percent + // sort by asset name for assets with same percent + return SortByAssetFullPathDescending(entry1, entry2); + }); + } + else + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + if (entry1.Percentage > entry2.Percentage) return 1; + if (entry1.Percentage < entry2.Percentage) return -1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetFullPathAscending(entry1, entry2); + }); + } + } + + static void SortAssetFullPath(BuildReportTool.SizePart[] assetList, BuildReportTool.AssetList.SortOrder sortOrder) + { + if (sortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + Array.Sort(assetList, SortByAssetFullPathDescending); + } + else + { + Array.Sort(assetList, SortByAssetFullPathAscending); + } + } + + static int SortByAssetFullPathDescending(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + int result = string.Compare(entry1.Name, entry2.Name, StringComparison.OrdinalIgnoreCase); + + return result; + } + + static int SortByAssetFullPathAscending(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + int result = string.Compare(entry1.Name, entry2.Name, StringComparison.OrdinalIgnoreCase); + + // invert the result + if (result == 1) return -1; + if (result == -1) return 1; + return 0; + } + + static void SortAssetName(BuildReportTool.SizePart[] assetList, BuildReportTool.AssetList.SortOrder sortOrder) + { + if (sortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + Array.Sort(assetList, SortByAssetNameDescending); + } + else + { + Array.Sort(assetList, SortByAssetNameAscending); + } + } + + static int SortByAssetNameDescending(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + int result = string.Compare(entry1.Name.GetFileNameOnly(), entry2.Name.GetFileNameOnly(), + StringComparison.OrdinalIgnoreCase); + + return result; + } + + static int SortByAssetNameAscending(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + int result = string.Compare(entry1.Name.GetFileNameOnly(), entry2.Name.GetFileNameOnly(), + StringComparison.OrdinalIgnoreCase); + + // invert the result + if (result == 1) return -1; + if (result == -1) return 1; + + return 0; + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort.cs.meta new file mode 100644 index 00000000..9064862d --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 79890ab40b491994db602a062a793219 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Mesh.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Mesh.cs new file mode 100644 index 00000000..831ef6fe --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Mesh.cs @@ -0,0 +1,71 @@ +using System; + +namespace BuildReportTool +{ + public static partial class AssetListUtility + { + public static void SortAssetList(BuildReportTool.SizePart[] assetList, BuildReportTool.MeshData meshData, MeshData.DataId meshSortType, BuildReportTool.AssetList.SortOrder sortOrder) + { + switch (meshSortType) + { + case BuildReportTool.MeshData.DataId.MeshFilterCount: + SortMeshData(assetList, meshData, sortOrder, entry => entry.MeshFilterCount); + break; + case BuildReportTool.MeshData.DataId.SkinnedMeshRendererCount: + SortMeshData(assetList, meshData, sortOrder, entry => entry.SkinnedMeshRendererCount); + break; + case BuildReportTool.MeshData.DataId.SubMeshCount: + SortMeshData(assetList, meshData, sortOrder, entry => entry.SubMeshCount); + break; + case BuildReportTool.MeshData.DataId.VertexCount: + SortMeshData(assetList, meshData, sortOrder, entry => entry.VertexCount); + break; + case BuildReportTool.MeshData.DataId.TriangleCount: + SortMeshData(assetList, meshData, sortOrder, entry => entry.TriangleCount); + break; + case BuildReportTool.MeshData.DataId.AnimationType: + SortMeshData(assetList, meshData, sortOrder, entry => entry.AnimationType); + break; + case BuildReportTool.MeshData.DataId.AnimationClipCount: + SortMeshData(assetList, meshData, sortOrder, entry => entry.AnimationClipCount); + break; + } + } + + static void SortMeshData(BuildReportTool.SizePart[] assetList, BuildReportTool.MeshData meshData, BuildReportTool.AssetList.SortOrder sortOrder, Func func) + { + var meshEntries = meshData.GetMeshData(); + + for (int n = 0; n < assetList.Length; ++n) + { + int intValue = 0; + if (meshEntries.ContainsKey(assetList[n].Name)) + { + intValue = func(meshEntries[assetList[n].Name]); + } + + assetList[n].SetIntAuxData(intValue); + } + + SortByInt(assetList, sortOrder); + } + + static void SortMeshData(BuildReportTool.SizePart[] assetList, BuildReportTool.MeshData meshData, BuildReportTool.AssetList.SortOrder sortOrder, Func func) + { + var meshEntries = meshData.GetMeshData(); + + for (int n = 0; n < assetList.Length; ++n) + { + string textData = null; + if (meshEntries.ContainsKey(assetList[n].Name)) + { + textData = func(meshEntries[assetList[n].Name]); + } + + assetList[n].SetTextAuxData(textData); + } + + SortByText(assetList, sortOrder); + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Mesh.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Mesh.cs.meta new file mode 100644 index 00000000..5d52790e --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Mesh.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f73334247e6cf5545871508d6e601fc5 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Prefab.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Prefab.cs new file mode 100644 index 00000000..6e37f940 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Prefab.cs @@ -0,0 +1,53 @@ +using System; + +namespace BuildReportTool +{ + public static partial class AssetListUtility + { + public static void SortAssetList(BuildReportTool.SizePart[] assetList, BuildReportTool.PrefabData prefabData, PrefabData.DataId prefabSortType, BuildReportTool.AssetList.SortOrder sortOrder) + { + switch (prefabSortType) + { + case BuildReportTool.PrefabData.DataId.ContributeGI: + SortPrefabData(assetList, prefabData, sortOrder, entry => entry.ContributeGIValue); + break; + case BuildReportTool.PrefabData.DataId.BatchingStatic: + SortPrefabData(assetList, prefabData, sortOrder, entry => entry.BatchingStaticValue); + break; + case BuildReportTool.PrefabData.DataId.ReflectionProbeStatic: + SortPrefabData(assetList, prefabData, sortOrder, entry => entry.ReflectionProbeStaticValue); + break; + case BuildReportTool.PrefabData.DataId.OccluderStatic: + SortPrefabData(assetList, prefabData, sortOrder, entry => entry.OccluderStaticValue); + break; + case BuildReportTool.PrefabData.DataId.OccludeeStatic: + SortPrefabData(assetList, prefabData, sortOrder, entry => entry.OccludeeStaticValue); + break; + case BuildReportTool.PrefabData.DataId.NavigationStatic: + SortPrefabData(assetList, prefabData, sortOrder, entry => entry.NavigationStaticValue); + break; + case BuildReportTool.PrefabData.DataId.OffMeshLinkGeneration: + SortPrefabData(assetList, prefabData, sortOrder, entry => entry.OffMeshLinkGenerationValue); + break; + } + } + + static void SortPrefabData(BuildReportTool.SizePart[] assetList, BuildReportTool.PrefabData prefabData, BuildReportTool.AssetList.SortOrder sortOrder, Func func) + { + var prefabEntries = prefabData.GetPrefabData(); + + for (int n = 0; n < assetList.Length; ++n) + { + int intValue = 0; + if (prefabEntries.ContainsKey(assetList[n].Name)) + { + intValue = func(prefabEntries[assetList[n].Name]); + } + + assetList[n].SetIntAuxData(intValue); + } + + SortByInt(assetList, sortOrder); + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Prefab.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Prefab.cs.meta new file mode 100644 index 00000000..c91a6eef --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Prefab.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 9b43049560f4da54c8419cb9700ba7f9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Texture.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Texture.cs new file mode 100644 index 00000000..de2c7c49 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Texture.cs @@ -0,0 +1,466 @@ +using System; + +namespace BuildReportTool +{ + public static partial class AssetListUtility + { + public static void SortAssetList(BuildReportTool.SizePart[] assetList, BuildReportTool.TextureData textureData, TextureData.DataId textureSortType, BuildReportTool.AssetList.SortOrder sortOrder) + { + switch (textureSortType) + { + case BuildReportTool.TextureData.DataId.TextureType: + SortTextureData(assetList, textureData, sortOrder, entry => entry.TextureType); + break; + case BuildReportTool.TextureData.DataId.IsSRGB: + SortTextureData(assetList, textureData, sortOrder, entry => entry.IsSRGB); + break; + case BuildReportTool.TextureData.DataId.AlphaSource: + SortTextureData(assetList, textureData, sortOrder, entry => entry.AlphaSource); + break; + case BuildReportTool.TextureData.DataId.AlphaIsTransparency: + SortTextureData(assetList, textureData, sortOrder, entry => entry.AlphaIsTransparency); + break; + case BuildReportTool.TextureData.DataId.IgnorePngGamma: + SortTextureData(assetList, textureData, sortOrder, entry => entry.IgnorePngGamma); + break; + case BuildReportTool.TextureData.DataId.NPotScale: + SortNPotScale(assetList, textureData, sortOrder); + break; + case BuildReportTool.TextureData.DataId.IsReadable: + SortTextureData(assetList, textureData, sortOrder, entry => entry.IsReadable); + break; + case BuildReportTool.TextureData.DataId.MipMapGenerated: + SortTextureData(assetList, textureData, sortOrder, entry => entry.MipMapGenerated); + break; + case BuildReportTool.TextureData.DataId.MipMapFilter: + SortTextureData(assetList, textureData, sortOrder, entry => entry.MipMapFilter); + break; + case BuildReportTool.TextureData.DataId.StreamingMipMaps: + SortTextureData(assetList, textureData, sortOrder, entry => entry.StreamingMipMaps); + break; + case BuildReportTool.TextureData.DataId.BorderMipMaps: + SortTextureData(assetList, textureData, sortOrder, entry => entry.BorderMipMaps); + break; + case BuildReportTool.TextureData.DataId.PreserveCoverageMipMaps: + SortTextureData(assetList, textureData, sortOrder, entry => entry.PreserveCoverageMipMaps); + break; + case BuildReportTool.TextureData.DataId.FadeOutMipMaps: + SortTextureData(assetList, textureData, sortOrder, entry => entry.FadeOutMipMaps); + break; + case BuildReportTool.TextureData.DataId.SpriteImportMode: + SortTextureData(assetList, textureData, sortOrder, entry => entry.SpriteImportMode); + break; + case BuildReportTool.TextureData.DataId.SpritePackingTag: + SortTextureData(assetList, textureData, sortOrder, entry => entry.SpritePackingTag); + break; + case BuildReportTool.TextureData.DataId.SpritePixelsPerUnit: + SortTextureData(assetList, textureData, sortOrder, entry => entry.SpritePixelsPerUnit); + break; + case BuildReportTool.TextureData.DataId.QualifiesForSpritePacking: + SortTextureData(assetList, textureData, sortOrder, entry => entry.QualifiesForSpritePacking); + break; + case BuildReportTool.TextureData.DataId.WrapMode: + SortTextureData(assetList, textureData, sortOrder, entry => entry.WrapMode); + break; + case BuildReportTool.TextureData.DataId.WrapModeU: + SortTextureData(assetList, textureData, sortOrder, entry => entry.WrapModeU); + break; + case BuildReportTool.TextureData.DataId.WrapModeV: + SortTextureData(assetList, textureData, sortOrder, entry => entry.WrapModeV); + break; + case BuildReportTool.TextureData.DataId.WrapModeW: + SortTextureData(assetList, textureData, sortOrder, entry => entry.WrapModeW); + break; + case BuildReportTool.TextureData.DataId.FilterMode: + SortTextureData(assetList, textureData, sortOrder, entry => entry.FilterMode); + break; + case BuildReportTool.TextureData.DataId.AnisoLevel: + SortTextureData(assetList, textureData, sortOrder, entry => entry.AnisoLevel); + break; + case BuildReportTool.TextureData.DataId.MaxTextureSize: + SortTextureData(assetList, textureData, sortOrder, entry => entry.GetShownMaxTextureSize()); + break; + case BuildReportTool.TextureData.DataId.TextureResizeAlgorithm: + SortTextureData(assetList, textureData, sortOrder, entry => entry.GetShownTextureResizeAlgorithm()); + break; + case BuildReportTool.TextureData.DataId.TextureFormat: + SortTextureData(assetList, textureData, sortOrder, entry => entry.GetShownTextureFormat()); + break; + case BuildReportTool.TextureData.DataId.CompressionType: + SortTextureData(assetList, textureData, sortOrder, entry => entry.GetShownCompressionType()); + break; + case BuildReportTool.TextureData.DataId.CompressionIsCrunched: + SortTextureData(assetList, textureData, sortOrder, entry => entry.GetShownCompressionIsCrunched()); + break; + case BuildReportTool.TextureData.DataId.CompressionQuality: + SortTextureData(assetList, textureData, sortOrder, entry => entry.GetShownCompressionQuality()); + break; + case BuildReportTool.TextureData.DataId.ImportedWidthAndHeight: + SortTextureData(assetList, textureData, sortOrder, entry => entry.GetImportedPixelCount()); + break; + case BuildReportTool.TextureData.DataId.RealWidthAndHeight: + SortTextureData(assetList, textureData, sortOrder, entry => entry.GetRealPixelCount()); + break; + } + } + + static int CompareNPotScale(string nPotScale1, string nPotScale2) + { + var nPotScale1IsNoneNot = nPotScale1 == BuildReportTool.TextureData.NPOT_SCALE_NONE_NOT_POT; + var nPotScale2IsNoneNot = nPotScale1 == BuildReportTool.TextureData.NPOT_SCALE_NONE_NOT_POT; + + if (nPotScale1IsNoneNot && !nPotScale2IsNoneNot) + { + return -1; + } + if (!nPotScale1IsNoneNot && nPotScale2IsNoneNot) + { + return 1; + } + + return string.Compare(nPotScale1, nPotScale2, StringComparison.Ordinal); + } + + // ============================================================================================================= + + static void SortByInt(BuildReportTool.SizePart[] assetList, BuildReportTool.AssetList.SortOrder sortOrder) + { + if (sortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + int sortResult = entry2.GetIntAuxData().CompareTo(entry1.GetIntAuxData()); + if (sortResult != 0) + { + return sortResult; + } + + // same texture data + // sort by asset size for assets with texture data + if (entry1.UsableSize > entry2.UsableSize) return -1; + if (entry1.UsableSize < entry2.UsableSize) return 1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameDescending(entry1, entry2); + }); + } + else + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + int sortResult = entry1.GetIntAuxData().CompareTo(entry2.GetIntAuxData()); + if (sortResult != 0) + { + return sortResult; + } + + // same texture data + // sort by asset size for assets with same texture data + if (entry1.UsableSize > entry2.UsableSize) return 1; + if (entry1.UsableSize < entry2.UsableSize) return -1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameAscending(entry1, entry2); + }); + } + } + + static void SortByFloat(BuildReportTool.SizePart[] assetList, BuildReportTool.AssetList.SortOrder sortOrder) + { + if (sortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + int sortResult = entry1.GetFloatAuxData().CompareTo(entry2.GetFloatAuxData()); + if (sortResult != 0) + { + return sortResult; + } + + // same texture data + // sort by asset size for assets with texture data + if (entry1.UsableSize > entry2.UsableSize) return -1; + if (entry1.UsableSize < entry2.UsableSize) return 1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameDescending(entry1, entry2); + }); + } + else + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + int sortResult = entry2.GetFloatAuxData().CompareTo(entry1.GetFloatAuxData()); + if (sortResult != 0) + { + return sortResult; + } + + // same texture data + // sort by asset size for assets with same texture data + if (entry1.UsableSize > entry2.UsableSize) return 1; + if (entry1.UsableSize < entry2.UsableSize) return -1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameAscending(entry1, entry2); + }); + } + } + + static void SortByText(BuildReportTool.SizePart[] assetList, BuildReportTool.AssetList.SortOrder sortOrder) + { + if (sortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + int sortTextureTypeResult = string.Compare(entry1.GetTextAuxData(), entry2.GetTextAuxData(), StringComparison.OrdinalIgnoreCase); + if (sortTextureTypeResult != 0) + { + return sortTextureTypeResult; + } + + // same texture type + // sort by asset size for assets with same texture types + if (entry1.UsableSize > entry2.UsableSize) return -1; + if (entry1.UsableSize < entry2.UsableSize) return 1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameDescending(entry1, entry2); + }); + } + else + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + int sortTextureTypeResult = string.Compare(entry2.GetTextAuxData(), entry1.GetTextAuxData(), StringComparison.OrdinalIgnoreCase); + if (sortTextureTypeResult != 0) + { + return sortTextureTypeResult; + } + + // same texture type + // sort by asset size for assets with same texture types + if (entry1.UsableSize > entry2.UsableSize) return 1; + if (entry1.UsableSize < entry2.UsableSize) return -1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameAscending(entry1, entry2); + }); + } + } + + static void SortByText(BuildReportTool.SizePart[] assetList, BuildReportTool.AssetList.SortOrder sortOrder, Func compare) + { + if (sortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + int sortTextureTypeResult = compare(entry1.GetTextAuxData(), entry2.GetTextAuxData()); + if (sortTextureTypeResult != 0) + { + return sortTextureTypeResult; + } + + // same texture type + // sort by asset size for assets with same texture types + if (entry1.UsableSize > entry2.UsableSize) return -1; + if (entry1.UsableSize < entry2.UsableSize) return 1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameDescending(entry1, entry2); + }); + } + else + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + int sortTextureTypeResult = compare(entry2.GetTextAuxData(), entry1.GetTextAuxData()); + if (sortTextureTypeResult != 0) + { + return sortTextureTypeResult; + } + + // same texture type + // sort by asset size for assets with same texture types + if (entry1.UsableSize > entry2.UsableSize) return 1; + if (entry1.UsableSize < entry2.UsableSize) return -1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameAscending(entry1, entry2); + }); + } + } + + // ============================================================================================================= + + static void SortTextureData(BuildReportTool.SizePart[] assetList, BuildReportTool.TextureData textureData, BuildReportTool.AssetList.SortOrder sortOrder, Func func) + { + var textureEntries = textureData.GetTextureData(); + + for (int n = 0; n < assetList.Length; ++n) + { + int boolValue = 0; + if (textureEntries.ContainsKey(assetList[n].Name)) + { + boolValue = func(textureEntries[assetList[n].Name]) ? 1 : 0; + } + + assetList[n].SetIntAuxData(boolValue); + } + + SortByInt(assetList, sortOrder); + } + + static void SortTextureData(BuildReportTool.SizePart[] assetList, BuildReportTool.TextureData textureData, BuildReportTool.AssetList.SortOrder sortOrder, Func func) + { + var textureEntries = textureData.GetTextureData(); + + for (int n = 0; n < assetList.Length; ++n) + { + string textData = null; + if (textureEntries.ContainsKey(assetList[n].Name)) + { + textData = func(textureEntries[assetList[n].Name]); + } + + assetList[n].SetTextAuxData(textData); + } + + SortByText(assetList, sortOrder); + } + + static void SortTextureData(BuildReportTool.SizePart[] assetList, BuildReportTool.TextureData textureData, BuildReportTool.AssetList.SortOrder sortOrder, Func func) + { + var textureEntries = textureData.GetTextureData(); + + for (int n = 0; n < assetList.Length; ++n) + { + float floatValue = 0; + if (textureEntries.ContainsKey(assetList[n].Name)) + { + floatValue = func(textureEntries[assetList[n].Name]); + } + + assetList[n].SetFloatAuxData(floatValue); + } + + SortByFloat(assetList, sortOrder); + } + + static void SortTextureData(BuildReportTool.SizePart[] assetList, BuildReportTool.TextureData textureData, BuildReportTool.AssetList.SortOrder sortOrder, Func func) + { + var textureEntries = textureData.GetTextureData(); + + for (int n = 0; n < assetList.Length; ++n) + { + int intValue = 0; + if (textureEntries.ContainsKey(assetList[n].Name)) + { + intValue = func(textureEntries[assetList[n].Name]); + } + + assetList[n].SetIntAuxData(intValue); + } + + SortByInt(assetList, sortOrder); + } + + // NPotScale sort is special: we want the "None (Not Power of 2)" values to go at top, ignoring alphabetical order for that special value + static void SortNPotScale(BuildReportTool.SizePart[] assetList, BuildReportTool.TextureData textureData, BuildReportTool.AssetList.SortOrder sortOrder) + { + var textureEntries = textureData.GetTextureData(); + + for (int n = 0; n < assetList.Length; ++n) + { + string textData = null; + if (textureEntries.ContainsKey(assetList[n].Name)) + { + textData = textureEntries[assetList[n].Name].NPotScale; + } + + assetList[n].SetTextAuxData(textData); + } + + if (sortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + string nPotScale1 = entry1.GetTextAuxData(); + string nPotScale2 = entry2.GetTextAuxData(); + + // put non-power-of-2 at top + bool nPotScale1IsNoneNot = nPotScale1 == BuildReportTool.TextureData.NPOT_SCALE_NONE_NOT_POT; + bool nPotScale2IsNoneNot = nPotScale2 == BuildReportTool.TextureData.NPOT_SCALE_NONE_NOT_POT; + if (nPotScale1IsNoneNot && !nPotScale2IsNoneNot) + { + return -1; + } + if (!nPotScale1IsNoneNot && nPotScale2IsNoneNot) + { + return 1; + } + + // at this point, entry1 and entry 2 are not non-power-of-2 (or both of them are), so compare them as usual + int sortTextureTypeResult = string.Compare(nPotScale1, nPotScale2, StringComparison.OrdinalIgnoreCase); + if (sortTextureTypeResult != 0) + { + return sortTextureTypeResult; + } + + // same nPotScale type + // sort by asset size for assets with same nPotScale types + if (entry1.UsableSize > entry2.UsableSize) return -1; + if (entry1.UsableSize < entry2.UsableSize) return 1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameDescending(entry1, entry2); + }); + } + else + { + Array.Sort(assetList, delegate(BuildReportTool.SizePart entry1, BuildReportTool.SizePart entry2) + { + string nPotScale1 = entry1.GetTextAuxData(); + string nPotScale2 = entry2.GetTextAuxData(); + + // put non-power-of-2 at bottom + bool nPotScale1IsNoneNot = nPotScale1 == BuildReportTool.TextureData.NPOT_SCALE_NONE_NOT_POT; + bool nPotScale2IsNoneNot = nPotScale2 == BuildReportTool.TextureData.NPOT_SCALE_NONE_NOT_POT; + if (nPotScale1IsNoneNot && !nPotScale2IsNoneNot) + { + return 1; + } + if (!nPotScale1IsNoneNot && nPotScale2IsNoneNot) + { + return -1; + } + + // at this point, entry1 and entry 2 are not non-power-of-2 (or both of them are), so compare them as usual + int sortTextureTypeResult = string.Compare(nPotScale2, nPotScale1, StringComparison.OrdinalIgnoreCase); + if (sortTextureTypeResult != 0) + { + return sortTextureTypeResult; + } + + // same nPotScale type + // sort by asset size for assets with same nPotScale types + if (entry1.UsableSize > entry2.UsableSize) return 1; + if (entry1.UsableSize < entry2.UsableSize) return -1; + + // same size + // sort by asset name for assets with same sizes + return SortByAssetNameAscending(entry1, entry2); + }); + } + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Texture.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Texture.cs.meta new file mode 100644 index 00000000..45d9a01f --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_AssetList_Sort_Texture.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ce767224a570c654b8fa057ab56f9655 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_LibCacheUtil.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_LibCacheUtil.cs new file mode 100644 index 00000000..5bcc61ab --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_LibCacheUtil.cs @@ -0,0 +1,67 @@ +using UnityEngine; +using UnityEditor; +using System.IO; + +public static class BRT_LibCacheUtil +{ + // assetPath is expected to start with "Assets/" + // + // since this function calls AssetDatabase.AssetPathToGUID(), + // it can only be called from the Unity main thread + // + public static long GetImportedFileSize(string assetPath) + { + long result = -1; + + assetPath = BuildReportTool.Util.MyHtmlDecode(assetPath); + + // files in "StreamingAssets" folder do not get imported + // in the 1st place, so skip them + if (BuildReportTool.Util.IsFileStreamingAsset(assetPath)) + { + return -1; + } + + // files like Thumbs.db or .DS_Store files do not get imported + if (BuildReportTool.Util.IsUselessFile(assetPath)) + { + return -1; + } + + // Unix-style hidden files do not get imported + if (BuildReportTool.Util.IsFileAUnixHiddenFile(assetPath)) + { + return -1; + } + + if (!string.IsNullOrEmpty(assetPath)) + { + string guid = AssetDatabase.AssetPathToGUID(assetPath); + if (guid.Length < 2) + { + //Debug.Log(assetPath + " has no guid? value is \"" + guid + "\""); + return -1; + } + + string assetImportedPath = + Path.GetFullPath(Application.dataPath + "../../Library/cache/" + guid.Substring(0, 2) + "/" + guid); + + if (File.Exists(assetImportedPath)) + { + result = BuildReportTool.Util.GetFileSizeInBytes(assetImportedPath); + } + else + { + //Debug.Log(assetPath + " not found: " + assetImportedPath); + assetImportedPath = + Path.GetFullPath(Application.dataPath + "../../Library/metadata/" + guid.Substring(0, 2) + "/" + guid); + if (File.Exists(assetImportedPath)) + { + result = BuildReportTool.Util.GetFileSizeInBytes(assetImportedPath); + } + } + } + + return result; + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_LibCacheUtil.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_LibCacheUtil.cs.meta new file mode 100644 index 00000000..561fa5b8 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_LibCacheUtil.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 4e196d8f60acab14686d24e69b820790 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_Util.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_Util.cs new file mode 100644 index 00000000..67905361 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_Util.cs @@ -0,0 +1,2571 @@ +#if (UNITY_4 || UNITY_4_1 || UNITY_4_2 || UNITY_4_3 || UNITY_4_4 || UNITY_4_5 || UNITY_4_6 || UNITY_5 || UNITY_2017_1_OR_NEWER) +#define UNITY_4_AND_GREATER +#endif + +using UnityEngine; +using UnityEditor; +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Runtime.InteropServices; + +namespace BuildReportTool +{ + public static class Util + { + public static BuildPlatform GetBuildPlatformBasedOnUnityBuildTarget(BuildTarget b) + { + switch (b) + { + // ----------------------------------- + // Web Builds + +#if !UNITY_5_4_OR_NEWER + // Unity Web Build was up to Unity 5.3 + case BuildTarget.WebPlayer: + return BuildPlatform.Web; + case BuildTarget.WebPlayerStreamed: + return BuildPlatform.Web; +#endif + +#if UNITY_4 + // NaCl and Flash build support was up to Unity 4 + case BuildTarget.NaCl: + return BuildPlatform.Web; + + case BuildTarget.FlashPlayer: + return BuildPlatform.Flash; +#endif + case BuildTarget.WebGL: + return BuildPlatform.WebGL; + + // ----------------------------------- + // Mobile builds + +#if UNITY_4 + case BuildTarget.iPhone: +#else + case BuildTarget.iOS: +#endif + return BuildPlatform.iOS; + + case BuildTarget.tvOS: + return BuildPlatform.tvOS; + + case BuildTarget.Android: + return BuildPlatform.Android; + + // ----------------------------------- + // Console builds + +#if !UNITY_5_5_OR_NEWER + // 7th gen console support was up to Unity 5.4 + case BuildTarget.XBOX360: + return BuildPlatform.XBOX360; + + case BuildTarget.PS3: + return BuildPlatform.PS3; +#endif + + // 8th gen + case BuildTarget.XboxOne: + return BuildPlatform.XboxOne; + case BuildTarget.PS4: + return BuildPlatform.PS4; +#if UNITY_5_2_OR_NEWER && !UNITY_2018_1_OR_NEWER + // WiiU support was from Unity 5.2 to Unity 2017.4 + case BuildTarget.WiiU: + return BuildPlatform.WiiU; +#endif +#if UNITY_5_6_OR_NEWER || UNITY_2017_1_OR_NEWER + case BuildTarget.Switch: + return BuildPlatform.Switch; +#endif + + // 9th gen +#if UNITY_2019_4_OR_NEWER + case BuildTarget.GameCoreXboxSeries: + return BuildPlatform.XboxSeries; + + case BuildTarget.PS5: + return BuildPlatform.PS5; +#endif + + // ----------------------------------- + // Windows builds + + case BuildTarget.StandaloneWindows: + return BuildPlatform.Windows32; + + case BuildTarget.StandaloneWindows64: + return BuildPlatform.Windows64; + + case BuildTarget.WSAPlayer: + return BuildPlatform.WindowsStoreApp; + + // ----------------------------------- + // Linux builds + +#if UNITY_4_AND_GREATER +#if !(UNITY_2019_2_OR_NEWER) + // note: Linux 32-bit and Universal support was from Unity 4 to Unity 2019.1 + case BuildTarget.StandaloneLinux: + return BuildPlatform.Linux32; + + case BuildTarget.StandaloneLinuxUniversal: + return BuildPlatform.LinuxUniversal; +#endif + // starting from Unity 2019.2, Linux builds are now only 64-bit builds + case BuildTarget.StandaloneLinux64: + return BuildPlatform.Linux64; +#endif + + // ----------------------------------- + // Mac OS X builds + +#if UNITY_2017_3_OR_NEWER + // in Unity 2017.3, OSX builds are now only Intel 64-bit builds + case BuildTarget.StandaloneOSX: + return BuildPlatform.MacOSX64; +#else + case BuildTarget.StandaloneOSXIntel: + return BuildPlatform.MacOSX32; + case BuildTarget.StandaloneOSXIntel64: + return BuildPlatform.MacOSX64; + case BuildTarget.StandaloneOSXUniversal: + return BuildPlatform.MacOSXUniversal; +#endif + } + + return BuildPlatform.None; + } + + [System.Serializable] + public class LastBuildExtraData : BuildReportTool.IDataFile + { + public string BuildTimeStarted; + public string BuildDuration; + + DateTime _buildTimeStarted; + TimeSpan _buildDuration; + + public DateTime GetBuildTimeStarted() => _buildTimeStarted; + public TimeSpan GetBuildDuration() => _buildDuration; + + public void SetBuildTimeStarted(System.DateTime newDateTime) + { + _buildTimeStarted = newDateTime; + } + + public void SetBuildDuration(System.TimeSpan newDuration) + { + _buildDuration = newDuration; + } + + public void OnBeforeSave() + { + BuildTimeStarted = _buildTimeStarted.ToString("u", System.Globalization.CultureInfo.InvariantCulture); + BuildDuration = _buildDuration.ToString(); + } + + public void OnAfterLoad() + { + _buildTimeStarted = System.DateTime.ParseExact(BuildTimeStarted, "u", System.Globalization.CultureInfo.InvariantCulture); + _buildDuration = System.TimeSpan.Parse(BuildDuration); + } + + string _savedPath; + + public void SetSavedPath(string savedPath) + { + _savedPath = savedPath.Replace("\\", "/"); + } + + public string SavedPath => _savedPath; + + public string GetDefaultFilename() + { + return BuildReportTool.Util.LastSuccessfulBuildExtraDataFilePath(Application.dataPath); + } + } + + static SessionData _sessionData = new SessionData(); + + // note: Changed these from EditorPrefs to an xml-serialized class, + // because some users are reporting problems with EditorPrefs. + + static void ReloadSessionData() + { + var gotSessionData = OpenSerialized(_sessionData.GetDefaultFilename()); + if (gotSessionData != null) + { + _sessionData = gotSessionData; + } + } + + static void SaveSessionData() + { + Serialize(_sessionData, _sessionData.GetDefaultFilename()); + } + + public static void SaveGetBuildReportNow() + { + _sessionData.ShouldGetBuildReportNow = true; + _sessionData.ShouldSaveGottenBuildReportNow = true; + SaveSessionData(); + } + + public static void ClearShouldGetBuildReportNow() + { + ReloadSessionData(); + if (_sessionData.ShouldGetBuildReportNow) + { + _sessionData.ShouldGetBuildReportNow = false; + SaveSessionData(); + } + } + + public static bool ShouldGetBuildReportNow + { + get + { + ReloadSessionData(); + return _sessionData.ShouldGetBuildReportNow; + } + } + + public static bool ShouldSaveGottenBuildReportNow + { + get + { + ReloadSessionData(); + return _sessionData.ShouldSaveGottenBuildReportNow; + } + set + { + _sessionData.ShouldSaveGottenBuildReportNow = value; + SaveSessionData(); + } + } + + public static void SaveBuildTime() + { + _sessionData.SetBuildTimeToNow(); + SaveSessionData(); + } + + public static bool HasBuildTime() + { + return _sessionData.HasBuildTime() || System.IO.File.Exists(_sessionData.GetDefaultFilename()); + } + + public static System.DateTime LoadBuildTime(bool clearKey = true) + { + ReloadSessionData(); + + System.DateTime returnValue = _sessionData.GetBuildTime(); + if (clearKey) + { + _sessionData.ClearBuildTime(); + SaveSessionData(); + } + return returnValue; + } + + public static void SaveBuildTimeDuration() + { + _sessionData.SaveBuildTimeDuration(); + SaveSessionData(); + } + + public static System.TimeSpan LoadBuildTimeDuration() + { + ReloadSessionData(); + return _sessionData.LoadBuildTimeDuration(); + } + +#if UNITY_2018_1_OR_NEWER + public static void SaveUnityBuildReportToCurrent(UnityEditor.Build.Reporting.BuildReport report) + { + string buildType; + string gotBuildType = BuildReportTool.ReportGenerator.GetBuildTypeFromEditorLog(BuildReportTool.Util.UsedEditorLogPath); + if (string.IsNullOrEmpty(gotBuildType)) + { + var buildPlatform = BuildReportTool.ReportGenerator.GetBuildPlatformFromString(gotBuildType, EditorUserBuildSettings.activeBuildTarget); + buildType = buildPlatform.ToString(); + } + else + { + buildType = gotBuildType; + } + + var br = new BuildReportTool.UnityBuildReport(); + br.ProjectName = BuildReportTool.Util.GetProjectName(Application.dataPath); + br.BuildType = buildType; + br.TimeGot = LoadBuildTime(false); + br.SetFrom(report); + BuildReportTool.Util.SerializeAtFolder(br, BuildReportTool.Options.BuildReportSavePath); + } + + public static void SaveUnityBuildReportToTemp(UnityEditor.Build.Reporting.BuildReport report) + { + var savePath = string.Format("{0}{1}", System.IO.Path.GetTempPath(), "BR.txt"); + + var br = new BuildReportTool.UnityBuildReport(); + br.SetFrom(report); + br.OnBeforeSave(); + var x = new System.Xml.Serialization.XmlSerializer(typeof(BuildReportTool.UnityBuildReport)); + System.IO.TextWriter writer = new System.IO.StreamWriter(savePath); + x.Serialize(writer, br); + writer.Close(); + } +#endif + + public static BuildReportTool.UnityBuildReport LoadUnityBuildReportFromTemp() + { + var savePath = string.Format("{0}{1}", System.IO.Path.GetTempPath(), "BR.txt"); + + BuildReportTool.UnityBuildReport ret = null; + + var x = new System.Xml.Serialization.XmlSerializer(typeof(BuildReportTool.UnityBuildReport)); + + try + { + // no corrections in the xml file + // proceed to open the file normally + using (var fs = new System.IO.FileStream(savePath, System.IO.FileMode.Open)) + { + System.Xml.XmlReader reader = new System.Xml.XmlTextReader(fs); + ret = (BuildReportTool.UnityBuildReport) x.Deserialize(reader); + fs.Close(); + } + } + catch (Exception e) + { + Debug.LogError(e); + } + + if (ret != null) + { + ret.OnAfterLoad(); + ret.SetSavedPath(savePath); + } + + return ret; + } + + public static string ToReadableString(this System.TimeSpan timeSpan) + { + var totalSeconds = timeSpan.TotalSeconds; + if (totalSeconds >= 1.0) + { + if (totalSeconds >= 60) + { + return timeSpan.ToString("h':'mm':'ss'.'FF"); + } + else + { + // less than 1 minute + return totalSeconds.ToString("0.00s", CultureInfo.InvariantCulture); + } + } + else + { + // less than 1 second + return timeSpan.TotalMilliseconds.ToString("0.000ms", CultureInfo.InvariantCulture); + } + } + + public static void DebugLogBuildReport(BuildReportTool.UnityBuildReport report) + { + var sb = new System.Text.StringBuilder(); + sb.AppendFormat("Build Files {0}\n\n", report.OutputFiles.Length.ToString()); + + for (int i = 0; i < report.OutputFiles.Length; i++) + { + sb.AppendFormat("File {0}: {1} ({2}) {3}\n", + (i+1).ToString(), report.OutputFiles[i].FilePath, report.OutputFiles[i].Role, + BuildReportTool.Util.GetBytesReadable(report.OutputFiles[i].Size)); + if ((i+1) % 100 == 0) + { + Debug.Log(sb.ToString()); + sb.Length = 0; + } + } + + if (sb.Length > 0) + { + Debug.Log(sb.ToString()); + sb.Length = 0; + } + + sb.AppendFormat("Build Steps {0}", report.BuildProcessSteps.Length.ToString()); + TimeSpan totalTime = new TimeSpan(0); + TimeSpan totalSceneTime = new TimeSpan(0); + for (int i = 0; i < report.BuildProcessSteps.Length; i++) + { + if (report.BuildProcessSteps[i].Name.StartsWith("Building scene ", StringComparison.OrdinalIgnoreCase)) + { + totalSceneTime += report.BuildProcessSteps[i].Duration; + } + else + { + totalTime += report.BuildProcessSteps[i].Duration; + } + + sb.Append("\n"); + for (int d = 0; d < report.BuildProcessSteps[i].Depth; ++d) + { + sb.Append(" "); + } + sb.Append(report.BuildProcessSteps[i].Name); + sb.Append(" "); + var totalSeconds = report.BuildProcessSteps[i].Duration.TotalSeconds; + if (totalSeconds >= 1.0) + { + if (totalSeconds >= 60) + { + sb.Append(report.BuildProcessSteps[i].Duration.ToString()); + } + else + { + // less than 1 minute + sb.Append(totalSeconds.ToString("0.00", CultureInfo.InvariantCulture)); + sb.Append("s"); + } + } + else + { + // less than 1 second + sb.Append(report.BuildProcessSteps[i].Duration.TotalMilliseconds.ToString("0.000", CultureInfo.InvariantCulture)); + sb.Append("ms"); + } + //sb.AppendFormat("Step {0}: {1}", (i+1).ToString(), report.steps[i].ToString()); + + var logs = report.BuildProcessSteps[i].BuildLogMessages; + if (logs != null && i < report.BuildProcessSteps.Length-1) + { + for (int m = 0; m < logs.Length; ++m) + { + sb.Append("\n"); + for (int d = 0; d < report.BuildProcessSteps[i].Depth+1; ++d) + { + sb.Append(" "); + } + sb.AppendFormat("Log Message {0}: {1} {2}", (m + 1).ToString(), logs[m].LogType, logs[m].Message); + } + } + } + + sb.AppendFormat("\n\nTotal Duration: {0}", totalTime.ToString()); + sb.AppendFormat("\nTotal Scene Duration: {0}", totalSceneTime.ToString()); + + Debug.Log(sb.ToString()); + } + +#if UNITY_2018_1_OR_NEWER + public static void DebugLogBuildReport(UnityEditor.Build.Reporting.BuildReport report) + { + var sb = new System.Text.StringBuilder(); +#if !UNITY_2022_2_OR_NEWER + var files = report.files; +#else + var files = report.GetFiles(); +#endif + sb.AppendFormat("Build Files {0}\n\n", files.Length.ToString()); + + for (int i = 0; i < files.Length; i++) + { + sb.AppendFormat("File {0}: {1} ({2}) {3}\n", + (i+1).ToString(), files[i].path, files[i].role, + BuildReportTool.Util.GetBytesReadable(files[i].size)); + if ((i+1) % 100 == 0) + { + Debug.Log(sb.ToString()); + sb.Length = 0; + } + } + + if (sb.Length > 0) + { + Debug.Log(sb.ToString()); + sb.Length = 0; + } + + if (report.strippingInfo != null && report.strippingInfo.includedModules != null) + { + foreach (var module in report.strippingInfo.includedModules) + { + sb.AppendFormat("\nIncluded Module: {0}", module); + } + Debug.Log(sb.ToString()); + sb.Length = 0; + } + + sb.AppendFormat("Build Steps {0}", report.steps.Length.ToString()); + TimeSpan totalTime = new TimeSpan(0); + TimeSpan totalSceneTime = new TimeSpan(0); + for (int i = 0; i < report.steps.Length; i++) + { + if (report.steps[i].name.StartsWith("Building scene ", StringComparison.OrdinalIgnoreCase)) + { + totalSceneTime += report.steps[i].duration; + } + else + { + totalTime += report.steps[i].duration; + + } + + sb.Append("\n"); + for (int d = 0; d < report.steps[i].depth; ++d) + { + sb.Append(" "); + } + sb.Append(report.steps[i].ToString()); + //sb.AppendFormat("Step {0}: {1}", (i+1).ToString(), report.steps[i].ToString()); + + var logs = report.steps[i].messages; + if (logs != null && i < report.steps.Length-1) + { + for (int m = 0; m < logs.Length; ++m) + { + sb.Append("\n"); + for (int d = 0; d < report.steps[i].depth+1; ++d) + { + sb.Append(" "); + } + sb.AppendFormat("Log Message {0}: {1} {2}", (m + 1).ToString(), logs[m].type, logs[m].content); + } + } + } + + sb.AppendFormat("\n\nTotal Duration: {0}", totalTime.ToString()); + sb.AppendFormat("\nTotal Scene Duration: {0}", totalSceneTime.ToString()); + + Debug.Log(sb.ToString()); + sb.Length = 0; + + sb.AppendFormat("Build Size: {0}", BuildReportTool.Util.GetBytesReadable(report.summary.totalSize)); + + sb.AppendFormat("\nBuild Result: {0}", report.summary.result); + sb.AppendFormat("\nWarnings: {0} Errors: {1}", report.summary.totalWarnings.ToString(), report.summary.totalErrors.ToString()); + + Debug.Log(sb.ToString()); + } +#endif + + public static BuildTarget BuildTargetOfLastBuild + { + get + { + ReloadSessionData(); + return (BuildTarget)_sessionData.LastTargetBuild; + } + set + { + _sessionData.LastTargetBuild = Convert.ToInt32(value); + SaveSessionData(); + } + } + + public static bool IsAnAssembly(this string filename) + { + return filename.EndsWith(".dll", StringComparison.OrdinalIgnoreCase); + } + + public static bool IsAScriptDLL(string filename) + { + return filename.StartsWith("Assembly-", StringComparison.OrdinalIgnoreCase); + } + + public static bool IsAUnityEngineDLL(string filename) + { + return filename.StartsWith("UnityEngine.", StringComparison.Ordinal) || + filename.StartsWith("Unity.", StringComparison.Ordinal) || + filename.Equals("Purchasing.Common.dll", StringComparison.Ordinal); + } + + public static bool IsAKnownSystemDLL(string filename) + { + return filename.StartsWith("System.", StringComparison.Ordinal) || + filename.StartsWith("Mono.", StringComparison.Ordinal) || + filename.StartsWith("Microsoft.", StringComparison.Ordinal) || + filename.Equals("system.dll", StringComparison.OrdinalIgnoreCase) || + filename.Equals("system.core.dll", StringComparison.OrdinalIgnoreCase) || + filename.Equals("mscorlib.dll", StringComparison.OrdinalIgnoreCase) || + filename.Equals("mono.security.dll", StringComparison.OrdinalIgnoreCase) || + filename.Equals("netstandard.dll", StringComparison.OrdinalIgnoreCase) || + filename.Equals("Accessibility.dll", StringComparison.OrdinalIgnoreCase) || + filename.Equals("nunit.framework.dll", StringComparison.OrdinalIgnoreCase) || + filename.Equals("boo.lang.dll", StringComparison.OrdinalIgnoreCase); + } + + public static string RemovePrefix(string prefix, string val) + { + if (val.StartsWith(prefix)) + { + return val.Substring(prefix.Length, val.Length - prefix.Length); + } + + return val; + } + + public static string RemoveSuffix(string suffix, string val, int offset = 0) + { + if (val.EndsWith(suffix, StringComparison.OrdinalIgnoreCase)) + { + return val.Substring(0, val.Length - suffix.Length + offset); + } + + return val; + } + + + static string GetLastFolder(string inFolder) + { + inFolder = inFolder.Replace('\\', '/'); + + //Debug.Log("folder: " + inFolder); + //string folderName = System.IO.Path.GetDirectoryName(folderEntries[n]); + + int lastSlashIdx = inFolder.LastIndexOf('/'); + if (lastSlashIdx == -1) + { + return ""; + } + + return inFolder.Substring(lastSlashIdx + 1, inFolder.Length - lastSlashIdx - 1); + } + + public static string FindAssetFolder(string folderToStart, string desiredFolderName) + { + string[] folderEntries = System.IO.Directory.GetDirectories(folderToStart); + + for (int n = 0, len = folderEntries.Length; n < len; ++n) + { + string folderName = GetLastFolder(folderEntries[n]); + //Debug.Log("folderName: " + folderName); + + if (folderName == desiredFolderName) + { + return folderEntries[n]; + } + else + { + string recursed = FindAssetFolder(folderEntries[n], desiredFolderName); + string recursedFolderName = GetLastFolder(recursed); + if (recursedFolderName == desiredFolderName) + { + return recursed; + } + } + } + + return ""; + } + + + static string GetPathParentFolder(string path) + { + if (string.IsNullOrEmpty(path)) + { + return string.Empty; + } + + var directoryName = System.IO.Path.GetDirectoryName(path); + // System.IO.Path.GetDirectoryName insists on converting / to \ so we need to fix that manually + return string.IsNullOrEmpty(directoryName) ? directoryName : directoryName.Replace("\\", "/"); + } + + public static string GetBuildSizePathDescription(BuildInfo buildReport) + { + if (string.IsNullOrEmpty(buildReport.BuildFilePath)) + { + return string.Empty; + } + + BuildReportTool.BuildPlatform buildPlatform = + BuildReportTool.ReportGenerator.GetBuildPlatformFromString(buildReport.BuildType, + buildReport.BuildTargetUsed); + + if (buildPlatform == BuildPlatform.Windows32 || + buildPlatform == BuildPlatform.Windows64 || + buildPlatform == BuildPlatform.Linux32 || + buildPlatform == BuildPlatform.Linux64) + { + // in windows builds, `buildFilePath` is the executable file + // we additionally need to get the size of the Data folder + + // in 32 bit builds, `buildFilePath` is the executable file (.x86 file). we still need the Data folder + // in 64 bit builds, `buildFilePath` is the executable file (.x86_64 file). we still need the Data folder + + var exeFile = System.IO.Path.GetFileName(buildReport.BuildFilePath); + var dataFolder = BuildReportTool.Util.ReplaceFileType(exeFile, "_Data"); + var buildParentFolder = GetPathParentFolder(buildReport.BuildFilePath); + + return string.Format("File size of {0} and the {1} folder in {2}", exeFile, dataFolder, + buildParentFolder); + } + + if (buildPlatform == BuildPlatform.LinuxUniversal) + { + // in universal builds, `buildFilePath` is the 32-bit executable. we still need the 64-bit executable and the Data folder + + var exe32File = System.IO.Path.GetFileName(buildReport.BuildFilePath); + var exe64File = BuildReportTool.Util.ReplaceFileType(exe32File, ".x86_64"); + var dataFolder = BuildReportTool.Util.ReplaceFileType(exe32File, "_Data"); + var buildParentFolder = GetPathParentFolder(buildReport.BuildFilePath); + + return string.Format("File size of {0}, {1}, and the {2} folder in {3}", exe32File, exe64File, + dataFolder, buildParentFolder); + } + + return string.Format("File size of {0}", buildReport.BuildFilePath); + } + + + public static double GetObbSizeInEclipseProject(string eclipseProjectPath) + { + if (string.IsNullOrEmpty(eclipseProjectPath) || !System.IO.Directory.Exists(eclipseProjectPath)) + { + return 0; + } + + double obbSize = 0; + foreach (string file in DldUtil.TraverseDirectory.Do(eclipseProjectPath)) + { + if (IsFileOfType(file, ".main.obb")) + { + obbSize += GetFileSizeInBytes(file); + break; + } + } + + return obbSize; + } + + public static string GetObbSizeInEclipseProjectReadable(string eclipseProjectPath) + { + if (string.IsNullOrEmpty(eclipseProjectPath) || !System.IO.Directory.Exists(eclipseProjectPath)) + { + return string.Empty; + } + + return GetBytesReadable(GetObbSizeInEclipseProject(eclipseProjectPath)); + } + + + public static string GetPathSizeReadable(string fileOrFolder) + { + if (string.IsNullOrEmpty(fileOrFolder)) + { + return string.Empty; + } + + return GetBytesReadable(GetPathSizeInBytes(fileOrFolder)); + } + + public static double GetPathSizeInBytes(string fileOrFolder) + { + if (System.IO.Directory.Exists(fileOrFolder)) + { + return GetFolderSizeInBytes(fileOrFolder); + } + + if (System.IO.File.Exists(fileOrFolder)) + { + return GetFileSizeInBytes(fileOrFolder); + } + + return 0; + } + + public static double GetFolderSizeInBytes(string folderPath) + { + if (string.IsNullOrEmpty(folderPath) || !System.IO.Directory.Exists(folderPath)) + { + return 0; + } + + double totalBytesOfFilesInFolder = 0; + foreach (string file in DldUtil.TraverseDirectory.Do(folderPath)) + { + totalBytesOfFilesInFolder += GetFileSizeInBytes(file); + } + + return totalBytesOfFilesInFolder; + } + + public static string GetFolderSizeReadable(string folderPath) + { + if (string.IsNullOrEmpty(folderPath) || !System.IO.Directory.Exists(folderPath)) + { + return string.Empty; + } + + return GetBytesReadable(GetFolderSizeInBytes(folderPath)); + } + + public static string GetStreamingAssetsSizeReadable() + { + return GetFolderSizeReadable(Application.dataPath + "/StreamingAssets"); + } + + public static string GetProjectPath(string appDataPath) + { + const int ASSETS_FOLDER_NAME_LENGTH = 6; // "Assets" + + return appDataPath.Remove(appDataPath.Length - ASSETS_FOLDER_NAME_LENGTH); + } + + // expects filename given to be full path + public static long GetFileSizeInBytes(string filename) + { + if (string.IsNullOrEmpty(filename) || !System.IO.File.Exists(filename)) + { + return 0; + } + + var fi = new System.IO.FileInfo(filename); + return fi.Length; + } + + public static string GetFileSizeReadable(string filename) + { + if (string.IsNullOrEmpty(filename)) + { + return string.Empty; + } + + return GetBytesReadable(GetFileSizeInBytes(filename)); + } + + const double ONE_TERABYTE = 1099511627776.0; + const double ONE_GIGABYTE = 1073741824.0; + const double ONE_MEGABYTE = 1048576.0; + const double ONE_KILOBYTE = 1024.0; + + const ulong ONE_TERABYTE_L = 1099511627776; + const ulong ONE_GIGABYTE_L = 1073741824; + const ulong ONE_MEGABYTE_L = 1048576; + const ulong ONE_KILOBYTE_L = 1024; + + public static string GetBytesReadable(double bytes) + { + return MyFileSizeReadable(bytes); + } + + public static string GetBytesReadable(ulong bytes) + { + return MyFileSizeReadable(bytes); + } + + static string MyFileSizeReadable(double bytes) + { + if (bytes < 0) + { + return "N/A"; + } + + double converted = bytes; + string units = "B"; + + if (bytes >= ONE_TERABYTE) + { + converted = bytes / ONE_TERABYTE; + units = "TB"; + } + else if (bytes >= ONE_GIGABYTE) + { + converted = bytes / ONE_GIGABYTE; + units = "GB"; + } + else if (bytes >= ONE_MEGABYTE) + { + converted = bytes / ONE_MEGABYTE; + units = "MB"; + } + else if (bytes >= ONE_KILOBYTE) + { + converted = bytes / ONE_KILOBYTE; + units = "KB"; + } + + return string.Format("{0:0.##} {1}", converted, units); + } + + static string MyFileSizeReadable(ulong bytes) + { + double converted = bytes; + string units = "B"; + + if (bytes >= ONE_TERABYTE_L) + { + converted = bytes / ONE_TERABYTE; + units = "TB"; + } + else if (bytes >= ONE_GIGABYTE_L) + { + converted = bytes / ONE_GIGABYTE; + units = "GB"; + } + else if (bytes >= ONE_MEGABYTE_L) + { + converted = bytes / ONE_MEGABYTE; + units = "MB"; + } + else if (bytes >= ONE_KILOBYTE_L) + { + converted = bytes / ONE_KILOBYTE; + units = "KB"; + } + + return string.Format("{0:0.##} {1}", converted, units); + } + + public static double GetApproxSizeFromString(string size) + { + if (string.IsNullOrEmpty(size) || size == "N/A" || size.Length <= 2) + { + return 0; + } + + // units is expected to be in the last two letters of the string + string units = size.Substring(size.Length - 2, 2); + + // therefore, everything except the last two letters is expected to be a number + string numOnly = size.Substring(0, size.Length - 2); + + double num; + var success = double.TryParse(numOnly, NumberStyles.Number, CultureInfo.InvariantCulture, out num); + + if (!success) + { + return 0; + } + + //Debug.Log(size + " " + num); + + // convert the number to bytes + switch (units) + { + case "KB": + return num * ONE_KILOBYTE; + case "MB": + return num * ONE_MEGABYTE; + case "GB": + return num * ONE_GIGABYTE; + case "TB": + return num * ONE_TERABYTE; + } + + return 0; + } + + /// + /// Returns "Yes" or "No" + /// + /// + /// + public static string ToYesNo(this bool b) + { + return b ? "Yes" : "No"; + } + + static bool TextFileHasContents(string filepath, string contents) + { + var fs = new System.IO.FileStream(filepath, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite); + var sr = new System.IO.StreamReader(fs); + + bool ret = false; + + string line; + while ((line = sr.ReadLine()) != null) + { + if (line.IndexOf(contents, StringComparison.OrdinalIgnoreCase) != -1) + { + ret = true; + break; + } + } + + fs.Close(); + return ret; + } + + public static bool FileHasContents(string filepath, string contents) + { + return TextFileHasContents(filepath, contents); + } + + + public static string GetTextFileContents(string file) + { + // thanks to http://answers.unity3d.com/questions/167518/reading-editorlog-in-the-editor.html + var fs = new System.IO.FileStream(file, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite); + var sr = new System.IO.StreamReader(fs); + + string contents = sr.ReadToEnd(); + + fs.Close(); + return contents; + } + + public static void DeleteSizePartFile(SizePart file) + { + //Debug.Log("going to delete " + file.Name); + DeleteFile(file.Name); + } + + static void DeleteFile(string file) + { + string projectFolder = RemoveSuffix("Assets", Application.dataPath); + + DeleteFile(projectFolder, file); + } + + public static bool HaveToUseSystemForDelete(string file) + { + return IsFileAUnixHiddenFile(file) || IsFileInVersionControlMetadataFolder(file); + } + + static void DeleteFile(string projectFolder, string file) + { + //Debug.Log("will delete " + file); + + if (HaveToUseSystemForDelete(file)) + { + string fileAbsPath = System.IO.Path.Combine(projectFolder, file); + //Debug.Log("will system delete " + fileAbsPath); + SystemDeleteFile(fileAbsPath); + } + else + { + // AssetDatabase.MoveAssetToTrash also deletes .meta file if it exists + AssetDatabase.MoveAssetToTrash(file); + } + } + + static void SystemDeleteFile(string file) + { + System.IO.File.Delete(file); + } + + + public static string ReplaceFileType(string filename, string newFileType) + { + int idxOfDot = filename.LastIndexOf(".", StringComparison.Ordinal); + + if (idxOfDot < 0) + { + // dot is not found + return string.Empty; + } + + string newFile = filename.Remove(idxOfDot); + + + newFile += newFileType; + + return newFile; + } + + + // low-level filename checks + + public static bool IsFileInAPath(string filepath, string pathToCheck) + { + if (string.IsNullOrEmpty(filepath)) + { + return false; + } + + return filepath.IndexOf(pathToCheck, StringComparison.OrdinalIgnoreCase) != -1; + } + + public static bool IsFileInAnEditorFolder(string filepath) + { + return IsFileInAPath(filepath, "/Editor/") || + DoesFileStartIn(filepath, "Editor/"); + } + + public static bool DoesFileStartIn(string filepath, string pathToCheck) + { + if (string.IsNullOrEmpty(filepath)) + { + return false; + } + + return filepath.StartsWith(pathToCheck, StringComparison.OrdinalIgnoreCase); + } + + public static bool IsFileOfType(this string filepath, string typeExtenstion) + { + if (string.IsNullOrEmpty(filepath)) + { + return false; + } + + return filepath.EndsWith(typeExtenstion, StringComparison.OrdinalIgnoreCase); + } + + static readonly char[] InvalidPathChars = System.IO.Path.GetInvalidPathChars(); + + public static bool DoesFileHaveInvalidPathChars(this string filepath) + { + if (filepath == null) + { + return false; + } + + return filepath.IndexOfAny(InvalidPathChars) >= 0; + } + + public static string GetFileNameOnly(this string filepath) + { + if (filepath.DoesFileHaveInvalidPathChars()) + { + return filepath; + } + if (filepath.StartsWith("Built-in ")) + { + if (filepath.EndsWith(":")) + { + return filepath; + } + + int colonIdx = filepath.IndexOf(':'); + if (colonIdx > -1 && colonIdx + 2 < filepath.Length) + { + return filepath.Substring(colonIdx + 2); + } + + return filepath; + } + return System.IO.Path.GetFileName(filepath); + } + + public static string GetFileNameOnlyNoExtension(this string filepath) + { + if (filepath.DoesFileHaveInvalidPathChars()) + { + return filepath; + } + if (filepath.StartsWith("Built-in ")) + { + if (filepath.EndsWith(":")) + { + return filepath; + } + + int colonIdx = filepath.IndexOf(':'); + if (colonIdx > -1 && colonIdx + 2 < filepath.Length) + { + return filepath.Substring(colonIdx + 2); + } + + return filepath; + } + return System.IO.Path.GetFileNameWithoutExtension(filepath); + } + + public static bool IsFileName(string filepath, string filenameToCheck) + { + return string.Equals(filepath.GetFileNameOnly(), filenameToCheck, + StringComparison.OrdinalIgnoreCase); + } + + public static bool IsFileAUnixHiddenFile(string filepath) + { + if (string.IsNullOrEmpty(filepath)) + { + return false; + } + + return filepath.GetFileNameOnly().StartsWith("."); + } + + public static bool DoesFileBeginWith(this string filepath, string stringToCheck) + { + if (string.IsNullOrEmpty(filepath)) + { + return false; + } + + return filepath.GetFileNameOnly().StartsWith(stringToCheck, StringComparison.OrdinalIgnoreCase); + } + + /// + /// Does string end in ".mat"? + /// + /// + /// + public static bool IsMaterialFile(this string me) + { + return !string.IsNullOrEmpty(me) && me.EndsWith(".mat", StringComparison.OrdinalIgnoreCase); + } + + public static bool IsSpriteAtlasFile(this string me) + { + return !string.IsNullOrEmpty(me) && me.EndsWith(".spriteatlasv2", StringComparison.OrdinalIgnoreCase); + } + + /// + /// Does string contain "/Resources/"? + /// + /// + /// + public static bool IsInResourcesFolder(this string me) + { + return !string.IsNullOrEmpty(me) && me.IndexOf("/Resources/", StringComparison.OrdinalIgnoreCase) > -1; + } + + /// + /// Does string start with "Assets/"? + /// + /// + /// + public static bool IsInAssetsFolder(this string me) + { + return !string.IsNullOrEmpty(me) && me.StartsWith("Assets/", StringComparison.OrdinalIgnoreCase); + } + + public static bool IsInStreamingAssetsFolder(this string me) + { + return !string.IsNullOrEmpty(me) && + me.StartsWith("Assets/StreamingAssets/", StringComparison.OrdinalIgnoreCase); + } + + public static bool IsInPackagesFolder(this string me) + { + return !string.IsNullOrEmpty(me) && me.StartsWith("Packages/", StringComparison.OrdinalIgnoreCase); + } + + public static bool IsInAssetsOrPackagesFolder(this string me) + { + return !string.IsNullOrEmpty(me) && + (me.StartsWith("Assets/", StringComparison.OrdinalIgnoreCase) || + me.StartsWith("Packages/", StringComparison.OrdinalIgnoreCase)); + } + + /// + /// Does string end in ".unity"? + /// + /// + /// + public static bool IsSceneFile(this string me) + { + return !string.IsNullOrEmpty(me) && me.EndsWith(".unity", StringComparison.OrdinalIgnoreCase); + } + + /// + /// Does string end in an image file type that Unity supports? + /// (psd, jpg, gif, png, tif, tga, bmp, dds, exr, iff, pict) + /// + /// + /// + public static bool IsTextureFile(this string file) + { + return IsFileOfType(file, ".psd") || + IsFileOfType(file, ".jpg") || + IsFileOfType(file, ".jpeg") || + IsFileOfType(file, ".gif") || + IsFileOfType(file, ".png") || + IsFileOfType(file, ".tiff") || + IsFileOfType(file, ".tif") || + IsFileOfType(file, ".tga") || + IsFileOfType(file, ".bmp") || + IsFileOfType(file, ".dds") || + IsFileOfType(file, ".exr") || + IsFileOfType(file, ".iff") || + IsFileOfType(file, ".pict"); + } + + /// + /// Does string end in a mesh file type that Unity supports? + /// (fbx, dae, mb, ma, max, blend, obj, 3ds, dxf) + /// + /// + /// + public static bool IsMeshFile(this string file) + { + return IsFileOfType(file, ".fbx") || + IsFileOfType(file, ".dae") || + IsFileOfType(file, ".mb") || + IsFileOfType(file, ".ma") || + IsFileOfType(file, ".max") || + IsFileOfType(file, ".blend") || + IsFileOfType(file, ".obj") || + IsFileOfType(file, ".3ds") || + IsFileOfType(file, ".dxf"); + } + + /// + /// Does string end in a sound file type that Unity supports? + /// (wav, mp3, ogg, aif, xm, mod, it, s3m) + /// + /// + /// + public static bool IsSoundFile(this string file) + { + return IsFileOfType(file, ".wav") || + IsFileOfType(file, ".mp3") || + IsFileOfType(file, ".ogg") || + IsFileOfType(file, ".aif") || + IsFileOfType(file, ".xm") || + IsFileOfType(file, ".mod") || + IsFileOfType(file, ".it") || + IsFileOfType(file, ".s3m"); + } + + /// + /// Does string end in a Unity animation file type? + /// (anim, controller, mask) + /// + /// + /// + public static bool IsAnimationFile(this string file) + { + return IsFileOfType(file, ".anim") || // animation file + IsFileOfType(file, ".controller") || // animator controller (mecanim state machine) + IsFileOfType(file, ".mask"); // avatar mask + } + + /// + /// Does string end in a Unity asset file type? + /// (unity, prefab, asset, mat, flare, physicMaterial, guiskin, mixer, anim, controller, mask) + /// + /// + /// + public static bool IsUnityAssetFile(this string file) + { + return IsFileOfType(file, ".unity") || // scene files + IsFileOfType(file, ".prefab") || + IsFileOfType(file, ".asset") || // scriptable objects, terrain files + IsFileOfType(file, ".mat") || // materials + IsFileOfType(file, ".flare") || + IsFileOfType(file, ".physicMaterial") || + IsFileOfType(file, ".guiskin") || // IMGUI skins + IsFileOfType(file, ".mixer") || // audio mixer + IsAnimationFile(file); + } + + // high-level filename checks + + public static bool IsFileInBuildReportFolder(string filepath) + { + return filepath.DoesFileBeginWith("BRT_") || filepath.DoesFileBeginWith("DldUtil_") || + IsFileInAPath(filepath, "/BuildReport/"); + } + + public static bool IsUselessFile(string filepath) + { + return IsFileName(filepath, "Thumbs.db") || IsFileName(filepath, ".DS_Store") || + IsFileName(filepath, "._.DS_Store"); + } + + public static bool IsFileInEditorFolder(string filepath) + { + return IsFileInAPath(filepath, "/Editor/"); + } + + public static bool IsFileInVersionControlMetadataFolder(string filepath) + { + return IsFileInAPath(filepath, "/.svn/") || + IsFileInAPath(filepath, "/.git/") || + IsFileInAPath(filepath, "/.cvs/"); + } + + public static bool IsFileStreamingAsset(string filepath) + { + return IsFileInAPath(filepath, "/StreamingAssets/"); + } + + + public static bool IsFileOkForDeleteAllOperation(string filepath) + { + return IsUselessFile(filepath) || + (!IsFileInBuildReportFolder(filepath) && + !IsFileInEditorFolder(filepath) && + !IsFileInVersionControlMetadataFolder(filepath) && + !IsFileAUnixHiddenFile(filepath)); + } + + + // ---------------------------------------------------------------------------------------------------------------------------------------- + + + public static string GetAssetPath(string assetPath) + { + if (IsBuiltInAsset(assetPath)) + { + return GetBuiltInAssetHeader(assetPath); + } + + var lastSlash = assetPath.LastIndexOf("/", StringComparison.Ordinal); + if (lastSlash > -1) + { + return assetPath.Substring(0, lastSlash+1); + } + + return assetPath; + } + + public static string GetAssetFilename(string assetPath) + { + if (IsBuiltInAsset(assetPath)) + { + return GetBuiltInAssetFilename(assetPath); + } + + return assetPath.GetFileNameOnly(); + } + + + static bool IsBuiltInAsset(string assetPath) + { + return assetPath.StartsWith("Built-in "); + } + + static string GetBuiltInAssetHeader(string assetPath) + { + var lastSlash = assetPath.LastIndexOf("/", StringComparison.Ordinal); + + if (lastSlash > -1) + { + return assetPath.Substring(0, lastSlash+1); + } + + var colon = assetPath.IndexOf(":", StringComparison.Ordinal); + if (colon > -1) + { + return assetPath.Substring(0, colon+1); + } + + return assetPath; + } + + static string GetBuiltInAssetFilename(string assetPath) + { + bool hasSlash = assetPath.IndexOf("/", StringComparison.Ordinal) > 0; + + if (hasSlash) + { + return assetPath.GetFileNameOnly(); + } + + int idxOfColon = assetPath.IndexOf(":", StringComparison.Ordinal); + if (idxOfColon > -1) + { + if (idxOfColon >= assetPath.Length - 2) + { + // there's nothing else after the colon + // filename is empty + return string.Empty; + } + + return assetPath.Substring(idxOfColon + 2, assetPath.Length - idxOfColon - 2); // -2 to get rid of ": " + } + + return assetPath; + } + + + public static string GetAssetPathToNameSeparator(string assetPath) + { + bool hasSlash = assetPath.IndexOf("/", StringComparison.Ordinal) > 0; + + if (hasSlash) + { + return "/"; + } + + return ": "; + } + + // ---------------------------------------------------------------------------------------------------------------------------------------- + + + public static string GetPackageFileContents(string filename) + { + // try default path first + string defaultBuildReportToolFullPath = + Application.dataPath + "/" + BuildReportTool.Options.BUILD_REPORT_TOOL_DEFAULT_FOLDER_NAME; + + string filePath = defaultBuildReportToolFullPath + "/" + filename; + + if (System.IO.File.Exists(filePath)) + { + return GetTextFileContents(filePath); + } + + // not in default path + // search for it + +#if BRT_SHOW_MINOR_WARNINGS + Debug.LogWarning(BuildReportTool.Options.BUILD_REPORT_PACKAGE_MOVED_MSG); +#endif + + string folderPath = BuildReportTool.Util.FindAssetFolder(Application.dataPath, + BuildReportTool.Options.BUILD_REPORT_TOOL_DEFAULT_FOLDER_NAME); + + if (!string.IsNullOrEmpty(folderPath)) + { + filePath = folderPath + "/" + filename; + + if (System.IO.File.Exists(filePath)) + { + return GetTextFileContents(filePath); + } + } + + // could not find it + // giving up +#if BRT_SHOW_MINOR_WARNINGS + Debug.LogError(BuildReportTool.Options.BUILD_REPORT_PACKAGE_MISSING_MSG); +#endif + + return null; + } + + + public static bool ShowFileDeleteProgress(int deletedSoFar, int totalToDelete, string filepath, + bool showRecoverableMsg) + { + float progress = (deletedSoFar + 1) / (float) totalToDelete; + + if (EditorUtility.DisplayCancelableProgressBar( + string.Format("Deleting file {0} of {1} ({2} left)", + (deletedSoFar + 1).ToString(), totalToDelete.ToString(), (totalToDelete - deletedSoFar - 1).ToString()), + filepath, + progress)) + { + EditorUtility.ClearProgressBar(); + + string filesReallyDeletedPlural = deletedSoFar > 1 ? "s" : ""; + + string cancelTitle = "Delete operation canceled"; + string cancelMsg; + + if (deletedSoFar > 0) + { + cancelMsg = string.Format("Only {0} file{1} (of {2}) deleted.", + deletedSoFar.ToString(), filesReallyDeletedPlural, totalToDelete.ToString()); + if (showRecoverableMsg) + { + cancelMsg += string.Format(" Those files can be recovered from your {0}.", BuildReportTool.Util.NameOfOSTrashFolder); + } + } + else + { + cancelMsg = "No files deleted."; + } + + EditorApplication.Beep(); + EditorUtility.DisplayDialog(cancelTitle, cancelMsg, "OK"); + + Debug.LogWarning(string.Format("{0}. {1}", cancelTitle, cancelMsg)); + + return true; + } + + return false; + } + + + // thanks to http://answers.unity3d.com/questions/16804/retrieving-project-name.html + public static string GetProjectName(string projectAssetsFolderPath) + { + var dp = projectAssetsFolderPath; + string[] s = dp.Split("/"[0]); + return s[s.Length - 2]; + } + + + // we have two ways of getting user home folder here: + + // from http://stackoverflow.com/questions/1143706/getting-the-path-of-the-home-directory-in-c + public static string UserHomePath + { + get + { + string homePath = (System.Environment.OSVersion.Platform == PlatformID.Unix || + System.Environment.OSVersion.Platform == PlatformID.MacOSX) + ? System.Environment.GetEnvironmentVariable("HOME") + : System.Environment.ExpandEnvironmentVariables("%HOMEDRIVE%%HOMEPATH%"); + + return homePath; + } + } + + //[MenuItem("Window/Test 3")] + public static string GetUserHomeFolder() + { + var ret = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal); + //Debug.Log("GetUserHomeFolder: " + ret); + ret = ret.Replace("\\", "/"); + return ret; + } + + + //[MenuItem("Window/Test 4")] + public static void OpenInFileBrowserTest() + { + //string path = "/Users/Ferds/Unity Projects/BuildReportTool/BuildReportUnityProject/Assets/BuildReportDebug"; + //string path = "/Users/Ferds/Unity Projects/BuildReportTool/BuildReportUnityProject/Assets/BuildReportDebug/EditorMorel.log.txt"; + //string path = "/Users/Ferds/UnityBuildReports/"; + string path = "/Users/Ferds/UnityBuildReports/test4.xml"; + + OpenInFileBrowser(path); + } + + + public static void OpenInMacFileBrowser(string path) + { + bool openInsidesOfFolder = false; + + // try mac + string macPath = path.Replace("\\", "/"); // mac finder doesn't like backward slashes + + if (System.IO.Directory.Exists(macPath)) // if path requested is a folder, automatically open insides of that folder + { + openInsidesOfFolder = true; + } + + //Debug.Log("macPath: " + macPath); + //Debug.Log("openInsidesOfFolder: " + openInsidesOfFolder); + + if (!macPath.StartsWith("\"")) + { + macPath = "\"" + macPath; + } + + if (!macPath.EndsWith("\"")) + { + macPath = macPath + "\""; + } + + string arguments = (openInsidesOfFolder ? "" : "-R ") + macPath; + //Debug.Log("arguments: " + arguments); + try + { + System.Diagnostics.Process.Start("open", arguments); + } + catch (System.ComponentModel.Win32Exception e) + { + // tried to open mac finder in windows + // just silently skip error + // we currently have no platform define for the current OS we are in, so we resort to this + e.HelpLink = ""; // do anything with this variable to silence warning about not using it + } + } + + public static void OpenInWinFileBrowser(string path) + { + bool openInsidesOfFolder = false; + + // try windows + string winPath = path.Replace("/", "\\"); // windows explorer doesn't like forward slashes + + if (System.IO.Directory.Exists(winPath)) // if path requested is a folder, automatically open insides of that folder + { + openInsidesOfFolder = true; + } + + try + { + System.Diagnostics.Process.Start("explorer.exe", (openInsidesOfFolder ? "/root," : "/select,") + winPath); + } + catch (System.ComponentModel.Win32Exception e) + { + // tried to open win explorer in mac + // just silently skip error + // we currently have no platform define for the current OS we are in, so we resort to this + e.HelpLink = ""; // do anything with this variable to silence warning about not using it + } + } + + public static void OpenInFileBrowser(string path) + { + if (IsInWinOS) + { + OpenInWinFileBrowser(path); + } + else if (IsInMacOS) + { + OpenInMacFileBrowser(path); + } + else // couldn't determine OS + { + OpenInWinFileBrowser(path); + OpenInMacFileBrowser(path); + } + } + + public static bool IsInMacOS + { + get { return SystemInfo.operatingSystem.IndexOf("Mac OS", StringComparison.Ordinal) != -1; } + } + + public static bool IsInWinOS + { + get { return SystemInfo.operatingSystem.IndexOf("Windows", StringComparison.Ordinal) != -1; } + } + + public static string NameOfOSFileBrowser + { + get { return (IsInMacOS) ? "Finder" : "Explorer"; } + } + + public static string NameOfOSTrashFolder + { + get { return (IsInMacOS) ? "Trash folder" : "Recycle Bin"; } + } + + static string GetEditorLogFileInWindows(string editorFilename = "Editor.log") + { + string editorLogSubPath = "/Unity/Editor/" + editorFilename; + + // try getting from LOCALAPPDATA + // this is the one used from after Windows XP + + string localAppDataVar = System.Environment.GetEnvironmentVariable("LOCALAPPDATA"); + + if (!string.IsNullOrEmpty(localAppDataVar)) + { + string nonXpStyleAppDataPath = localAppDataVar.Replace("\\", "/"); + if (System.IO.Directory.Exists(nonXpStyleAppDataPath)) + { + return nonXpStyleAppDataPath + editorLogSubPath; + } + } + + // didn't find it in LOCALAPPDATA + // try USERPROFILE (WinXP style) + + string userProfileVar = System.Environment.GetEnvironmentVariable("USERPROFILE"); + + if (!string.IsNullOrEmpty(userProfileVar)) + { + string xpStyleAppDataPath = userProfileVar.Replace("\\", "/") + "/Local Settings/Application Data"; + if (System.IO.Directory.Exists(xpStyleAppDataPath)) + { + return xpStyleAppDataPath + editorLogSubPath; + } + } + + Debug.LogError("Could not find path to Unity Editor log!"); + + return ""; + } + + public static string EditorLogDefaultPath + { + get + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + return UserHomePath + "/.config/unity3d/Editor.log"; + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + return UserHomePath + "/Library/Logs/Unity/Editor.log"; + } + else // assume Windows + { + return GetEditorLogFileInWindows(); + } + } + } + + public static string EditorPrevLogPath + { + get + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + return UserHomePath + "/.config/unity3d/Editor-prev.log"; + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + return UserHomePath + "/Library/Logs/Unity/Editor-prev.log"; + } + else // assume Windows + { + return GetEditorLogFileInWindows("Editor-prev.log"); + } + } + } + + public static string UsedEditorLogPath + { + get + { + if (IsDefaultEditorLogPathOverridden) + { + return BuildReportTool.Options.EditorLogOverridePath; + } + + return EditorLogDefaultPath; + } + } + + public static string EditorLogPathOverrideMessage + { + get + { + if (IsDefaultEditorLogPathOverridden) + { + return "(Overridden)"; + } + + return "(Default)"; + } + } + + public static bool IsDefaultEditorLogPathOverridden + { + get { return !string.IsNullOrEmpty(BuildReportTool.Options.EditorLogOverridePath); } + } + + const string LAST_SUCCESSFUL_BUILD_FILENAME = "Editor-LastSuccessfulBuild.log"; + const string LAST_SUCCESSFUL_BUILD_EXTRA_DATA_FILENAME = "LastSuccessfulBuildExtraData.xml"; + + public static string LastSuccessfulBuildFilePath(string projectAssetsPath) + { + return $"{RemoveSuffix("Assets", projectAssetsPath)}Library/{LAST_SUCCESSFUL_BUILD_FILENAME}"; + } + + public static string LastSuccessfulBuildExtraDataFilePath(string projectAssetsPath) + { + return $"{RemoveSuffix("Assets", projectAssetsPath)}Library/{LAST_SUCCESSFUL_BUILD_EXTRA_DATA_FILENAME}"; + } + + public static bool IsUsingLastSuccessfulEditorLog(string logPath) + { + return !string.IsNullOrEmpty(logPath) && logPath.EndsWith(LAST_SUCCESSFUL_BUILD_FILENAME); + } + + public static bool UsedEditorLogExists + { + get { return System.IO.File.Exists(UsedEditorLogPath); } + } + + + public static string GetBuildManagedFolder(string buildFilePath) + { + string buildFolder = buildFilePath; + + const string WINDOWS_APP_FILE_TYPE = ".exe"; + const string LINUX_32_APP_FILE_TYPE = ".x86"; + const string LINUX_64_APP_FILE_TYPE = ".x86_64"; + const string MAC_APP_FILE_TYPE = ".app"; + + if (buildFolder.EndsWith(WINDOWS_APP_FILE_TYPE, StringComparison.OrdinalIgnoreCase)) // Windows Standalone + { + // + // example: + // "/Users/Ferds/Unity Projects/BuildReportTool/testwin64.exe" + // + // need to remove ".exe" at end + // then append "_Data" at end + // + buildFolder = buildFolder.Substring(0, buildFolder.Length - WINDOWS_APP_FILE_TYPE.Length); + + buildFolder += "_Data/Managed"; + } + else if (buildFolder.EndsWith(LINUX_32_APP_FILE_TYPE, StringComparison.OrdinalIgnoreCase) + ) // Linux 32-bit Standalone + { + // + // example: + // "/Users/Ferds/Unity Projects/BuildReportTool/test.x86" + // + // need to remove ".x86" at end + // then append "_Data" at end + // + buildFolder = buildFolder.Substring(0, buildFolder.Length - LINUX_32_APP_FILE_TYPE.Length); + + buildFolder += "_Data/Managed"; + } + else if (buildFolder.EndsWith(LINUX_64_APP_FILE_TYPE, StringComparison.OrdinalIgnoreCase) + ) // Linux 64-bit Standalone + { + // + // example: + // "/Users/Ferds/Unity Projects/BuildReportTool/test.x86_64" + // + // need to remove ".x86_64" at end + // then append "_Data" at end + // + buildFolder = buildFolder.Substring(0, buildFolder.Length - LINUX_64_APP_FILE_TYPE.Length); + + buildFolder += "_Data/Managed"; + } + else if (buildFolder.EndsWith(MAC_APP_FILE_TYPE, StringComparison.OrdinalIgnoreCase)) // Mac OS X + { + // + // example: + // "/Users/Ferds/Unity Projects/BuildReportTool/testmac.app" + // + // .app is really just a folder. + // + buildFolder += "/Contents/Data/Managed"; + } + else if (System.IO.Directory.Exists(buildFolder + "/Data/Managed/")) // iOS + { + buildFolder += "/Data/Managed"; + } + else if (!System.IO.Directory.Exists(buildFolder)) + { + // happens with users who use custom build scripts + //Debug.LogWarning("Folder \"" + buildFolder + "\" does not exist."); + return ""; + } + + buildFolder += "/"; + + return buildFolder; + } + + public static string GetBuildDataFolder(string buildFilePath) + { + string buildFolder = buildFilePath; + + const string WINDOWS_APP_FILE_TYPE = ".exe"; + const string LINUX_32_APP_FILE_TYPE = ".x86"; + const string LINUX_64_APP_FILE_TYPE = ".x86_64"; + const string MAC_APP_FILE_TYPE = ".app"; + + if (buildFolder.EndsWith(WINDOWS_APP_FILE_TYPE, StringComparison.OrdinalIgnoreCase)) // Windows + { + // + // example: + // "/Users/Ferds/Unity Projects/BuildReportTool/testwin64.exe" + // + // need to remove ".exe" at end + // then append "_Data" at end + // + buildFolder = buildFolder.Substring(0, buildFolder.Length - WINDOWS_APP_FILE_TYPE.Length); + buildFolder += "_Data"; + } + else if (buildFolder.EndsWith(LINUX_32_APP_FILE_TYPE, StringComparison.OrdinalIgnoreCase) + ) // Linux 32-bit Standalone + { + // + // example: + // "/Users/Ferds/Unity Projects/BuildReportTool/test.x86" + // + // need to remove ".x86" at end + // then append "_Data" at end + // + buildFolder = buildFolder.Substring(0, buildFolder.Length - LINUX_32_APP_FILE_TYPE.Length); + + buildFolder += "_Data"; + } + else if (buildFolder.EndsWith(LINUX_64_APP_FILE_TYPE, StringComparison.OrdinalIgnoreCase) + ) // Linux 64-bit Standalone + { + // + // example: + // "/Users/Ferds/Unity Projects/BuildReportTool/test.x86_64" + // + // need to remove ".x86_64" at end + // then append "_Data" at end + // + buildFolder = buildFolder.Substring(0, buildFolder.Length - LINUX_64_APP_FILE_TYPE.Length); + + buildFolder += "_Data"; + } + else if (buildFolder.EndsWith(MAC_APP_FILE_TYPE, StringComparison.OrdinalIgnoreCase)) // Mac OS X + { + // + // example: + // "/Users/Ferds/Unity Projects/BuildReportTool/testmac.app" + // + // .app is really just a folder. + // + buildFolder += "/Contents/Data"; + } + else if (System.IO.Directory.Exists(buildFolder + "/Data")) // iOS + { + buildFolder += "/Data"; + } + else if (!System.IO.Directory.Exists(buildFolder)) + { + // happens with users who use custom builders + //Debug.LogWarning("Folder \"" + buildFolder + "\" does not exist."); + return string.Empty; + } + + buildFolder += "/"; + + return buildFolder; + } + + static string GetProjectTempStagingArea(string projectDataPath) + { + string tempFolder = projectDataPath; + const string ASSETS = "Assets"; + tempFolder = tempFolder.Substring(0, tempFolder.Length - ASSETS.Length); + tempFolder += "Temp/StagingArea"; + return tempFolder; + } + + public static bool AttemptGetWebTempStagingArea(string projectDataPath, out string path) + { + string tempFolder = GetProjectTempStagingArea(projectDataPath) + "/Data/Managed/"; + + if (System.IO.Directory.Exists(tempFolder)) + { + path = tempFolder; + return true; + } + + path = ""; + return false; + } + + public static bool AttemptGetAndroidTempStagingArea(string projectDataPath, out string path) + { + string tempFolder = GetProjectTempStagingArea(projectDataPath) + "/assets/bin/Data/Managed/"; + + //Debug.Log(tempFolder); + + if (System.IO.Directory.Exists(tempFolder)) + { + path = tempFolder; + return true; + } + + path = ""; + return false; + } + + public static bool AttemptGetUnityFolderMonoDLLs(bool wasWebBuild, bool wasAndroidApkBuild, + string editorAppContentsPath, ApiCompatibilityLevel monoLevel, StrippingLevel codeStrippingLevel, + out string path, out string higherPriorityPath) + { + bool success = false; + + // more hackery + // attempt to get DLL size info + // from Unity install folder + // + // this only happens in: + // 1. Web build + // 2. Android build + // 3. Custom builders + // + string[] pathTries = new string[] + { + editorAppContentsPath + "/Frameworks/Mono/lib/mono", + editorAppContentsPath + "/Mono/lib/mono", + "/Applications/Unity/Unity.app/Contents/Frameworks/Mono/lib/mono", + "C:/Program Files (x86)/Unity/Data/Mono/lib/mono", + "C:/Program Files (x86)/Unity/Editor/Data/Mono/lib/mono", +#if UNITY_3_5 + "/Applications/Unity3/Unity.app/Contents/Frameworks/Mono/lib/mono", + "/Applications/Unity 3/Unity.app/Contents/Frameworks/Mono/lib/mono", + "/Applications/Unity3.5/Unity.app/Contents/Frameworks/Mono/lib/mono", + "/Applications/Unity 3.5/Unity.app/Contents/Frameworks/Mono/lib/mono", + "C:/Program Files (x86)/Unity3/Data/Mono/lib/mono", + "C:/Program Files (x86)/Unity 3/Data/Mono/lib/mono", + "C:/Program Files (x86)/Unity3.5/Data/Mono/lib/mono", + "C:/Program Files (x86)/Unity 3.5/Data/Mono/lib/mono", + "C:/Program Files (x86)/Unity3/Editor/Data/Mono/lib/mono", + "C:/Program Files (x86)/Unity 3/Editor/Data/Mono/lib/mono", +#endif +#if UNITY_4_AND_GREATER + "/Applications/Unity4/Unity.app/Contents/Frameworks/Mono/lib/mono", + "/Applications/Unity 4/Unity.app/Contents/Frameworks/Mono/lib/mono", + "C:/Program Files (x86)/Unity4/Data/Mono/lib/mono", + "C:/Program Files (x86)/Unity 4/Data/Mono/lib/mono", + "C:/Program Files (x86)/Unity4/Editor/Data/Mono/lib/mono", + "C:/Program Files (x86)/Unity 4/Editor/Data/Mono/lib/mono", +#endif + }; + + string tryPath = ""; + + for (int n = 0, len = pathTries.Length; n < len; ++n) + { + tryPath = pathTries[n]; + if (System.IO.Directory.Exists(tryPath)) + { + break; + } + + tryPath = ""; + } + + if (!string.IsNullOrEmpty(tryPath)) + { + success = true; + + // "unity_web" is obviously for the web build. Presumably, this one has DLLs removed that can compromise web security. + // "2.0" is likely the full featured Mono libraries + // "unity" is most likely the one used when selecting 2.0 subset in the player settings. this is the setting by default. + // "micro" is probably the one used in StrippingLevel.UseMicroMSCorlib. only makes sense to be here when building on Android. + // since in iOS, we already have the DLL files. No need for this hackery in iOS. But since in Android we do not have a project folder, + // we resort to this. + + if (wasWebBuild) + { + path = tryPath + "/unity_web/"; + } + else if (monoLevel == ApiCompatibilityLevel.NET_2_0_Subset) + { + path = tryPath + "/unity/"; + } + else + { + path = tryPath + "/2.0/"; + } + +#if !UNITY_2018_3_OR_NEWER + if (wasAndroidApkBuild && codeStrippingLevel == StrippingLevel.UseMicroMSCorlib) + { + higherPriorityPath = tryPath + "/micro/"; + } + else +#endif + { + higherPriorityPath = ""; + } + } + else + { + path = ""; + higherPriorityPath = ""; + } + + return success; + } + + + public static EditorBuildSettingsScene[] GetAllScenesInBuild() + { + return EditorBuildSettings.scenes; + } + + public static BuildReportTool.SizePart CreateSizePartFromFile(string filename, string fileFullPath, + bool getRawSize = true) + { + var outPart = new BuildReportTool.SizePart(); + + outPart.Name = System.Security.SecurityElement.Escape(filename); + + if (System.IO.File.Exists(fileFullPath)) + { + if (getRawSize) + { + long fileSizeBytes = GetFileSizeInBytes(fileFullPath); + outPart.RawSizeBytes = fileSizeBytes; + outPart.RawSize = GetBytesReadable(fileSizeBytes); + } + else + { + outPart.RawSizeBytes = -1; + outPart.RawSize = "N/A"; + } + + + long importedSizeBytes = -1; + + outPart.ImportedSizeBytes = importedSizeBytes; + outPart.ImportedSize = BuildReportTool.Util.GetBytesReadable(importedSizeBytes); + } + else + { + outPart.RawSizeBytes = -1; + outPart.RawSize = "???"; + } + + // todo perhaps compute percentage: file size of this DLL out of total build size (would need to convert string of total build size into an int of bytes) + outPart.Percentage = -1; + + return outPart; + } + + public static bool Exists(this SizePart[] list, string assetName) + { + for (int n = 0; n < list.Length; ++n) + { + if (list[n].Name == assetName) + { + return true; + } + } + + return false; + } + + public static int FindIdx(this List list, string assetName) + { + for (int n = 0; n < list.Count; ++n) + { + if (list[n].Name == assetName) + { + return n; + } + } + + return -1; + } + + static void SaveTextFile(string saveFilePath, string data) + { + string folder = System.IO.Path.GetDirectoryName(saveFilePath); + + if (!string.IsNullOrEmpty(folder)) + { + System.IO.Directory.CreateDirectory(folder); + } + +#if UNITY_WEBPLAYER && !UNITY_EDITOR + Debug.LogError("Current build target is set to Web Player. Cannot perform file input/output when in Web Player."); +#else + System.IO.StreamWriter + write = new System.IO.StreamWriter(saveFilePath, false, + System.Text.Encoding.UTF8); // Unity's TextAsset.text borks when encoding used is UTF8 :( + write.Write(data); + write.Flush(); + write.Close(); + write.Dispose(); +#endif + } + + static string FixXmlBuildReportFile(string serializedBuildInfoFilePath) + { + string xmlData = GetTextFileContents(serializedBuildInfoFilePath); + + if (string.IsNullOrEmpty(xmlData)) + { + return string.Empty; + } + + xmlData = xmlData.Replace("BuildSizePart", "SizePart"); + + // quick and dirty fix for invalid XML characters in filenames + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace(" ", ""); + xmlData = xmlData.Replace(" ", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + xmlData = xmlData.Replace("", ""); + + SaveTextFile(serializedBuildInfoFilePath, xmlData); + + return xmlData; + } + + public static string MyHtmlDecode(string input) + { + input = input.Replace("<", "<"); + input = input.Replace(">", ">"); + input = input.Replace("&", "&"); + input = input.Replace("'", "'"); + input = input.Replace(""", "\""); + input = input.Replace("ñ", "ñ"); + input = input.Replace("Ñ", "Ñ"); + input = input.Replace("©", "©"); + input = input.Replace("®", "®"); + input = input.Replace("™", "™"); + + return input; + } + + + public static BuildReportTool.BuildInfo OpenSerializedBuildInfo(string serializedBuildInfoFilePath, bool fromMainThread = true) + { + if (!System.IO.File.Exists(serializedBuildInfoFilePath)) + { + return null; + } + + BuildReportTool.BuildInfo ret = null; + + var x = new System.Xml.Serialization.XmlSerializer(typeof(BuildReportTool.BuildInfo)); + + string correctedXmlData = FixXmlBuildReportFile(serializedBuildInfoFilePath); + + try + { + // when the string has contents, it means there were corrections to the xml data + // and we should load that updated content instead of reading the file + if (!string.IsNullOrEmpty(correctedXmlData)) + { + System.IO.TextReader reader = new System.IO.StringReader(correctedXmlData); + ret = (BuildReportTool.BuildInfo) x.Deserialize(reader); + } + else + { + // no corrections in the xml file + // proceed to open the file normally + using (var fs = new System.IO.FileStream(serializedBuildInfoFilePath, System.IO.FileMode.Open)) + { + System.Xml.XmlReader reader = new System.Xml.XmlTextReader(fs); + ret = (BuildReportTool.BuildInfo) x.Deserialize(reader); + fs.Close(); + } + } + } + catch (Exception e) + { + Debug.LogError(e); + } + + if (fromMainThread) + { + if (ret != null && BuildInfoHasContents(ret)) + { + ret.OnAfterLoad(); + ret.SetSavedPath(serializedBuildInfoFilePath); + } + else + { + Debug.LogError("Build Report Tool: Invalid data in build info file: " + serializedBuildInfoFilePath); + } + } + + return ret; + } + + public static bool BuildInfoHasContents(BuildReportTool.BuildInfo n) + { + return n != null && n.HasContents; + } + + // --------------------------------- + + public static T OpenSerialized(string filePath) where T : class, BuildReportTool.IDataFile + { + if (!System.IO.File.Exists(filePath)) + { + return null; + } + + T ret = null; + + var x = new System.Xml.Serialization.XmlSerializer(typeof(T)); + + // no corrections in the xml file + // proceed to open the file normally + using (var fs = new System.IO.FileStream(filePath, System.IO.FileMode.Open)) + { + System.Xml.XmlReader reader = new System.Xml.XmlTextReader(fs); + ret = (T) x.Deserialize(reader); + fs.Close(); + } + + if (ret != null) + { + ret.OnAfterLoad(); + ret.SetSavedPath(filePath); + } + + return ret; + } + + // --------------------------------- + + const string SAVE_DATE_TIME_FORMAT = "yyyyMMMdd-HHmmss"; + + public static string GetBuildInfoDefaultFilename(string projectName, string buildType, System.DateTime timeGot) + { + return string.Format("{0}-{1}-{2}.xml", projectName, buildType, timeGot.ToString(SAVE_DATE_TIME_FORMAT)); + } + + public static string GetAssetDependenciesDefaultFilename(string projectName, string buildType, + System.DateTime timeGot) + { + return string.Format("DEP-{0}-{1}-{2}.xml", projectName, buildType, timeGot.ToString(SAVE_DATE_TIME_FORMAT)); + } + + public static string GetTextureDataDefaultFilename(string projectName, string buildType, + System.DateTime timeGot) + { + return string.Format("TextureData-{0}-{1}-{2}.xml", projectName, buildType, timeGot.ToString(SAVE_DATE_TIME_FORMAT)); + } + + public static string GetMeshDataDefaultFilename(string projectName, string buildType, + System.DateTime timeGot) + { + return string.Format("MeshData-{0}-{1}-{2}.xml", projectName, buildType, timeGot.ToString(SAVE_DATE_TIME_FORMAT)); + } + + public static string GetPrefabDataDefaultFilename(string projectName, string buildType, + System.DateTime timeGot) + { + return string.Format("PrefabData-{0}-{1}-{2}.xml", projectName, buildType, timeGot.ToString(SAVE_DATE_TIME_FORMAT)); + } + + public static string GetUnityBuildReportDefaultFilename(string projectName, string buildType, + System.DateTime timeGot) + { + return string.Format("UBR-{0}-{1}-{2}.xml", projectName, buildType, timeGot.ToString(SAVE_DATE_TIME_FORMAT)); + } + + public static string GetAssetDependenciesFilenameFromBuildInfo(string filepath) + { + var folderPath = System.IO.Path.GetDirectoryName(filepath); + var filename = filepath.GetFileNameOnly(); + return string.Format("{0}/DEP-{1}", folderPath, filename); + } + + public static string GetTextureDataFilenameFromBuildInfo(string filepath) + { + var folderPath = System.IO.Path.GetDirectoryName(filepath); + var filename = filepath.GetFileNameOnly(); + return string.Format("{0}/TextureData-{1}", folderPath, filename); + } + + public static string GetMeshDataFilenameFromBuildInfo(string filepath) + { + var folderPath = System.IO.Path.GetDirectoryName(filepath); + var filename = filepath.GetFileNameOnly(); + return string.Format("{0}/MeshData-{1}", folderPath, filename); + } + + public static string GetPrefabDataFilenameFromBuildInfo(string filepath) + { + var folderPath = System.IO.Path.GetDirectoryName(filepath); + var filename = filepath.GetFileNameOnly(); + return string.Format("{0}/PrefabData-{1}", folderPath, filename); + } + + public static string GetUnityBuildReportFilenameFromBuildInfo(string filepath) + { + var folderPath = System.IO.Path.GetDirectoryName(filepath); + var filename = filepath.GetFileNameOnly(); + return string.Format("{0}/UBR-{1}", folderPath, filename); + } + + public static string GetExtraDataFilename(string filepath) + { + var folderPath = System.IO.Path.GetDirectoryName(filepath); + var filename = filepath.GetFileNameOnlyNoExtension(); + return string.Format("{0}/ExtraData-{1}.txt", folderPath, filename); + } + + // --------------------------------- + + public static string SerializeAtFolder(T data, + string folderPathToSaveTo) where T : class, BuildReportTool.IDataFile + { + string filePath; + if (!string.IsNullOrEmpty(folderPathToSaveTo)) + { + if (!System.IO.Directory.Exists(folderPathToSaveTo)) + { + System.IO.Directory.CreateDirectory(folderPathToSaveTo); + } + + char lastChar = folderPathToSaveTo[folderPathToSaveTo.Length - 1]; + if (lastChar == '/' || lastChar == '\\' || lastChar == ':') + { + filePath = string.Format("{0}{1}", folderPathToSaveTo, data.GetDefaultFilename()); + } + else + { + filePath = string.Format("{0}/{1}", folderPathToSaveTo, data.GetDefaultFilename()); + } + } + else + { + filePath = data.GetDefaultFilename(); + } + + Serialize(data, filePath); + + return filePath; + } + + public static void Serialize(T data, string fullPathToSaveTo) where T : class, BuildReportTool.IDataFile + { + fullPathToSaveTo = fullPathToSaveTo.Replace("\\", "/"); + data.OnBeforeSave(); + + var xmlSerializer = new System.Xml.Serialization.XmlSerializer(typeof(T)); + var writer = new System.IO.StreamWriter(fullPathToSaveTo); + xmlSerializer.Serialize(writer, data); + writer.Close(); + + data.SetSavedPath(fullPathToSaveTo); + + if (!string.IsNullOrEmpty(data.SavedPath)) + { + Debug.Log(string.Format("Build Report Tool: Saved \"{0}\"", data.SavedPath)); + } + } + + // --------------------------------- + + public static string WildCardToRegex(string value) + { + if (!value.Contains("*")) + { + value = string.Format("*{0}*", value); + } + + return string.Format("^{0}$", System.Text.RegularExpressions.Regex.Escape(value).Replace("\\*", ".*")); + } + + public static bool IsRegexValid(string testPattern) + { + if (string.IsNullOrEmpty(testPattern)) + { + // ignore blank input + return true; + } + + bool isValid = true; + + if (testPattern.Trim().Length > 0) + { + try + { + System.Text.RegularExpressions.Regex.Match("", testPattern); + } + catch (ArgumentException) + { + // BAD PATTERN: Syntax error + isValid = false; + } + } + else + { + //BAD PATTERN: Pattern is null or blank + isValid = false; + } + + return (isValid); + } + } +} // namespace BuildReportTool \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_Util.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_Util.cs.meta new file mode 100644 index 00000000..2bb4ee92 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/BRT_Util.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f528fefa626a0440daf1137d5a319f28 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_BackwardFileReader.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_BackwardFileReader.cs new file mode 100644 index 00000000..8ef7290e --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_BackwardFileReader.cs @@ -0,0 +1,92 @@ +using System.IO; +using System.Text; + +namespace DldUtil +{ + // from http://arstechnica.com/civis/viewtopic.php?p=22839293&sid=e2bcb348ac8b58c9016e6a0a6442ba1b#p22839293 + public class BackwardReader + { + readonly FileStream fs; + + public BackwardReader(string path) + { + fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + } + + public void JumpToEnd(long lineNumber) + { + fs.Seek(0, SeekOrigin.End); + } + + public void JumpToLine(long lineNumber) + { + fs.Seek(lineNumber, SeekOrigin.Begin); + } + + public string ReadLine() + { + var text = new byte[1]; + long position = 0; + + fs.Seek(0, SeekOrigin.Current); + position = fs.Position; + + // do we have a trailing \r\n? + if (fs.Length > 1) + { + var vagnretur = new byte[2]; + + fs.Seek(-2, SeekOrigin.Current); + fs.Read(vagnretur, 0, 2); + + if (Encoding.ASCII.GetString(vagnretur).Equals("\r\n")) + { + // move it back + fs.Seek(-2, SeekOrigin.Current); + position = fs.Position; + } + } + + while (fs.Position > 0) + { + text.Initialize(); + + // read one char + fs.Read(text, 0, 1); + var asciiText = Encoding.ASCII.GetString(text); + + // move back to the character before + fs.Seek(-2, SeekOrigin.Current); + + if (asciiText.Equals("\n")) + { + fs.Read(text, 0, 1); + + asciiText = Encoding.ASCII.GetString(text); + if (asciiText.Equals("\r")) + { + fs.Seek(1, SeekOrigin.Current); + break; + } + } + } + + var count = int.Parse((position - fs.Position).ToString()); + var line = new byte[count]; + fs.Read(line, 0, count); + fs.Seek(-count, SeekOrigin.Current); + + return Encoding.ASCII.GetString(line); + } + + public bool SOF + { + get { return fs.Position == 0; } + } + + public void Close() + { + fs.Close(); + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_BackwardFileReader.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_BackwardFileReader.cs.meta new file mode 100644 index 00000000..3a3b1ba8 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_BackwardFileReader.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 2e985eb9b8631424b9e93f8901cdefab +timeCreated: 1456670746 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_BigFileReader.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_BigFileReader.cs new file mode 100644 index 00000000..a374336d --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_BigFileReader.cs @@ -0,0 +1,292 @@ +using System; +using System.Collections.Generic; +using System.IO; + +namespace DldUtil +{ + public static class BigFileReader + { + public static bool FileHasText(string path, params string[] seekText) + { + if (!File.Exists(path)) + { + return false; + } + + FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + BufferedStream bs = new BufferedStream(fs); + StreamReader sr = new StreamReader(bs); + + while (true) + { + var line = sr.ReadLine(); + + if (line == null) + { + break; + } + + for (var seekTextIdx = 0; seekTextIdx < seekText.Length; ++seekTextIdx) + { + if (line.IndexOf(seekText[seekTextIdx], StringComparison.Ordinal) >= 0) + { + sr.Close(); + bs.Close(); + fs.Close(); + + return true; + } + } + } + + sr.Close(); + bs.Close(); + fs.Close(); + + return false; + } + + public static string SeekText(string path, params string[] seekText) + { + FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + BufferedStream bs = new BufferedStream(fs); + StreamReader sr = new StreamReader(bs); + + //long currentLine = 0; + while (true) + { + //++currentLine; + var line = sr.ReadLine(); + //Debug.LogFormat("seeking... line number {0}: {1}", currentLine, line); + + // reached end of file? + if (line == null) + { + break; + } + + for (var seekTextIdx = 0; seekTextIdx < seekText.Length; ++seekTextIdx) + { + if (line.IndexOf(seekText[seekTextIdx], StringComparison.Ordinal) >= 0) + { + return line; + } + } + } + + return string.Empty; + } + + public struct FoundText + { + public long LineNumber; + public string Text; + } + + public static List SeekAllText(string path, params string[] seekText) + { + if (!File.Exists(path)) + { + return null; + } + + FileStream fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + BufferedStream bs = new BufferedStream(fs); + StreamReader sr = new StreamReader(bs); + + List returnValue = new List(); + + long currentLine = 0; + while (true) + { + ++currentLine; + var line = sr.ReadLine(); + //Debug.LogFormat("seeking... line number {0}: {1}", currentLine, line); + + // reached end of file? + if (line == null) + { + break; + } + + for (var seekTextIdx = 0; seekTextIdx < seekText.Length; ++seekTextIdx) + { + if (line.IndexOf(seekText[seekTextIdx], StringComparison.Ordinal) >= 0) + { + FoundText newFoundText; + newFoundText.LineNumber = currentLine; + newFoundText.Text = line; + returnValue.Add(newFoundText); + } + } + } + + return returnValue; + } + + public static IEnumerable ReadFile(string path, params string[] seekText) + { + return ReadFile(path, true, seekText); + } + + public static IEnumerable ReadFile(string path, bool startAfterSeekedText, params string[] seekText) + { + if (!File.Exists(path)) + { + yield break; + } + + var fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + var bs = new BufferedStream(fs); + var sr = new StreamReader(bs); + + string line; + + bool seekTextRequested = (seekText != null) && (seekText.Length > 0) && !string.IsNullOrEmpty(seekText[0]); + + + long seekTextFoundAtLine = -1; + + + if (seekTextRequested) + { + long currentLine = 0; + while (true) + { + ++currentLine; + line = sr.ReadLine(); + //Debug.LogFormat("seeking... line number {0}: {1}", currentLine, line); + + // reached end of file? + if (line == null) + { + break; + } + + var atLeastOneSeekTextFound = false; + for (var seekTextIdx = 0; seekTextIdx < seekText.Length; ++seekTextIdx) + { + if (line.IndexOf(seekText[seekTextIdx], StringComparison.Ordinal) >= 0) + { + atLeastOneSeekTextFound = true; + break; + } + } + + // if seekText not found yet, continue search + if (!atLeastOneSeekTextFound) + { + continue; + } + + seekTextFoundAtLine = currentLine; + + //Debug.Log("seeking: " + line); + //Debug.LogFormat("seekText found at line number {0}: {1}", currentLine, line); + } + //Debug.Log("done seeking"); + + if (seekTextFoundAtLine != -1) + { + fs.Seek(0, SeekOrigin.Begin); + + currentLine = 0; + while (true) + { + ++currentLine; + line = sr.ReadLine(); + + if (line == null) + { + break; + } + + if (startAfterSeekedText && currentLine <= seekTextFoundAtLine) + { + continue; + } + + if (!startAfterSeekedText && currentLine < seekTextFoundAtLine) + { + continue; + } + + //Debug.Log("seeked: " + line); + + yield return line; + } + } + } + else + { + while (true) + { + line = sr.ReadLine(); + + if (line == null) + { + break; + } + + yield return line; + } + } + + sr.Close(); + bs.Close(); + fs.Close(); + } + + + public static IEnumerable ReadFile(string path) + { + var fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + var bs = new BufferedStream(fs); + var sr = new StreamReader(bs); + + while (true) + { + var line = sr.ReadLine(); + + if (line == null) + { + break; + } + + yield return line; + } + + sr.Close(); + bs.Close(); + fs.Close(); + } + + public static IEnumerable ReadFileWithLine(string path) + { + var fs = File.Open(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); + var bs = new BufferedStream(fs); + var sr = new StreamReader(bs); + + long currentLineNumber = 0; + while (true) + { + ++currentLineNumber; + var line = sr.ReadLine(); + + if (line == null) + { + break; + } + + FoundText text; + text.Text = line; + text.LineNumber = currentLineNumber; + yield return text; + } + + sr.Close(); + bs.Close(); + fs.Close(); + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_BigFileReader.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_BigFileReader.cs.meta new file mode 100644 index 00000000..49763798 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_BigFileReader.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8542a3803dd50b84ab3795bd8fe6bcf4 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_GetRspDefines.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_GetRspDefines.cs new file mode 100644 index 00000000..bc9f5473 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_GetRspDefines.cs @@ -0,0 +1,223 @@ +using System.Collections.Generic; +using System.IO; +using UnityEditor; +using UnityEngine; + +namespace DldUtil +{ + public static class GetRspDefines + { + static string SmcsFilePath + { + get { return Application.dataPath + "/smcs.rsp"; } + } + + static string McsFilePath + { + get { return Application.dataPath + "/mcs.rsp"; } + } + + static string UsFilePath + { + get { return Application.dataPath + "/us.rsp"; } + } + + static string BooFilePath + { + get { return Application.dataPath + "/boo.rsp"; } + } + + public struct Entry + { + public int TimesDefinedInSmcs; + public int TimesDefinedInMcs; + public int TimesDefinedInUs; + public int TimesDefinedInBoo; + public int TimesDefinedInBuiltIn; + } + + // Unity-made defines are in EditorUserBuildSettings.activeScriptCompilationDefines + static bool IsDefineAlreadyInUnity(string defineName) + { + string[] builtInDefines = EditorUserBuildSettings.activeScriptCompilationDefines; + + for (int n = 0, len = builtInDefines.Length; n < len; n++) + { + if (builtInDefines[n] == defineName) + { + return true; + } + } + + return false; + } + + // ======================================================================================== + + static void IncrementTimesDefinedInBuiltIn(Dictionary table, string define) + { + if (!table.ContainsKey(define)) + { + table[define] = new Entry(); + } + + Entry currentDef = table[define]; + currentDef.TimesDefinedInBuiltIn++; + + // assign it back to store it + table[define] = currentDef; + } + + static void IncrementTimesDefinedInSmcs(Dictionary table, string define) + { + if (!table.ContainsKey(define)) + { + table[define] = new Entry(); + } + + Entry currentDef = table[define]; + currentDef.TimesDefinedInSmcs++; + + // assign it back to store it + table[define] = currentDef; + } + + static void IncrementTimesDefinedInMcs(Dictionary table, string define) + { + if (!table.ContainsKey(define)) + { + table[define] = new Entry(); + } + + Entry currentDef = table[define]; + currentDef.TimesDefinedInMcs++; + + // assign it back to store it + table[define] = currentDef; + } + + static void IncrementTimesDefinedInUs(Dictionary table, string define) + { + if (!table.ContainsKey(define)) + { + table[define] = new Entry(); + } + + Entry currentDef = table[define]; + currentDef.TimesDefinedInUs++; + + // assign it back to store it + table[define] = currentDef; + } + + static void IncrementTimesDefinedInBoo(Dictionary table, string define) + { + if (!table.ContainsKey(define)) + { + table[define] = new Entry(); + } + + Entry currentDef = table[define]; + currentDef.TimesDefinedInBoo++; + + // assign it back to store it + table[define] = currentDef; + } + + // ======================================================================================== + + public static Dictionary GetDefines() + { + Dictionary result = new Dictionary(); + + // --------------------------------------------------------- + + string[] definesInSmcs = GetDefinesInsideFile(SmcsFilePath); + + if (definesInSmcs != null && definesInSmcs.Length > 0) + { + for (int n = 0, len = definesInSmcs.Length; n < len; n++) + { + IncrementTimesDefinedInSmcs(result, definesInSmcs[n]); + if (IsDefineAlreadyInUnity(definesInSmcs[n])) + { + IncrementTimesDefinedInBuiltIn(result, definesInSmcs[n]); + } + } + } + + // --------------------------------------------------------- + + string[] definesInMcs = GetDefinesInsideFile(McsFilePath); + + if (definesInMcs != null && definesInMcs.Length > 0) + { + for (int n = 0, len = definesInMcs.Length; n < len; n++) + { + IncrementTimesDefinedInMcs(result, definesInMcs[n]); + if (IsDefineAlreadyInUnity(definesInMcs[n])) + { + IncrementTimesDefinedInBuiltIn(result, definesInMcs[n]); + } + } + } + + // --------------------------------------------------------- + + string[] definesInUs = GetDefinesInsideFile(UsFilePath); + + if (definesInUs != null && definesInUs.Length > 0) + { + for (int n = 0, len = definesInUs.Length; n < len; n++) + { + IncrementTimesDefinedInUs(result, definesInUs[n]); + if (IsDefineAlreadyInUnity(definesInUs[n])) + { + IncrementTimesDefinedInBuiltIn(result, definesInUs[n]); + } + } + } + + // --------------------------------------------------------- + + string[] definesInBoo = GetDefinesInsideFile(BooFilePath); + + if (definesInBoo != null && definesInBoo.Length > 0) + { + for (int n = 0, len = definesInBoo.Length; n < len; n++) + { + IncrementTimesDefinedInBoo(result, definesInBoo[n]); + if (IsDefineAlreadyInUnity(definesInBoo[n])) + { + IncrementTimesDefinedInBuiltIn(result, definesInBoo[n]); + } + } + } + + // --------------------------------------------------------- + + return result; + } + + static string[] GetDefinesInsideFile(string filePath) + { + if (!File.Exists(filePath)) + { + return null; + } + + string rawContents = File.ReadAllText(filePath); + if (!rawContents.StartsWith("-define:")) + { + // malformed .rsp file + return null; + } + + // remove "-define:" + string allDefines = rawContents.Substring(8); + //Debug.Log(allDefines); + + return allDefines.Split(';'); + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_GetRspDefines.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_GetRspDefines.cs.meta new file mode 100644 index 00000000..93ceb003 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_GetRspDefines.cs.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1e536a29403c28f479da249218b27ee2 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_TraverseDirectory.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_TraverseDirectory.cs new file mode 100644 index 00000000..5b52ef6a --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_TraverseDirectory.cs @@ -0,0 +1,124 @@ +using UnityEngine; +using System.Collections.Generic; +using System.IO; + +namespace DldUtil +{ + public static class TraverseDirectory + { + struct TraversalStack + { + public string TopFolder; + public long ChildIdxToGoOnReturn; // idx to go to when resuming from lower/inner level of depth + } + + const long OUTER_LOOP_LIMIT = 1000000; // 1 million + const long FILE_LIMIT = 4000000000; // 4 billion + + public static IEnumerable Do(string path) + { + Stack traversal = new Stack(5); + + TraversalStack initial; + initial.TopFolder = path; + initial.ChildIdxToGoOnReturn = 0; + + traversal.Push(initial); + + + // guard against infinite loop + long infiniteCounterStack = 0; + long infiniteCounterFile = 0; + + TraversalStack currentStack; + + + while (traversal.Count > 0) + { + ++infiniteCounterStack; + if (infiniteCounterStack > OUTER_LOOP_LIMIT) + { + break; + } + + currentStack = traversal.Peek(); + //Debug.Log("in " + currentStack.TopFolder); + + bool toGoDeeper = false; + + string[] allInCurrentFolder = Directory.GetFileSystemEntries(currentStack.TopFolder); + + infiniteCounterFile = 0; + for (long n = currentStack.ChildIdxToGoOnReturn, len = allInCurrentFolder.Length; n < len; ++n) + { + ++infiniteCounterFile; + if (infiniteCounterFile > FILE_LIMIT) + { + break; + } + + //Debug.Log("for loop: [" + n + "] " + allInCurrentFolder[n]); + + if (File.Exists(allInCurrentFolder[n]) && !allInCurrentFolder[n].EndsWith(".meta")) + { + var returnValue = allInCurrentFolder[n].Replace("\\", "/"); + returnValue = returnValue.Replace("&", "&"); + + yield return returnValue; + } + else if (Directory.Exists(allInCurrentFolder[n])) + { + //Debug.Log("is folder: " + allInCurrentFolder[n]); + + // update current stack: change its idx to return to + + currentStack.ChildIdxToGoOnReturn = n + 1; + traversal.Pop(); + traversal.Push(currentStack); + + + // add new stack so we go inside this folder + + TraversalStack deeper; + deeper.TopFolder = allInCurrentFolder[n]; + deeper.ChildIdxToGoOnReturn = 0; + + traversal.Push(deeper); + + //Debug.Log("pushed " + allInCurrentFolder[n]); + + toGoDeeper = true; + break; + } + } + + // if completely finished that for loop, + // then we're done with current stack. remove it. + if (!toGoDeeper) + { + //Debug.Log("popped " + currentStack.TopFolder); + traversal.Pop(); + } + } + } + + +#if UNITY_EDITOR + //[MenuItem("Window/Test traverse folder")] + public static void TestA() + { + //string folder = "C:/Users/Ferdi/Projects/_AssetStoreProducts/BuildReportTool/BuildReportToolU353/BuildReportUnityProject/Assets/BuildReport/Scripts"; + string folder = Application.dataPath; + + Debug.Log("traverse at: " + folder); + foreach (string file in Do(folder)) + { + if (BuildReportTool.Util.IsFileOfType(file, ".prefab")) + { + Debug.Log("traverse stack: " + Path.GetFileName(file)); + } + } + } +#endif + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_TraverseDirectory.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_TraverseDirectory.cs.meta new file mode 100644 index 00000000..9c7711d4 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_TraverseDirectory.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 34de8006dd00e8540895016e2be2606f +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_UnityVersion.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_UnityVersion.cs new file mode 100644 index 00000000..93aa616f --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_UnityVersion.cs @@ -0,0 +1,171 @@ +using System; +using UnityEngine; + +namespace DldUtil +{ + public static class UnityVersion + { + public static void GetUnityVersionNumbers(string unityVersionString, out int major, out int minor, out int patch) + { + var splits = unityVersionString.Split(new[] {"Unity", ".", "a", "b", "rc", "f"}, + StringSplitOptions.RemoveEmptyEntries); + + major = -1; + minor = -1; + patch = -1; + + if (splits.Length >= 1) + { + int.TryParse(splits[0], out major); + } + + if (splits.Length >= 2) + { + int.TryParse(splits[1], out minor); + } + + if (splits.Length >= 3) + { + int.TryParse(splits[2], out patch); + } + } + + public static void GetUnityVersionNumbers(out int major, out int minor, out int patch) + { + GetUnityVersionNumbers(Application.unityVersion, out major, out minor, out patch); + + //Debug.LogFormat("major: {0}, minor: {1}, patch: {2}", major, minor, patch); + } + + public static bool IsUnityVersionAtLeast(int majorAtLeast, int minorAtLeast, int patchAtLeast) + { + int unityMajor; + int unityMinor; + int unityPatch; + + GetUnityVersionNumbers(out unityMajor, out unityMinor, out unityPatch); + + if (unityMajor > majorAtLeast) + { + return true; + } + + if (unityMajor == majorAtLeast) + { + if (unityMinor > minorAtLeast) + { + return true; + } + + if (unityMinor == minorAtLeast) + { + if (unityPatch >= patchAtLeast) + { + return true; + } + } + } + + return false; + } + + public static bool IsUnityVersionAtMost(int majorAtMost, int minorAtMost, int patchAtMost) + { + int unityMajor; + int unityMinor; + int unityPatch; + + GetUnityVersionNumbers(out unityMajor, out unityMinor, out unityPatch); + + if (unityMajor < majorAtMost) + { + return true; + } + + if (unityMajor == majorAtMost) + { + if (unityMinor < minorAtMost) + { + return true; + } + + if (unityMinor == minorAtMost) + { + if (unityPatch <= patchAtMost) + { + return true; + } + } + } + + return false; + } + + + public static bool IsUnityVersionAtLeast(string unityVersionString, int majorAtLeast, int minorAtLeast, + int patchAtLeast) + { + int unityMajor; + int unityMinor; + int unityPatch; + + GetUnityVersionNumbers(unityVersionString, out unityMajor, out unityMinor, out unityPatch); + + if (unityMajor > majorAtLeast) + { + return true; + } + + if (unityMajor == majorAtLeast) + { + if (unityMinor > minorAtLeast) + { + return true; + } + + if (unityMinor == minorAtLeast) + { + if (unityPatch >= patchAtLeast) + { + return true; + } + } + } + + return false; + } + + public static bool IsUnityVersionAtMost(string unityVersionString, int majorAtMost, int minorAtMost, + int patchAtMost) + { + int unityMajor; + int unityMinor; + int unityPatch; + + GetUnityVersionNumbers(unityVersionString, out unityMajor, out unityMinor, out unityPatch); + + if (unityMajor < majorAtMost) + { + return true; + } + + if (unityMajor == majorAtMost) + { + if (unityMinor < minorAtMost) + { + return true; + } + + if (unityMinor == minorAtMost) + { + if (unityPatch <= patchAtMost) + { + return true; + } + } + } + + return false; + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_UnityVersion.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_UnityVersion.cs.meta new file mode 100644 index 00000000..d8fa0fa9 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/DldUtil_UnityVersion.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 12045753a7d86e548bd5e1b4f00ef56b +timeCreated: 1456509724 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/ImageDimensions.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/ImageDimensions.cs new file mode 100644 index 00000000..d1aa833d --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/ImageDimensions.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections.Generic; +using System.IO; + +namespace ImageUtility +{ + public struct Dimensions + { + public int Width; + public int Height; + + public static Dimensions ErrorValue + { + get + { + Dimensions returnValue; + returnValue.Width = 0; + returnValue.Height = 0; + return returnValue; + } + } + } + + /// + /// Retrieves width and height of an image, without loading the entire image in memory. + /// + /// Based on https://stackoverflow.com/a/112711/1377948 + /// (with edits from https://stackoverflow.com/a/60667939/1377948 + /// for recognizing progressive jpeg and webp). + /// + /// Code will return (-1, -1) as an error value, instead of any exception throwing. + /// + public static class Dimension + { + static readonly Dictionary> ImageFormatDecoders = new Dictionary>() + { + { new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A }, DecodePng }, + { new byte[] { 0x47, 0x49, 0x46, 0x38, 0x37, 0x61 }, DecodeGif }, + { new byte[] { 0x47, 0x49, 0x46, 0x38, 0x39, 0x61 }, DecodeGif }, + { new byte[] { 0x52, 0x49, 0x46, 0x46 }, DecodeWebP }, + { new byte[] { 0xFF, 0xD8 }, DecodeJfif }, + { new byte[] { 0x42, 0x4D }, DecodeBitmap }, + }; + + /// + /// Currently the longest we have in is the png one, with 8 bytes. + /// + const int LONGEST_MAGIC_BYTES = 8; + + static byte[] _magicBytes; + + /// + /// Retrieves width and height of an image, without loading the entire image in memory. + /// + /// Full path to the image to get the dimensions of. + /// (width, height) tuple, or (-1, -1) if not found. + public static Dimensions Get(string path) + { + using (var binaryReader = new BinaryReader(File.OpenRead(path))) + { + return Get(binaryReader); + } + } + + /// + /// Retrieves width and height of an image opened in a BinaryReader. + /// It will only read through the BinaryReader as least as it possibly + /// can to get to the width and height. + /// + /// A BinaryReader with the image file opened in it. + /// (width, height) tuple, or (-1, -1) if not found. + public static Dimensions Get(BinaryReader binaryReader) + { + if (_magicBytes == null) + { + _magicBytes = new byte[LONGEST_MAGIC_BYTES]; + } + else + { + // reset the byte array checker to 0 value + for (int i = 0; i < LONGEST_MAGIC_BYTES; i += 1) + { + _magicBytes[i] = 0; + } + } + + // Detect the image type not using the file type, + // but via the bytes it has at the start of the file. + // + // We read up to n number of bytes at the start of the file (where n is LONGEST_MAGIC_BYTES), + // and each time we've appended to the _magicBytes we're reading, + // check if what we have so far matches any of the image types we know. + for (int i = 0; i < LONGEST_MAGIC_BYTES; i += 1) + { + _magicBytes[i] = binaryReader.ReadByte(); + + foreach (var kvPair in ImageFormatDecoders) + { + if (_magicBytes.StartsWith(kvPair.Key)) + { + // The bytes have been recognized as one of our known image types, + // now we use the Decode method assigned for that image type. + return kvPair.Value(binaryReader); + } + } + } + + return Dimensions.ErrorValue; + } + + // ================================================================================= + + static bool StartsWith(this byte[] thisBytes, byte[] thatBytes) + { + for (int i = 0; i < thatBytes.Length; i += 1) + { + if (thisBytes[i] != thatBytes[i]) + { + return false; + } + } + + return true; + } + + const int SIZE_OF_SHORT = sizeof(short); + static readonly byte[] ShortBytes = new byte[SIZE_OF_SHORT]; + static short ReadLittleEndianInt16(this BinaryReader binaryReader) + { + for (int i = 0; i < SIZE_OF_SHORT; i += 1) + { + ShortBytes[SIZE_OF_SHORT - 1 - i] = binaryReader.ReadByte(); + } + + return BitConverter.ToInt16(ShortBytes, 0); + } + + const int SIZE_OF_INT = sizeof(int); + static readonly byte[] IntBytes = new byte[SIZE_OF_INT]; + static int ReadLittleEndianInt32(this BinaryReader binaryReader) + { + for (int i = 0; i < SIZE_OF_INT; i += 1) + { + IntBytes[SIZE_OF_INT - 1 - i] = binaryReader.ReadByte(); + } + + return BitConverter.ToInt32(IntBytes, 0); + } + + // ================================================================================= + + static Dimensions DecodeBitmap(BinaryReader binaryReader) + { + binaryReader.ReadBytes(16); + Dimensions returnValue; + returnValue.Width = binaryReader.ReadInt32(); + returnValue.Height = binaryReader.ReadInt32(); + return returnValue; + } + + static Dimensions DecodeGif(BinaryReader binaryReader) + { + Dimensions returnValue; + returnValue.Width = binaryReader.ReadInt16(); + returnValue.Height = binaryReader.ReadInt16(); + return returnValue; + } + + static Dimensions DecodePng(BinaryReader binaryReader) + { + binaryReader.ReadBytes(8); + Dimensions returnValue; + returnValue.Width = binaryReader.ReadLittleEndianInt32(); + returnValue.Height = binaryReader.ReadLittleEndianInt32(); + return returnValue; + } + + static Dimensions DecodeJfif(BinaryReader binaryReader) + { + while (binaryReader.ReadByte() == 0xFF) // skipp FF + { + byte marker = binaryReader.ReadByte(); + short chunkLength = binaryReader.ReadLittleEndianInt16(); + + // C2: progressive (from https://stackoverflow.com/a/60667939/1377948) + if (marker == 0xC0 || marker == 0xC2) + { + binaryReader.ReadByte(); + + Dimensions returnValue; + returnValue.Height = binaryReader.ReadLittleEndianInt16(); + returnValue.Width = binaryReader.ReadLittleEndianInt16(); + return returnValue; + } + + if (chunkLength < 0) + { + ushort uChunkLength = (ushort)chunkLength; + binaryReader.ReadBytes(uChunkLength - 2); + } + else + { + binaryReader.ReadBytes(chunkLength - 2); + } + } + + return Dimensions.ErrorValue; + } + + // (from https://stackoverflow.com/a/60667939/1377948) + static Dimensions DecodeWebP(BinaryReader binaryReader) + { + binaryReader.ReadUInt32(); // Size + binaryReader.ReadBytes(15); // WEBP, VP8 + more + binaryReader.ReadBytes(3); // SYNC + + Dimensions returnValue; + + // 14 bits (ignore last 2 bits of the 16 bit value) for width + returnValue.Width = binaryReader.ReadUInt16() & 0x3FFF; + + // 14 bits (ignore last 2 bits of the 16 bit value) for height + returnValue.Height = binaryReader.ReadUInt16() & 0x3FFF; + + return returnValue; + } + + // ================================================================================= + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/ImageDimensions.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/ImageDimensions.cs.meta new file mode 100644 index 00000000..840b39d3 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/ImageDimensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4b0199226a7dee14fa4f0865aee45839 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/SessionData.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/SessionData.cs new file mode 100644 index 00000000..ff8827bf --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/SessionData.cs @@ -0,0 +1,76 @@ +using UnityEngine; + +namespace BuildReportTool +{ + [System.Serializable] + public class SessionData : IDataFile + { + public bool ShouldGetBuildReportNow; + public bool ShouldSaveGottenBuildReportNow; + public string BuildTimeStart; + public string BuildTimeDuration; + public int LastTargetBuild; + + System.DateTime _savedBuildTimeStart = new System.DateTime(0); + public bool HasBuildTime() + { + return _savedBuildTimeStart.Ticks > 0; + } + public void SetBuildTimeToNow() + { + _savedBuildTimeStart = System.DateTime.Now; + BuildTimeStart = _savedBuildTimeStart.ToString("u", System.Globalization.CultureInfo.InvariantCulture); + } + public System.DateTime GetBuildTime() + { + return _savedBuildTimeStart; + } + public void ClearBuildTime() + { + _savedBuildTimeStart = default; + } + + public void SaveBuildTimeDuration() + { + if (_savedBuildTimeStart.Ticks <= 0) + { + return; + } + + var timeSpanBuildStart = new System.TimeSpan(_savedBuildTimeStart.Ticks); + var timeSpanNow = new System.TimeSpan(System.DateTime.Now.Ticks); + var buildDurationTime = timeSpanNow - timeSpanBuildStart; + + // ---------------------- + + BuildTimeDuration = buildDurationTime.ToString(); + } + + public System.TimeSpan LoadBuildTimeDuration() + { + return System.TimeSpan.Parse(BuildTimeDuration); + } + + public void OnBeforeSave() + { + } + + public void OnAfterLoad() + { + _savedBuildTimeStart = !string.IsNullOrEmpty(BuildTimeStart) + ? System.DateTime.ParseExact(BuildTimeStart, "u", System.Globalization.CultureInfo.InvariantCulture) + : default; + } + + public void SetSavedPath(string savedPath) + { + } + + public string SavedPath => null; + + public string GetDefaultFilename() + { + return $"{BuildReportTool.Util.RemoveSuffix("Assets", Application.dataPath)}Library/BuildReportTool-SessionData.xml"; + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/SessionData.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/SessionData.cs.meta new file mode 100644 index 00000000..afd5561a --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Utility/SessionData.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4f40784f52405934f8f84575a0a89f42 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window.meta new file mode 100644 index 00000000..0442891d --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 2752dac761ccd6a48a67c24653c7cc05 diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_BuildReportWindow.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_BuildReportWindow.cs new file mode 100644 index 00000000..d95dc633 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_BuildReportWindow.cs @@ -0,0 +1,2282 @@ +//#define BRT_SHOW_MINOR_WARNINGS + +#if UNITY_EDITOR +using System; +using System.Collections.Generic; +using System.Reflection; +using UnityEngine; +using UnityEditor; +using System.Threading; +using BuildReportTool; +using BuildReportTool.Window; +using UnityEditor.U2D; +using UnityEngine.U2D; + +// can't put this in a namespace since older versions of Unity doesn't allow that +public class BRT_BuildReportWindow : EditorWindow +{ + const int ICON_WIDTH = 16; + public const int ICON_WIDTH_WITH_PADDING = 20; + public const int LIST_HEIGHT = 20; + + const int TOOLTIP_END_USERS_MAX_COUNT = 10; + const int TOOLTIP_PADDING_T = 2; + const int TOOLTIP_PADDING_B = 4; + const int TOOLTIP_PADDING_L = 2; + const int TOOLTIP_PADDING_R = 2; + + public static Vector2 IconSize = new Vector2(15, 15); + + public static readonly GUILayoutOption[] LayoutNone = { }; + + public static readonly GUILayoutOption[] LayoutListHeight = + {GUILayout.Height(LIST_HEIGHT), GUILayout.ExpandHeight(false)}; + + public static readonly GUILayoutOption[] LayoutListHeightMinWidth90 = + {GUILayout.MinWidth(90), GUILayout.Height(LIST_HEIGHT)}; + + public static readonly GUILayoutOption[] LayoutNoExpandWidth = + {GUILayout.ExpandWidth(false)}; + public static readonly GUILayoutOption[] LayoutExpandWidth = + {GUILayout.ExpandWidth(true)}; + + public static readonly GUILayoutOption[] LayoutMinHeight30 = + {GUILayout.MinHeight(30), GUILayout.ExpandHeight(true)}; + public static readonly GUILayoutOption[] LayoutHeight11 = {GUILayout.Height(11)}; + public static readonly GUILayoutOption[] LayoutHeight18 = {GUILayout.Height(18)}; + public static readonly GUILayoutOption[] LayoutHeight21 = {GUILayout.Height(21)}; + public static readonly GUILayoutOption[] LayoutHeight25 = {GUILayout.Height(25)}; + public static readonly GUILayoutOption[] LayoutMinWidth200 = {GUILayout.MinWidth(200)}; + public static readonly GUILayoutOption[] LayoutPingButton = {GUILayout.Width(37)}; + public static readonly GUILayoutOption[] LayoutIconWidth = {GUILayout.Width(ICON_WIDTH)}; + public static readonly GUILayoutOption[] Layout20x16 = {GUILayout.Width(20), GUILayout.Height(16)}; + public static readonly GUILayoutOption[] Layout20x25 = {GUILayout.Width(20), GUILayout.Height(25)}; + public static readonly GUILayoutOption[] Layout20x30 = {GUILayout.Width(20), GUILayout.Height(30)}; + public static readonly GUILayoutOption[] Layout28x30 = {GUILayout.Width(28), GUILayout.Height(30)}; + public static readonly GUILayoutOption[] Layout100To400x30 = {GUILayout.MinWidth(100), GUILayout.MaxWidth(400), GUILayout.Height(30)}; + public static readonly GUILayoutOption[] LayoutTo100x30 = {GUILayout.MaxWidth(100), GUILayout.Height(30)}; + + public static readonly GUILayoutOption[] Layout100x30 = {GUILayout.MinWidth(100), GUILayout.Height(30), GUILayout.ExpandWidth(true)}; + public static readonly GUILayoutOption[] LayoutMinWidth44 = {GUILayout.MinWidth(44)}; + public static readonly GUILayoutOption[] LayoutMinWidth63 = {GUILayout.MinWidth(63)}; + public static readonly GUILayoutOption[] LayoutMinWidth84 = {GUILayout.MinWidth(84)}; + public static readonly GUILayoutOption[] LayoutMaxWidth500 = {GUILayout.MaxWidth(500)}; + + public const string STYLE_BREADCRUMB_LEFT = "GUIEditor.BreadcrumbLeft"; + public const string STYLE_BREADCRUMB_MID = "GUIEditor.BreadcrumbMid"; + + void OnDisable() + { + ForceStopFileLoadThread(); + IsOpen = false; + } + + void OnFocus() + { + if (BuildReportTool.Options.AutoResortAssetsWhenUnityEditorRegainsFocus) + { + _usedAssetsScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + _unusedAssetsScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + + // check if configured file filters changed and only then do we need to recategorize + + if (BuildReportTool.Options.ShouldUseConfiguredFileFilters()) + { + RecategorizeDisplayedBuildInfo(); + } + } + } + + void OnEnable() + { + //Debug.Log("BuildReportWindow.OnEnable() " + System.DateTime.Now); + +#if UNITY_5_6_OR_NEWER + wantsMouseEnterLeaveWindow = true; +#endif + wantsMouseMove = true; + + IsOpen = true; + + InitGUISkin(); + + if (BuildReportTool.Util.BuildInfoHasContents(_buildInfo)) + { + //Debug.Log("recompiled " + _buildInfo.SavedPath); + if (!string.IsNullOrEmpty(_buildInfo.SavedPath)) + { + BuildReportTool.BuildInfo loadedBuild = BuildReportTool.Util.OpenSerializedBuildInfo(_buildInfo.SavedPath); + if (BuildReportTool.Util.BuildInfoHasContents(loadedBuild)) + { + _buildInfo = loadedBuild; + } + } + else + { + if (_buildInfo.HasUsedAssets) + { + _buildInfo.UsedAssets.AssignPerCategoryList( + BuildReportTool.ReportGenerator.SegregateAssetSizesPerCategory(_buildInfo.UsedAssets.All, + _buildInfo.FileFilters)); + } + + if (_buildInfo.HasUnusedAssets) + { + _buildInfo.UnusedAssets.AssignPerCategoryList( + BuildReportTool.ReportGenerator.SegregateAssetSizesPerCategory(_buildInfo.UnusedAssets.All, + _buildInfo.FileFilters)); + } + } + } + + _usedAssetsScreen.SetListToDisplay(BuildReportTool.Window.Screen.AssetList.ListToDisplay.UsedAssets); + _unusedAssetsScreen.SetListToDisplay(BuildReportTool.Window.Screen.AssetList.ListToDisplay.UnusedAssets); + + _overviewScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + _buildSettingsScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + _buildStepsScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + _sizeStatsScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + _usedAssetsScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + _unusedAssetsScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + _extraDataScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + + _optionsScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + _helpScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + } + + double _lastTime; + + void OnInspectorUpdate() + { + var deltaTime = EditorApplication.timeSinceStartup - _lastTime; + _lastTime = EditorApplication.timeSinceStartup; + + if (IsInUsedAssetsCategory) + { + _usedAssetsScreen.Update(EditorApplication.timeSinceStartup, deltaTime, _buildInfo, _assetDependencies); + } + else if (IsInUnusedAssetsCategory) + { + _unusedAssetsScreen.Update(EditorApplication.timeSinceStartup, deltaTime, _buildInfo, _assetDependencies); + } + + if (_buildInfo != null && BuildReportTool.ReportGenerator.IsFinishedGettingValues) + { + OnFinishGeneratingBuildReport(); + } + + // if Unity Editor has finished making a build and we are scheduled to create a Build Report... + if (!BuildReportTool.ReportGenerator.IsStillGettingValues && + !EditorApplication.isCompiling && + BuildReportTool.Util.ShouldGetBuildReportNow) + { + //Debug.Log("BuildReportWindow getting build info right after the build... " + System.DateTime.Now); + Refresh(true); + } + + if (_finishedOpeningFromThread) + { + OnFinishOpeningBuildReportFile(); + } + } + + void Update() + { + if (_buildInfo != null) + { + if (_buildInfo.RequestedToRefresh) + { + Repaint(); + _buildInfo.FlagFinishedRefreshing(); + } + } + } + + // ========================================================================================== + // sub-screens + + readonly BuildReportTool.Window.Screen.Overview _overviewScreen = new BuildReportTool.Window.Screen.Overview(); + + readonly BuildReportTool.Window.Screen.BuildSettings _buildSettingsScreen = + new BuildReportTool.Window.Screen.BuildSettings(); + + readonly BuildReportTool.Window.Screen.BuildStepsScreen _buildStepsScreen = + new BuildReportTool.Window.Screen.BuildStepsScreen(); + + readonly BuildReportTool.Window.Screen.SizeStats _sizeStatsScreen = new BuildReportTool.Window.Screen.SizeStats(); + readonly BuildReportTool.Window.Screen.AssetList _usedAssetsScreen = new BuildReportTool.Window.Screen.AssetList(); + readonly BuildReportTool.Window.Screen.AssetList _unusedAssetsScreen = new BuildReportTool.Window.Screen.AssetList(); + readonly BuildReportTool.Window.Screen.ExtraData _extraDataScreen = new BuildReportTool.Window.Screen.ExtraData(); + + readonly BuildReportTool.Window.Screen.Options _optionsScreen = new BuildReportTool.Window.Screen.Options(); + readonly BuildReportTool.Window.Screen.Help _helpScreen = new BuildReportTool.Window.Screen.Help(); + + + // ========================================================================================== + + + public static string GetValueMessage { set; get; } + + static bool _loadingValuesFromThread; + + public static bool LoadingValuesFromThread + { + get { return _loadingValuesFromThread; } + } + + static bool _noGuiSkinFound; + + /// + /// The Build Report we're displaying. + /// + static BuildReportTool.BuildInfo _buildInfo; + + /// + /// The Asset Dependencies data being used + /// for whichever Build Report is displayed. + /// + static BuildReportTool.AssetDependencies _assetDependencies; + + /// + /// The TextureData being used + /// for whichever Build Report is displayed. + /// + static BuildReportTool.TextureData _textureData; + + /// + /// The MeshData being used + /// for whichever Build Report is displayed. + /// + static BuildReportTool.MeshData _meshData; + + /// + /// The PrefabData being used + /// for whichever Build Report is displayed. + /// + static BuildReportTool.PrefabData _prefabData; + + static BuildReportTool.UnityBuildReport _unityBuildReport; + + static ExtraData _extraData; + + public const bool FORCE_USE_DARK_SKIN = false; + + GUISkin _usedSkin = null; + + public static bool IsOpen { get; set; } + + public static bool ZoomedInThumbnails { get; set; } + public static bool ShowThumbnailsWithAlphaBlend { get; set; } + + static Vector2 _lastMousePos; + static bool _lastMouseMoved; + + public enum AssetInfoType + { + None, + InStreamingAssetsFolder, + InAPackage, + InAResourcesFolder, + ASceneInBuild, + } + + /// + /// Rect of whatever asset is hovered on + /// + public static Rect HoveredAssetEntryRect; + + /// + /// Asset path of whatever asset is hovered + /// + public static string HoveredAssetEntryPath; + + public static List HoveredAssetEndUsers; + + public static void UpdateHoveredAsset(string hoveredAssetPath, Rect hoveredAssetRect, bool showingUsedAssets, + BuildInfo buildReportToDisplay, AssetDependencies assetDependencies) + { + var alreadyUsingSameAssetPath = + hoveredAssetPath.Equals(HoveredAssetEntryPath, StringComparison.OrdinalIgnoreCase); + + if (!alreadyUsingSameAssetPath) + { + HoveredAssetEntryPath = hoveredAssetPath; + } + + // even if the new hovered asset to assign is the same as the current one, + // its rect might have moved, so we always assign it + HoveredAssetEntryRect = hoveredAssetRect; + + if (BuildReportTool.Options.ShowAssetPrimaryUsersInTooltipIfAvailable && !alreadyUsingSameAssetPath) + { + UpdateHoveredAssetType(hoveredAssetPath, showingUsedAssets); + + if (HoveredAssetIsASceneInBuild) + { + UpdateSceneInBuildLabel(SceneIsInBuildLabel, + buildReportToDisplay.ScenesInBuild, HoveredAssetEntryPath); + } + + AssignHoveredAssetEndUsers(assetDependencies); + } + } + + public static void UpdateSceneInBuildLabel(GUIContent destination, BuildInfo.SceneInBuild[] scenesInBuild, + string scenePath) + { + var foundSceneInBuild = false; + for (int sceneN = 0, sceneLen = scenesInBuild.Length; sceneN < sceneLen; ++sceneN) + { + if (scenesInBuild[sceneN].Path.Equals(scenePath, StringComparison.OrdinalIgnoreCase)) + { + destination.text = string.Format(SCENE_IN_BUILD_LABEL_WITH_INDEX_FORMAT, sceneN.ToString()); + foundSceneInBuild = true; + break; + } + } + + if (!foundSceneInBuild) + { + // This doesn't make sense though. If we're showing used assets, + // the scene *should* be in the ScenesInBuild array. + // + // One possibility is that the user might have had a custom build script + // that was manipulating the values in UnityEditor.EditorBuildSettings.scenes + // after Build Report generation recorded it into the ScenesInBuild array. + // + destination.text = SCENE_IN_BUILD_LABEL; + } + } + + static List GetEndUserLabelsFor(AssetDependencies assetDependencies, string assetPath) + { + if (string.IsNullOrEmpty(assetPath) || assetDependencies == null) + { + return null; + } + + List endUsersListToUse = null; + + var dependencies = assetDependencies.GetAssetDependencies(); + if (dependencies.ContainsKey(assetPath)) + { + var entry = dependencies[assetPath]; + if (entry != null) + { + endUsersListToUse = entry.GetEndUserLabels(); + } + } + + return endUsersListToUse; + } + + static void AssignHoveredAssetEndUsers(AssetDependencies assetDependencies) + { + BuildReportTool.AssetDependencies.PopulateAssetEndUsers(HoveredAssetEntryPath, assetDependencies); + HoveredAssetEndUsers = GetEndUserLabelsFor(assetDependencies, HoveredAssetEntryPath); + } + + static AssetInfoType _hoveredAssetType = AssetInfoType.None; + + static void UpdateHoveredAssetType(string hoveredAssetPath, bool showingUsedAssets) + { + if (hoveredAssetPath.IsInStreamingAssetsFolder()) + { + _hoveredAssetType = AssetInfoType.InStreamingAssetsFolder; + } + else if (hoveredAssetPath.IsInPackagesFolder()) + { + _hoveredAssetType = AssetInfoType.InAPackage; + } + else if (hoveredAssetPath.IsInResourcesFolder()) + { + _hoveredAssetType = AssetInfoType.InAResourcesFolder; + } + else if (hoveredAssetPath.IsSceneFile() && showingUsedAssets) + { + _hoveredAssetType = AssetInfoType.ASceneInBuild; + } + else + { + _hoveredAssetType = AssetInfoType.None; + } + } + + public static bool HoveredAssetIsASceneInBuild + { + get { return _hoveredAssetType == AssetInfoType.ASceneInBuild; } + } + + public static bool ShouldHoveredAssetShowEndUserTooltip(AssetDependencies assetDependencies) + { + if (_hoveredAssetType != AssetInfoType.None) + { + return true; + } + + List endUsersListToUse = GetEndUserLabelsFor(assetDependencies, HoveredAssetEntryPath); + + return endUsersListToUse != null && endUsersListToUse.Count > 0; + } + + public static GUIContent GetAppropriateEndUserLabelForHovered() + { + switch (_hoveredAssetType) + { + case AssetInfoType.InAPackage: + { + if (HoveredAssetEndUsers != null && HoveredAssetEndUsers.Count > 0) + { + if (HoveredAssetEndUsers[0].text.IsAnAssembly()) + { + return InPackagesButAlsoUsedInLabel; + } + return InPackagesButAlsoUsedByLabel; + } + else + { + return InPackagesLabel; + } + } + + case AssetInfoType.InStreamingAssetsFolder: + return InStreamingAssetsLabel; + + case AssetInfoType.InAResourcesFolder: + { + if (HoveredAssetEndUsers != null && HoveredAssetEndUsers.Count > 0) + { + return AResourcesAssetButAlsoUsedByLabel; + } + else + { + return AResourcesAssetLabel; + } + } + + case AssetInfoType.ASceneInBuild: + return SceneIsInBuildLabel; + + default: + if (HoveredAssetEndUsers != null && HoveredAssetEndUsers.Count > 0 && HoveredAssetEndUsers[0].text.IsAnAssembly()) + { + return IsInLabel; + } + + return UsedByLabel; + } + } + + /// + /// "Used by:" + /// + static readonly GUIContent UsedByLabel = new GUIContent("Used by:"); + + static readonly GUIContent IsInLabel = new GUIContent("Is compiled into:"); + + static readonly GUIContent PlusMore = new GUIContent("...plus x more"); + + /// + /// "Asset is in a Resources folder" + /// + static readonly GUIContent AResourcesAssetLabel = new GUIContent("Asset is in a Resources folder"); + + /// + /// "Asset is in the StreamingAssets folder" + /// + static readonly GUIContent InStreamingAssetsLabel = new GUIContent("File is in the StreamingAssets folder"); + + /// + /// "A Resources asset, but also used by:" + /// + static readonly GUIContent AResourcesAssetButAlsoUsedByLabel = + new GUIContent("A Resources asset, but also used by:"); + + /// + /// "Scene is in build" + /// + public static readonly GUIContent SceneIsInBuildLabel = new GUIContent("Scene is in build"); + + const string SCENE_IN_BUILD_LABEL_WITH_INDEX_FORMAT = "Scene is in build at index {0}"; + const string SCENE_IN_BUILD_LABEL = "Scene is in build"; + + static readonly GUIContent InPackagesLabel = new GUIContent("Asset is from the Packages folder"); + + static readonly GUIContent InPackagesButAlsoUsedByLabel = new GUIContent("Asset is from the Packages folder\n\nUsed by:"); + static readonly GUIContent InPackagesButAlsoUsedInLabel = new GUIContent("Asset is from the Packages folder\n\nIs compiled into:"); + + Texture2D _toolbarIconLog; + Texture2D _toolbarIconOpen; + Texture2D _toolbarIconSave; + Texture2D _toolbarIconOptions; + Texture2D _toolbarIconHelp; + + + GUIContent _toolbarLabelLog; + GUIContent _toolbarLabelOpen; + GUIContent _toolbarLabelSave; + GUIContent _toolbarLabelOptions; + GUIContent _toolbarLabelHelp; + + + void RecategorizeDisplayedBuildInfo() + { + if (BuildReportTool.Util.BuildInfoHasContents(_buildInfo)) + { + BuildReportTool.ReportGenerator.RecategorizeAssetList(_buildInfo); + } + } + + static void GetFromNative(GUIStyle ownStyle, GUIStyle nativeStyle, out GUIStyle styleToAssign, string desiredName = null) + { + if (nativeStyle == null) + { + styleToAssign = null; + return; + } + + if (ownStyle == null) + { + // make our own copy of the native skin + styleToAssign = new GUIStyle(nativeStyle); + if (!string.IsNullOrEmpty(desiredName)) + { + styleToAssign.name = desiredName; + } + } + else + { + styleToAssign = null; + + if (!string.IsNullOrEmpty(desiredName)) + { + ownStyle.name = desiredName; + } + + // ensure our skin uses Unity's builtin look + ownStyle.normal.background = nativeStyle.normal.background; + ownStyle.hover.background = nativeStyle.hover.background; + ownStyle.active.background = nativeStyle.active.background; + ownStyle.onNormal.background = nativeStyle.onNormal.background; + ownStyle.onHover.background = nativeStyle.onHover.background; + ownStyle.onActive.background = nativeStyle.onActive.background; + +#if UNITY_5_6_OR_NEWER + if (nativeStyle.normal.scaledBackgrounds != null && nativeStyle.normal.scaledBackgrounds.Length > 0) + { + ownStyle.normal.scaledBackgrounds = new Texture2D[nativeStyle.normal.scaledBackgrounds.Length]; + for (int i = 0; i < nativeStyle.normal.scaledBackgrounds.Length; i++) + { + ownStyle.normal.scaledBackgrounds[i] = nativeStyle.normal.scaledBackgrounds[i]; + } + } + else + { + if (ownStyle.normal.scaledBackgrounds != null) + { + ownStyle.normal.scaledBackgrounds = null; + } + } + + if (nativeStyle.hover.scaledBackgrounds != null && nativeStyle.hover.scaledBackgrounds.Length > 0) + { + ownStyle.hover.scaledBackgrounds = new Texture2D[nativeStyle.hover.scaledBackgrounds.Length]; + for (int i = 0; i < nativeStyle.hover.scaledBackgrounds.Length; i++) + { + ownStyle.hover.scaledBackgrounds[i] = nativeStyle.hover.scaledBackgrounds[i]; + } + } + else + { + if (ownStyle.hover.scaledBackgrounds != null) + { + ownStyle.hover.scaledBackgrounds = null; + } + } + + if (nativeStyle.active.scaledBackgrounds != null && nativeStyle.active.scaledBackgrounds.Length > 0) + { + ownStyle.active.scaledBackgrounds = new Texture2D[nativeStyle.active.scaledBackgrounds.Length]; + for (int i = 0; i < nativeStyle.active.scaledBackgrounds.Length; i++) + { + ownStyle.active.scaledBackgrounds[i] = nativeStyle.active.scaledBackgrounds[i]; + } + } + else + { + if (ownStyle.active.scaledBackgrounds != null) + { + ownStyle.active.scaledBackgrounds = null; + } + } + + if (nativeStyle.onNormal.scaledBackgrounds != null && nativeStyle.onNormal.scaledBackgrounds.Length > 0) + { + ownStyle.onNormal.scaledBackgrounds = new Texture2D[nativeStyle.onNormal.scaledBackgrounds.Length]; + for (int i = 0; i < nativeStyle.onNormal.scaledBackgrounds.Length; i++) + { + ownStyle.onNormal.scaledBackgrounds[i] = nativeStyle.onNormal.scaledBackgrounds[i]; + } + } + else + { + if (ownStyle.onNormal.scaledBackgrounds != null) + { + ownStyle.onNormal.scaledBackgrounds = null; + } + } + + if (nativeStyle.onHover.scaledBackgrounds != null && nativeStyle.onHover.scaledBackgrounds.Length > 0) + { + ownStyle.onHover.scaledBackgrounds = new Texture2D[nativeStyle.onHover.scaledBackgrounds.Length]; + for (int i = 0; i < nativeStyle.onHover.scaledBackgrounds.Length; i++) + { + ownStyle.onHover.scaledBackgrounds[i] = nativeStyle.onHover.scaledBackgrounds[i]; + } + } + else + { + if (ownStyle.onHover.scaledBackgrounds != null) + { + ownStyle.onHover.scaledBackgrounds = null; + } + } + + if (nativeStyle.onActive.scaledBackgrounds != null && nativeStyle.onActive.scaledBackgrounds.Length > 0) + { + ownStyle.onActive.scaledBackgrounds = new Texture2D[nativeStyle.onActive.scaledBackgrounds.Length]; + for (int i = 0; i < nativeStyle.onActive.scaledBackgrounds.Length; i++) + { + ownStyle.onActive.scaledBackgrounds[i] = nativeStyle.onActive.scaledBackgrounds[i]; + } + } + else + { + if (ownStyle.onActive.scaledBackgrounds != null) + { + ownStyle.onActive.scaledBackgrounds = null; + } + } +#endif + + ownStyle.normal.textColor = nativeStyle.normal.textColor; + ownStyle.hover.textColor = nativeStyle.hover.textColor; + ownStyle.active.textColor = nativeStyle.active.textColor; + ownStyle.onNormal.textColor = nativeStyle.onNormal.textColor; + ownStyle.onHover.textColor = nativeStyle.onHover.textColor; + ownStyle.onActive.textColor = nativeStyle.onActive.textColor; + + ownStyle.border.top = nativeStyle.border.top; + ownStyle.border.bottom = nativeStyle.border.bottom; + ownStyle.border.left = nativeStyle.border.left; + ownStyle.border.right = nativeStyle.border.right; + + ownStyle.margin.top = nativeStyle.margin.top; + ownStyle.margin.bottom = nativeStyle.margin.bottom; + ownStyle.margin.left = nativeStyle.margin.left; + ownStyle.margin.right = nativeStyle.margin.right; + + ownStyle.padding.top = nativeStyle.padding.top; + ownStyle.padding.bottom = nativeStyle.padding.bottom; + ownStyle.padding.left = nativeStyle.padding.left; + ownStyle.padding.right = nativeStyle.padding.right; + + ownStyle.overflow.top = nativeStyle.overflow.top; + ownStyle.overflow.bottom = nativeStyle.overflow.bottom; + ownStyle.overflow.left = nativeStyle.overflow.left; + ownStyle.overflow.right = nativeStyle.overflow.right; + + ownStyle.font = nativeStyle.font; + ownStyle.fontStyle = nativeStyle.fontStyle; + ownStyle.alignment = nativeStyle.alignment; + + ownStyle.richText = nativeStyle.richText; + ownStyle.wordWrap = nativeStyle.wordWrap; + + ownStyle.contentOffset = nativeStyle.contentOffset; + + ownStyle.fixedWidth = nativeStyle.fixedWidth; + ownStyle.fixedHeight = nativeStyle.fixedHeight; + + ownStyle.stretchWidth = nativeStyle.stretchWidth; + ownStyle.stretchHeight = nativeStyle.stretchHeight; + } + } + + + void InitGUISkin() + { + string guiSkinToUse; + if (EditorGUIUtility.isProSkin || FORCE_USE_DARK_SKIN) + { + guiSkinToUse = BuildReportTool.Window.Settings.DARK_GUI_SKIN_FILENAME; + } + else + { + guiSkinToUse = BuildReportTool.Window.Settings.DEFAULT_GUI_SKIN_FILENAME; + } + + // try default path + _usedSkin = AssetDatabase.LoadAssetAtPath( + string.Format("{0}/GUI/{1}", BuildReportTool.Options.BUILD_REPORT_TOOL_DEFAULT_PATH, guiSkinToUse), + typeof(GUISkin)) as GUISkin; + + if (_usedSkin == null) + { +#if BRT_SHOW_MINOR_WARNINGS + Debug.LogWarning(BuildReportTool.Options.BUILD_REPORT_PACKAGE_MOVED_MSG); +#endif + + string folderPath = BuildReportTool.Util.FindAssetFolder(Application.dataPath, + BuildReportTool.Options.BUILD_REPORT_TOOL_DEFAULT_FOLDER_NAME); + if (!string.IsNullOrEmpty(folderPath)) + { + folderPath = folderPath.Replace('\\', '/'); + int assetsIdx = folderPath.IndexOf("/Assets/", StringComparison.OrdinalIgnoreCase); + if (assetsIdx != -1) + { + folderPath = folderPath.Substring(assetsIdx + 8, folderPath.Length - assetsIdx - 8); + } + //Debug.Log(folderPath); + + _usedSkin = AssetDatabase.LoadAssetAtPath(string.Format("Assets/{0}/GUI/{1}", folderPath, guiSkinToUse), + typeof(GUISkin)) as GUISkin; + } + else + { + Debug.LogError(BuildReportTool.Options.BUILD_REPORT_PACKAGE_MISSING_MSG); + } + + //Debug.Log("_usedSkin " + (_usedSkin != null)); + } + + if (_usedSkin != null) + { + // weirdo enum labels used to get either light or dark skin + // (https://forum.unity.com/threads/editorguiutility-getbuiltinskin-not-working-correctly-in-unity-4-3.211504/#post-1430038) + GUISkin nativeSkin = + EditorGUIUtility.GetBuiltinSkin(EditorGUIUtility.isProSkin ? EditorSkin.Scene : EditorSkin.Inspector); + + if (!(EditorGUIUtility.isProSkin || FORCE_USE_DARK_SKIN)) + { + _usedSkin.verticalScrollbar = nativeSkin.verticalScrollbar; + _usedSkin.verticalScrollbarThumb = nativeSkin.verticalScrollbarThumb; + _usedSkin.verticalScrollbarUpButton = nativeSkin.verticalScrollbarUpButton; + _usedSkin.verticalScrollbarDownButton = nativeSkin.verticalScrollbarDownButton; + + _usedSkin.horizontalScrollbar = nativeSkin.horizontalScrollbar; + _usedSkin.horizontalScrollbarThumb = nativeSkin.horizontalScrollbarThumb; + _usedSkin.horizontalScrollbarLeftButton = nativeSkin.horizontalScrollbarLeftButton; + _usedSkin.horizontalScrollbarRightButton = nativeSkin.horizontalScrollbarRightButton; + + // change the toggle skin to use the Unity builtin look, but keep our settings + GUIStyle toggleSaved = new GUIStyle(_usedSkin.toggle); + + // make our own copy of the native skin toggle so that editing it won't affect the rest of the editor GUI + GUIStyle nativeToggleCopy = new GUIStyle(nativeSkin.toggle); + + _usedSkin.toggle = nativeToggleCopy; + _usedSkin.toggle.font = toggleSaved.font; + _usedSkin.toggle.fontSize = toggleSaved.fontSize; + _usedSkin.toggle.border = toggleSaved.border; + _usedSkin.toggle.margin = toggleSaved.margin; + _usedSkin.toggle.padding = toggleSaved.padding; + _usedSkin.toggle.overflow = toggleSaved.overflow; + _usedSkin.toggle.contentOffset = toggleSaved.contentOffset; + + _usedSkin.box = nativeSkin.box; + _usedSkin.label = nativeSkin.label; + _usedSkin.textField = nativeSkin.textField; + _usedSkin.button = nativeSkin.button; + + _usedSkin.label.wordWrap = true; + } + + var miniButtonStyle = _usedSkin.FindStyle("MiniButton"); + if (miniButtonStyle != null) + { + if (miniButtonStyle.normal.background == null) + { + miniButtonStyle.normal.background = nativeSkin.button.normal.background; + miniButtonStyle.active.background = nativeSkin.button.active.background; + miniButtonStyle.onNormal.background = nativeSkin.button.onNormal.background; + miniButtonStyle.onActive.background = nativeSkin.button.onActive.background; + } + } + + // ---------------------------------------------------- + // Add styles we need + + var nativeReorderableListDragHandle = nativeSkin.GetStyle("RL DragHandle"); + var nativeReorderableListHeader = nativeSkin.GetStyle("RL Header"); + var nativeReorderableListFooter = nativeSkin.GetStyle("RL Footer"); + var nativeReorderableListBg = nativeSkin.GetStyle("RL Background"); + var nativeReorderableListFooterButton = nativeSkin.GetStyle("RL FooterButton"); + var nativeReorderableListElement = nativeSkin.GetStyle("RL Element"); + var nativeReorderableListEmptyHeader = nativeSkin.FindStyle("RL Empty Header"); + + var reorderableListDragHandle = _usedSkin.FindStyle("RL DragHandle"); + var reorderableListHeader = _usedSkin.FindStyle("RL Header"); + var reorderableListFooter = _usedSkin.FindStyle("RL Footer"); + var reorderableListBg = _usedSkin.FindStyle("RL Background"); + var reorderableListFooterButton = _usedSkin.FindStyle("RL FooterButton"); + var reorderableListElement = _usedSkin.FindStyle("RL Element"); + var reorderableListEmptyHeader = _usedSkin.FindStyle("RL Empty Header"); + + GUIStyle reorderableListDragHandleToAssign; + GUIStyle reorderableListHeaderToAssign; + GUIStyle reorderableListFooterToAssign; + GUIStyle reorderableListBgToAssign; + GUIStyle reorderableListFooterButtonToAssign; + GUIStyle reorderableListElementToAssign; + GUIStyle reorderableListEmptyHeaderToAssign; + GetFromNative(reorderableListDragHandle, nativeReorderableListDragHandle, out reorderableListDragHandleToAssign); + GetFromNative(reorderableListHeader, nativeReorderableListHeader, out reorderableListHeaderToAssign); + GetFromNative(reorderableListFooter, nativeReorderableListFooter, out reorderableListFooterToAssign); + GetFromNative(reorderableListBg, nativeReorderableListBg, out reorderableListBgToAssign); + GetFromNative(reorderableListFooterButton, nativeReorderableListFooterButton, out reorderableListFooterButtonToAssign); + GetFromNative(reorderableListElement, nativeReorderableListElement, out reorderableListElementToAssign); + GetFromNative(reorderableListEmptyHeader, nativeReorderableListEmptyHeader, out reorderableListEmptyHeaderToAssign); + + + var nativeErrorIcon = nativeSkin.FindStyle("CN EntryErrorIconSmall"); + var nativeWarningIcon = nativeSkin.FindStyle("CN EntryWarnIconSmall"); + var nativeLogIcon = nativeSkin.FindStyle("CN EntryInfoIconSmall"); + + var logMessageIcons = _usedSkin.FindStyle("LogMessageIcons"); + bool addLogMessageIcons = logMessageIcons == null; + if (addLogMessageIcons) + { + logMessageIcons = new GUIStyle(); + logMessageIcons.name = "LogMessageIcons"; + } + + + if (nativeLogIcon != null && nativeLogIcon.normal.background != null) + { + logMessageIcons.normal.background = nativeLogIcon.normal.background; + } + + if (nativeWarningIcon != null && nativeWarningIcon.normal.background != null) + { + logMessageIcons.hover.background = nativeWarningIcon.normal.background; + } + + if (nativeErrorIcon != null && nativeErrorIcon.normal.background != null) + { + logMessageIcons.active.background = nativeErrorIcon.normal.background; + } + + #region LeftCrumb + var nativeLeftCrumb = nativeSkin.GetStyle(STYLE_BREADCRUMB_LEFT); + var leftCrumb = _usedSkin.FindStyle(STYLE_BREADCRUMB_LEFT); + GUIStyle leftCrumbToAssign = null; + if (leftCrumb == null) + { + // make our own copy of the native skin left crumb so that editing it won't affect the rest of the editor GUI + leftCrumbToAssign = new GUIStyle(nativeLeftCrumb); + + leftCrumbToAssign.fixedHeight = 19; + +#if UNITY_2019_1_OR_NEWER + // in Unity 2019+, the styles have changed, + // so ensure we modify it so it fits our GUI + leftCrumbToAssign.overflow.top = 1; + leftCrumbToAssign.overflow.bottom = 1; +#else + leftCrumbToAssign.overflow.top = 0; + leftCrumbToAssign.overflow.bottom = 0; +#endif + } + else + { + // ensure our left crumb skin uses Unity's builtin look, but keep our settings + leftCrumb.normal.background = nativeLeftCrumb.normal.background; + leftCrumb.hover.background = nativeLeftCrumb.hover.background; + leftCrumb.active.background = nativeLeftCrumb.active.background; + leftCrumb.onNormal.background = nativeLeftCrumb.onNormal.background; + leftCrumb.onHover.background = nativeLeftCrumb.onHover.background; + leftCrumb.onActive.background = nativeLeftCrumb.onActive.background; + + leftCrumb.fixedHeight = 19; + +#if UNITY_2019_1_OR_NEWER + // in Unity 2019+, the styles have changed, + // so ensure we modify it so it fits our GUI + leftCrumb.overflow.top = 1; + leftCrumb.overflow.bottom = 1; +#else + leftCrumb.overflow.top = 0; + leftCrumb.overflow.bottom = 0; +#endif + } + #endregion + + // ---------------------------------------------------- + + #region MidCrumb + var nativeMidCrumb = nativeSkin.GetStyle(STYLE_BREADCRUMB_MID); + var midCrumb = _usedSkin.FindStyle(STYLE_BREADCRUMB_MID); + GUIStyle midCrumbToAssign = null; + + if (midCrumb == null) + { + // make our own copy of the native skin mid crumb so that editing it won't affect the rest of the editor GUI + midCrumbToAssign = new GUIStyle(nativeMidCrumb); + + midCrumbToAssign.fixedHeight = 19; + +#if UNITY_2019_1_OR_NEWER + // in Unity 2019+, the styles have changed, + // so ensure we modify it so it fits our GUI + midCrumbToAssign.overflow.top = 1; + midCrumbToAssign.overflow.bottom = 1; +#else + midCrumbToAssign.overflow.top = 0; + midCrumbToAssign.overflow.bottom = 0; +#endif + } + else + { + // ensure our mid crumb skin uses Unity's builtin look, but keep our settings + midCrumb.normal.background = nativeMidCrumb.normal.background; + midCrumb.hover.background = nativeMidCrumb.hover.background; + midCrumb.active.background = nativeMidCrumb.active.background; + midCrumb.onNormal.background = nativeMidCrumb.onNormal.background; + midCrumb.onHover.background = nativeMidCrumb.onHover.background; + midCrumb.onActive.background = nativeMidCrumb.onActive.background; + + midCrumb.fixedHeight = 19; + +#if UNITY_2019_1_OR_NEWER + // in Unity 2019+, the styles have changed, + // so ensure we modify it so it fits our GUI + midCrumb.overflow.top = 1; + midCrumb.overflow.bottom = 1; +#else + midCrumb.overflow.top = 0; + midCrumb.overflow.bottom = 0; +#endif + } + #endregion + + // ---------------------------------------------------- + + if (leftCrumbToAssign != null || midCrumbToAssign != null || + reorderableListDragHandleToAssign != null || + reorderableListHeaderToAssign != null || + reorderableListFooterToAssign != null || + reorderableListBgToAssign != null || + reorderableListFooterButtonToAssign != null || + reorderableListElementToAssign != null || + reorderableListEmptyHeaderToAssign != null || + addLogMessageIcons) + { + // append these styles to the GUISkin + // but since it's an array, we have to create a new array and place it there first + var newStyles = new List(_usedSkin.customStyles); + if (leftCrumbToAssign != null) + { + newStyles.Add(leftCrumbToAssign); + } + if (midCrumbToAssign != null) + { + newStyles.Add(midCrumbToAssign); + } + if (reorderableListDragHandleToAssign != null) + { + newStyles.Add(reorderableListDragHandleToAssign); + } + if (reorderableListHeaderToAssign != null) + { + newStyles.Add(reorderableListHeaderToAssign); + } + if (reorderableListFooterToAssign != null) + { + newStyles.Add(reorderableListFooterToAssign); + } + if (reorderableListBgToAssign != null) + { + newStyles.Add(reorderableListBgToAssign); + } + if (reorderableListFooterButtonToAssign != null) + { + newStyles.Add(reorderableListFooterButtonToAssign); + } + if (reorderableListElementToAssign != null) + { + newStyles.Add(reorderableListElementToAssign); + } + if (reorderableListEmptyHeaderToAssign != null) + { + newStyles.Add(reorderableListEmptyHeaderToAssign); + } + if (addLogMessageIcons) + { + newStyles.Add(logMessageIcons); + } + _usedSkin.customStyles = newStyles.ToArray(); + } + + // ---------------------------------------------------- + + _toolbarIconLog = _usedSkin.GetStyle("Icon-Toolbar-Log").normal.background; + _toolbarIconOpen = _usedSkin.GetStyle("Icon-Toolbar-Open").normal.background; + _toolbarIconSave = _usedSkin.GetStyle("Icon-Toolbar-Save").normal.background; + _toolbarIconOptions = _usedSkin.GetStyle("Icon-Toolbar-Options").normal.background; + _toolbarIconHelp = _usedSkin.GetStyle("Icon-Toolbar-Help").normal.background; + + _toolbarLabelLog = new GUIContent(Labels.REFRESH_LABEL, _toolbarIconLog); + _toolbarLabelOpen = new GUIContent(Labels.OPEN_LABEL, _toolbarIconOpen); + _toolbarLabelSave = new GUIContent(Labels.SAVE_LABEL, _toolbarIconSave); + _toolbarLabelOptions = new GUIContent(Labels.OPTIONS_CATEGORY_LABEL, _toolbarIconOptions); + _toolbarLabelHelp = new GUIContent(Labels.HELP_CATEGORY_LABEL, _toolbarIconHelp); + } + else + { + _toolbarLabelLog = new GUIContent(Labels.REFRESH_LABEL); + _toolbarLabelOpen = new GUIContent(Labels.OPEN_LABEL); + _toolbarLabelSave = new GUIContent(Labels.SAVE_LABEL); + _toolbarLabelOptions = new GUIContent(Labels.OPTIONS_CATEGORY_LABEL); + _toolbarLabelHelp = new GUIContent(Labels.HELP_CATEGORY_LABEL); + } + } + + + public void Init(BuildReportTool.BuildInfo buildInfo) + { + _buildInfo = buildInfo; + + minSize = new Vector2(903, 440); + } + + /// + /// Creates a Build Report and shows it on-screen. + /// + /// Called either when the "Get Log" button is pressed in this EditorWindow + /// (called in , which is called in ), + /// or in , when it has detected that a build has completed and + /// a Build Report creation was scheduled. + void Refresh(bool fromBuild) + { + GoToOverviewScreen(); + BuildReportTool.ReportGenerator.RefreshData(fromBuild, ref _buildInfo, ref _assetDependencies, ref _textureData, ref _meshData, ref _prefabData); + } + + bool IsWaitingForBuildCompletionToGenerateBuildReport + { + get { return EditorApplication.isCompiling && BuildReportTool.Util.ShouldGetBuildReportNow; } + } + + void OnFinishOpeningBuildReportFile() + { + _finishedOpeningFromThread = false; + + if (BuildReportTool.Util.BuildInfoHasContents(_buildInfo)) + { + _buildSettingsScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + _buildStepsScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + _usedAssetsScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + _unusedAssetsScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + _sizeStatsScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + _extraDataScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + + _buildInfo.OnAfterLoad(); + _buildInfo.SetSavedPath(_lastOpenedBuildInfoFilePath); + } + + Repaint(); + GoToOverviewScreen(); + } + + void OnFinishGeneratingBuildReport() + { + BuildReportTool.ReportGenerator.OnFinishedGetValues(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData); + _buildInfo.UnescapeAssetNames(); + + GoToOverviewScreen(); + + _unityBuildReport = ReportGenerator.LastKnownUnityBuildReport; + if (_unityBuildReport != null) + { + Debug.Log(string.Format("UnityBuildReport displayed is now: {0}", _unityBuildReport.SavedPath)); + } + + _buildSettingsScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + _buildStepsScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + } + + + void GoToOverviewScreen() + { + _selectedCategoryIdx = OVERVIEW_IDX; + } + + + // ========================================================================== + + // ========================================================================== + + + int _fileFilterGroupToUseOnOpeningOptionsWindow = 0; + int _fileFilterGroupToUseOnClosingOptionsWindow = 0; + + + int _selectedCategoryIdx = 0; + + bool IsInOverviewCategory + { + get { return _selectedCategoryIdx == OVERVIEW_IDX; } + } + + bool IsInBuildSettingsCategory + { + get { return _selectedCategoryIdx == BUILD_SETTINGS_IDX; } + } + + bool IsInBuildStepsCategory + { + get { return _selectedCategoryIdx == BUILD_STEPS_IDX; } + } + + bool IsInWarningsErrorsCategory + { + get { return _selectedCategoryIdx == WARNING_ERRORS_IDX; } + } + + bool IsInSizeStatsCategory + { + get { return _selectedCategoryIdx == SIZE_STATS_IDX; } + } + + bool IsInUsedAssetsCategory + { + get { return _selectedCategoryIdx == USED_ASSETS_IDX; } + } + + bool IsInUnusedAssetsCategory + { + get { return _selectedCategoryIdx == UNUSED_ASSETS_IDX; } + } + + bool IsInExtraDataCategory + { + get { return _selectedCategoryIdx == EXTRA_DATA_IDX; } + } + + bool IsInOptionsCategory + { + get { return _selectedCategoryIdx == OPTIONS_IDX; } + } + + bool IsInHelpCategory + { + get { return _selectedCategoryIdx == HELP_IDX; } + } + + + const int OVERVIEW_IDX = 0; + const int BUILD_SETTINGS_IDX = 1; + const int BUILD_STEPS_IDX = 2; + const int WARNING_ERRORS_IDX = 3; + const int SIZE_STATS_IDX = 4; + const int USED_ASSETS_IDX = 5; + const int UNUSED_ASSETS_IDX = 6; + const int EXTRA_DATA_IDX = 7; + + const int OPTIONS_IDX = 8; + const int HELP_IDX = 9; + + + bool _finishedOpeningFromThread = false; + string _lastOpenedBuildInfoFilePath = ""; + + void _OpenBuildInfo(string filepath) + { + if (string.IsNullOrEmpty(filepath)) + { + return; + } + + _finishedOpeningFromThread = false; + GetValueMessage = "Opening..."; + BuildReportTool.BuildInfo loadedBuild = BuildReportTool.Util.OpenSerializedBuildInfo(filepath, false); + + if (BuildReportTool.Util.BuildInfoHasContents(loadedBuild)) + { + _buildInfo = loadedBuild; + _lastOpenedBuildInfoFilePath = filepath; + } + else + { + Debug.LogError(string.Format("Build Report Tool: Invalid data in build info file: {0}", filepath)); + } + + var assetDependenciesFilePath = BuildReportTool.Util.GetAssetDependenciesFilenameFromBuildInfo(filepath); + if (System.IO.File.Exists(assetDependenciesFilePath)) + { + var loadedAssetDependencies = BuildReportTool.Util.OpenSerialized(assetDependenciesFilePath); + if (loadedAssetDependencies != null) + { + _assetDependencies = loadedAssetDependencies; + } + } + else + { + _assetDependencies = null; + } + + var textureDataFilePath = BuildReportTool.Util.GetTextureDataFilenameFromBuildInfo(filepath); + if (System.IO.File.Exists(textureDataFilePath)) + { + var loadedTextureData = BuildReportTool.Util.OpenSerialized(textureDataFilePath); + if (loadedTextureData != null) + { + _textureData = loadedTextureData; + } + } + else + { + _textureData = null; + } + + var meshDataFilePath = BuildReportTool.Util.GetMeshDataFilenameFromBuildInfo(filepath); + if (System.IO.File.Exists(meshDataFilePath)) + { + var loadedMeshData = BuildReportTool.Util.OpenSerialized(meshDataFilePath); + if (loadedMeshData != null) + { + _meshData = loadedMeshData; + } + } + else + { + _meshData = null; + } + + var prefabDataFilePath = BuildReportTool.Util.GetPrefabDataFilenameFromBuildInfo(filepath); + if (System.IO.File.Exists(prefabDataFilePath)) + { + var loadedPrefabData = BuildReportTool.Util.OpenSerialized(prefabDataFilePath); + if (loadedPrefabData != null) + { + _prefabData = loadedPrefabData; + } + } + else + { + _prefabData = null; + } + + var unityBuildReportFilePath = BuildReportTool.Util.GetUnityBuildReportFilenameFromBuildInfo(filepath); + if (System.IO.File.Exists(unityBuildReportFilePath)) + { + try + { + var loadedUnityBuildReport = + BuildReportTool.Util.OpenSerialized(unityBuildReportFilePath); + if (loadedUnityBuildReport != null) + { + _unityBuildReport = loadedUnityBuildReport; + //Debug.Log(string.Format("UnityBuildReport displayed is now: {0}", _unityBuildReport.SavedPath)); + } + else + { + _unityBuildReport = null; + } + } + catch (Exception e) + { + Debug.LogWarning(string.Format("Can't open additional build info data due to Unity version incompatibility.\n\n{0}", e)); + _unityBuildReport = null; + } + } + else + { + //Debug.LogWarning(string.Format("Not found: {0}", unityBuildReportFilePath)); + _unityBuildReport = null; + } + + var extraDataFilePath = BuildReportTool.Util.GetExtraDataFilename(filepath).Replace('\\', '/'); + if (System.IO.File.Exists(extraDataFilePath)) + { + _extraData.Contents = System.IO.File.ReadAllText(extraDataFilePath); + _extraData.SavedPath = extraDataFilePath; + } + else + { + _extraData.Contents = null; + _extraData.SavedPath = null; + } + + _finishedOpeningFromThread = true; + + GetValueMessage = ""; + } + + + Thread _currentBuildReportFileLoadThread = null; + + bool IsCurrentlyOpeningAFile + { + get + { + return _currentBuildReportFileLoadThread != null && + _currentBuildReportFileLoadThread.ThreadState == ThreadState.Running; + } + } + + void ForceStopFileLoadThread() + { + if (IsCurrentlyOpeningAFile) + { + try + { + //Debug.LogFormat(this, "Build Report Tool: Stopping file load background thread..."); + _currentBuildReportFileLoadThread.Abort(); + Debug.LogFormat(this, "Build Report Tool: File load background thread stopped."); + } + catch (ThreadStateException) + { + } + } + } + + void OpenBuildInfoInBackgroundIfNeeded(string filepath) + { + if (string.IsNullOrEmpty(filepath)) + { + return; + } + + // user selected the asset dependencies file for the build report + // derive the build report file from it + if (filepath.DoesFileBeginWith("DEP-")) + { + filepath = TakeOutPrefix(filepath, "DEP-"); + } + else if (filepath.DoesFileBeginWith("TextureData-")) + { + filepath = TakeOutPrefix(filepath, "TextureData-"); + } + else if (filepath.DoesFileBeginWith("MeshData-")) + { + filepath = TakeOutPrefix(filepath, "MeshData-"); + } + else if (filepath.DoesFileBeginWith("PrefabData-")) + { + filepath = TakeOutPrefix(filepath, "PrefabData-"); + } + else if (filepath.DoesFileBeginWith("UBR-")) + { + filepath = TakeOutPrefix(filepath, "UBR-"); + } + else if (filepath.DoesFileBeginWith("ExtraData-")) + { + filepath = TakeOutPrefix(filepath, "ExtraData-"); + } + + if (!BuildReportTool.Options.UseThreadedFileLoading) + { + _OpenBuildInfo(filepath); + } + else + { + if (_currentBuildReportFileLoadThread != null && + _currentBuildReportFileLoadThread.ThreadState == ThreadState.Running) + { + ForceStopFileLoadThread(); + } + + _currentBuildReportFileLoadThread = new Thread(() => LoadThread(filepath)); + _currentBuildReportFileLoadThread.Start(); + Debug.LogFormat(this, "Build Report Tool: Started new load background thread..."); + } + } + + static string TakeOutPrefix(string s, string prefixToRemove) + { + var path = System.IO.Path.GetDirectoryName(s); + var filename = s.GetFileNameOnly(); + return string.Format("{0}/{1}", path, filename.Substring(prefixToRemove.Length)); + } + + void LoadThread(string filepath) + { + _OpenBuildInfo(filepath); + Debug.LogFormat(this, "Build Report Tool: Load background thread finished."); + } + + + void DrawCentralMessage(string msg) + { + float w = 300; + float h = 100; + float x = (position.width - w) * 0.5f; + float y = (position.height - h) * 0.25f; + + GUI.Label(new Rect(x, y, w, h), msg); + } + + + void DrawWarningMessage(string msg) + { + float w = 400; + float h = 100; + float x = (position.width - w) * 0.5f; + float y = ((position.height - h) * 0.25f) + 100 + 40; + + var msgRect = new Rect(x, y, w, h); + GUI.Label(msgRect, msg); + + var warning = GUI.skin.FindStyle("Icon-Warning"); + if (warning != null) + { + var warningIcon = warning.normal.background; + + var iconWidth = warning.fixedWidth; + var iconHeight = warning.fixedHeight; + + GUI.DrawTexture(new Rect(msgRect.x - iconWidth, msgRect.y, iconWidth, iconHeight), warningIcon); + } + } + + + void DrawTopRowButtons() + { + int toolbarX = 10; + + var leftToolbarStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TOOLBAR_LEFT_STYLE_NAME); + if (leftToolbarStyle == null) + { + leftToolbarStyle = GUI.skin.button; + } + + var midToolbarStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TOOLBAR_MIDDLE_STYLE_NAME); + if (midToolbarStyle == null) + { + midToolbarStyle = GUI.skin.button; + } + + var rightToolbarStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TOOLBAR_RIGHT_STYLE_NAME); + if (rightToolbarStyle == null) + { + rightToolbarStyle = GUI.skin.button; + } + + if (GUI.Button(new Rect(toolbarX, 5, 50, 40), _toolbarLabelLog, leftToolbarStyle) && + !LoadingValuesFromThread) + { + Refresh(false); + } + + toolbarX += 50; + if (GUI.Button(new Rect(toolbarX, 5, 40, 40), _toolbarLabelOpen, midToolbarStyle) && + !LoadingValuesFromThread) + { + string filepath = EditorUtility.OpenFilePanel( + Labels.OPEN_SERIALIZED_BUILD_INFO_TITLE, + BuildReportTool.Options.BuildReportSavePath, + "xml"); + + OpenBuildInfoInBackgroundIfNeeded(filepath); + } + + toolbarX += 40; + + if (GUI.Button(new Rect(toolbarX, 5, 40, 40), _toolbarLabelSave, rightToolbarStyle) && + BuildReportTool.Util.BuildInfoHasContents(_buildInfo)) + { + string filepath = EditorUtility.SaveFilePanel( + Labels.SAVE_MSG, + BuildReportTool.Options.BuildReportSavePath, + _buildInfo.GetDefaultFilename(), + "xml"); + + if (!string.IsNullOrEmpty(filepath)) + { + BuildReportTool.Util.Serialize(_buildInfo, filepath); + + if (_assetDependencies != null && _assetDependencies.HasContents) + { + var assetDependenciesFilePath = BuildReportTool.Util.GetAssetDependenciesFilenameFromBuildInfo(filepath); + BuildReportTool.Util.Serialize(_assetDependencies, assetDependenciesFilePath); + } + + if (_textureData != null && _textureData.HasContents) + { + var textureDataFilePath = BuildReportTool.Util.GetTextureDataFilenameFromBuildInfo(filepath); + BuildReportTool.Util.Serialize(_textureData, textureDataFilePath); + } + + if (_meshData != null && _meshData.HasContents) + { + var meshDataFilePath = BuildReportTool.Util.GetMeshDataFilenameFromBuildInfo(filepath); + BuildReportTool.Util.Serialize(_meshData, meshDataFilePath); + } + + if (_prefabData != null && _prefabData.HasContents) + { + var prefabDataFilePath = BuildReportTool.Util.GetPrefabDataFilenameFromBuildInfo(filepath); + BuildReportTool.Util.Serialize(_prefabData, prefabDataFilePath); + } + + if (_unityBuildReport != null) + { + var unityBuildReportFilePath = BuildReportTool.Util.GetUnityBuildReportFilenameFromBuildInfo(filepath); + BuildReportTool.Util.Serialize(_unityBuildReport, unityBuildReportFilePath); + } + } + } + + toolbarX += 40; + + + toolbarX += 20; + + if (GUI.Button(new Rect(toolbarX, 5, 55, 40), _toolbarLabelOptions, leftToolbarStyle)) + { + _selectedCategoryIdx = OPTIONS_IDX; + BuildReportTool.Options.UpdatePreviousSearchType(); + } + + toolbarX += 55; + if (GUI.Button(new Rect(toolbarX, 5, 70, 40), _toolbarLabelHelp, rightToolbarStyle)) + { + _selectedCategoryIdx = HELP_IDX; + _helpScreen.RefreshData(_buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport); + } + } + + bool _buildInfoHasNoContentsToDisplay = false; + + void OnGUI() + { + if (Event.current.type == EventType.Layout) + { + _noGuiSkinFound = _usedSkin == null; + _loadingValuesFromThread = !string.IsNullOrEmpty(GetValueMessage); + _buildInfoHasNoContentsToDisplay = !BuildReportTool.Util.BuildInfoHasContents(_buildInfo); + } + + //GUI.Label(new Rect(5, 100, 800, 20), "BuildReportTool.Util.ShouldReload: " + BuildReportTool.Util.ShouldReload + " EditorApplication.isCompiling: " + EditorApplication.isCompiling); + if (!_noGuiSkinFound) + { + GUI.skin = _usedSkin; + //GUI.Label(new Rect(20, 20, 500, 100), BuildReportTool.Options.BUILD_REPORT_PACKAGE_MISSING_MSG); + //return; + } + else + { + GUI.Label(new Rect(300, -25, 500, 100), BuildReportTool.Options.BUILD_REPORT_GUI_SKIN_MISSING_MSG); + } + + DrawTopRowButtons(); + + if (GUI.skin.FindStyle(BuildReportTool.Window.Settings.VERSION_STYLE_NAME) != null) + { + GUI.Label(new Rect(0, 0, position.width, 20), BuildReportTool.Info.ReadableVersion, + BuildReportTool.Window.Settings.VERSION_STYLE_NAME); + } + else + { + GUI.Label(new Rect(position.width - 160, 0, position.width, 20), BuildReportTool.Info.ReadableVersion); + } + + + // loading message + if (LoadingValuesFromThread) + { + DrawCentralMessage(GetValueMessage); + return; + } + + bool requestRepaint = false; + + // content to show when there is no build report on display + if (_buildInfoHasNoContentsToDisplay) + { + if (IsInOptionsCategory) + { + GUILayout.Space(40); + _optionsScreen.DrawGUI(position, _buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport, _extraData, out requestRepaint); + } + else if (IsInHelpCategory) + { + GUILayout.Space(40); + _helpScreen.DrawGUI(position, _buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport, _extraData, out requestRepaint); + } + else if (IsWaitingForBuildCompletionToGenerateBuildReport) + { + DrawCentralMessage(Labels.WAITING_FOR_BUILD_TO_COMPLETE_MSG); + } + else + { + DrawCentralMessage(Labels.NO_BUILD_INFO_FOUND_MSG); + + if (ReportGenerator.CheckIfUnityHasNoLogArgument()) + { + DrawWarningMessage(Labels.FOUND_NO_LOG_ARGUMENT_MSG); + } + } + + if (requestRepaint) + { + Repaint(); + } + + return; + } + + + GUILayout.Space(50); // top padding (top row buttons are 40 pixels) + + + var mouseHasMoved = Mathf.Abs(Event.current.mousePosition.x - _lastMousePos.x) > 0 || + Mathf.Abs(Event.current.mousePosition.y - _lastMousePos.y) > 0; + + + // category buttons + + int oldSelectedCategoryIdx = _selectedCategoryIdx; + + var leftTabStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TAB_LEFT_STYLE_NAME); + if (leftTabStyle == null) + { + leftTabStyle = GUI.skin.button; + } + + var midTabStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TAB_MIDDLE_STYLE_NAME); + if (midTabStyle == null) + { + midTabStyle = GUI.skin.button; + } + + var rightTabStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TAB_RIGHT_STYLE_NAME); + if (rightTabStyle == null) + { + rightTabStyle = GUI.skin.button; + } + + GUILayout.BeginHorizontal(); + if (GUILayout.Toggle(IsInOverviewCategory, "Overview", leftTabStyle, LayoutExpandWidth)) + { + _selectedCategoryIdx = OVERVIEW_IDX; + } + + if (GUILayout.Toggle(IsInBuildSettingsCategory, "Project Settings", midTabStyle, LayoutExpandWidth)) + { + _selectedCategoryIdx = BUILD_SETTINGS_IDX; + } + + if (_unityBuildReport != null && GUILayout.Toggle(IsInBuildStepsCategory, "Build Process", midTabStyle, LayoutExpandWidth)) + { + _selectedCategoryIdx = BUILD_STEPS_IDX; + } + + if (GUILayout.Toggle(IsInSizeStatsCategory, "Size Stats", midTabStyle, LayoutExpandWidth)) + { + _selectedCategoryIdx = SIZE_STATS_IDX; + } + + if (!string.IsNullOrEmpty(_extraData.Contents) && + GUILayout.Toggle(IsInExtraDataCategory, "Extra Data", midTabStyle, LayoutExpandWidth)) + { + _selectedCategoryIdx = EXTRA_DATA_IDX; + } + + if (GUILayout.Toggle(IsInUsedAssetsCategory, "Used Assets", midTabStyle, LayoutExpandWidth)) + { + if (_selectedCategoryIdx != USED_ASSETS_IDX && BuildReportTool.Options.HasSearchTypeChanged) + { + _usedAssetsScreen.UpdateSearchNow(_buildInfo); + } + + _selectedCategoryIdx = USED_ASSETS_IDX; + } + + if (GUILayout.Toggle(IsInUnusedAssetsCategory, "Unused Assets", rightTabStyle, LayoutExpandWidth)) + { + if (_selectedCategoryIdx != UNUSED_ASSETS_IDX && BuildReportTool.Options.HasSearchTypeChanged) + { + _unusedAssetsScreen.UpdateSearchNow(_buildInfo); + } + + _selectedCategoryIdx = UNUSED_ASSETS_IDX; + } + + /*GUILayout.Space(20); + + if (GUILayout.Toggle(IsInOptionsCategory, _toolbarLabelOptions, leftTabStyle, LayoutExpandWidth)) + { + _selectedCategoryIdx = OPTIONS_IDX; + } + if (GUILayout.Toggle(IsInHelpCategory, _toolbarLabelHelp, rightTabStyle, LayoutExpandWidth)) + { + _selectedCategoryIdx = HELP_IDX; + }*/ + GUILayout.EndHorizontal(); + + + if (oldSelectedCategoryIdx != OPTIONS_IDX && _selectedCategoryIdx == OPTIONS_IDX) + { + // moving into the options screen + _fileFilterGroupToUseOnOpeningOptionsWindow = BuildReportTool.Options.FilterToUseInt; + } + else if (oldSelectedCategoryIdx == OPTIONS_IDX && _selectedCategoryIdx != OPTIONS_IDX) + { + // moving away from the options screen + _fileFilterGroupToUseOnClosingOptionsWindow = BuildReportTool.Options.FilterToUseInt; + + if (_fileFilterGroupToUseOnOpeningOptionsWindow != _fileFilterGroupToUseOnClosingOptionsWindow) + { + RecategorizeDisplayedBuildInfo(); + } + } + + bool requestRepaintOnTabs = false; + + // main content + GUILayout.BeginHorizontal(); + //GUILayout.Space(3); // left padding + GUILayout.BeginVertical(); + + if (IsInOverviewCategory) + { + _overviewScreen.DrawGUI(position, _buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport, _extraData, out requestRepaintOnTabs); + } + else if (IsInBuildSettingsCategory) + { + _buildSettingsScreen.DrawGUI(position, _buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport, _extraData, out requestRepaintOnTabs); + } + else if (IsInBuildStepsCategory) + { + _buildStepsScreen.DrawGUI(position, _buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport, _extraData, out requestRepaintOnTabs); + } + else if (IsInSizeStatsCategory) + { + _sizeStatsScreen.DrawGUI(position, _buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport, _extraData, out requestRepaintOnTabs); + } + else if (IsInUsedAssetsCategory) + { + _usedAssetsScreen.DrawGUI(position, _buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport, _extraData, out requestRepaintOnTabs); + } + else if (IsInUnusedAssetsCategory) + { + _unusedAssetsScreen.DrawGUI(position, _buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport, _extraData, out requestRepaintOnTabs); + } + else if (IsInExtraDataCategory) + { + _extraDataScreen.DrawGUI(position, _buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport, _extraData, out requestRepaintOnTabs); + } + else if (IsInOptionsCategory) + { + _optionsScreen.DrawGUI(position, _buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport, _extraData, out requestRepaintOnTabs); + } + else if (IsInHelpCategory) + { + _helpScreen.DrawGUI(position, _buildInfo, _assetDependencies, _textureData, _meshData, _prefabData, _unityBuildReport, _extraData, out requestRepaintOnTabs); + } + + GUILayout.FlexibleSpace(); + GUILayout.EndVertical(); + //GUILayout.Space(5); // right padding + GUILayout.EndHorizontal(); + + //GUILayout.Space(10); // bottom padding + + if (requestRepaintOnTabs) + { + _buildInfo.FlagOkToRefresh(); + } + + _lastMousePos = Event.current.mousePosition; + _lastMouseMoved = mouseHasMoved; + } + + public static bool LastMouseMoved + { + get { return _lastMouseMoved; } + } + + public static bool MouseMovedNow + { + get + { + return Mathf.Abs(Event.current.mousePosition.x - _lastMousePos.x) > 0 || + Mathf.Abs(Event.current.mousePosition.y - _lastMousePos.y) > 0; + } + } + + // ===================================================================================== + + static readonly MethodInfo GetAtlasPreviewTextureMethod = typeof(SpriteAtlasExtensions) + .GetMethod("GetPreviewTextures", BindingFlags.Static | BindingFlags.NonPublic); + + static readonly object[] GetAtlasPreviewTextureParams = new object[1]; + + public static Texture GetAssetPreview(SizePart sizePart) + { + if (sizePart == null) + { + return null; + } + + return GetAssetPreview(sizePart.Name); + } + + public static Texture GetAssetPreview(string assetName) + { + if (string.IsNullOrEmpty(assetName)) + { + return null; + } + + Texture thumbnailImage = null; + if (assetName.IsTextureFile()) + { +#if UNITY_5_6_OR_NEWER + thumbnailImage = AssetDatabase.LoadAssetAtPath(assetName); +#else + thumbnailImage = (Texture)AssetDatabase.LoadAssetAtPath(assetName, typeof(Texture)); +#endif + } + else //if (_assetListEntryHovered.Name.EndsWith(".prefab") || BuildReportTool.Util.IsFileAUnityMesh(_assetListEntryHovered.Name)) + { +#if UNITY_5_6_OR_NEWER + var loadedObj = AssetDatabase.LoadAssetAtPath(assetName); +#else + var loadedObj = (UnityEngine.Object)AssetDatabase.LoadAssetAtPath(assetName, typeof(UnityEngine.Object)); +#endif + + if (loadedObj == null) + { + return null; + } + + if (loadedObj is SpriteAtlas atlas) + { + GetAtlasPreviewTextureParams[0] = atlas; + + if (GetAtlasPreviewTextureMethod?.Invoke(null, GetAtlasPreviewTextureParams) is Texture2D[] textures && + textures.Length > 0 && + textures[0] != null) + { + thumbnailImage = textures[0]; + } + else + { + // If SpriteAtlasExtensions.GetPreviewTextures failed, + // just try AssetPreview.GetAssetPreview + thumbnailImage = AssetPreview.GetAssetPreview(atlas); + } + } + else + { + thumbnailImage = AssetPreview.GetAssetPreview(loadedObj); + //thumbnailImage = AssetPreview.GetMiniThumbnail(loadedObj); + } + } + + return thumbnailImage; + } + + public static Vector2 GetThumbnailSize() + { + Vector2 thumbnailSize; + thumbnailSize.x = ZoomedInThumbnails + ? BuildReportTool.Options.TooltipThumbnailZoomedInWidth + : BuildReportTool.Options.TooltipThumbnailWidth; + + thumbnailSize.y = ZoomedInThumbnails + ? BuildReportTool.Options.TooltipThumbnailZoomedInHeight + : BuildReportTool.Options.TooltipThumbnailHeight; + return thumbnailSize; + } + + public static Rect DrawTooltip(Rect position, float desiredWidth, float desiredHeight, float additionalPadding = 0) + { + var tooltipStyle = GUI.skin.FindStyle("Tooltip"); + if (tooltipStyle == null) + { + tooltipStyle = GUI.skin.box; + } + var tooltipRect = new Rect(); + + // -------------------------------------------------- + + var tooltipPos = Event.current.mousePosition; + + // offset for mouse + tooltipPos.x += 18; + tooltipPos.y += 15; + + // -------------------------------------------------- + // initially tooltip is to the right and below the mouse + + tooltipRect.width = desiredWidth; + tooltipRect.height = desiredHeight; + + tooltipRect.width += tooltipStyle.border.horizontal + (additionalPadding * 2); + tooltipRect.height += tooltipStyle.border.vertical + (additionalPadding * 2); + + tooltipRect.x = tooltipPos.x - tooltipStyle.border.left; + tooltipRect.y = tooltipPos.y - tooltipStyle.border.top; + + // -------------------------------------------------- + + if (tooltipRect.xMax > position.width) + { + // move tooltip to the left + tooltipPos.x = Event.current.mousePosition.x - 5 - tooltipRect.width; + tooltipRect.x = tooltipPos.x - tooltipStyle.border.left; + + if (tooltipRect.x < 0) + { + tooltipPos.x = position.width - tooltipRect.width; + tooltipRect.x = tooltipPos.x - tooltipStyle.border.left; + } + } + + // -------------------------------------------------- + + if (tooltipRect.yMax > position.height) + { + // move tooltip above mouse + tooltipPos.y = Event.current.mousePosition.y + 3 - tooltipRect.height; + tooltipRect.y = tooltipPos.y - tooltipStyle.border.top; + + if (tooltipRect.y < 0) + { + tooltipPos.y = position.height - tooltipRect.height; + tooltipRect.y = tooltipPos.y - tooltipStyle.border.top; + } + } + + // -------------------------------------------------- + + GUI.Box(tooltipRect, string.Empty, tooltipStyle); + + return new Rect(tooltipPos.x + additionalPadding, tooltipPos.y + additionalPadding, desiredWidth, desiredHeight); + } + + public static void ProcessThumbnailControls() + { + if (Event.current.type == EventType.KeyDown && (Event.current.keyCode == KeyCode.LeftAlt || + Event.current.keyCode == KeyCode.RightAlt)) + { + ShowThumbnailsWithAlphaBlend = !ShowThumbnailsWithAlphaBlend; + } + + if ((Event.current.keyCode == KeyCode.LeftControl || + Event.current.keyCode == KeyCode.RightControl)) + { + if (Event.current.type == EventType.KeyDown) + { + ZoomedInThumbnails = true; + } + else if (Event.current.type == EventType.KeyUp) + { + ZoomedInThumbnails = false; + } + } + } + + public static void ResetThumbnailControls() + { + // ensure that thumbnails are not zoomed in + ZoomedInThumbnails = false; + } + + public static void DrawThumbnail(float posX, float posY, Vector2 thumbnailSize, Texture thumbnailImage) + { + var thumbnailRect = new Rect(posX, posY, thumbnailSize.x, thumbnailSize.y); + GUI.DrawTexture(thumbnailRect, thumbnailImage, ScaleMode.ScaleToFit, ShowThumbnailsWithAlphaBlend); + } + + public static Vector2 GetEndUsersListSize(GUIContent label, List endUsers) + { + var assetStyle = GUI.skin.FindStyle("Asset"); + if (assetStyle == null) + { + assetStyle = GUI.skin.label; + } + var labelStyle = GUI.skin.FindStyle("TooltipText"); + if (labelStyle == null) + { + labelStyle = GUI.skin.box; + } + + Vector2 endUsersSize = Vector2.zero; + + var labelSize = labelStyle.CalcSize(label); + endUsersSize.x = Mathf.Max(endUsersSize.x, labelSize.x); + endUsersSize.y += labelSize.y; + + if (endUsers != null) + { + EditorGUIUtility.SetIconSize(IconSize); + + for (int n = 0, len = Mathf.Min(endUsers.Count, TOOLTIP_END_USERS_MAX_COUNT); n < len; ++n) + { + var endUserSize = assetStyle.CalcSize(endUsers[n]); + + endUsersSize.x = Mathf.Max(endUsersSize.x, endUserSize.x); + endUsersSize.y += endUserSize.y; + } + + if (endUsers.Count > TOOLTIP_END_USERS_MAX_COUNT) + { + PlusMore.text = string.Format("...plus {0} more", endUsers.Count - TOOLTIP_END_USERS_MAX_COUNT); + var plusMoreSize = labelStyle.CalcSize(PlusMore); + + endUsersSize.x = Mathf.Max(endUsersSize.x, plusMoreSize.x); + endUsersSize.y += plusMoreSize.y; + } + } + + // padding + endUsersSize.x += TOOLTIP_PADDING_L + TOOLTIP_PADDING_R; + endUsersSize.y += TOOLTIP_PADDING_T + TOOLTIP_PADDING_B; + + return endUsersSize; + } + + public static void DrawEndUsersList(Vector2 pos, GUIContent label, List endUsers) + { + var assetStyle = GUI.skin.FindStyle("Asset"); + if (assetStyle == null) + { + assetStyle = GUI.skin.label; + } + var labelStyle = GUI.skin.FindStyle("TooltipText"); + if (labelStyle == null) + { + labelStyle = GUI.skin.box; + } + + Rect endUserRect = new Rect(pos.x + TOOLTIP_PADDING_T, pos.y + TOOLTIP_PADDING_L, 0, 0); + + endUserRect.size = labelStyle.CalcSize(label); + GUI.Label(endUserRect, label, labelStyle); + + if (endUsers != null && endUsers.Count > 0) + { + endUserRect.y += endUserRect.height; + + EditorGUIUtility.SetIconSize(IconSize); + + for (int n = 0, len = Mathf.Min(endUsers.Count, TOOLTIP_END_USERS_MAX_COUNT); n < len; ++n) + { + endUserRect.size = assetStyle.CalcSize(endUsers[n]); + + GUI.Label(endUserRect, endUsers[n], assetStyle); + + endUserRect.y += endUserRect.height; + } + + if (endUsers.Count > TOOLTIP_END_USERS_MAX_COUNT) + { + PlusMore.text = string.Format("...plus {0} more", endUsers.Count - TOOLTIP_END_USERS_MAX_COUNT); + endUserRect.size = labelStyle.CalcSize(PlusMore); + + GUI.Label(endUserRect, PlusMore, labelStyle); + } + } + } + + // ----------------------------------------------- + + public static void DrawThumbnailTooltip(Rect position, BuildReportTool.TextureData textureData) + { + DrawThumbnailTooltip(position, HoveredAssetEntryPath, HoveredAssetEntryRect, textureData); + } + + static readonly GUIContent TextureDataTooltipLabel = new GUIContent(); + + static bool GetTextureDataForTooltip(string assetPath, BuildReportTool.TextureData textureData, out Vector2 labelSize) + { + if (textureData == null) + { + labelSize = Vector2.zero; + return false; + } + + var labelStyle = GUI.skin.FindStyle("TooltipText"); + if (labelStyle == null) + { + labelStyle = GUI.skin.box; + } + + if (assetPath.IsSpriteAtlasFile()) + { + var thumbnailImage = BRT_BuildReportWindow.GetAssetPreview(assetPath); + + TextureDataTooltipLabel.text = string.Format("Sprite Atlas ({0}) {1}x{2}", + thumbnailImage.graphicsFormat, + thumbnailImage.width, + thumbnailImage.height); + + labelSize = labelStyle.CalcSize(TextureDataTooltipLabel); + return true; + } + + var data = textureData.GetTextureData(); + if (data.ContainsKey(assetPath)) + { + if (data[assetPath].IsImportedWidthAndHeightDifferentFromReal) + { + if (ZoomedInThumbnails) + { + TextureDataTooltipLabel.text = string.Format("{0} ({1}) {2} (source: {3})", + data[assetPath].TextureType, + data[assetPath].GetShownTextureFormat(), + data[assetPath].ToDisplayedValue(TextureData.DataId.ImportedWidthAndHeight), + data[assetPath].ToDisplayedValue(TextureData.DataId.RealWidthAndHeight)); + } + else + { + TextureDataTooltipLabel.text = string.Format("{0} ({1})\n{2} (source: {3})", + data[assetPath].TextureType, + data[assetPath].GetShownTextureFormat(), + data[assetPath].ToDisplayedValue(TextureData.DataId.ImportedWidthAndHeight), + data[assetPath].ToDisplayedValue(TextureData.DataId.RealWidthAndHeight)); + } + } + else + { + TextureDataTooltipLabel.text = string.Format("{0} ({1}) {2}", + data[assetPath].TextureType, + data[assetPath].GetShownTextureFormat(), + data[assetPath].ToDisplayedValue(TextureData.DataId.ImportedWidthAndHeight)); + } + + labelSize = labelStyle.CalcSize(TextureDataTooltipLabel); + + return true; + } + else + { + labelSize = Vector2.zero; + return false; + } + } + + public static void DrawThumbnailTooltip(Rect position, string assetPath, Rect assetRect, BuildReportTool.TextureData textureData) + { + var thumbnailImage = BRT_BuildReportWindow.GetAssetPreview(assetPath); + + if (thumbnailImage != null) + { + var desiredSize = Vector2.zero; + var thumbnailSize = BRT_BuildReportWindow.GetThumbnailSize(); + desiredSize.x = thumbnailSize.x; + desiredSize.y = thumbnailSize.y; + + Vector2 textureDataLabelSize; + bool showTextureData = GetTextureDataForTooltip(assetPath, textureData, out textureDataLabelSize); + if (showTextureData) + { + desiredSize.x = Mathf.Max(desiredSize.x, textureDataLabelSize.x); + desiredSize.y += textureDataLabelSize.y; + } + + var tooltipRect = BRT_BuildReportWindow.DrawTooltip(position, desiredSize.x, desiredSize.y); + + DrawThumbnail(tooltipRect.x, tooltipRect.y, thumbnailSize, thumbnailImage); + + if (showTextureData) + { + var labelStyle = GUI.skin.FindStyle("TooltipText"); + if (labelStyle == null) + { + labelStyle = GUI.skin.box; + } + + GUI.Label(new Rect( + tooltipRect.x, tooltipRect.y + thumbnailSize.y, textureDataLabelSize.x, textureDataLabelSize.y), + TextureDataTooltipLabel, labelStyle); + } + } + } + + public static void DrawEndUsersTooltip(Rect position, AssetDependencies assetDependencies) + { + List endUsersListToUse = GetEndUserLabelsFor(assetDependencies, HoveredAssetEntryPath); + DrawEndUsersTooltip(position, GetAppropriateEndUserLabelForHovered(), endUsersListToUse, + HoveredAssetEntryRect); + } + + public static void DrawEndUsersTooltip(Rect position, GUIContent label, List endUsers, Rect assetRect) + { + var endUsersSize = BRT_BuildReportWindow.GetEndUsersListSize(label, endUsers); + + var tooltipRect = BRT_BuildReportWindow.DrawTooltip(position, endUsersSize.x, endUsersSize.y); + + BRT_BuildReportWindow.DrawEndUsersList(tooltipRect.position, label, endUsers); + } + + public static void DrawThumbnailEndUsersTooltip(Rect position, AssetDependencies assetDependencies, BuildReportTool.TextureData textureData) + { + List endUsersListToUse = GetEndUserLabelsFor(assetDependencies, HoveredAssetEntryPath); + DrawThumbnailEndUsersTooltip(position, HoveredAssetEntryPath, GetAppropriateEndUserLabelForHovered(), + endUsersListToUse, HoveredAssetEntryRect, textureData); + } + + public static void DrawThumbnailEndUsersTooltip(Rect position, string assetPath, GUIContent label, + List endUsers, Rect assetRect, BuildReportTool.TextureData textureData) + { + var thumbnailImage = BRT_BuildReportWindow.GetAssetPreview(assetPath); + + if (thumbnailImage != null) + { + var usedBySpacing = 5; + + var thumbnailSize = BRT_BuildReportWindow.GetThumbnailSize(); + + // compute end users height and width + // then create a tooltip size that encompasses both thumbnail and end users list + + Vector2 endUsersSize = BRT_BuildReportWindow.GetEndUsersListSize(label, endUsers); + endUsersSize.y += usedBySpacing; + + Vector2 tooltipSize = new Vector2(Mathf.Max(thumbnailSize.x, endUsersSize.x), + thumbnailSize.y + endUsersSize.y); + + Vector2 textureDataLabelSize; + bool showTextureData = GetTextureDataForTooltip(assetPath, textureData, out textureDataLabelSize); + if (showTextureData) + { + tooltipSize.x = Mathf.Max(tooltipSize.x, textureDataLabelSize.x); + tooltipSize.y += textureDataLabelSize.y; + } + + var tooltipRect = BRT_BuildReportWindow.DrawTooltip(position, tooltipSize.x, tooltipSize.y); + + // -------- + // now draw the contents + + BRT_BuildReportWindow.DrawThumbnail(tooltipRect.x, tooltipRect.y, thumbnailSize, thumbnailImage); + + if (showTextureData) + { + var labelStyle = GUI.skin.FindStyle("TooltipText"); + if (labelStyle == null) + { + labelStyle = GUI.skin.box; + } + GUI.Label(new Rect( + tooltipRect.x, tooltipRect.y + thumbnailSize.y, textureDataLabelSize.x, textureDataLabelSize.y), + TextureDataTooltipLabel, labelStyle); + } + + var endUsersPos = tooltipRect.position; + endUsersPos.y += thumbnailSize.y + textureDataLabelSize.y + usedBySpacing; + BRT_BuildReportWindow.DrawEndUsersList(endUsersPos, label, endUsers); + } + } + + // ===================================================================================== +} + +#endif \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_BuildReportWindow.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_BuildReportWindow.cs.meta new file mode 100644 index 00000000..8101786d --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_BuildReportWindow.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 94e8069bc988f754daa2540ec5849063 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowLabels.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowLabels.cs new file mode 100644 index 00000000..fbba0c2a --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowLabels.cs @@ -0,0 +1,183 @@ +#if UNITY_EDITOR + +namespace BuildReportTool.Window +{ + public static class Labels + { + // GUI messages, labels + + public const string WAITING_FOR_BUILD_TO_COMPLETE_MSG = + "Waiting for build to complete... Click this window if not in focus to refresh."; + + public const string NO_BUILD_INFO_FOUND_MSG = + "No Build Info.\n\nClick \"Get Log\" to retrieve the last build info from the Editor log.\n\nClick Open to manually open a previously saved build report file."; + + public const string FOUND_NO_LOG_ARGUMENT_MSG = + "Warning: Unity was launched with the -nolog argument. Build Report Tool can't obtain build info if there are no logs. To generate build reports, relaunch Unity without the -nolog argument."; + + + public const string MONO_DLLS_LABEL = "System DLLs:"; + public const string UNITY_ENGINE_DLLS_LABEL = "UnityEngine DLLs:"; + public const string SCRIPT_DLLS_LABEL = "Script DLLs:"; + + + public const string TIME_OF_BUILD_LABEL = "Time of Build:"; + + + public const string UNUSED_TOTAL_SIZE_LABEL = "Total Unused\nAssets Size:"; + public const string USED_TOTAL_SIZE_LABEL = "Total Used\nAssets Size:"; + public const string STREAMING_ASSETS_TOTAL_SIZE_LABEL = "Streaming\nAssets Size:"; + public const string BUILD_TOTAL_SIZE_LABEL = "Total Build Size:"; + public const string BUILD_XCODE_SIZE_LABEL = "Size of Xcode Project Folder"; + + public const string WEB_UNITY3D_FILE_SIZE_LABEL = "Size of .unity3d File:"; + + public const string ANDROID_APK_FILE_SIZE_LABEL = "Size of .apk File:"; + public const string ANDROID_OBB_FILE_SIZE_LABEL = "Size of .obb File:"; + + + public const string UNUSED_TOTAL_SIZE_DESC = "Total size of project assets not included in the build."; + public const string UNUSED_TOTAL_IS_FROM_BATCH = "This size only accounts for the first {0:N0} assets in the project due to the Unused Assets batching. You can turn this off from the Options (under the In Unused Assets List section) then regenerate the Build Report."; + + public const string USED_TOTAL_SIZE_DESC = + "Total size of the used assets before being packed.\nAlso includes size of compiled Mono scripts.\nDoes not include size of files in StreamingAssets."; + + public const string STREAMING_ASSETS_SIZE_DESC = "Total size of all files in the StreamingAssets folder."; + + + public const string BUILD_SIZE_STANDALONE_DESC = + "File size of the executable file and the accompanying Data folder."; + + public const string BUILD_SIZE_WINDOWS_DESC = "File size of the .exe file and the accompanying Data folder."; + public const string BUILD_SIZE_MACOSX_DESC = "File size of the .app file."; + + public const string BUILD_SIZE_LINUX_UNIVERSAL_DESC = + "File size of both 32-bit and 64-bit executables, plus the accompanying Data folder."; + + public const string BUILD_SIZE_WEB_DESC = "File size of the whole web build folder."; + + public const string BUILD_SIZE_IOS_DESC = "File size of the Xcode project folder."; + + public const string BUILD_SIZE_ANDROID_DESC = "File size of resulting .apk file."; + public const string BUILD_SIZE_ANDROID_WITH_OBB_DESC = "File size of resulting .apk and .obb files."; + public const string BUILD_SIZE_ANDROID_WITH_PROJECT_DESC = "File size of generated Eclipse project folder."; + + + public const string OPEN_SERIALIZED_BUILD_INFO_TITLE = "Open Build Report XML File"; + + public const string TOTAL_SIZE_BREAKDOWN_LABEL = "Used Assets Size Breakdown:"; + + public const string ASSET_SIZE_BREAKDOWN_LABEL = "Asset Breakdown:"; + + + public const string ASSET_SIZE_BREAKDOWN_MSG_PRE_BOLD = "Sorted by"; + public const string ASSET_SIZE_BREAKDOWN_MSG_BOLD = "uncompressed"; + + public const string ASSET_SIZE_BREAKDOWN_MSG_POST_BOLD = + "size. Click on an asset's name to include it in size calculations or batch deletions. Shift-click to select many. Ctrl-click to toggle selection."; + + public const string TOTAL_SIZE_BREAKDOWN_MSG_PRE_BOLD = "Based on"; + public const string TOTAL_SIZE_BREAKDOWN_MSG_BOLD = "uncompressed"; + public const string TOTAL_SIZE_BREAKDOWN_MSG_POST_BOLD = "build size"; + + + public const string NO_FILES_FOR_THIS_CATEGORY_LABEL = "None"; + + public const string NON_APPLICABLE_PERCENTAGE_LABEL = "N/A"; + + public const string OVERVIEW_CATEGORY_LABEL = "Overview"; + public const string BUILD_SETTINGS_CATEGORY_LABEL = "Project Settings"; + public const string SIZE_STATS_CATEGORY_LABEL = "Total Size"; + public const string USED_ASSETS_CATEGORY_LABEL = "Used Assets"; + public const string UNUSED_ASSETS_CATEGORY_LABEL = "Unused Assets"; + public const string EXTRA_DATA_CATEGORY_LABEL = "Extra Data"; + public const string OPTIONS_CATEGORY_LABEL = "Options"; + public const string HELP_CATEGORY_LABEL = "Help & Info"; + + + public const string REFRESH_LABEL = "Get Log"; + public const string OPEN_LABEL = "Open"; + public const string SAVE_LABEL = "Save"; + + public const string SAVE_MSG = "Save Build Report to XML"; + + public const string RECALC_RAW_SIZES = "Recalculate Raw Sizes"; + public const string RECALC_IMPORTED_SIZES = "Recalculate Imported Sizes"; + public const string RECALC_SIZE_BEFORE_BUILD = "Recalculate Size Before Build"; + + public const string SELECT_ALL_LABEL = "Select All"; + public const string SELECT_NONE_LABEL = "Select None"; + public const string SELECTED_QTY_LABEL = "Selected: "; + public const string SELECTED_SIZE_LABEL = "Total size: "; + public const string SELECTED_PERCENT_LABEL = "Total percentage: "; + + public const string BUILD_TYPE_PREFIX_MSG = "For "; + public const string BUILD_TYPE_SUFFIX_MSG = ""; + public const string UNITY_VERSION_PREFIX_MSG = ", built in "; + + public const string COLLECT_BUILD_INFO_LABEL = + "Automatically collect and save build info after building (does not include batchmode builds)"; + + public const string SHOW_AFTER_BUILD_LABEL = "Show Build Report Window automatically after building"; + public const string INCLUDE_SVN_LABEL = "Include SVN metadata when creating Unused Assets list"; + public const string INCLUDE_GIT_LABEL = "Include Git metadata when creating Unused Assets list"; + public const string INCLUDE_BRT_LABEL = "Include Build Report Tool assets when creating Unused Assets list"; + public const string FILE_FILTER_DISPLAY_TYPE_LABEL = "Draw file filters as:"; + + public const string FILE_FILTER_DISPLAY_TYPE_DROP_DOWN_LABEL = "Dropdown box"; + public const string FILE_FILTER_DISPLAY_TYPE_BUTTONS_LABEL = "Buttons"; + + public const string SAVE_PATH_LABEL = "Current Build Report save path: "; + public const string SAVE_FOLDER_NAME_LABEL = "Folder name for Build Reports:"; + public const string SAVE_PATH_TYPE_LABEL = "Save build reports:"; + + public const string SAVE_PATH_TYPE_PERSONAL_DEFAULT_LABEL = "In user's personal folder"; + public const string SAVE_PATH_TYPE_PERSONAL_WIN_LABEL = "In \"My Documents\" folder"; + public const string SAVE_PATH_TYPE_PERSONAL_MAC_LABEL = "In Home folder"; + public const string SAVE_PATH_TYPE_PROJECT_LABEL = "Beside project folder"; + + public const string EDITOR_LOG_LABEL = "Unity Editor.log path "; + public const string DEFAULT_EDITOR_LOG_NOT_FOUND_MSG = "Warning: Unity Editor Log file not found."; + + public const string OVERRIDE_LOG_NOT_FOUND_MSG = + "Specified log file not found. Please change the path by clicking \"Set Override Log\""; + + public const string SET_OVERRIDE_LOG_LABEL = "Set Override Log"; + public const string CLEAR_OVERRIDE_LOG_LABEL = "Clear Override Log"; + + public const string FILTER_GROUP_TO_USE_LABEL = "File Filter Group To Use:"; + public const string FILTER_GROUP_FILE_PATH_LABEL = "Configured File Filter Group: "; + + public const string FILTER_GROUP_TO_USE_CONFIGURED_LABEL = "Always use configured file filter group"; + + public const string FILTER_GROUP_TO_USE_EMBEDDED_LABEL = + "Use file filter group embedded in file if available\n(when opening build report files)"; + + public const string OPEN_IN_FILE_BROWSER_DEFAULT_LABEL = "Open in file browser"; + public const string OPEN_IN_FILE_BROWSER_WIN_LABEL = "Show in Explorer"; + public const string OPEN_IN_FILE_BROWSER_MAC_LABEL = "Reveal in Finder"; + + + public const string CALCULATION_LEVEL_FULL_NAME = "4 - Full Report (complete calculations)"; + + public const string CALCULATION_LEVEL_FULL_DESC = + "Calculate everything. Will show size breakdown, \"Used Assets\", and \"Unused Assets\" list.\n\nThis can be slow if you have a large project with thousands of files or objects in scenes. If you get out of memory errors, try the lower calculation levels."; + + public const string CALCULATION_LEVEL_NO_PREFAB_NAME = "3 - Do not calculate unused prefabs"; + + public const string CALCULATION_LEVEL_NO_PREFAB_DESC = + "Will calculate everything, except that it will not determine whether a prefab is unused. It will still show which other assets are unused.\n\nIf you have scenes that use hundreds to thousands of prefabs and you get an out of memory error when generating a build report, try this setting."; + + public const string CALCULATION_LEVEL_NO_UNUSED_NAME = "2 - Do not calculate unused assets"; + + public const string CALCULATION_LEVEL_NO_UNUSED_DESC = + "Will display overview data and \"Used Assets\" list only. It will not determine which assets are unused.\n\nIt will not show Streaming Assets files in your Used Assets list, but their total size will still be shown in the Overview."; + + public const string CALCULATION_LEVEL_MINIMAL_NAME = "1 - Overview only (minimum calculations)"; + + public const string CALCULATION_LEVEL_MINIMAL_DESC = + "Will display overview data only. This is the fastest but also shows the least information."; + } +} + +#endif \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowLabels.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowLabels.cs.meta new file mode 100644 index 00000000..5f449595 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowLabels.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 591e9cd014f62054a85ab359ad5f5918 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowSettings.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowSettings.cs new file mode 100644 index 00000000..47ccb6e2 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowSettings.cs @@ -0,0 +1,90 @@ +#if UNITY_EDITOR + +namespace BuildReportTool.Window +{ + public static class Settings + { + // GUI Settings + public const string DEFAULT_GUI_SKIN_FILENAME = "BuildReportWindow.guiskin"; + public const string DARK_GUI_SKIN_FILENAME = "BuildReportWindowDark.guiskin"; + + // list normal is a list style with normal font size + public const string LIST_NORMAL_STYLE_NAME = "ListNormal"; + public const string LIST_NORMAL_ALT_STYLE_NAME = "ListAltNormal"; + public const string LIST_NORMAL_SELECTED_NAME = "ListAltNormalSelected"; + + // list normal is a list style with normal font size + public const string LIST_ICON_STYLE_NAME = "ListIcon"; + public const string LIST_ICON_ALT_STYLE_NAME = "ListAltIcon"; + + // list small is a list style with smaller font size (for the asset list) + public const string LIST_SMALL_STYLE_NAME = "List"; + public const string LIST_SMALL_ALT_STYLE_NAME = "ListAlt"; + public const string LIST_SMALL_SELECTED_NAME = "ListAltSelected"; + + + public const string TOOLBAR_LEFT_STYLE_NAME = "ToolbarLeft"; + public const string TOOLBAR_MIDDLE_STYLE_NAME = "ToolbarMiddle"; + public const string TOOLBAR_RIGHT_STYLE_NAME = "ToolbarRight"; + + + public const string TAB_LEFT_STYLE_NAME = "TabLeft"; + public const string TAB_MIDDLE_STYLE_NAME = "TabMiddle"; + public const string TAB_RIGHT_STYLE_NAME = "TabRight"; + + public const string STATUS_BAR_BG_STYLE_NAME = "StatusBarBg"; + public const string STATUS_BAR_LABEL_STYLE_NAME = "StatusBarLabel"; + + public const string VERSION_STYLE_NAME = "Version"; + + + public const string TOP_BAR_LABEL_STYLE_NAME = "TopBarLabel"; + public const string TOP_BAR_BTN_STYLE_NAME = "TopBarButton"; + public const string TOP_BAR_BG_STYLE_NAME = "TopBarBg"; + + + public const string LIST_COLUMN_HEADER_STYLE_NAME = "ListColumnHeader"; + public const string LIST_COLUMN_HEADER_ASC_STYLE_NAME = "ListColumnHeader-Asc"; + public const string LIST_COLUMN_HEADER_DESC_STYLE_NAME = "ListColumnHeader-Desc"; + + + public const string FILE_FILTER_POPUP_STYLE_NAME = "TopBarPopup"; + + + public const string LIST_FILENAME_STYLE = "button"; + public const string LIST_FILEPATH_STYLE = "button"; + + public const string HIDDEN_SCROLLBAR_STYLE_NAME = "HiddenScrollbar"; + + public const string MAIN_TITLE_STYLE_NAME = "Title"; + public const string MAIN_SUBTITLE_STYLE_NAME = "Subtitle"; + public const string TINY_HELP_STYLE_NAME = "TinyHelp"; + + public const string BOXED_LABEL_STYLE_NAME = "Text-Boxed"; + + public const string INFO_TITLE_STYLE_NAME = "Big1"; + + public const string SUB_TITLE_STYLE_NAME = "Big3"; + + public const string INFO_SUBTITLE_STYLE_NAME = "Header2"; + public const string INFO_SUBTITLE_BOLD_STYLE_NAME = "Header2Bold"; + + public const string BIG_NUMBER_STYLE_NAME = "Big2"; + + public const string INFO_TEXT_STYLE_NAME = "TextInfo"; + + public const string SETTING_NAME_STYLE_NAME = "TextBold"; + public const string SETTING_VALUE_STYLE_NAME = "Text"; + public const string SETTING_VALUE_NO_WRAP_STYLE_NAME = "TextNoWrap"; + + public const float CATEGORY_VERTICAL_SPACING = 40; + public const float CATEGORY_HORIZONTAL_SPACING = 30; + + + public const string BIG_LEFT_ARROW_ICON_STYLE_NAME = "Icon-ArrowBig-Left"; + public const string BIG_RIGHT_ARROW_ICON_STYLE_NAME = "Icon-ArrowBig-Right"; + public const string COLUMN_ICON_STYLE_NAME = "Icon-Toolbar-Column"; + } +} + +#endif \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowSettings.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowSettings.cs.meta new file mode 100644 index 00000000..02fd2d16 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowSettings.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6c68d32e125434fd4a5e31f854d379af +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowUtility.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowUtility.cs new file mode 100644 index 00000000..2d80da03 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowUtility.cs @@ -0,0 +1,177 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; + +namespace BuildReportTool.Window +{ + public static class Utility + { + public static void DrawCentralMessage(Rect position, string msg) + { + float w = 300; + float h = 100; + float x = (position.width - w) * 0.5f; + float y = (position.height - h) * 0.25f; + + GUI.Label(new Rect(x, y, w, h), msg); + } + + public static Texture AssemblyIcon + { + get + { + var assemblyGuiContent = EditorGUIUtility.IconContent("Assembly Icon"); + if (assemblyGuiContent != null) + { + return assemblyGuiContent.image; + } + + return null; + } + } + + public static Texture GetIcon(string assetPath) + { + if (assetPath.IsAnAssembly()) + { + // an assembly (dll) doesn't exist yet in the library, + // so we'll use a hardcoded icon + return AssemblyIcon; + } + else + { + return AssetDatabase.GetCachedIcon(assetPath); + } + } + + public static void PingSelectedAssets(AssetList list) + { + var newSelection = new List(list.GetSelectedCount()); + + var iterator = list.GetSelectedEnumerator(); + while (iterator.MoveNext()) + { + var loadedObject = + AssetDatabase.LoadAssetAtPath(iterator.Current.Key, typeof(UnityEngine.Object)); + if (loadedObject != null) + { + newSelection.Add(loadedObject); + } + } + + Selection.objects = newSelection.ToArray(); + } + + public static void PingAssetInProject(string file) + { + if (string.IsNullOrEmpty(file)) + { + return; + } + + if (!file.StartsWith("Assets/") && !file.StartsWith("Packages/")) + { + return; + } + + // thanks to http://answers.unity3d.com/questions/37180/how-to-highlight-or-select-an-asset-in-project-win.html + var asset = AssetDatabase.LoadMainAssetAtPath(file); + if (asset != null) + { + GUISkin temp = GUI.skin; + GUI.skin = null; + + //EditorGUIUtility.PingObject(AssetDatabase.LoadAssetAtPath(file, typeof(Object))); + EditorGUIUtility.PingObject(asset); + Selection.activeObject = asset; + EditorUtility.FocusProjectWindow(); + + GUI.skin = temp; + } + } + + + public static string GetProperBuildSizeDesc(BuildInfo buildReportToDisplay) + { + BuildReportTool.BuildPlatform buildPlatform = + BuildReportTool.ReportGenerator.GetBuildPlatformFromString(buildReportToDisplay.BuildType, + buildReportToDisplay.BuildTargetUsed); + + switch (buildPlatform) + { + case BuildReportTool.BuildPlatform.MacOSX32: + return Labels.BUILD_SIZE_MACOSX_DESC; + case BuildReportTool.BuildPlatform.MacOSX64: + return Labels.BUILD_SIZE_MACOSX_DESC; + case BuildReportTool.BuildPlatform.MacOSXUniversal: + return Labels.BUILD_SIZE_MACOSX_DESC; + + case BuildReportTool.BuildPlatform.Windows32: + return Labels.BUILD_SIZE_WINDOWS_DESC; + case BuildReportTool.BuildPlatform.Windows64: + return Labels.BUILD_SIZE_WINDOWS_DESC; + + case BuildReportTool.BuildPlatform.Linux32: + return Labels.BUILD_SIZE_STANDALONE_DESC; + case BuildReportTool.BuildPlatform.Linux64: + return Labels.BUILD_SIZE_STANDALONE_DESC; + case BuildReportTool.BuildPlatform.LinuxUniversal: + return Labels.BUILD_SIZE_LINUX_UNIVERSAL_DESC; + + case BuildReportTool.BuildPlatform.Android: + if (buildReportToDisplay.AndroidCreateProject) + { + return Labels.BUILD_SIZE_ANDROID_WITH_PROJECT_DESC; + } + + if (buildReportToDisplay.AndroidUseAPKExpansionFiles) + { + return Labels.BUILD_SIZE_ANDROID_WITH_OBB_DESC; + } + + return Labels.BUILD_SIZE_ANDROID_DESC; + + case BuildReportTool.BuildPlatform.iOS: + return Labels.BUILD_SIZE_IOS_DESC; + + case BuildReportTool.BuildPlatform.Web: + return Labels.BUILD_SIZE_WEB_DESC; + } + + return ""; + } + + + public static void DrawLargeSizeDisplay(string label, string desc, string value) + { + if (string.IsNullOrEmpty(value)) + { + return; + } + + var labelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME); + if (labelStyle == null) + { + labelStyle = GUI.skin.label; + } + + var descStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TINY_HELP_STYLE_NAME); + if (descStyle == null) + { + descStyle = GUI.skin.label; + } + + var valueStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.BIG_NUMBER_STYLE_NAME); + if (valueStyle == null) + { + valueStyle = GUI.skin.label; + } + + GUILayout.BeginVertical(); + GUILayout.Label(label, labelStyle); + GUILayout.Label(desc, descStyle); + GUILayout.Label(value, valueStyle); + GUILayout.EndVertical(); + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowUtility.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowUtility.cs.meta new file mode 100644 index 00000000..f89db5c3 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/BRT_WindowUtility.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b35f23d62e95e9441801ecf6c9a2ae8a +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen.meta new file mode 100644 index 00000000..27337a6e --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 157891036ec1dd44583e0c4445ce30c4 diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen.cs new file mode 100644 index 00000000..a7cda394 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen.cs @@ -0,0 +1,3561 @@ +//#define BRT_ASSET_LIST_SCREEN_DEBUG + +using System.Globalization; +using UnityEngine; +using UnityEditor; + + +namespace BuildReportTool.Window.Screen +{ + public partial class AssetList : BaseScreen + { +#if BRT_ASSET_LIST_SCREEN_DEBUG + bool _showDebugText; + readonly GUIContent _debugLabel = new GUIContent(); + System.Text.StringBuilder _debugText; +#endif + + const int SCROLLBAR_BOTTOM_PADDING = 5; + const int BOTTOM_STATUS_BAR_HEIGHT = 20; + const int DOUBLE_CLICK_THRESHOLD = 2; + + BuildReportTool.FileFilterGroup _configuredFileFilterGroup; + + /// + /// Which field of the asset we are sorting the list in. + /// + BuildReportTool.AssetList.SortType _currentSortType = BuildReportTool.AssetList.SortType.RawSize; + + BuildReportTool.TextureData.DataId _currentTextureDataSortType = BuildReportTool.TextureData.DataId.None; + + BuildReportTool.TextureData.DataId _hoveredTextureDataId = BuildReportTool.TextureData.DataId.None; + BuildReportTool.TextureData.DataId _clickedTextureDataId = BuildReportTool.TextureData.DataId.None; + + string _overridenTextureDataTooltipText; + + BuildReportTool.MeshData.DataId _currentMeshDataSortType = BuildReportTool.MeshData.DataId.None; + + BuildReportTool.MeshData.DataId _hoveredMeshDataId = BuildReportTool.MeshData.DataId.None; + BuildReportTool.MeshData.DataId _clickedMeshDataId = BuildReportTool.MeshData.DataId.None; + + BuildReportTool.PrefabData.DataId _currentPrefabDataSortType = BuildReportTool.PrefabData.DataId.None; + + BuildReportTool.PrefabData.DataId _hoveredPrefabDataId = BuildReportTool.PrefabData.DataId.None; + BuildReportTool.PrefabData.DataId _clickedPrefabDataId = BuildReportTool.PrefabData.DataId.None; + + /// + /// Whether we are sorting ascending or descending. + /// + BuildReportTool.AssetList.SortOrder _currentSortOrder = BuildReportTool.AssetList.SortOrder.Descending; + + /// + /// Last clicked entry in the main asset list. + /// This is used to check if user is clicking on the same asset that's already selected, or a new one. + /// + int _assetListEntryLastClickedIdx = -1; + + /// + /// -1 is already used to signify the "All" list (i.e. no filter) + /// so we need something else to signify no value. + /// + const int NO_FILTER_VALUE = -2; + + int _filterIdxOfLastClickedAssetListEntry = NO_FILTER_VALUE; + + /// + /// Hovered entry in the main asset list + /// + int _assetListEntryHoveredIdx = -1; + + /// + /// Hovered entry in the asset usage ancestry list + /// + int _assetUsageAncestryHoveredIdx = -1; + + /// + /// Hovered entry in the flattened asset users list + /// + int _assetUserEntryHoveredIdx = -1; + + bool _shouldShowThumbnailOnHoveredAsset; + + + /// + /// We record the time an asset has been clicked + /// to check for a double-click. + /// We use this instead of Event.current.clickCount + /// because this way is easier. + /// + double _assetListEntryLastClickedTime; + + Vector2 _assetListScrollPos; + Rect _assetPathColumnHeaderRect; + readonly GUIContent _assetPathCheckboxLabel = new GUIContent("", "Display Asset's Path or just the filename."); + + readonly GUIContent _textureDataTooltipLabel = new GUIContent(); + + /// + /// Re-used entry in the main asset list. + /// + readonly GUIContent _assetListEntry = new GUIContent(); + + + public enum ListToDisplay + { + Invalid, + UsedAssets, + UnusedAssets, + } + + ListToDisplay _currentListDisplayed = ListToDisplay.Invalid; + + bool _mouseIsPreviouslyInWindow; + + bool _mouseIsOnOverlayControl; + + Rect _showColumnOptionButtonRect; + bool _showColumnOptions; + readonly GUIContent _showColumnLabel = new GUIContent("Columns"); + readonly GUIContent _columnLabel = new GUIContent(); + + bool _showPageNumbers = true; + + // ================================================================================= + + public override string Name + { + get { return ""; } + } + + public override void RefreshData(BuildInfo buildReport, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, UnityBuildReport unityBuildReport) + { + RefreshConfiguredFileFilters(); + + if (BuildReportTool.Options.ShouldUseConfiguredFileFilters()) + { + BuildReportTool.AssetList listToDisplay = GetAssetListToDisplay(buildReport); + if (listToDisplay != null) + { + listToDisplay.SortIfNeeded(_configuredFileFilterGroup); + } + } + + _currentSortType = BuildReportTool.AssetList.SortType.RawSize; + _currentSortOrder = BuildReportTool.AssetList.SortOrder.Descending; + } + + public override void Update(double timeNow, double deltaTime, BuildInfo buildReportToDisplay, + AssetDependencies assetDependencies) + { + UpdateSearch(timeNow, buildReportToDisplay); + } + + public void SetListToDisplay(ListToDisplay t) + { + _currentListDisplayed = t; + } + + bool IsShowingUnusedAssets + { + get { return _currentListDisplayed == ListToDisplay.UnusedAssets; } + } + + bool IsShowingUsedAssets + { + get { return _currentListDisplayed == ListToDisplay.UsedAssets; } + } + + BuildReportTool.AssetList GetAssetListToDisplay(BuildInfo buildReportToDisplay) + { + if (buildReportToDisplay == null) + { + return null; + } + + if (_currentListDisplayed == ListToDisplay.UsedAssets) + { + return buildReportToDisplay.UsedAssets; + } + else if (_currentListDisplayed == ListToDisplay.UnusedAssets) + { + return buildReportToDisplay.UnusedAssets; + } + + Debug.LogError("Invalid list to display type"); + return null; + } + + void DrawUnderlay(BuildReportTool.BuildInfo buildReportToDisplay) + { + DrawOverlay(buildReportToDisplay, false); + } + + void DrawOverlay(BuildReportTool.BuildInfo buildReportToDisplay, bool isOverlay = true) + { + const int TOGGLE_EXTRA_WIDTH = 9; + const int TOGGLE_SPACING = 2; + + var prevEnabled = GUI.enabled; + + if (_showColumnOptions) + { + Rect columnOptionsBg = new Rect(); + columnOptionsBg.x = _showColumnOptionButtonRect.x; + columnOptionsBg.y = _showColumnOptionButtonRect.yMax; + columnOptionsBg.width = UnityEngine.Screen.width - _showColumnOptionButtonRect.x - 19; + columnOptionsBg.height = 448; + + columnOptionsBg.x = UnityEngine.Screen.width - columnOptionsBg.width - 19; + + var bgStyle = GUI.skin.FindStyle(isOverlay ? "PopupPanel" : "HiddenScrollbar"); + if (bgStyle == null) + { + bgStyle = GUI.skin.box; + } + GUI.Box(columnOptionsBg, GUIContent.none, bgStyle); + + _mouseIsOnOverlayControl = columnOptionsBg.Contains(Event.current.mousePosition); + if (_mouseIsOnOverlayControl) + { + _hoveredTextureDataId = TextureData.DataId.None; + _hoveredMeshDataId = MeshData.DataId.None; + _hoveredPrefabDataId = PrefabData.DataId.None; + _overridenTextureDataTooltipText = null; + } + + Rect rect = new Rect(); + rect.x = columnOptionsBg.x + 10; + rect.y = columnOptionsBg.y + 5; + + float startX = rect.x; + + //rect.width = 300; + //rect.height = 28; + //GUI.Label(rect, string.Format("Screen.width: {0} Screen.height: {1}", UnityEngine.Screen.width.ToString(), UnityEngine.Screen.height.ToString())); + + const int COLUMN_SPACING = 15; + const int GROUP_SPACING = 5; + + float normalColumnsHeight = 0; + + float textureDataLowestY = 0; + float textureDataColumn1Width = 0; + float textureDataColumn2Width = 0; + + var toggleHeaderStyle = GUI.skin.FindStyle("Header3"); + if (toggleHeaderStyle == null) + { + toggleHeaderStyle = GUI.skin.label; + } + + _columnLabel.text = "Columns:"; + rect.size = toggleHeaderStyle.CalcSize(_columnLabel); + GUI.Label(rect, _columnLabel, toggleHeaderStyle); + rect.y += rect.height - 2; + + _columnLabel.text = "Asset Path"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowColumnAssetPath = GUI.Toggle(rect, BuildReportTool.Options.ShowColumnAssetPath, _columnLabel); + rect.x += rect.width + COLUMN_SPACING; + normalColumnsHeight = Mathf.Max(normalColumnsHeight, rect.height); + + _columnLabel.text = "Size Before Build"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowColumnSizeBeforeBuild = GUI.Toggle(rect, BuildReportTool.Options.ShowColumnSizeBeforeBuild, _columnLabel); + rect.x += rect.width + COLUMN_SPACING; + normalColumnsHeight = Mathf.Max(normalColumnsHeight, rect.height); + + _columnLabel.text = "Size In Build"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowColumnSizeInBuild = GUI.Toggle(rect, BuildReportTool.Options.ShowColumnSizeInBuild, _columnLabel); + rect.x += rect.width + COLUMN_SPACING; + normalColumnsHeight = Mathf.Max(normalColumnsHeight, rect.height); + + rect.x = startX; + rect.y += normalColumnsHeight + TOGGLE_SPACING; + + normalColumnsHeight = 0; + _columnLabel.text = "Raw Size (for Unused Assets)"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowColumnUnusedRawSize = GUI.Toggle(rect, BuildReportTool.Options.ShowColumnUnusedRawSize, _columnLabel); + rect.x += rect.width + COLUMN_SPACING; + normalColumnsHeight = Mathf.Max(normalColumnsHeight, rect.height); + + _columnLabel.text = "Imported Size (for Unused Assets)"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowColumnUnusedImportedSize = GUI.Toggle(rect, BuildReportTool.Options.ShowColumnUnusedImportedSize, _columnLabel); + rect.x += rect.width + COLUMN_SPACING; + normalColumnsHeight = Mathf.Max(normalColumnsHeight, rect.height); + + rect.y += normalColumnsHeight + 8; + + // ----------------------------------------------------------------------- + + // column 1 + rect.x = startX; + + _columnLabel.text = "Texture Data Columns:"; + rect.size = toggleHeaderStyle.CalcSize(_columnLabel); + GUI.Label(rect, _columnLabel, toggleHeaderStyle); + rect.y += rect.height - 2; + float toggleYStart = rect.y; + + #region Texture Column 1 + + _columnLabel.text = "Texture Type"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnTextureType = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnTextureType, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.TextureType; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn1Width = Mathf.Max(textureDataColumn1Width, rect.width); + + _columnLabel.text = "Is sRGB (Color Texture)"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnIsSRGB = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnIsSRGB, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.IsSRGB; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn1Width = Mathf.Max(textureDataColumn1Width, rect.width); + + _columnLabel.text = "Alpha Source"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnAlphaSource = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnAlphaSource, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.AlphaSource; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn1Width = Mathf.Max(textureDataColumn1Width, rect.width); + + _columnLabel.text = "Alpha Is Transparency"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnAlphaIsTransparency = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnAlphaIsTransparency, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.AlphaIsTransparency; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn1Width = Mathf.Max(textureDataColumn1Width, rect.width); + + _columnLabel.text = "Ignore PNG Gamma"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnIgnorePngGamma = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnIgnorePngGamma, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.IgnorePngGamma; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn1Width = Mathf.Max(textureDataColumn1Width, rect.width); + + _columnLabel.text = "Read/Write Enabled"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnIsReadable = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnIsReadable, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.IsReadable; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn1Width = Mathf.Max(textureDataColumn1Width, rect.width); + + // ------------------------------------------- + rect.y += GROUP_SPACING; + + _columnLabel.text = "Mip Map Generated"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnMipMapGenerated = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnMipMapGenerated, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.MipMapGenerated; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn1Width = Mathf.Max(textureDataColumn1Width, rect.width); + + _columnLabel.text = "Mip Map Filter"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnMipMapFilter = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnMipMapFilter, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.MipMapFilter; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn1Width = Mathf.Max(textureDataColumn1Width, rect.width); + + _columnLabel.text = "Streaming Mip Maps"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnStreamingMipMaps = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnStreamingMipMaps, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.StreamingMipMaps; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn1Width = Mathf.Max(textureDataColumn1Width, rect.width); + + _columnLabel.text = "Border Mip Maps"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnBorderMipMaps = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnBorderMipMaps, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.BorderMipMaps; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn1Width = Mathf.Max(textureDataColumn1Width, rect.width); + + _columnLabel.text = "Preserve Coverage Mip Maps"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnPreserveCoverageMipMaps = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnPreserveCoverageMipMaps, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.PreserveCoverageMipMaps; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn1Width = Mathf.Max(textureDataColumn1Width, rect.width); + + _columnLabel.text = "Fade Mip Maps"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnFadeOutMipMaps = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnFadeOutMipMaps, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.FadeOutMipMaps; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn1Width = Mathf.Max(textureDataColumn1Width, rect.width); + textureDataLowestY = Mathf.Max(textureDataLowestY, rect.y); + + #endregion + + // ----------------------------------------------------------------------- + // column 2 + rect.x += textureDataColumn1Width + COLUMN_SPACING; + rect.y = toggleYStart; + + #region Texture Column 2 + + _columnLabel.text = "Imported Width & Height"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnImportedWidthAndHeight = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnImportedWidthAndHeight, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.ImportedWidthAndHeight; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn2Width = Mathf.Max(textureDataColumn2Width, rect.width); + + _columnLabel.text = "Source Width & Height"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnRealWidthAndHeight = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnRealWidthAndHeight, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.RealWidthAndHeight; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn2Width = Mathf.Max(textureDataColumn2Width, rect.width); + + _columnLabel.text = "Non-Power of 2 Scale"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnNPotScale = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnNPotScale, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.NPotScale; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn2Width = Mathf.Max(textureDataColumn2Width, rect.width); + + _columnLabel.text = "Max Texture Size"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnMaxTextureSize = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnMaxTextureSize, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.MaxTextureSize; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn2Width = Mathf.Max(textureDataColumn2Width, rect.width); + + _columnLabel.text = "Resize Algorithm"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnResizeAlgorithm = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnResizeAlgorithm, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.TextureResizeAlgorithm; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn2Width = Mathf.Max(textureDataColumn2Width, rect.width); + + // ----------------------------------------------------------------------- + rect.y += GROUP_SPACING; + + _columnLabel.text = "Sprite Mode"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnSpriteImportMode = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnSpriteImportMode, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.SpriteImportMode; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn2Width = Mathf.Max(textureDataColumn2Width, rect.width); + + _columnLabel.text = "Sprite Packing Tag"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnSpritePackingTag = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnSpritePackingTag, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.SpritePackingTag; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn2Width = Mathf.Max(textureDataColumn2Width, rect.width); + + _columnLabel.text = "Sprite Pixels Per Unit"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnSpritePixelsPerUnit = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnSpritePixelsPerUnit, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.SpritePixelsPerUnit; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn2Width = Mathf.Max(textureDataColumn2Width, rect.width); + + _columnLabel.text = "Qualifies for Sprite Packing"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnQualifiesForSpritePacking = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnQualifiesForSpritePacking, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.QualifiesForSpritePacking; + } + rect.y += rect.height + TOGGLE_SPACING; + textureDataColumn2Width = Mathf.Max(textureDataColumn2Width, rect.width); + textureDataLowestY = Mathf.Max(textureDataLowestY, rect.y); + + #endregion + + // ----------------------------------------------------------------------- + // column 3 + rect.x += textureDataColumn2Width + COLUMN_SPACING; + rect.y = toggleYStart; + + #region Texture Column 3 + + _columnLabel.text = "Texture Format"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnTextureFormat = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnTextureFormat, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.TextureFormat; + } + rect.y += rect.height + TOGGLE_SPACING; + + _columnLabel.text = "Compression Type"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnCompressionType = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnCompressionType, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.CompressionType; + } + rect.y += rect.height + TOGGLE_SPACING; + + _columnLabel.text = "Compression Crunched"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnCompressionIsCrunched = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnCompressionIsCrunched, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.CompressionIsCrunched; + } + rect.y += rect.height + TOGGLE_SPACING; + + _columnLabel.text = "Compression Quality"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnCompressionQuality = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnCompressionQuality, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.CompressionQuality; + } + rect.y += rect.height + TOGGLE_SPACING; + + // ----------------------------------------------------------------------- + rect.y += GROUP_SPACING; + + _columnLabel.text = "Wrap Mode"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnWrapMode = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnWrapMode, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.WrapMode; + } + rect.y += rect.height + TOGGLE_SPACING; + + _columnLabel.text = "Wrap Mode U"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnWrapModeU = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnWrapModeU, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.WrapModeU; + } + rect.y += rect.height + TOGGLE_SPACING; + + _columnLabel.text = "Wrap Mode V"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnWrapModeV = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnWrapModeV, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.WrapModeV; + } + rect.y += rect.height + TOGGLE_SPACING; + + _columnLabel.text = "Wrap Mode W"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnWrapModeW = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnWrapModeW, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.WrapModeW; + } + rect.y += rect.height + TOGGLE_SPACING; + + _columnLabel.text = "Filter Mode"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnFilterMode = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnFilterMode, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.FilterMode; + } + rect.y += rect.height + TOGGLE_SPACING; + + _columnLabel.text = "Anisotropic Filtering Level"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowTextureColumnAnisoLevel = GUI.Toggle(rect, BuildReportTool.Options.ShowTextureColumnAnisoLevel, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = TextureData.DataId.AnisoLevel; + } + rect.y += rect.height + TOGGLE_SPACING; + + textureDataLowestY = Mathf.Max(textureDataLowestY, rect.y); + + #endregion + + // ----------------------------------------------------------------------- + + float meshColumn1Width = 0; + float meshColumn2Width = 0; + float meshDataLowestY = 0; + + // column 1 + rect.x = startX; + rect.y = textureDataLowestY + 8; + + _columnLabel.text = "Mesh Data Columns:"; + rect.size = toggleHeaderStyle.CalcSize(_columnLabel); + GUI.Label(rect, _columnLabel, toggleHeaderStyle); + rect.y += rect.height - 2; + toggleYStart = rect.y; + + #region Mesh Column 1 + + _columnLabel.text = "Non-Skinned Mesh Count"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowMeshColumnMeshFilterCount = GUI.Toggle(rect, BuildReportTool.Options.ShowMeshColumnMeshFilterCount, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredMeshDataId = MeshData.DataId.MeshFilterCount; + } + rect.y += rect.height + TOGGLE_SPACING; + meshColumn1Width = Mathf.Max(meshColumn1Width, rect.width); + + _columnLabel.text = "Skinned Mesh Count"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowMeshColumnSkinnedMeshRendererCount = GUI.Toggle(rect, BuildReportTool.Options.ShowMeshColumnSkinnedMeshRendererCount, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredMeshDataId = MeshData.DataId.SkinnedMeshRendererCount; + } + rect.y += rect.height + TOGGLE_SPACING; + meshColumn1Width = Mathf.Max(meshColumn1Width, rect.width); + + meshDataLowestY = Mathf.Max(meshDataLowestY, rect.y); + + #endregion + + // ----------------------------------------------------------------------- + // column 2 + + rect.x += meshColumn1Width + COLUMN_SPACING; + rect.y = toggleYStart; + + #region Mesh Column 2 + + _columnLabel.text = "Sub-Mesh Count"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowMeshColumnSubMeshCount = GUI.Toggle(rect, BuildReportTool.Options.ShowMeshColumnSubMeshCount, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredMeshDataId = MeshData.DataId.SubMeshCount; + } + rect.y += rect.height + TOGGLE_SPACING; + meshColumn2Width = Mathf.Max(meshColumn2Width, rect.width); + + _columnLabel.text = "Vertex Count"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowMeshColumnVertexCount = GUI.Toggle(rect, BuildReportTool.Options.ShowMeshColumnVertexCount, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredMeshDataId = MeshData.DataId.VertexCount; + } + rect.y += rect.height + TOGGLE_SPACING; + meshColumn2Width = Mathf.Max(meshColumn2Width, rect.width); + + _columnLabel.text = "Face Count"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowMeshColumnTriangleCount = GUI.Toggle(rect, BuildReportTool.Options.ShowMeshColumnTriangleCount, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredMeshDataId = MeshData.DataId.TriangleCount; + } + rect.y += rect.height + TOGGLE_SPACING; + meshColumn2Width = Mathf.Max(meshColumn2Width, rect.width); + + meshDataLowestY = Mathf.Max(meshDataLowestY, rect.y); + + #endregion + + // ----------------------------------------------------------------------- + // column 3 + + rect.x += meshColumn2Width + COLUMN_SPACING; + rect.y = toggleYStart; + + #region Mesh Column 3 + + _columnLabel.text = "Animation Type"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowMeshColumnAnimationType = GUI.Toggle(rect, BuildReportTool.Options.ShowMeshColumnAnimationType, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredMeshDataId = MeshData.DataId.AnimationType; + } + rect.y += rect.height + TOGGLE_SPACING; + + _columnLabel.text = "Animation Clip Count"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowMeshColumnAnimationClipCount = GUI.Toggle(rect, BuildReportTool.Options.ShowMeshColumnAnimationClipCount, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredMeshDataId = MeshData.DataId.AnimationClipCount; + } + rect.y += rect.height + TOGGLE_SPACING; + + meshDataLowestY = Mathf.Max(meshDataLowestY, rect.y); + + #endregion + + // ----------------------------------------------------------------------- + + float prefabColumn1Width = 0; + float prefabColumn2Width = 0; + + // column 1 + rect.x = startX; + rect.y = meshDataLowestY + 8; + + _columnLabel.text = "Prefab Data Columns:"; + rect.size = toggleHeaderStyle.CalcSize(_columnLabel); + GUI.Label(rect, _columnLabel, toggleHeaderStyle); + rect.y += rect.height - 2; + toggleYStart = rect.y; + + #region Prefab Column 1 + + _columnLabel.text = "Contribute Global Illumination"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowPrefabColumnContributeGI = GUI.Toggle(rect, BuildReportTool.Options.ShowPrefabColumnContributeGI, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredPrefabDataId = PrefabData.DataId.ContributeGI; + } + rect.y += rect.height + TOGGLE_SPACING; + prefabColumn1Width = Mathf.Max(prefabColumn1Width, rect.width); + + _columnLabel.text = "Static Batching"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowPrefabColumnBatchingStatic = GUI.Toggle(rect, BuildReportTool.Options.ShowPrefabColumnBatchingStatic, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredPrefabDataId = PrefabData.DataId.BatchingStatic; + } + rect.y += rect.height + TOGGLE_SPACING; + prefabColumn1Width = Mathf.Max(prefabColumn1Width, rect.width); + + _columnLabel.text = "Reflection Probe Static"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowPrefabColumnReflectionProbeStatic = GUI.Toggle(rect, BuildReportTool.Options.ShowPrefabColumnReflectionProbeStatic, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredPrefabDataId = PrefabData.DataId.ReflectionProbeStatic; + } + rect.y += rect.height + TOGGLE_SPACING; + prefabColumn1Width = Mathf.Max(prefabColumn1Width, rect.width); + + #endregion + + // ----------------------------------------------------------------------- + // column 2 + + rect.x += prefabColumn1Width + COLUMN_SPACING; + rect.y = toggleYStart; + + #region Prefab Column 2 + + _columnLabel.text = "Occluder Static"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowPrefabColumnOccluderStatic = GUI.Toggle(rect, BuildReportTool.Options.ShowPrefabColumnOccluderStatic, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredPrefabDataId = PrefabData.DataId.OccluderStatic; + } + rect.y += rect.height + TOGGLE_SPACING; + prefabColumn2Width = Mathf.Max(prefabColumn2Width, rect.width); + + _columnLabel.text = "Occludee Static"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowPrefabColumnOccludeeStatic = GUI.Toggle(rect, BuildReportTool.Options.ShowPrefabColumnOccludeeStatic, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredPrefabDataId = PrefabData.DataId.OccludeeStatic; + } + rect.y += rect.height + TOGGLE_SPACING; + prefabColumn2Width = Mathf.Max(prefabColumn2Width, rect.width); + + #endregion + + // ----------------------------------------------------------------------- + // column 3 + + rect.x += prefabColumn2Width + COLUMN_SPACING; + rect.y = toggleYStart; + + #region Prefab Column 3 + + _columnLabel.text = "Navigation Static"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowPrefabColumnNavigationStatic = GUI.Toggle(rect, BuildReportTool.Options.ShowPrefabColumnNavigationStatic, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredPrefabDataId = PrefabData.DataId.NavigationStatic; + } + rect.y += rect.height + TOGGLE_SPACING; + prefabColumn2Width = Mathf.Max(prefabColumn2Width, rect.width); + + _columnLabel.text = "Off-Mesh Link Generation"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + BuildReportTool.Options.ShowPrefabColumnOffMeshLinkGeneration = GUI.Toggle(rect, BuildReportTool.Options.ShowPrefabColumnOffMeshLinkGeneration, _columnLabel); + if (rect.Contains(Event.current.mousePosition)) + { + _hoveredPrefabDataId = PrefabData.DataId.OffMeshLinkGeneration; + } + rect.y += rect.height + TOGGLE_SPACING; + prefabColumn2Width = Mathf.Max(prefabColumn2Width, rect.width); + + #endregion + + // ----------------------------------------------------------------------- + + // input catcher + GUI.Button(columnOptionsBg, GUIContent.none, "HiddenScrollbar"); + } + + if (_showSearchOptions) + { + Rect searchOptionsBg = new Rect(); + searchOptionsBg.x = _searchTextfieldRect.x + 8; + searchOptionsBg.y = _searchTextfieldRect.yMax; + searchOptionsBg.width = _searchTextfieldRect.width - 11; + searchOptionsBg.height = 130; + + _mouseIsOnOverlayControl = searchOptionsBg.Contains(Event.current.mousePosition); + if (_mouseIsOnOverlayControl) + { + _hoveredTextureDataId = TextureData.DataId.None; + _hoveredMeshDataId = MeshData.DataId.None; + _hoveredPrefabDataId = PrefabData.DataId.None; + _overridenTextureDataTooltipText = null; + } + + var bgStyle = GUI.skin.FindStyle(isOverlay ? "PopupPanel" : "HiddenScrollbar"); + if (bgStyle == null) + { + bgStyle = GUI.skin.box; + } + GUI.Box(searchOptionsBg, GUIContent.none, bgStyle); + + + Rect rect = new Rect(); + rect.x = searchOptionsBg.x + 10; + rect.y = searchOptionsBg.y + 5; + + float startX = rect.x; + + var toggleHeaderStyle = GUI.skin.FindStyle("Header3"); + var radioLeftStyle = GUI.skin.FindStyle("RadioLeft"); + var radioMidStyle = GUI.skin.FindStyle("RadioMiddle"); + var radioRightStyle = GUI.skin.FindStyle("RadioRight"); + + if (toggleHeaderStyle == null) + { + toggleHeaderStyle = GUI.skin.label; + } + if (radioLeftStyle == null) + { + radioLeftStyle = GUI.skin.toggle; + } + if (radioMidStyle == null) + { + radioMidStyle = GUI.skin.toggle; + } + if (radioRightStyle == null) + { + radioRightStyle = GUI.skin.toggle; + } + + float searchTypeHeight = 0; + + _columnLabel.text = "Search Method:"; + rect.size = toggleHeaderStyle.CalcSize(_columnLabel); + GUI.Label(rect, _columnLabel, toggleHeaderStyle); + rect.y += rect.height + 5; + + _columnLabel.text = "Basic"; + rect.size = radioLeftStyle.CalcSize(_columnLabel); + var pressedBasic = GUI.Toggle(rect, BuildReportTool.Options.SearchTypeIsBasic, _columnLabel, radioLeftStyle); + if (rect.Contains(Event.current.mousePosition)) + { + _overridenTextureDataTooltipText = "Basic\n\nUse * for wildcard."; + } + rect.x += rect.width; + searchTypeHeight = Mathf.Max(searchTypeHeight, rect.height); + + if (pressedBasic && !BuildReportTool.Options.SearchTypeIsBasic) + { + BuildReportTool.Options.SearchType = SearchType.Basic; + UpdateSearchNow(buildReportToDisplay); + } + + _columnLabel.text = "Regex"; + rect.size = radioMidStyle.CalcSize(_columnLabel); + var pressedRegex = GUI.Toggle(rect, BuildReportTool.Options.SearchTypeIsRegex, _columnLabel, radioMidStyle); + if (rect.Contains(Event.current.mousePosition)) + { + _overridenTextureDataTooltipText = "Regular Expression"; + } + rect.x += rect.width; + searchTypeHeight = Mathf.Max(searchTypeHeight, rect.height); + + if (pressedRegex && !BuildReportTool.Options.SearchTypeIsRegex) + { + BuildReportTool.Options.SearchType = SearchType.Regex; + UpdateSearchNow(buildReportToDisplay); + } + + + _columnLabel.text = "Fuzzy"; + rect.size = radioRightStyle.CalcSize(_columnLabel); + var pressedFuzzy = GUI.Toggle(rect, BuildReportTool.Options.SearchTypeIsFuzzy, _columnLabel, radioRightStyle); + if (rect.Contains(Event.current.mousePosition)) + { + _overridenTextureDataTooltipText = "Fuzzy Search\n\nApproximate string matching."; + } + searchTypeHeight = Mathf.Max(searchTypeHeight, rect.height); + + if (pressedFuzzy && !BuildReportTool.Options.SearchTypeIsFuzzy) + { + BuildReportTool.Options.SearchType = SearchType.Fuzzy; + UpdateSearchNow(buildReportToDisplay); + } + + rect.x = startX; + rect.y += searchTypeHeight + 20; + + _columnLabel.text = "Search through filenames only\n(ignore path when searching)"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + rect.height += 3; + var newSearchFilenameOnly = GUI.Toggle(rect, BuildReportTool.Options.SearchFilenameOnly, _columnLabel); + if (newSearchFilenameOnly != BuildReportTool.Options.SearchFilenameOnly) + { + BuildReportTool.Options.SearchFilenameOnly = newSearchFilenameOnly; + UpdateSearchNow(buildReportToDisplay); + } + rect.y += rect.height + TOGGLE_SPACING; + + var usingFuzzy = BuildReportTool.Options.SearchTypeIsFuzzy; + GUI.enabled = prevEnabled && !usingFuzzy; + _columnLabel.text = "Case Sensitive Search"; + rect.size = GUI.skin.toggle.CalcSize(_columnLabel); + rect.width += TOGGLE_EXTRA_WIDTH; + var newSearchCaseSensitive = GUI.Toggle(rect, BuildReportTool.Options.SearchCaseSensitive, _columnLabel); + if (newSearchCaseSensitive != BuildReportTool.Options.SearchCaseSensitive) + { + BuildReportTool.Options.SearchCaseSensitive = newSearchCaseSensitive; + UpdateSearchNow(buildReportToDisplay); + } + if (usingFuzzy && rect.Contains(Event.current.mousePosition)) + { + _overridenTextureDataTooltipText = "Not applicable to Fuzzy Search. Fuzzy Search is always Case Insensitive."; + } + rect.y += rect.height + TOGGLE_SPACING; + GUI.enabled = prevEnabled; + + // input catcher + GUI.Button(searchOptionsBg, GUIContent.none, "HiddenScrollbar"); + } + } + + public override void DrawGUI(Rect position, + BuildInfo buildReportToDisplay, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, + UnityBuildReport unityBuildReport, BuildReportTool.ExtraData extraData, + out bool requestRepaint) + { + if (buildReportToDisplay == null || !buildReportToDisplay.HasUsedAssets) + { + requestRepaint = false; + return; + } + +#if BRT_ASSET_LIST_SCREEN_DEBUG + if (_debugText == null) + { + _debugText = new System.Text.StringBuilder(); + } + else + { + _debugText.Length = 0; + } +#endif + + + // init variables to use + // -------------------------------------------------------------------------- + + BuildReportTool.FileFilterGroup fileFilterGroupToUse = buildReportToDisplay.FileFilters; + + if (BuildReportTool.Options.ShouldUseConfiguredFileFilters()) + { + fileFilterGroupToUse = _configuredFileFilterGroup; + } + + BuildReportTool.AssetList listToDisplay = GetAssetListToDisplay(buildReportToDisplay); + + if (listToDisplay == null) + { + if (IsShowingUsedAssets) + { + Utility.DrawCentralMessage(position, "No \"Used Assets\" included in this build report."); + } + else if (IsShowingUnusedAssets) + { + Utility.DrawCentralMessage(position, "No \"Unused Assets\" included in this build report."); + } + + requestRepaint = false; + return; + } + + + // continually request repaint, since we need to check the rects + // generated by the GUILayout (using GUILayoutUtility.GetLastRect()) + // to make the hover checks work. GetLastRect() only works during + // repaint event. + // + // later checks below can set requestRepaint to false if there's no + // need to repaint, to help lessen cpu usage + requestRepaint = true; + + // GUI + // -------------------------------------------------------------------------- + + DrawUnderlay(buildReportToDisplay); + + GUILayout.Space(1); + + // Toolbar at top + // ------------------------------------------------ + + DrawTopBar(position, buildReportToDisplay, fileFilterGroupToUse); + + + // Actual Asset List + // ------------------------------------------------ + + if (buildReportToDisplay.HasUsedAssets) + { + DrawAssetList(position, buildReportToDisplay, assetDependencies, textureData, meshData, prefabData, + listToDisplay, fileFilterGroupToUse, BuildReportTool.Options.AssetListPaginationLength); + GUILayout.FlexibleSpace(); + } + + + // Asset Usage Panel for selected + // ------------------------------------------------ + + DrawAssetUsage(position, listToDisplay, buildReportToDisplay, assetDependencies); + + var selectedName = listToDisplay.GetSelectedCount() == 1 ? listToDisplay.GetLastSelected().Name : null; + + // .unity files (scenes) are users themselves, but no asset uses them, because they are the ones directly + // included in builds + bool selectedAssetHasUsers = listToDisplay.GetSelectedCount() == 1 && !string.IsNullOrEmpty(selectedName) && + (assetDependencies != null && assetDependencies.GetAssetDependencies().ContainsKey(selectedName)); + + bool isAssetUsagePanelShown = selectedAssetHasUsers || _selectedIsAResourcesAsset; + + + // Status bar at bottom + // ------------------------------------------------ + + // reserve space for the bottom bar + // later we draw the bottom bar using GUILayout.BeginArea/EndArea + GUILayout.Space(BOTTOM_STATUS_BAR_HEIGHT); + + var bottomBarRect = new Rect(0, 0, position.width, BOTTOM_STATUS_BAR_HEIGHT); + + if (isAssetUsagePanelShown) + { + // bottom bar is anchored to the bottom of the window + // but move it up a bit, since the bottom-most portion is now occupied by the Asset Usage Panel + bottomBarRect.y = position.height - BOTTOM_STATUS_BAR_HEIGHT - _assetUsageRect.height; + } + else + { + // bottom bar is anchored to the bottom of the window + bottomBarRect.y = position.height - BOTTOM_STATUS_BAR_HEIGHT; + } + + + // -------------------------- + + if (Event.current.mousePosition.y >= position.height || + Event.current.mousePosition.y <= _assetPathColumnHeaderRect.yMin - 5 || + Event.current.mousePosition.x <= 0 || + Event.current.mousePosition.x >= position.width) + { + if (!_mouseIsPreviouslyInWindow) + { + // mouse is outside the area that shows tooltips + // set requestRepaint to false to help lessen cpu usage + requestRepaint = false; + } + _mouseIsPreviouslyInWindow = false; + } + else + { + _mouseIsPreviouslyInWindow = true; + } + + // if mouse is too far below, above, or to the right for showing tooltip + // in main asset list, then prevent tooltip from showing in that situation + // note: this doesn't prevent tooltips in the asset usage panel + if (Event.current.type == EventType.Repaint && (Event.current.mousePosition.y >= bottomBarRect.y || + Event.current.mousePosition.y <= + _assetPathColumnHeaderRect.yMax || + Event.current.mousePosition.x >= position.width)) + { + _assetListEntryHoveredIdx = -1; + } + + var shouldShowThumbnailTooltipNow = BuildReportTool.Options.ShowTooltipThumbnail && + _shouldShowThumbnailOnHoveredAsset && + (_assetListEntryHoveredIdx != -1 || + _assetUsageAncestryHoveredIdx != -1 || + _assetUserEntryHoveredIdx != -1); + + var zoomInChanged = false; + if (shouldShowThumbnailTooltipNow) + { + var prevZoomedIn = BRT_BuildReportWindow.ZoomedInThumbnails; + + // if thumbnail is currently showing, we process the inputs + // (ctrl zooms in on thumbnail, alt toggles alpha blend) + BRT_BuildReportWindow.ProcessThumbnailControls(); + + if (prevZoomedIn != BRT_BuildReportWindow.ZoomedInThumbnails) + { + zoomInChanged = true; + } + } + else + { + // no thumbnail currently shown. ensure the controls that + // need to be reset to initial state are reset + BRT_BuildReportWindow.ResetThumbnailControls(); + } + + if (!zoomInChanged && !Event.current.alt && + !BRT_BuildReportWindow.MouseMovedNow && !BRT_BuildReportWindow.LastMouseMoved) + { + // mouse hasn't moved, and no request to zoom-in thumbnail or toggle thumbnail alpha + // no need to repaint because nothing has changed + // set requestRepaint to false to help lessen cpu usage + requestRepaint = false; + } + + // -------------------------- + // actual contents of Bottom Bar + + var statusBarBgStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.STATUS_BAR_BG_STYLE_NAME); + if (statusBarBgStyle == null) + { + statusBarBgStyle = GUI.skin.box; + } + + var statusBarLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.STATUS_BAR_LABEL_STYLE_NAME); + if (statusBarLabelStyle == null) + { + statusBarLabelStyle = GUI.skin.label; + } + + string selectedInfoLabel = string.Format( + "{0}{1}. {2}{3} ({4}%)", + Labels.SELECTED_QTY_LABEL, + listToDisplay.GetSelectedCount().ToString("N0"), + Labels.SELECTED_SIZE_LABEL, listToDisplay.GetReadableSizeOfSumSelection(), + listToDisplay.GetPercentageOfSumSelection().ToString("N")); + + GUILayout.BeginArea(bottomBarRect); + + GUILayout.BeginHorizontal(statusBarBgStyle, + BRT_BuildReportWindow.LayoutNone); + GUILayout.Label(selectedInfoLabel, statusBarLabelStyle, + BRT_BuildReportWindow.LayoutNone); + GUILayout.FlexibleSpace(); + + if (shouldShowThumbnailTooltipNow) + { + GUILayout.Label( + "Hold Ctrl to zoom-in on the thumbnail. Press Alt to show/hide alpha transparency.", + statusBarLabelStyle, + BRT_BuildReportWindow.LayoutNone); + } + else + { + GUILayout.Label( + "Click on an asset's name to include it in size calculations or batch deletions. Shift-click to select many. Ctrl-click to toggle selection.", + statusBarLabelStyle, + BRT_BuildReportWindow.LayoutNone); + } + + GUILayout.EndHorizontal(); + + GUILayout.EndArea(); + + // -------------------------- + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("Event.current.mousePosition.x: {0}\nposition.width: {1}\nshouldShowThumbnailTooltipNow: {2}\n", + Event.current.mousePosition.x.ToString(CultureInfo.InvariantCulture), + position.width.ToString(CultureInfo.InvariantCulture), + shouldShowThumbnailTooltipNow); +#endif + + // ------------------------------------------------ + + DrawOverlay(buildReportToDisplay); + + // ------------------------------------------------ + // Tooltip + + var shouldShowAssetEndUsersTooltipNow = BuildReportTool.Options.ShowAssetPrimaryUsersInTooltipIfAvailable && + BRT_BuildReportWindow.ShouldHoveredAssetShowEndUserTooltip(assetDependencies) && + (_assetListEntryHoveredIdx != -1 || + _assetUsageAncestryHoveredIdx != -1 || + _assetUserEntryHoveredIdx != -1); + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("shouldShowAssetEndUsersTooltipNow: {0}\n", + shouldShowAssetEndUsersTooltipNow); + _debugText.AppendFormat("_mouseIsOnOverlayControl: {0}\n", + _mouseIsOnOverlayControl); + _debugText.AppendFormat("_overridenTextureDataTooltipText: {0}\n", + _overridenTextureDataTooltipText); + _debugText.AppendFormat("HoveredAssetEntryPath: {0}\n", + BRT_BuildReportWindow.HoveredAssetEntryPath); +#endif + + if (Event.current.type == EventType.Repaint) + { + if (!string.IsNullOrEmpty(_overridenTextureDataTooltipText)) + { + _textureDataTooltipLabel.text = _overridenTextureDataTooltipText; + var tooltipTextStyle = GUI.skin.FindStyle("TooltipText"); + if (tooltipTextStyle == null) + { + tooltipTextStyle = GUI.skin.box; + } + + const int MAX_TOOLTIP_WIDTH = 240; + var tooltipSize = tooltipTextStyle.CalcSize(_textureDataTooltipLabel); + if (tooltipSize.x > MAX_TOOLTIP_WIDTH) + { + tooltipSize.x = MAX_TOOLTIP_WIDTH; + tooltipSize.y = tooltipTextStyle.CalcHeight(_textureDataTooltipLabel, tooltipSize.x); + } + + var tooltipRect = BRT_BuildReportWindow.DrawTooltip(position, tooltipSize.x, tooltipSize.y, 5); + GUI.Label(tooltipRect, _textureDataTooltipLabel, tooltipTextStyle); + } + else if (shouldShowThumbnailTooltipNow && shouldShowAssetEndUsersTooltipNow && !_mouseIsOnOverlayControl) + { + // draw thumbnail and end users below it + BRT_BuildReportWindow.DrawThumbnailEndUsersTooltip(position, assetDependencies, textureData); + } + else if (shouldShowAssetEndUsersTooltipNow && !_mouseIsOnOverlayControl) + { + // draw only end users in tooltip + BRT_BuildReportWindow.DrawEndUsersTooltip(position, assetDependencies); + } + else if (shouldShowThumbnailTooltipNow && !_mouseIsOnOverlayControl) + { + // draw only thumbnail in tooltip + BRT_BuildReportWindow.DrawThumbnailTooltip(position, textureData); + } + else if (_hoveredTextureDataId != BuildReportTool.TextureData.DataId.None || + _hoveredMeshDataId != BuildReportTool.MeshData.DataId.None || + _hoveredPrefabDataId != BuildReportTool.PrefabData.DataId.None) + { + if (_hoveredTextureDataId != BuildReportTool.TextureData.DataId.None) + { + _textureDataTooltipLabel.text = + BuildReportTool.TextureData.GetTooltipTextFromId(_hoveredTextureDataId); + } + else if (_hoveredMeshDataId != BuildReportTool.MeshData.DataId.None) + { + _textureDataTooltipLabel.text = BuildReportTool.MeshData.GetTooltipTextFromId(_hoveredMeshDataId); + } + else if (_hoveredPrefabDataId != BuildReportTool.PrefabData.DataId.None) + { + _textureDataTooltipLabel.text = BuildReportTool.PrefabData.GetTooltipTextFromId(_hoveredPrefabDataId); + } + + if (!string.IsNullOrEmpty(_textureDataTooltipLabel.text)) + { + var tooltipTextStyle = GUI.skin.FindStyle("TooltipText"); + if (tooltipTextStyle == null) + { + tooltipTextStyle = GUI.skin.box; + } + + const int MAX_TOOLTIP_WIDTH = 400; + var tooltipSize = tooltipTextStyle.CalcSize(_textureDataTooltipLabel); + if (tooltipSize.x > MAX_TOOLTIP_WIDTH) + { + tooltipSize.x = MAX_TOOLTIP_WIDTH; + tooltipSize.y = tooltipTextStyle.CalcHeight(_textureDataTooltipLabel, tooltipSize.x); + } + + var tooltipRect = BRT_BuildReportWindow.DrawTooltip(position, tooltipSize.x, tooltipSize.y, 5); + GUI.Label(tooltipRect, _textureDataTooltipLabel, tooltipTextStyle); + } + } + } + +#if BRT_ASSET_LIST_SCREEN_DEBUG + // Debug text + // ------------------------------------------------ + + _showDebugText = GUI.Toggle(new Rect(position.width - 90, 20, 90, 20), + _showDebugText, "Show Debug", "Button"); + + if (_showDebugText) + { + _debugLabel.text = _debugText.ToString(); + var debugStyle = GUI.skin.FindStyle("DebugOverlay"); + if (debugStyle == null) + { + debugStyle = GUI.skin.box; + } + var debugLabelSize = debugStyle.CalcSize(_debugLabel); + + var prevBgColor = GUI.backgroundColor; + GUI.backgroundColor = new Color(1, 1, 1, 0.85f); + GUI.Label(new Rect(position.width - debugLabelSize.x, 0, debugLabelSize.x, debugLabelSize.y), _debugLabel, debugStyle); + GUI.backgroundColor = prevBgColor; + } +#endif + } + + + public void ToggleSort(BuildReportTool.AssetList assetList, BuildReportTool.AssetList.SortType newSortType, BuildReportTool.FileFilterGroup fileFilters) + { + _currentTextureDataSortType = BuildReportTool.TextureData.DataId.None; + + if (_currentSortType != newSortType) + { + _currentSortType = newSortType; + _currentSortOrder = BuildReportTool.AssetList.SortOrder.Descending; // descending by default + } + else + { + // already in this sort type + // now toggle the sort order + if (_currentSortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + _currentSortOrder = BuildReportTool.AssetList.SortOrder.Ascending; + } + else if (_currentSortOrder == BuildReportTool.AssetList.SortOrder.Ascending) + { + if (_searchResults != null) + { + // clicked again while sort order is in ascending + // now disable it (which means sorting goes back to sort by search rank) + _currentSortType = BuildReportTool.AssetList.SortType.None; + _currentSortOrder = BuildReportTool.AssetList.SortOrder.None; + } + else + { + _currentSortOrder = BuildReportTool.AssetList.SortOrder.Descending; + } + } + } + + if (_searchResults != null) + { + if (_currentSortType == BuildReportTool.AssetList.SortType.None) + { + // no column used as sort + // revert to sorting by search rank + SortBySearchRank(_searchResults, _lastSearchText); + } + else + { + BuildReportTool.AssetListUtility.SortAssetList(_searchResults, _currentSortType, _currentSortOrder); + } + } + else + { + assetList.Sort(_currentSortType, _currentSortOrder, fileFilters); + } + } + + void ToggleSort(BuildReportTool.AssetList assetList, BuildReportTool.TextureData textureData, + BuildReportTool.TextureData.DataId newSortType, BuildReportTool.FileFilterGroup fileFilters) + { + if (_currentSortType != BuildReportTool.AssetList.SortType.TextureData || + _currentTextureDataSortType != newSortType) + { + _currentSortType = BuildReportTool.AssetList.SortType.TextureData; + _currentTextureDataSortType = newSortType; + _currentSortOrder = BuildReportTool.AssetList.SortOrder.Descending; // descending by default + } + else + { + // already in this sort type + // now toggle the sort order + if (_currentSortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + _currentSortOrder = BuildReportTool.AssetList.SortOrder.Ascending; + } + else if (_currentSortOrder == BuildReportTool.AssetList.SortOrder.Ascending) + { + if (_searchResults != null) + { + // clicked again while sort order is in ascending + // now disable it (which means sorting goes back to sort by search rank) + _currentSortType = BuildReportTool.AssetList.SortType.None; + _currentSortOrder = BuildReportTool.AssetList.SortOrder.None; + _currentTextureDataSortType = BuildReportTool.TextureData.DataId.None; + } + else + { + _currentSortOrder = BuildReportTool.AssetList.SortOrder.Descending; + } + } + } + + if (_searchResults != null) + { + if (_currentSortType == BuildReportTool.AssetList.SortType.None && + _currentTextureDataSortType == BuildReportTool.TextureData.DataId.None) + { + // no column used as sort + // revert to sorting by search rank + SortBySearchRank(_searchResults, _lastSearchText); + } + else + { + BuildReportTool.AssetListUtility.SortAssetList(_searchResults, textureData, _currentTextureDataSortType, _currentSortOrder); + } + } + else + { + assetList.Sort(textureData, _currentTextureDataSortType, _currentSortOrder, fileFilters); + } + } + + void ToggleSort(BuildReportTool.AssetList assetList, BuildReportTool.MeshData meshData, + BuildReportTool.MeshData.DataId newSortType, BuildReportTool.FileFilterGroup fileFilters) + { + if (_currentSortType != BuildReportTool.AssetList.SortType.MeshData || + _currentMeshDataSortType != newSortType) + { + _currentSortType = BuildReportTool.AssetList.SortType.MeshData; + _currentMeshDataSortType = newSortType; + _currentSortOrder = BuildReportTool.AssetList.SortOrder.Descending; // descending by default + } + else + { + // already in this sort type + // now toggle the sort order + if (_currentSortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + _currentSortOrder = BuildReportTool.AssetList.SortOrder.Ascending; + } + else if (_currentSortOrder == BuildReportTool.AssetList.SortOrder.Ascending) + { + if (_searchResults != null) + { + // clicked again while sort order is in ascending + // now disable it (which means sorting goes back to sort by search rank) + _currentSortType = BuildReportTool.AssetList.SortType.None; + _currentSortOrder = BuildReportTool.AssetList.SortOrder.None; + _currentMeshDataSortType = BuildReportTool.MeshData.DataId.None; + } + else + { + _currentSortOrder = BuildReportTool.AssetList.SortOrder.Descending; + } + } + } + + if (_searchResults != null) + { + if (_currentSortType == BuildReportTool.AssetList.SortType.None && + _currentMeshDataSortType == BuildReportTool.MeshData.DataId.None) + { + // no column used as sort + // revert to sorting by search rank + SortBySearchRank(_searchResults, _lastSearchText); + } + else + { + BuildReportTool.AssetListUtility.SortAssetList(_searchResults, meshData, _currentMeshDataSortType, _currentSortOrder); + } + } + else + { + assetList.Sort(meshData, _currentMeshDataSortType, _currentSortOrder, fileFilters); + } + } + + void ToggleSort(BuildReportTool.AssetList assetList, BuildReportTool.PrefabData prefabData, + BuildReportTool.PrefabData.DataId newSortType, BuildReportTool.FileFilterGroup fileFilters) + { + if (_currentSortType != BuildReportTool.AssetList.SortType.PrefabData || + _currentPrefabDataSortType != newSortType) + { + _currentSortType = BuildReportTool.AssetList.SortType.PrefabData; + _currentPrefabDataSortType = newSortType; + _currentSortOrder = BuildReportTool.AssetList.SortOrder.Descending; // descending by default + } + else + { + // already in this sort type + // now toggle the sort order + if (_currentSortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + _currentSortOrder = BuildReportTool.AssetList.SortOrder.Ascending; + } + else if (_currentSortOrder == BuildReportTool.AssetList.SortOrder.Ascending) + { + if (_searchResults != null) + { + // clicked again while sort order is in ascending + // now disable it (which means sorting goes back to sort by search rank) + _currentSortType = BuildReportTool.AssetList.SortType.None; + _currentSortOrder = BuildReportTool.AssetList.SortOrder.None; + _currentPrefabDataSortType = BuildReportTool.PrefabData.DataId.None; + } + else + { + _currentSortOrder = BuildReportTool.AssetList.SortOrder.Descending; + } + } + } + + if (_searchResults != null) + { + if (_currentSortType == BuildReportTool.AssetList.SortType.None && + _currentPrefabDataSortType == BuildReportTool.PrefabData.DataId.None) + { + // no column used as sort + // revert to sorting by search rank + SortBySearchRank(_searchResults, _lastSearchText); + } + else + { + BuildReportTool.AssetListUtility.SortAssetList(_searchResults, prefabData, _currentPrefabDataSortType, _currentSortOrder); + } + } + else + { + assetList.Sort(prefabData, _currentPrefabDataSortType, _currentSortOrder, fileFilters); + } + } + + void RefreshConfiguredFileFilters() + { + // reload used FileFilterGroup but save current used filter idx + // to be re-set afterwards + + int tempIdx = 0; + + if (_configuredFileFilterGroup != null) + { + tempIdx = _configuredFileFilterGroup.GetSelectedFilterIdx(); + } + + _configuredFileFilterGroup = BuildReportTool.FiltersUsed.GetProperFileFilterGroupToUse(); + + _configuredFileFilterGroup.ForceSetSelectedFilterIdx(tempIdx); + } + + + void DrawTopBar(Rect position, BuildInfo buildReportToDisplay, + BuildReportTool.FileFilterGroup fileFilterGroupToUse) + { + BuildReportTool.AssetList assetListUsed = GetAssetListToDisplay(buildReportToDisplay); + + if (assetListUsed == null) + { + return; + } + + Texture2D prevArrow; + var prevArrowStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.BIG_LEFT_ARROW_ICON_STYLE_NAME); + if (prevArrowStyle != null) + { + prevArrow = prevArrowStyle.normal.background; + } + else + { + prevArrow = null; + } + + Texture2D nextArrow; + var nextArrowStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.BIG_RIGHT_ARROW_ICON_STYLE_NAME); + if (nextArrowStyle != null) + { + nextArrow = nextArrowStyle.normal.background; + } + else + { + nextArrow = null; + } + + var columnStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.COLUMN_ICON_STYLE_NAME); + if (columnStyle != null) + { + _showColumnLabel.image = columnStyle.normal.background; + } + + var topBarBgStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TOP_BAR_BG_STYLE_NAME); + if (topBarBgStyle == null) + { + topBarBgStyle = GUI.skin.label; + } + + var topBarButtonStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TOP_BAR_BTN_STYLE_NAME); + if (topBarButtonStyle == null) + { + topBarButtonStyle = GUI.skin.button; + } + + var topBarLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TOP_BAR_LABEL_STYLE_NAME); + if (topBarLabelStyle == null) + { + topBarLabelStyle = GUI.skin.label; + } + + var searchDropdownStyle = GUI.skin.FindStyle("TextField-Search-DropDown"); + if (searchDropdownStyle == null) + { + searchDropdownStyle = GUI.skin.label; + } + + var searchTextStyle = GUI.skin.FindStyle("TextField-Search-Text"); + if (searchTextStyle == null) + { + searchTextStyle = GUI.skin.textField; + } + + var searchClearStyle = GUI.skin.FindStyle("TextField-Search-ClearButton"); + if (searchClearStyle == null) + { + searchClearStyle = GUI.skin.button; + } + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutHeight11); + + GUILayout.Label(" ", topBarBgStyle, BRT_BuildReportWindow.LayoutNone); + + // ------------------------------------------------------------------------------------------------------ + // File Filters + + var selectedFilterChanged = fileFilterGroupToUse.Draw(assetListUsed, position.width - 100); + + if (selectedFilterChanged) + { + _assetListEntryLastClickedIdx = -1; + _filterIdxOfLastClickedAssetListEntry = NO_FILTER_VALUE; + } + + // ------------------------------------------------------------------------------------------------------ + + GUILayout.Space(20); + + // ------------------------------------------------------------------------------------------------------ + // Unused Assets Batch + + if (IsShowingUnusedAssets && buildReportToDisplay.ProcessUnusedAssetsInBatches) + { + int batchNumber = buildReportToDisplay.UnusedAssetsBatchIdx + 1; + + bool prevButton = prevArrow != null + ? GUILayout.Button(prevArrow, topBarButtonStyle) + : GUILayout.Button("Previous", topBarButtonStyle); + if (prevButton && (batchNumber - 1 >= 1)) + { + // move to previous batch + BuildReportTool.ReportGenerator.MoveUnusedAssetsBatchToPrev(buildReportToDisplay, fileFilterGroupToUse); + } + + string batchLabel = string.Format("Batch {0}", batchNumber.ToString()); + GUILayout.Label(batchLabel, topBarLabelStyle); + + bool nextButton = nextArrow != null + ? GUILayout.Button(nextArrow, topBarButtonStyle) + : GUILayout.Button("Next", topBarButtonStyle); + if (nextButton) + { + // move to next batch + // (possible to have no new batch anymore. if so, it will just fail silently) + BuildReportTool.ReportGenerator.MoveUnusedAssetsBatchToNext(buildReportToDisplay, fileFilterGroupToUse); + } + GUILayout.Space(8); + } + + // ------------------------------------------------------------------------------------------------------ + + // ------------------------------------------------------------------------------------------------------ + // Paginate Buttons + + BuildReportTool.SizePart[] assetListToUse = assetListUsed.GetListToDisplay(fileFilterGroupToUse); + + // how many assets overall in this entire list + int assetListLength = 0; + if (_searchResults != null && _searchResults.Length > 0) + { + assetListLength = _searchResults.Length; + } + else if (assetListToUse != null) + { + assetListLength = assetListToUse.Length; + } + + // index of first asset to show, for current page. + // This is an offset from the entire asset list. + int viewOffset = _searchResults != null + ? _searchViewOffset + : assetListUsed.GetViewOffsetForDisplayedList(fileFilterGroupToUse); + + if (GUILayout.Button(prevArrow, topBarButtonStyle, + BRT_BuildReportWindow.LayoutNone) && + (viewOffset - BuildReportTool.Options.AssetListPaginationLength >= 0)) + { + if (_searchResults != null) + { + _searchViewOffset -= BuildReportTool.Options.AssetListPaginationLength; + } + else + { + assetListUsed.SetViewOffsetForDisplayedList(fileFilterGroupToUse, + viewOffset - BuildReportTool.Options.AssetListPaginationLength); + } + + _assetListScrollPos.y = 0; + } + + string paginateLabel; + + if (_showPageNumbers) + { + int totalPageNumbers = assetListLength/BuildReportTool.Options.AssetListPaginationLength; + if (assetListLength % BuildReportTool.Options.AssetListPaginationLength > 0) + { + ++totalPageNumbers; + } + + // the max number of digits for the displayed offset counters + string assetCountDigitNumFormat = string.Format("D{0}", totalPageNumbers.ToString().Length.ToString()); + + paginateLabel = string.Format("Page {0} of {1}", + ((viewOffset/BuildReportTool.Options.AssetListPaginationLength)+1).ToString(assetCountDigitNumFormat), + totalPageNumbers.ToString()); + } + else + { + // number of assets in current page + int pageLength = Mathf.Min(viewOffset + BuildReportTool.Options.AssetListPaginationLength, assetListLength); + + // the max number of digits for the displayed offset counters + string assetCountDigitNumFormat = string.Format("D{0}", assetListLength.ToString().Length.ToString()); + + int offsetNonZeroBased = viewOffset + (pageLength > 0 ? 1 : 0); + + paginateLabel = string.Format("Page {0} - {1} of {2}", + offsetNonZeroBased.ToString(assetCountDigitNumFormat), + pageLength.ToString(assetCountDigitNumFormat), + assetListLength.ToString(assetCountDigitNumFormat)); + } + + if (GUILayout.Button(paginateLabel, topBarLabelStyle, + BRT_BuildReportWindow.LayoutNone)) + { + _showPageNumbers = !_showPageNumbers; + } + + if (GUILayout.Button(nextArrow, topBarButtonStyle, + BRT_BuildReportWindow.LayoutNone) && + (viewOffset + BuildReportTool.Options.AssetListPaginationLength < assetListLength)) + { + if (_searchResults != null) + { + _searchViewOffset += BuildReportTool.Options.AssetListPaginationLength; + } + else + { + assetListUsed.SetViewOffsetForDisplayedList(fileFilterGroupToUse, + viewOffset + BuildReportTool.Options.AssetListPaginationLength); + } + + _assetListScrollPos.y = 0; + } + + // ------------------------------------------------------------------------------------------------------ + + GUILayout.FlexibleSpace(); + + var newShowColumnOptions = GUILayout.Toggle(_showColumnOptions, _showColumnLabel, + topBarButtonStyle, BRT_BuildReportWindow.LayoutNone); + if (newShowColumnOptions != _showColumnOptions) + { + _showColumnOptions = newShowColumnOptions; + if (_showColumnOptions) + { + _showSearchOptions = false; + } + } + if (Event.current.type == EventType.Repaint) + { + _showColumnOptionButtonRect = GUILayoutUtility.GetLastRect(); + } + + var newSearchOptions = GUILayout.Toggle(_showSearchOptions, GUIContent.none, searchDropdownStyle, + BRT_BuildReportWindow.LayoutNone); + if (newSearchOptions != _showSearchOptions) + { + _showSearchOptions = newSearchOptions; + if (_showSearchOptions) + { + _showColumnOptions = false; + } + } + if (Event.current.type == EventType.Repaint) + { + _searchTextfieldRect = GUILayoutUtility.GetLastRect(); + } + _searchTextInput = GUILayout.TextField(_searchTextInput, searchTextStyle, + BRT_BuildReportWindow.LayoutMinWidth200); + if (GUILayout.Button(GUIContent.none, searchClearStyle, BRT_BuildReportWindow.LayoutNone)) + { + ClearSearch(); + } + if (Event.current.type == EventType.Repaint) + { + _searchTextfieldRect.xMax = GUILayoutUtility.GetLastRect().xMax; + } + + // ------------------------------------------------------------------------------------------------------ + // Recalculate Imported sizes + // (makes sense only for unused assets) + + if ((_currentListDisplayed != ListToDisplay.UsedAssets) && + GUILayout.Button(Labels.RECALC_IMPORTED_SIZES, + topBarButtonStyle, BRT_BuildReportWindow.LayoutNone)) + { + assetListUsed.PopulateImportedSizes(); + } + + if (!BuildReportTool.Options.AutoResortAssetsWhenUnityEditorRegainsFocus && + BuildReportTool.Options.GetSizeBeforeBuildForUsedAssets && + (_currentListDisplayed == ListToDisplay.UsedAssets) && + GUILayout.Button(Labels.RECALC_SIZE_BEFORE_BUILD, + topBarButtonStyle, BRT_BuildReportWindow.LayoutNone)) + { + assetListUsed.PopulateSizeInAssetsFolder(); + } + + // ------------------------------------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------------------------------------ + // Selection buttons + + if (GUILayout.Button(Labels.SELECT_ALL_LABEL, + topBarButtonStyle, BRT_BuildReportWindow.LayoutNone)) + { + assetListUsed.AddAllDisplayedToSumSelection(fileFilterGroupToUse); + } + + if (GUILayout.Button(Labels.SELECT_NONE_LABEL, + topBarButtonStyle, BRT_BuildReportWindow.LayoutNone)) + { + assetListUsed.ClearSelection(); + _assetListEntryLastClickedIdx = -1; + _filterIdxOfLastClickedAssetListEntry = NO_FILTER_VALUE; + } + + // ------------------------------------------------------------------------------------------------------ + + + // ------------------------------------------------------------------------------------------------------ + // Delete buttons + + if (ShouldShowDeleteButtons(buildReportToDisplay)) + { + GUI.backgroundColor = Color.red; + const string DEL_SELECTED_LABEL = "Delete selected"; + if (GUILayout.Button(DEL_SELECTED_LABEL, + topBarButtonStyle, BRT_BuildReportWindow.LayoutNone)) + { + InitiateDeleteSelectedUsed(buildReportToDisplay); + } + + const string DELETE_ALL_LABEL = "Delete all"; + if (GUILayout.Button(DELETE_ALL_LABEL, + topBarButtonStyle, BRT_BuildReportWindow.LayoutNone)) + { + InitiateDeleteAllUnused(buildReportToDisplay); + } + + GUI.backgroundColor = Color.white; + } + + // ------------------------------------------------------------------------------------------------------ + + GUILayout.EndHorizontal(); + + + GUILayout.Space(5); + } + + + GUIStyle GetColumnHeaderStyle(BuildReportTool.AssetList.SortType sortTypeNeeded) + { + string styleResult = BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_STYLE_NAME; + + if (_currentSortType == sortTypeNeeded) + { + if (_currentSortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + styleResult = BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_DESC_STYLE_NAME; + } + else + { + styleResult = BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_ASC_STYLE_NAME; + } + } + + var style = GUI.skin.FindStyle(styleResult); + if (style == null) + { + style = GUI.skin.label; + } + + return style; + } + + void DrawAssetList(Rect position, + BuildReportTool.BuildInfo buildReportToDisplay, BuildReportTool.AssetDependencies assetDependencies, + BuildReportTool.TextureData textureData, BuildReportTool.MeshData meshData, BuildReportTool.PrefabData prefabData, + BuildReportTool.AssetList list, BuildReportTool.FileFilterGroup filter, int length) + { + if (list == null) + { + return; + } + + if (_searchResults != null && _searchResults.Length == 0) + { + DrawCentralMessage(position, "No search results"); + return; + } + + var listEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_STYLE_NAME); + if (listEntryStyle == null) + { + listEntryStyle = GUI.skin.label; + } + + var listAltEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_ALT_STYLE_NAME); + if (listAltEntryStyle == null) + { + listAltEntryStyle = GUI.skin.label; + } + + var listSelectedEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_SELECTED_NAME); + if (listSelectedEntryStyle == null) + { + listSelectedEntryStyle = GUI.skin.label; + } + + BuildReportTool.SizePart[] assetListToUse; + + var hasSearchResults = _searchResults != null; + + if (hasSearchResults && _searchResults.Length > 0) + { + assetListToUse = _searchResults; + } + else + { + assetListToUse = list.GetListToDisplay(filter); + } + + if (assetListToUse == null) + { + return; + } + + var messageStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME); + if (messageStyle == null) + { + messageStyle = GUI.skin.label; + } + + if (assetListToUse.Length == 0) + { + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Space(10); + GUILayout.Label(Labels.NO_FILES_FOR_THIS_CATEGORY_LABEL, + messageStyle, BRT_BuildReportWindow.LayoutNone); + GUILayout.EndHorizontal(); + + return; + } + + var hiddenHorizontalScrollbarStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME); + if (hiddenHorizontalScrollbarStyle == null) + { + hiddenHorizontalScrollbarStyle = GUI.skin.horizontalScrollbar; + } + + var hiddenVerticalScrollbarStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME); + if (hiddenVerticalScrollbarStyle == null) + { + hiddenVerticalScrollbarStyle = GUI.skin.verticalScrollbar; + } + + var textureStyle = GUI.skin.FindStyle("DrawTexture"); + if (textureStyle == null) + { + textureStyle = GUI.skin.label; + } + + var listButtonStyle = GUI.skin.FindStyle("ListButton"); + if (listButtonStyle == null) + { + listButtonStyle = GUI.skin.button; + } + + EditorGUIUtility.SetIconSize(BRT_BuildReportWindow.IconSize); + + int viewOffset = hasSearchResults ? _searchViewOffset : list.GetViewOffsetForDisplayedList(filter); + + // if somehow view offset was out of bounds of the SizePart[] array + // reset it to zero + if (viewOffset >= assetListToUse.Length) + { + list.SetViewOffsetForDisplayedList(filter, 0); + viewOffset = 0; + } + + int len = Mathf.Min(viewOffset + length, assetListToUse.Length); + + // -------------------------------------------------------------------------------------------------------- + + var showTextureColumns = filter.SelectedFilterIdx >= 0 && + filter.GetSelectedFilterLabel() == BuildReportTool.Options.FileFilterNameForTextureData && + textureData != null && + textureData.HasContents; + + var showMeshColumns = filter.SelectedFilterIdx >= 0 && + filter.GetSelectedFilterLabel() == BuildReportTool.Options.FileFilterNameForMeshData && + meshData != null && + meshData.HasContents; + + var showPrefabColumns = filter.SelectedFilterIdx >= 0 && + filter.GetSelectedFilterLabel() == BuildReportTool.Options.FileFilterNameForPrefabData && + prefabData != null && + prefabData.HasContents; + + // -------------------------------------------------------------------------------------------------------- + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + + // -------------------------------------------------------------------------------------------------------- + + #region Column: Asset Path and Name + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + var useAlt = false; + + #region Header + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + + Rect assetPathCheckboxRect = _assetPathColumnHeaderRect; + assetPathCheckboxRect.x += 5; + assetPathCheckboxRect.y += 1; + assetPathCheckboxRect.width = 20; + assetPathCheckboxRect.height -= 1; + + BuildReportTool.Options.ShowColumnAssetPath = GUI.Toggle(assetPathCheckboxRect, BuildReportTool.Options.ShowColumnAssetPath, _assetPathCheckboxLabel); + + var sortTypeAssetFullPathStyleName = GetColumnHeaderStyle(BuildReportTool.AssetList.SortType.AssetFullPath); + if (GUILayout.Button(" Asset Path", sortTypeAssetFullPathStyleName, + BRT_BuildReportWindow.LayoutListHeight)) + { + ToggleSort(list, BuildReportTool.AssetList.SortType.AssetFullPath, filter); + } + + if (Event.current.type == EventType.Repaint) + { + _assetPathColumnHeaderRect = GUILayoutUtility.GetLastRect(); +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("_assetPathColumnHeaderRect: {0}\nyMax: {1}\n", _assetPathColumnHeaderRect.ToString(), + _assetPathColumnHeaderRect.yMax.ToString(CultureInfo.InvariantCulture)); +#endif + } + + GUI.Toggle(assetPathCheckboxRect, BuildReportTool.Options.ShowColumnAssetPath, _assetPathCheckboxLabel); + + // ----------------------------------------------------------------- + + var sortTypeAssetFilenameStyleName = GetColumnHeaderStyle(BuildReportTool.AssetList.SortType.AssetFilename); + if (GUILayout.Button("Asset Filename", sortTypeAssetFilenameStyleName, BRT_BuildReportWindow.LayoutListHeight)) + { + ToggleSort(list, BuildReportTool.AssetList.SortType.AssetFilename, filter); + } + + GUILayout.EndHorizontal(); + #endregion + + // -------------------------------------------------------------------------------------------------------- + + var newEntryHoveredIdx = -1; + + _assetListScrollPos = GUILayout.BeginScrollView(_assetListScrollPos, + hiddenHorizontalScrollbarStyle, + hiddenVerticalScrollbarStyle, BRT_BuildReportWindow.LayoutNone); + + var mousePos = Event.current.mousePosition; + + for (int n = viewOffset; n < len; ++n) + { + BuildReportTool.SizePart b = assetListToUse[n]; + + var styleToUse = useAlt + ? listAltEntryStyle + : listEntryStyle; + bool inSumSelect = list.InSumSelection(b); + if (inSumSelect) + { + styleToUse = listSelectedEntryStyle; + } + + #region Entry Bg + GUILayout.BeginHorizontal(styleToUse, BRT_BuildReportWindow.LayoutNone); + + + if (!BuildReportTool.Options.DoubleClickOnAssetWillPing) + { + // only asset entries inside the top-level Assets or Packages folder can be pinged + if (b.Name.IsInAssetsFolder() || b.Name.IsInPackagesFolder()) + { + if (GUILayout.Button("Ping", listButtonStyle, BRT_BuildReportWindow.LayoutPingButton)) + { + if (list.GetSelectedCount() > 1 && list.InSumSelection(b) && Event.current.alt) + { + // ping multiple + Utility.PingSelectedAssets(list); + } + else + { + Utility.PingAssetInProject(b.Name); + } + } + } + else + { + // add spacing where the ping button would be, + // so that this entry aligns with the rest + GUILayout.Space(38); + } + } + + + _assetListEntry.image = AssetDatabase.GetCachedIcon(b.Name); + var hasIcon = _assetListEntry.image != null; + + var mouseIsOnEmptySpaceForIcon = false; + + if (!hasIcon) + { + // entry has no icon, just add space so it aligns with the other entries + GUILayout.Label(string.Empty, textureStyle, BRT_BuildReportWindow.LayoutIconWidth); + + if (Event.current.type == EventType.Repaint) + { + var emptySpaceForIconRect = GUILayoutUtility.GetLastRect(); + if (emptySpaceForIconRect.Contains(mousePos)) + { + mouseIsOnEmptySpaceForIcon = true; + } + } + } + + _assetListEntry.text = GetPrettyAssetPath(b.Name, n, BuildReportTool.Options.ShowColumnAssetPath, inSumSelect); + + Color temp = styleToUse.normal.textColor; + int origLeft = styleToUse.padding.left; + int origRight = styleToUse.padding.right; + + styleToUse.normal.textColor = styleToUse.onNormal.textColor; + styleToUse.padding.right = 0; + + styleToUse.normal.textColor = temp; + styleToUse.padding.left = 2; + + // the asset icon and name + + if (GUILayout.Button(_assetListEntry, styleToUse, BRT_BuildReportWindow.LayoutListHeight)) + { + if (Event.current.control) + { + if (!inSumSelect) + { + list.AddToSumSelection(b); + _assetListEntryLastClickedIdx = n; + } + else + { + list.ToggleSumSelection(b); + _assetListEntryLastClickedIdx = -1; + } + } + else if (Event.current.shift) + { + if (_assetListEntryLastClickedIdx != -1) + { + // select all from last clicked to here + if (_assetListEntryLastClickedIdx < n) + { + for (int addToSelectIdx = _assetListEntryLastClickedIdx; addToSelectIdx <= n; ++addToSelectIdx) + { + list.AddToSumSelection(assetListToUse[addToSelectIdx]); + } + } + else if (_assetListEntryLastClickedIdx > n) + { + for (int addToSelectIdx = n; addToSelectIdx <= _assetListEntryLastClickedIdx; ++addToSelectIdx) + { + list.AddToSumSelection(assetListToUse[addToSelectIdx]); + } + } + } + else + { + list.AddToSumSelection(b); + } + + _assetListEntryLastClickedIdx = n; + } + else + { + // single select + // ----------------------------- + + // double-click detection for pinging + if (BuildReportTool.Options.DoubleClickOnAssetWillPing && + (EditorApplication.timeSinceStartup - _assetListEntryLastClickedTime) < DOUBLE_CLICK_THRESHOLD && + (b.Name.IsInAssetsFolder() || b.Name.IsInPackagesFolder())) + { + if (list.GetSelectedCount() > 1 && list.InSumSelection(b) && Event.current.alt) + { + // double-clicking on one of the selected assets while holding alt + // ping multiple + Utility.PingSelectedAssets(list); + } + else if (_assetListEntryLastClickedIdx == n) + { + // 2nd click on the same asset (i.e. double-click) + Utility.PingAssetInProject(b.Name); + } + } + + + // -------------------- + // selecting a different asset + // click with no ctrl, alt, or shift + if ((_assetListEntryLastClickedIdx != n || + _filterIdxOfLastClickedAssetListEntry != filter.SelectedFilterIdx) && + !Event.current.alt) + { + list.ClearSelection(); + list.AddToSumSelection(b); + + _assetListEntryLastClickedIdx = n; + _filterIdxOfLastClickedAssetListEntry = filter.SelectedFilterIdx; + + // -------------------- + // update what's shown in the Asset Usage Panel + + if (b.Name.IsInResourcesFolder()) + { + // this is a Resources asset + _selectedIsAResourcesAsset = true; + _selectedResourcesAssetPath = b.Name; + _selectedResourcesAsset.text = _selectedResourcesAssetPath.GetFileNameOnly(); + _selectedResourcesAsset.image = AssetDatabase.GetCachedIcon(_selectedResourcesAssetPath); + } + else + { + _selectedIsAResourcesAsset = false; + _selectedResourcesAssetPath = null; + } + + if (_selectedAssetUsageDisplayIdx == ASSET_USAGE_DISPLAY_ALL) + { + _selectedAssetUserIdx = -1; + _assetUsageAncestry.Clear(); + SetAssetUsageHistoryToFirstEndUser(b.Name, assetDependencies); + } + else if (_selectedAssetUsageDisplayIdx == ASSET_USAGE_DISPLAY_DIRECT) + { + ChangeAssetUserCrumbRootIfNeeded(b.Name); + } + } + + _assetListEntryLastClickedTime = EditorApplication.timeSinceStartup; + } + } + + styleToUse.padding.right = origRight; + styleToUse.padding.left = origLeft; + + +#if BRT_ASSET_LIST_SCREEN_DEBUG + //_debugText.AppendFormat("mousePos: {0}\n", mousePos.ToString()); +#endif + + if (Event.current.type == EventType.Repaint) + { + // Have to do this during Repaint event because + // GUILayoutUtility.GetLastRect() only works during that time. + // + // The problem is that our hover check should really only be done during + // MouseMove event instead. The way it is right now, doing the hover check + // every Repaint event, means it's doing this check over and over + // even if the mouse is sitting still at the same position. + // + // However, we do mitigate this by not calling EditorWindow.Repaint() if + // it's not needed. + // + // Also, getting GetLastRect() during Repaint event and then using + // that value during MouseMove event means having to store the rect value + // in a variable. Since we're checking for each entry in the asset list, + // we'd have to store all the rects in a List + // (we have one rect for each entry in the asset list). + // + // I don't know if that is too much processing, + // so I'm leaving the code the way it is right now. + + var assetListEntryRect = GUILayoutUtility.GetLastRect(); + + // note: Rects of the asset list entries do not overlap. + // So actually, throughout all the iterations of this for-loop, + // this if can only be successful once. + if (assetListEntryRect.Contains(mousePos) || mouseIsOnEmptySpaceForIcon) + { + newEntryHoveredIdx = n; + + // ---------------- + // update what is considered the hovered asset, for use later on + // when the tooltip will be drawn + BRT_BuildReportWindow.UpdateHoveredAsset(b.Name, assetListEntryRect, IsShowingUsedAssets, + buildReportToDisplay, assetDependencies); + + // ---------------- + // put a border on the icon to signify that it's the one being hovered + // note: _assetListEntry.image currently has the icon of the asset we hovered + Rect iconHoveredRect = assetListEntryRect; + if (_assetListEntry.image != null) + { + iconHoveredRect.x += 1; + } + else + { + iconHoveredRect.x -= 15; + } + + iconHoveredRect.y += 2; + iconHoveredRect.width = 17; + iconHoveredRect.height = 16; + + var iconHoveredStyle = GUI.skin.FindStyle("IconHovered"); + if (iconHoveredStyle == null) + { + iconHoveredStyle = GUI.skin.label; + } + GUI.Box(iconHoveredRect, _assetListEntry.image, iconHoveredStyle); + + // ---------------- + // if mouse is hovering over the correct area, we signify that + // the tooltip thumbnail should be drawn + if (BuildReportTool.Options.ShowTooltipThumbnail && + (BuildReportTool.Options.ShowThumbnailOnHoverLabelToo || + Mathf.Abs(mousePos.x - assetListEntryRect.x) < BRT_BuildReportWindow.ICON_WIDTH_WITH_PADDING) && + BRT_BuildReportWindow.GetAssetPreview(b.Name) != null) + { + _shouldShowThumbnailOnHoveredAsset = true; + } + else + { + _shouldShowThumbnailOnHoveredAsset = false; + } + } + } + + + GUILayout.EndHorizontal(); + #endregion + + useAlt = !useAlt; + } // end of for-loop for drawing all asset names + + if (Event.current.type == EventType.Repaint) + { + _assetListEntryHoveredIdx = newEntryHoveredIdx; + } + + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("_assetListEntryLastClickedTime: {0}\n", + _assetListEntryLastClickedTime.ToString(CultureInfo.InvariantCulture)); + _debugText.AppendFormat("_assetListEntryHovered: {0}\n", _assetListEntryHoveredIdx.ToString()); +#endif + + + GUILayout.Space(SCROLLBAR_BOTTOM_PADDING); + + GUILayout.EndScrollView(); + + GUILayout.EndVertical(); // end of column: asset path and name + #endregion + + // -------------------------------------------------------------------------------------------------------- + + #region Columns: Texture Data + + if (Event.current.type == EventType.Repaint) + { + _hoveredTextureDataId = BuildReportTool.TextureData.DataId.None; + _overridenTextureDataTooltipText = null; + } + + _clickedTextureDataId = BuildReportTool.TextureData.DataId.None; + + if (showTextureColumns) + { + if (BuildReportTool.Options.ShowTextureColumnTextureType) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.TextureType, "Type", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnIsSRGB) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.IsSRGB, "Is sRGB?", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnAlphaSource) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.AlphaSource, "Alpha Source", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnAlphaIsTransparency) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.AlphaIsTransparency, "Alpha is Transparency", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnIgnorePngGamma) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.IgnorePngGamma, "Ignore PNG Gamma", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnIsReadable) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.IsReadable, "Read/Write Enabled", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + // ------------------------------- + if (BuildReportTool.Options.ShowTextureColumnMipMapGenerated) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.MipMapGenerated, "MipMap Generated", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnMipMapFilter) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.MipMapFilter, "MipMap Filter", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnStreamingMipMaps) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.StreamingMipMaps, "Streaming MipMaps", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnBorderMipMaps) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.BorderMipMaps, "Border MipMaps", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnPreserveCoverageMipMaps) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.PreserveCoverageMipMaps, "Preserve Coverage MipMaps", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnFadeOutMipMaps) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.FadeOutMipMaps, "Fade Out MipMaps", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + // ------------------------------- + if (BuildReportTool.Options.ShowTextureColumnSpriteImportMode) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.SpriteImportMode, "Sprite Mode", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnSpritePackingTag) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.SpritePackingTag, "Sprite Packing Tag", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnSpritePixelsPerUnit) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.SpritePixelsPerUnit, "Sprite Pixels-Per-Unit", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnQualifiesForSpritePacking) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.QualifiesForSpritePacking, "Qualifies for Sprite Packing", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnWrapMode) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.WrapMode, "Wrap Mode", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnWrapModeU) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.WrapModeU, "Wrap Mode U", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnWrapModeV) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.WrapModeV, "Wrap Mode V", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnWrapModeW) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.WrapModeW, "Wrap Mode W", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + // ------------------------------- + if (BuildReportTool.Options.ShowTextureColumnFilterMode) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.FilterMode, "Filter Mode", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnAnisoLevel) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.AnisoLevel, "Anisotropic Level", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + // ------------------------------- + if (BuildReportTool.Options.ShowTextureColumnTextureFormat) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.TextureFormat, "Format", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnCompressionType) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.CompressionType, "Compression Type", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnCompressionIsCrunched) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.CompressionIsCrunched, "Compression Crunched", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnCompressionQuality) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.CompressionQuality, "Compression Quality", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + // ------------------------------- + if (BuildReportTool.Options.ShowTextureColumnResizeAlgorithm) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.TextureResizeAlgorithm, "Resize Algorithm", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnMaxTextureSize) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.MaxTextureSize, "Max Size", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnNPotScale) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.NPotScale, "Non-Power Of 2 Scale", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnImportedWidthAndHeight) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.ImportedWidthAndHeight, "Imported Width & Height", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowTextureColumnRealWidthAndHeight) + { + DrawTextureDataColumn(viewOffset, len, + BuildReportTool.TextureData.DataId.RealWidthAndHeight, "Source Width & Height", + true, false, list, textureData, + assetListToUse, ref _assetListScrollPos); + } + // ------------------------------- + + if (_clickedTextureDataId != BuildReportTool.TextureData.DataId.None) + { + ToggleSort(list, textureData, _clickedTextureDataId, filter); + _clickedTextureDataId = BuildReportTool.TextureData.DataId.None; + } + } + #endregion + + // -------------------------------------------------------------------------------------------------------- + + #region Columns: Mesh Data + + if (Event.current.type == EventType.Repaint) + { + _hoveredMeshDataId = BuildReportTool.MeshData.DataId.None; + } + + _clickedMeshDataId = BuildReportTool.MeshData.DataId.None; + + if (showMeshColumns) + { + if (BuildReportTool.Options.ShowMeshColumnMeshFilterCount) + { + DrawMeshDataColumn(viewOffset, len, + BuildReportTool.MeshData.DataId.MeshFilterCount, "Non-skinned", + true, false, list, meshData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowMeshColumnSkinnedMeshRendererCount) + { + DrawMeshDataColumn(viewOffset, len, + BuildReportTool.MeshData.DataId.SkinnedMeshRendererCount, "Skinned", + true, false, list, meshData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowMeshColumnSubMeshCount) + { + DrawMeshDataColumn(viewOffset, len, + BuildReportTool.MeshData.DataId.SubMeshCount, "SubMesh Count", + true, false, list, meshData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowMeshColumnVertexCount) + { + DrawMeshDataColumn(viewOffset, len, + BuildReportTool.MeshData.DataId.VertexCount, "Vertices", + true, false, list, meshData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowMeshColumnTriangleCount) + { + DrawMeshDataColumn(viewOffset, len, + BuildReportTool.MeshData.DataId.TriangleCount, "Faces", + true, false, list, meshData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowMeshColumnAnimationType) + { + DrawMeshDataColumn(viewOffset, len, + BuildReportTool.MeshData.DataId.AnimationType, "Animation Type", + true, false, list, meshData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowMeshColumnAnimationClipCount) + { + DrawMeshDataColumn(viewOffset, len, + BuildReportTool.MeshData.DataId.AnimationClipCount, "Animations", + true, false, list, meshData, + assetListToUse, ref _assetListScrollPos); + } + + // ------------------------------- + + if (_clickedMeshDataId != BuildReportTool.MeshData.DataId.None) + { + ToggleSort(list, meshData, _clickedMeshDataId, filter); + _clickedMeshDataId = BuildReportTool.MeshData.DataId.None; + } + } + + #endregion + + // -------------------------------------------------------------------------------------------------------- + + #region Columns: Prefab Data + + if (Event.current.type == EventType.Repaint) + { + _hoveredPrefabDataId = BuildReportTool.PrefabData.DataId.None; + } + + _clickedPrefabDataId = BuildReportTool.PrefabData.DataId.None; + + if (showPrefabColumns) + { + if (BuildReportTool.Options.ShowPrefabColumnContributeGI) + { + DrawPrefabDataColumn(viewOffset, len, + BuildReportTool.PrefabData.DataId.ContributeGI, "ContributeGI", + true, false, list, prefabData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowPrefabColumnBatchingStatic) + { + DrawPrefabDataColumn(viewOffset, len, + BuildReportTool.PrefabData.DataId.BatchingStatic, "Static Batching", + true, false, list, prefabData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowPrefabColumnOccluderStatic) + { + DrawPrefabDataColumn(viewOffset, len, + BuildReportTool.PrefabData.DataId.OccluderStatic, "Occluder Static", + true, false, list, prefabData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowPrefabColumnOccludeeStatic) + { + DrawPrefabDataColumn(viewOffset, len, + BuildReportTool.PrefabData.DataId.OccludeeStatic, "Occludee Static", + true, false, list, prefabData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowPrefabColumnReflectionProbeStatic) + { + DrawPrefabDataColumn(viewOffset, len, + BuildReportTool.PrefabData.DataId.ReflectionProbeStatic, "Reflection Probe Static", + true, false, list, prefabData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowPrefabColumnNavigationStatic) + { + DrawPrefabDataColumn(viewOffset, len, + BuildReportTool.PrefabData.DataId.NavigationStatic, "Navigation Static", + true, false, list, prefabData, + assetListToUse, ref _assetListScrollPos); + } + if (BuildReportTool.Options.ShowPrefabColumnOffMeshLinkGeneration) + { + DrawPrefabDataColumn(viewOffset, len, + BuildReportTool.PrefabData.DataId.OffMeshLinkGeneration, "Off-Mesh Link Generation", + true, false, list, prefabData, + assetListToUse, ref _assetListScrollPos); + } + + // ------------------------------- + + if (_clickedPrefabDataId != BuildReportTool.PrefabData.DataId.None) + { + ToggleSort(list, prefabData, _clickedPrefabDataId, filter); + _clickedPrefabDataId = BuildReportTool.PrefabData.DataId.None; + } + } + + #endregion + + // -------------------------------------------------------------------------------------------------------- + + #region Column: Raw File Size (Size Before Build) + + bool pressedRawSizeSortBtn = false; + + bool pressedSizeBeforeBuildSortBtn = false; + + if (IsShowingUsedAssets && BuildReportTool.Options.ShowColumnSizeBeforeBuild && (assetListToUse[0].SizeInAssetsFolderBytes != -1)) + { + pressedSizeBeforeBuildSortBtn = DrawColumn(viewOffset, len, + BuildReportTool.AssetList.SortType.SizeBeforeBuild, "Size Before Build ", true, false, + list, assetListToUse, (b) => b.SizeInAssetsFolder, ref _assetListScrollPos); + } + + if (IsShowingUsedAssets && BuildReportTool.Options.ShowColumnSizeInBuild && BuildReportTool.Options.ShowImportedSizeForUsedAssets) + { + pressedRawSizeSortBtn = DrawColumn(viewOffset, len, + BuildReportTool.AssetList.SortType.ImportedSizeOrRawSize, "Size In Build", true, false, + list, assetListToUse, (b) => + { + // assets in the "StreamingAssets" folder do not have an imported size + // in those cases, the raw size is the same as the imported size + // so just use the raw size + if (b.ImportedSize == "N/A") + { + return b.RawSize; + } + + return b.ImportedSize; + }, ref _assetListScrollPos); + } + + if ((IsShowingUnusedAssets && BuildReportTool.Options.ShowColumnUnusedRawSize) || + (IsShowingUsedAssets && BuildReportTool.Options.ShowColumnSizeInBuild && !BuildReportTool.Options.ShowImportedSizeForUsedAssets)) + { + pressedRawSizeSortBtn = DrawColumn(viewOffset, len, BuildReportTool.AssetList.SortType.RawSize, + (IsShowingUnusedAssets ? "Raw Size" : "Size In Build"), true, false, + list, assetListToUse, (b) => b.RawSize, ref _assetListScrollPos); + } + + #endregion + + bool showScrollbarForImportedSize = IsShowingUnusedAssets; + + // -------------------------------------------------------------------------------------------------------- + + #region Column: Imported File Size + + bool pressedImpSizeSortBtn = false; + + if (IsShowingUnusedAssets && BuildReportTool.Options.ShowColumnUnusedImportedSize) + { + pressedImpSizeSortBtn = DrawColumn(viewOffset, len, BuildReportTool.AssetList.SortType.ImportedSize, + "Imported Size ", true, showScrollbarForImportedSize, + list, assetListToUse, (b) => b.ImportedSize, ref _assetListScrollPos); + } + + #endregion + + // -------------------------------------------------------------------------------------------------------- + + #region Column: Percentage to Total Size + + bool pressedPercentSortBtn = false; + + if (IsShowingUsedAssets) + { + pressedPercentSortBtn = DrawColumn(viewOffset, len, BuildReportTool.AssetList.SortType.PercentSize, + "Percent ", true, true, + list, assetListToUse, (b) => + { + string text = string.Format("{0}%", b.Percentage.ToString(CultureInfo.InvariantCulture)); + if (b.Percentage < 0) + { + text = Labels.NON_APPLICABLE_PERCENTAGE_LABEL; + } + + return text; + }, ref _assetListScrollPos); + } + + #endregion + + // -------------------------------------------------------------------------------------------------------- + + #region Handle Sort Change + + if (pressedRawSizeSortBtn) + { + var sortType = BuildReportTool.AssetList.SortType.RawSize; + if (IsShowingUsedAssets && BuildReportTool.Options.ShowImportedSizeForUsedAssets) + { + sortType = BuildReportTool.AssetList.SortType.ImportedSizeOrRawSize; + } + + ToggleSort(list, sortType, filter); + } + else if (pressedSizeBeforeBuildSortBtn) + { + ToggleSort(list, BuildReportTool.AssetList.SortType.SizeBeforeBuild, filter); + } + else if (pressedImpSizeSortBtn) + { + ToggleSort(list, BuildReportTool.AssetList.SortType.ImportedSize, filter); + } + else if (pressedPercentSortBtn) + { + ToggleSort(list, BuildReportTool.AssetList.SortType.PercentSize, filter); + } + + #endregion + + GUILayout.EndHorizontal(); + } + + public static string GetPathColor(bool inSumSelect) + { + const string PATH_COLOR_UNSELECTED_WHITE_SKIN = "4f4f4fff"; + const string PATH_COLOR_SELECTED_WHITE_SKIN = "cececeff"; + + const string PATH_COLOR_UNSELECTED_DARK_SKIN = "767676ff"; + const string PATH_COLOR_SELECTED_DARK_SKIN = "c2c2c2ff"; + + string colorUsedForPath = PATH_COLOR_UNSELECTED_WHITE_SKIN; + if (EditorGUIUtility.isProSkin || BRT_BuildReportWindow.FORCE_USE_DARK_SKIN) + { + colorUsedForPath = PATH_COLOR_UNSELECTED_DARK_SKIN; + } + + if (inSumSelect) + { + if (EditorGUIUtility.isProSkin || BRT_BuildReportWindow.FORCE_USE_DARK_SKIN) + { + colorUsedForPath = PATH_COLOR_SELECTED_DARK_SKIN; + } + else + { + colorUsedForPath = PATH_COLOR_SELECTED_WHITE_SKIN; + } + } + + return colorUsedForPath; + } + + + delegate string ColumnDisplayDelegate(BuildReportTool.SizePart b); + + bool DrawColumn(int sta, int end, BuildReportTool.AssetList.SortType columnType, string columnName, + bool allowSort, + bool showScrollbar, BuildReportTool.AssetList assetListCollection, BuildReportTool.SizePart[] assetList, + ColumnDisplayDelegate dataToDisplay, ref Vector2 scrollbarPos) + { + bool buttonPressed = false; + + var hiddenHorizontalScrollbarStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME); + if (hiddenHorizontalScrollbarStyle == null) + { + hiddenHorizontalScrollbarStyle = GUI.skin.horizontalScrollbar; + } + + var hiddenVerticalScrollbarStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME); + if (hiddenVerticalScrollbarStyle == null) + { + hiddenVerticalScrollbarStyle = GUI.skin.verticalScrollbar; + } + + var verticalScrollbarStyle = GUI.skin.verticalScrollbar; + + var listEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_STYLE_NAME); + if (listEntryStyle == null) + { + listEntryStyle = GUI.skin.label; + } + + var listAltEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_ALT_STYLE_NAME); + if (listAltEntryStyle == null) + { + listAltEntryStyle = GUI.skin.label; + } + + var listSelectedEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_SELECTED_NAME); + if (listSelectedEntryStyle == null) + { + listSelectedEntryStyle = GUI.skin.label; + } + + // ---------------------------------------------------------- + + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + + // ---------------------------------------------------------- + // column header + string sortTypeStyleName = BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_STYLE_NAME; + if (allowSort && _currentSortType == columnType) + { + if (_currentSortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + sortTypeStyleName = BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_DESC_STYLE_NAME; + } + else + { + sortTypeStyleName = BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_ASC_STYLE_NAME; + } + } + var sortTypeStyle = GUI.skin.FindStyle(sortTypeStyleName); + if (sortTypeStyle == null) + { + sortTypeStyle = GUI.skin.label; + } + + if (GUILayout.Button(columnName, sortTypeStyle, BRT_BuildReportWindow.LayoutListHeight) && allowSort) + { + buttonPressed = true; + } + + + // ---------------------------------------------------------- + // scrollbar + if (showScrollbar) + { + scrollbarPos = GUILayout.BeginScrollView(scrollbarPos, + hiddenHorizontalScrollbarStyle, + verticalScrollbarStyle, BRT_BuildReportWindow.LayoutNone); + } + else + { + scrollbarPos = GUILayout.BeginScrollView(scrollbarPos, + hiddenHorizontalScrollbarStyle, + hiddenVerticalScrollbarStyle, BRT_BuildReportWindow.LayoutNone); + } + + + // ---------------------------------------------------------- + // actual contents + bool useAlt = false; + + for (int n = sta; n < end; ++n) + { + var b = assetList[n]; + + var styleToUse = useAlt ? listAltEntryStyle : listEntryStyle; + if (assetListCollection.InSumSelection(b)) + { + styleToUse = listSelectedEntryStyle; + } + + GUILayout.Label(dataToDisplay(b), styleToUse, BRT_BuildReportWindow.LayoutListHeightMinWidth90); + + useAlt = !useAlt; + } + + GUILayout.Space(SCROLLBAR_BOTTOM_PADDING); + + GUILayout.EndScrollView(); + + GUILayout.EndVertical(); + + return buttonPressed; + } + + void DrawTextureDataColumn(int sta, int end, TextureData.DataId textureDataId, string columnName, + bool allowSort, bool showScrollbar, BuildReportTool.AssetList assetListCollection, TextureData textureData, + SizePart[] assetList, ref Vector2 scrollbarPos) + { + var hiddenHorizontalScrollbarStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME); + if (hiddenHorizontalScrollbarStyle == null) + { + hiddenHorizontalScrollbarStyle = GUI.skin.horizontalScrollbar; + } + + var hiddenVerticalScrollbarStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME); + if (hiddenVerticalScrollbarStyle == null) + { + hiddenVerticalScrollbarStyle = GUI.skin.verticalScrollbar; + } + + var verticalScrollbarStyle = GUI.skin.verticalScrollbar; + + var listEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_STYLE_NAME); + if (listEntryStyle == null) + { + listEntryStyle = GUI.skin.label; + } + + var listAltEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_ALT_STYLE_NAME); + if (listAltEntryStyle == null) + { + listAltEntryStyle = GUI.skin.label; + } + + var listSelectedEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_SELECTED_NAME); + if (listSelectedEntryStyle == null) + { + listSelectedEntryStyle = GUI.skin.label; + } + + // ---------------------------------------------------------- + + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + + // ---------------------------------------------------------- + // column header + string sortTypeStyleName = BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_STYLE_NAME; + if (allowSort && _currentSortType == BuildReportTool.AssetList.SortType.TextureData && _currentTextureDataSortType == textureDataId) + { + if (_currentSortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + sortTypeStyleName = BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_DESC_STYLE_NAME; + } + else + { + sortTypeStyleName = BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_ASC_STYLE_NAME; + } + } + var sortTypeStyle = GUI.skin.FindStyle(sortTypeStyleName); + if (sortTypeStyle == null) + { + sortTypeStyle = GUI.skin.label; + } + + if (GUILayout.Button(columnName, sortTypeStyle, BRT_BuildReportWindow.LayoutListHeight) && allowSort) + { + _clickedTextureDataId = textureDataId; + } + + if (Event.current.type == EventType.Repaint) + { + var lastRect = GUILayoutUtility.GetLastRect(); + if (lastRect.Contains(Event.current.mousePosition)) + { + _hoveredTextureDataId = textureDataId; + } + } + + // ---------------------------------------------------------- + // scrollbar + if (showScrollbar) + { + scrollbarPos = GUILayout.BeginScrollView(scrollbarPos, + hiddenHorizontalScrollbarStyle, + verticalScrollbarStyle, BRT_BuildReportWindow.LayoutNone); + } + else + { + scrollbarPos = GUILayout.BeginScrollView(scrollbarPos, + hiddenHorizontalScrollbarStyle, + hiddenVerticalScrollbarStyle, BRT_BuildReportWindow.LayoutNone); + } + + // ---------------------------------------------------------- + // actual contents + bool useAlt = false; + + var textureDataEntries = textureData.GetTextureData(); + for (int n = sta; n < end; ++n) + { + var b = assetList[n]; + + var styleToUse = useAlt ? listAltEntryStyle : listEntryStyle; + if (assetListCollection.InSumSelection(b)) + { + styleToUse = listSelectedEntryStyle; + } + + var dataToDisplay = string.Empty; + var assetHasTextureData = textureDataEntries.ContainsKey(b.Name); + if (assetHasTextureData) + { + dataToDisplay = textureDataEntries[b.Name].ToDisplayedValue(textureDataId); + } + + GUILayout.Label(dataToDisplay, styleToUse, BRT_BuildReportWindow.LayoutListHeightMinWidth90); + if (assetHasTextureData && Event.current.type == EventType.Repaint && textureDataEntries[b.Name].IsOverriden(textureDataId)) + { + var lastRect = GUILayoutUtility.GetLastRect(); + if (lastRect.Contains(Event.current.mousePosition)) + { + _overridenTextureDataTooltipText = textureDataEntries[b.Name].GetOverridingMessage(textureDataId); + } + } + + useAlt = !useAlt; + } + + GUILayout.Space(SCROLLBAR_BOTTOM_PADDING); + + GUILayout.EndScrollView(); + + GUILayout.EndVertical(); + } + + void DrawMeshDataColumn(int sta, int end, MeshData.DataId meshDataId, string columnName, + bool allowSort, bool showScrollbar, BuildReportTool.AssetList assetListCollection, MeshData meshData, + SizePart[] assetList, ref Vector2 scrollbarPos) + { + var hiddenHorizontalScrollbarStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME); + if (hiddenHorizontalScrollbarStyle == null) + { + hiddenHorizontalScrollbarStyle = GUI.skin.horizontalScrollbar; + } + + var hiddenVerticalScrollbarStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME); + if (hiddenVerticalScrollbarStyle == null) + { + hiddenVerticalScrollbarStyle = GUI.skin.verticalScrollbar; + } + + var verticalScrollbarStyle = GUI.skin.verticalScrollbar; + + var listEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_STYLE_NAME); + if (listEntryStyle == null) + { + listEntryStyle = GUI.skin.label; + } + + var listAltEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_ALT_STYLE_NAME); + if (listAltEntryStyle == null) + { + listAltEntryStyle = GUI.skin.label; + } + + var listSelectedEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_SELECTED_NAME); + if (listSelectedEntryStyle == null) + { + listSelectedEntryStyle = GUI.skin.label; + } + + // ---------------------------------------------------------- + + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + + // ---------------------------------------------------------- + // column header + string sortTypeStyleName = BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_STYLE_NAME; + if (allowSort && _currentSortType == BuildReportTool.AssetList.SortType.MeshData && _currentMeshDataSortType == meshDataId) + { + if (_currentSortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + sortTypeStyleName = BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_DESC_STYLE_NAME; + } + else + { + sortTypeStyleName = BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_ASC_STYLE_NAME; + } + } + var sortTypeStyle = GUI.skin.FindStyle(sortTypeStyleName); + if (sortTypeStyle == null) + { + sortTypeStyle = GUI.skin.label; + } + + if (GUILayout.Button(columnName, sortTypeStyle, BRT_BuildReportWindow.LayoutListHeight) && allowSort) + { + _clickedMeshDataId = meshDataId; + } + + if (Event.current.type == EventType.Repaint) + { + var lastRect = GUILayoutUtility.GetLastRect(); + if (lastRect.Contains(Event.current.mousePosition)) + { + _hoveredMeshDataId = meshDataId; + } + } + + // ---------------------------------------------------------- + // scrollbar + if (showScrollbar) + { + scrollbarPos = GUILayout.BeginScrollView(scrollbarPos, + hiddenHorizontalScrollbarStyle, + verticalScrollbarStyle, BRT_BuildReportWindow.LayoutNone); + } + else + { + scrollbarPos = GUILayout.BeginScrollView(scrollbarPos, + hiddenHorizontalScrollbarStyle, + hiddenVerticalScrollbarStyle, BRT_BuildReportWindow.LayoutNone); + } + + // ---------------------------------------------------------- + // actual contents + bool useAlt = false; + + var meshDataEntries = meshData.GetMeshData(); + for (int n = sta; n < end; ++n) + { + var b = assetList[n]; + + var styleToUse = useAlt + ? listAltEntryStyle + : listEntryStyle; + if (assetListCollection.InSumSelection(b)) + { + styleToUse = listSelectedEntryStyle; + } + + var dataToDisplay = string.Empty; + var assetHasMeshData = meshDataEntries.ContainsKey(b.Name); + if (assetHasMeshData) + { + dataToDisplay = meshDataEntries[b.Name].ToDisplayedValue(meshDataId); + } + + GUILayout.Label(dataToDisplay, styleToUse, BRT_BuildReportWindow.LayoutListHeightMinWidth90); + + useAlt = !useAlt; + } + + GUILayout.Space(SCROLLBAR_BOTTOM_PADDING); + + GUILayout.EndScrollView(); + + GUILayout.EndVertical(); + } + + void DrawPrefabDataColumn(int sta, int end, PrefabData.DataId prefabDataId, string columnName, + bool allowSort, bool showScrollbar, BuildReportTool.AssetList assetListCollection, PrefabData prefabData, + SizePart[] assetList, ref Vector2 scrollbarPos) + { + var hiddenHorizontalScrollbarStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME); + if (hiddenHorizontalScrollbarStyle == null) + { + hiddenHorizontalScrollbarStyle = GUI.skin.horizontalScrollbar; + } + + var hiddenVerticalScrollbarStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME); + if (hiddenVerticalScrollbarStyle == null) + { + hiddenVerticalScrollbarStyle = GUI.skin.verticalScrollbar; + } + + var verticalScrollbarStyle = GUI.skin.verticalScrollbar; + + var listEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_STYLE_NAME); + if (listEntryStyle == null) + { + listEntryStyle = GUI.skin.label; + } + + var listAltEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_ALT_STYLE_NAME); + if (listAltEntryStyle == null) + { + listAltEntryStyle = GUI.skin.label; + } + + var listSelectedEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_SELECTED_NAME); + if (listSelectedEntryStyle == null) + { + listSelectedEntryStyle = GUI.skin.label; + } + + // ---------------------------------------------------------- + + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + + // ---------------------------------------------------------- + // column header + string sortTypeStyleName = BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_STYLE_NAME; + if (allowSort && _currentSortType == BuildReportTool.AssetList.SortType.PrefabData && _currentPrefabDataSortType == prefabDataId) + { + if (_currentSortOrder == BuildReportTool.AssetList.SortOrder.Descending) + { + sortTypeStyleName = BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_DESC_STYLE_NAME; + } + else + { + sortTypeStyleName = BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_ASC_STYLE_NAME; + } + } + var sortTypeStyle = GUI.skin.FindStyle(sortTypeStyleName); + if (sortTypeStyle == null) + { + sortTypeStyle = GUI.skin.label; + } + + if (GUILayout.Button(columnName, sortTypeStyle, BRT_BuildReportWindow.LayoutListHeight) && allowSort) + { + _clickedPrefabDataId = prefabDataId; + } + + if (Event.current.type == EventType.Repaint) + { + var lastRect = GUILayoutUtility.GetLastRect(); + if (lastRect.Contains(Event.current.mousePosition)) + { + _hoveredPrefabDataId = prefabDataId; + } + } + + // ---------------------------------------------------------- + // scrollbar + if (showScrollbar) + { + scrollbarPos = GUILayout.BeginScrollView(scrollbarPos, + hiddenHorizontalScrollbarStyle, + verticalScrollbarStyle, BRT_BuildReportWindow.LayoutNone); + } + else + { + scrollbarPos = GUILayout.BeginScrollView(scrollbarPos, + hiddenHorizontalScrollbarStyle, + hiddenVerticalScrollbarStyle, BRT_BuildReportWindow.LayoutNone); + } + + // ---------------------------------------------------------- + // actual contents + bool useAlt = false; + + var prefabDataEntries = prefabData.GetPrefabData(); + for (int n = sta; n < end; ++n) + { + var b = assetList[n]; + + var styleToUse = useAlt + ? listAltEntryStyle + : listEntryStyle; + if (assetListCollection.InSumSelection(b)) + { + styleToUse = listSelectedEntryStyle; + } + + var dataToDisplay = string.Empty; + var assetHasMeshData = prefabDataEntries.ContainsKey(b.Name); + if (assetHasMeshData) + { + dataToDisplay = prefabDataEntries[b.Name].HasValue(prefabDataId); + } + + GUILayout.Label(dataToDisplay, styleToUse, BRT_BuildReportWindow.LayoutListHeightMinWidth90); + + useAlt = !useAlt; + } + + GUILayout.Space(SCROLLBAR_BOTTOM_PADDING); + + GUILayout.EndScrollView(); + + GUILayout.EndVertical(); + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen.cs.meta new file mode 100644 index 00000000..416349c6 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 5a70a05257d97424cbf31865798b753e +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_AssetUsage.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_AssetUsage.cs new file mode 100644 index 00000000..fe04bc5e --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_AssetUsage.cs @@ -0,0 +1,2674 @@ +//#define BRT_ASSET_LIST_SCREEN_DEBUG + +using System; +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; +using System.Globalization; + +namespace BuildReportTool.Window.Screen +{ + public partial class AssetList + { + // ---------------------------------------------------------------- + + /// + /// "is used by" + /// + static readonly GUIContent AssetUsageIsUsedByLabel = new GUIContent("is used by"); + + /// + /// "which is used by" + /// + static readonly GUIContent AssetUsageWhichIsUsedByLabel = new GUIContent("which is used by"); + + /// + /// "is compiled into" + /// + static readonly GUIContent AssetUsageIsCompiledIntoLabel = new GUIContent("is compiled into"); + + // --------------------------------------- + + /// + /// "is used as default material by" + /// + static readonly GUIContent AssetUsageIsUsedAsDefaultMaterialByLabel = + new GUIContent("is used as default material by"); + + /// + /// "which is used as default material by" + /// + static readonly GUIContent AssetUsageWhichIsUsedAsDefaultMaterialByLabel = + new GUIContent("which is used as default material by"); + + // --------------------------------------- + + /// + /// "is used as default value by" + /// + static readonly GUIContent AssetUsageIsUsedAsDefaultValueByLabel = + new GUIContent("is used as default value by"); + + /// + /// "which is used as default value by" + /// + static readonly GUIContent AssetUsageWhichIsUsedAsDefaultValueByLabel = + new GUIContent("which is used as default value by"); + + // --------------------------------------- + + /// + /// "is a Resources asset, so it's always in the build. But it's also used by" + /// + static readonly GUIContent AssetUsageIsAResourcesAssetButAlsoUsedByLabel = + new GUIContent("is a Resources asset, so it's always in the build. But it's also used by"); + + /// + /// "which is a Resources asset, so it's always in the build. But it's also used by" + /// + static readonly GUIContent AssetUsageWhichIsAResourcesAssetButAlsoUsedByLabel = + new GUIContent("which is a Resources asset, so it's always in the build. But it's also used by"); + + // -------------------------------------------------- + + /// + /// "which is in the build" + /// + static readonly GUIContent AssetUsageWhichIsInTheBuildLabel = new GUIContent("which is in the build"); + + /// + /// "is a Resources asset, so it's always in the build" + /// + static readonly GUIContent AssetUsageIsAResourcesAssetLabel = + new GUIContent("is a Resources asset, so it's always in the build"); + + /// + /// "which is a Resources asset, so it's always in the build" + /// + static readonly GUIContent AssetUsageWhichIsAResourcesAssetLabel = + new GUIContent("which is a Resources asset, so it's always in the build"); + + /// + /// "(cyclic dependency)" + /// + static readonly GUIContent AssetUsageWhichIsACyclicDependencyLabel = new GUIContent("(cyclic dependency)"); + + static readonly GUIContent AssetUsageAncestryDefaultMaterialInFbxOfScene = new GUIContent( + "* even though the scene is certainly using the material, Build Report Tool is not certain that the instantiated fbx in the scene is really the one using the material"); + + // ---------------------------------------------------------------- + + struct PrettyAssetLabel + { + public string AssetPath; + public string AssetPathSelected; + public string AssetName; + } + + struct PrettyAssetLabelWithNumber + { + public string AssetPath; + public string AssetPathSelected; + public string AssetName; + public int NumberForPath; + public int NumberForPathSelected; + public int NumberForName; + } + + readonly Dictionary _prettyAssetLabels = new Dictionary(); + + readonly Dictionary _prettyAssetLabelsWithNumber = + new Dictionary(); + + string GetPrettyAssetPath(string assetPath, bool showAssetPath, bool selected) + { + PrettyAssetLabel entry; + + if (_prettyAssetLabels.ContainsKey(assetPath)) + { + entry = _prettyAssetLabels[assetPath]; + } + else + { + var path = BuildReportTool.Util.GetAssetPath(assetPath); + var filename = BuildReportTool.Util.GetAssetFilename(assetPath); + + if (path == filename) + { + // no path + entry.AssetPathSelected = string.Format("{0}", filename); + entry.AssetPath = entry.AssetPathSelected; + entry.AssetName = string.Format("{0}", filename); + } + else + { + entry.AssetPathSelected = string.Format("{1}{2}", + BuildReportTool.Window.Screen.AssetList.GetPathColor(true), + path, filename); + + entry.AssetPath = string.Format("{1}{2}", + BuildReportTool.Window.Screen.AssetList.GetPathColor(false), + path, filename); + + entry.AssetName = string.Format("{0}", filename); + } + + _prettyAssetLabels.Add(assetPath, entry); + } + + if (showAssetPath) + { + if (selected) + { + return entry.AssetPathSelected; + } + else + { + return entry.AssetPath; + } + } + else + { + return entry.AssetName; + } + } + + string GetPrettyAssetPath(string assetPath, int number, bool showAssetPath, bool selected) + { + PrettyAssetLabelWithNumber entry; + + if (_prettyAssetLabelsWithNumber.ContainsKey(assetPath)) + { + entry = _prettyAssetLabelsWithNumber[assetPath]; + } + else + { + entry.AssetPath = null; + entry.AssetPathSelected = null; + entry.AssetName = null; + entry.NumberForPath = -1; + entry.NumberForPathSelected = -1; + entry.NumberForName = -1; + _prettyAssetLabelsWithNumber.Add(assetPath, entry); + } + + if (showAssetPath) + { + if (selected) + { + if (string.IsNullOrEmpty(entry.AssetPathSelected) || entry.NumberForPathSelected != number) + { + entry.AssetPathSelected = string.Format(" {0}. {2}{3}", + (number + 1).ToString(), + BuildReportTool.Window.Screen.AssetList.GetPathColor(true), + BuildReportTool.Util.GetAssetPath(assetPath), + BuildReportTool.Util.GetAssetFilename(assetPath)); + entry.NumberForPathSelected = number; + _prettyAssetLabelsWithNumber[assetPath] = entry; + } + + return entry.AssetPathSelected; + } + else + { + if (string.IsNullOrEmpty(entry.AssetPath) || entry.NumberForPath != number) + { + entry.AssetPath = string.Format(" {0}. {2}{3}", + (number + 1).ToString(), + BuildReportTool.Window.Screen.AssetList.GetPathColor(false), + BuildReportTool.Util.GetAssetPath(assetPath), + BuildReportTool.Util.GetAssetFilename(assetPath)); + entry.NumberForPath = number; + _prettyAssetLabelsWithNumber[assetPath] = entry; + } + + return entry.AssetPath; + } + } + else + { + if (string.IsNullOrEmpty(entry.AssetName) || entry.NumberForName != number) + { + entry.AssetName = string.Format(" {0}. {1}", + (number + 1).ToString(), BuildReportTool.Util.GetAssetFilename(assetPath)); + entry.NumberForName = number; + _prettyAssetLabelsWithNumber[assetPath] = entry; + } + + return entry.AssetName; + } + } + + /// + /// The size of the Asset Usage Panel that shows up below the Asset Screen. + /// + Rect _assetUsageRect; + + /// + /// Upper portion of the Asset Usage Panel that shows toolbar plus contextual info. + /// + Rect _assetInfoPanelRect; + + /// + /// Scrollbar pos for the asset user list. + /// + Vector2 _assetUsagePanelScrollbarPos; + + /// + /// Re-used GUIContent for drawing the asset user list. + /// + readonly GUIContent _assetUsageEntryLabel = new GUIContent(); + + /// + /// Which asset is selected/highlighted in the Asset User List. + /// + int _selectedAssetUserIdx = -1; + + /// + /// Used when the Asset User List is showing "All" (flattened), + /// meaning show both direct and indirect users in one giant list. + /// + /// This is the chain of "which is used by", "which is used by", etc. + /// chain for the currently selected asset user. + /// + /// The very first element in the list is the asset being looked at, + /// and the very last element is, most often, the scene where it's used, + /// telling the user why the asset got included in the build. + /// + readonly List _assetUsageAncestry = new List(); + + /// + /// Used when the Asset User List is showing "Direct", + /// meaning showing only direct users. + /// + /// This is the breadcrumb history of inspected direct users. + /// + readonly List _assetUserCrumbs = new List(); + + struct AssetUserCrumb + { + public string AssetPath; + public float ScrollbarPosY; + } + + int _assetUserCrumbActiveIdx; + + float _preferredDirectAssetUserListViewHeight; + + /// + /// True when the asset selected is from a Resources folder, meaning it has no + /// asset dependencies. It is automatically included in the build because of being + /// in a Resources folder. + /// + bool _selectedIsAResourcesAsset; + + /// + /// When the selected asset in the main asset list is a Resources asset, this stores + /// the filename and icon. + /// + readonly GUIContent _selectedResourcesAsset = new GUIContent(); + + /// + /// Path to the selected Resources asset, starting from "Assets/" + /// + string _selectedResourcesAssetPath; + + /// + /// Special case when a scene is using an fbx directly (did not save it as a prefab first). + /// In this case, it's impossible to tell whether the fbx in that scene is using its + /// default material, or if it's overriden to use no material. So, without opening the scene + /// and checking directly, we cannot be sure of the Asset Usage Ancestry in this situation. + /// + bool _assetUsageAncestryHasFbxUsingDefaultMaterialUsedInScene; + + /// + /// Toggled by user to show a list of all users of selected asset, "users" being other assets. + /// + bool _showAssetUsagesList; + + struct AssetUsageAncestry + { + public GUIContent Label; + public string AssetPath; + public bool CyclicDependency; + } + + Texture _indentLine; + + static readonly string[] AssetUsageDisplayLabel = new[] + { + "All", "Direct", "End" + }; + + const int ASSET_USAGE_DISPLAY_ALL = 0; + const int ASSET_USAGE_DISPLAY_DIRECT = 1; + const int ASSET_USAGE_DISPLAY_END = 2; + + int _selectedAssetUsageDisplayIdx = ASSET_USAGE_DISPLAY_ALL; + + const int ASSET_USAGE_HISTORY_ROW_SPACING = 2; + const int ASSET_USAGE_HISTORY_LAST_ROW_PADDING = 2; + + const int ASSET_INFO_ROW_HEIGHT = 20; + + // ---------------------------------------------------------------- + + static bool IsFileNextToFile(List list, int idx, string fileTypeInIdx, string fileTypeInNext) + { + return !string.IsNullOrEmpty(list[idx].AssetPath) && list[idx].AssetPath.IsFileOfType(fileTypeInIdx) && + (idx < list.Count - 1) && + !string.IsNullOrEmpty(list[idx + 1].AssetPath) && list[idx + 1].AssetPath.IsFileOfType(fileTypeInNext); + } + + public void DrawAssetUsage(Rect position, BuildReportTool.AssetList listToDisplay, + BuildInfo buildReportToDisplay, AssetDependencies assetDependencies) + { + if (buildReportToDisplay == null) + { + _assetUsageRect.height = 0; + return; + } + + if (listToDisplay == null) + { + _assetUsageRect.height = 0; + return; + } + + if (assetDependencies == null) + { + _assetUsageRect.height = 0; + return; + } + + var assetStyle = GUI.skin.FindStyle("Asset"); + if (assetStyle == null) + { + assetStyle = GUI.skin.label; + } + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("listToDisplay.GetSelectedCount(): {0}\n", + listToDisplay.GetSelectedCount().ToString()); +#endif + + if (listToDisplay.GetSelectedCount() != 1) + { + // no asset selected, or too many selected + _assetUsageRect.height = 0; + return; + } + + var selectedAsset = listToDisplay.GetLastSelected(); + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("selectedAsset: {0}\n", + selectedAsset != null ? selectedAsset.Name : "null"); +#endif + + if (selectedAsset == null) + { + // selected is null? + _assetUsageRect.height = 0; + return; + } + + var dependencies = assetDependencies.GetAssetDependencies(); + + if (dependencies == null) + { + _assetUsageRect.height = 0; + return; + } + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("AssetDependencies has \"{0}\" ? {1}\n", + selectedAsset.Name, + dependencies.ContainsKey(selectedAsset.Name).ToString()); +#endif + + var selectedHasNoAssetDependencies = false; + DependencyEntry selectedAssetDependencies; + + if (dependencies.TryGetValue(selectedAsset.Name, out selectedAssetDependencies)) + { + // There may be record of selected Asset but check first if + // selected Asset has no recorded users + + var selectedAssetUsers = selectedAssetDependencies != null ? selectedAssetDependencies.Users : null; + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("selectedAssetDependencies.Users.Count: {0}\n", + selectedAssetUsers != null ? selectedAssetUsers.Count.ToString() : "-1"); +#endif + if (selectedAssetUsers == null || selectedAssetUsers.Count <= 0) + { + // No asset is using the selected asset + selectedHasNoAssetDependencies = true; + } + } + else + { + // selected asset is not in the calculated + // Asset Dependencies of the project + selectedAssetDependencies = null; + selectedHasNoAssetDependencies = true; + } + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("selectedHasNoAssetDependencies: {0}\n_selectedIsAResourcesAsset: {1}\n", + selectedHasNoAssetDependencies.ToString(), _selectedIsAResourcesAsset.ToString()); +#endif + + var assetInfoPanelNoListStyle = GUI.skin.FindStyle("AssetInfoPanelNoList"); + if (assetInfoPanelNoListStyle == null) + { + assetInfoPanelNoListStyle = GUI.skin.box; + } + + GUIStyle assetInfoPanelStyle; + if (_showAssetUsagesList) + { + if (_selectedAssetUsageDisplayIdx == ASSET_USAGE_DISPLAY_ALL) + { + assetInfoPanelStyle = GUI.skin.FindStyle("AssetInfoPanelToolbarTopAllList"); + } + else + { + assetInfoPanelStyle = GUI.skin.FindStyle("AssetInfoPanelToolbarTop"); + } + } + else + { + assetInfoPanelStyle = GUI.skin.FindStyle("AssetInfoPanel"); + } + if (assetInfoPanelStyle == null) + { + assetInfoPanelStyle = GUI.skin.box; + } + + var labelSingleLineStyle = GUI.skin.FindStyle("LabelSingleLine"); + if (labelSingleLineStyle == null) + { + labelSingleLineStyle = GUI.skin.label; + } + + if (selectedHasNoAssetDependencies) + { + // Selected asset is not used by another asset and/or is not using any asset, so we will abort. + + // But if it's a Resources asset, we will at least indicate so. + // It's most likely this Resources asset is only referenced in code, + // (or also could be not at all!) + if (_selectedIsAResourcesAsset) + { + var height = ASSET_INFO_ROW_HEIGHT + assetInfoPanelNoListStyle.padding.vertical; + _assetUsageRect = + new Rect(0, position.height - height, position.width, height); + + _assetUsageRect.y = Mathf.RoundToInt(_assetUsageRect.y); + + GUILayout.Space(height); + GUILayout.BeginArea(_assetUsageRect); + + + GUILayout.BeginVertical(string.Empty, assetInfoPanelNoListStyle, BRT_BuildReportWindow.LayoutNone); + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + + if (GUILayout.Button(_selectedResourcesAsset, assetStyle, BRT_BuildReportWindow.LayoutNone)) + { + Utility.PingAssetInProject(_selectedResourcesAssetPath); + } + + if (Event.current.type == EventType.Repaint && + (Event.current.mousePosition.x < position.width || + Event.current.mousePosition.y < position.height)) + { + var assetUsageAncestryEntryRect = GUILayoutUtility.GetLastRect(); + + if (assetUsageAncestryEntryRect.Contains(Event.current.mousePosition)) + { + // there really isn't an asset usage ancestry list in this case, + // but we do this to flag the code that a tooltip should be drawn + _assetUsageAncestryHoveredIdx = 0; + + // ---------------- + // update what is considered the hovered asset, for use later on + // when the tooltip will be drawn + BRT_BuildReportWindow.UpdateHoveredAsset(_selectedResourcesAssetPath, + assetUsageAncestryEntryRect, IsShowingUsedAssets, + buildReportToDisplay, assetDependencies); + + // ---------------- + // if mouse is hovering over the correct area, we signify that + // the tooltip thumbnail should be drawn + if (BuildReportTool.Options.ShowTooltipThumbnail && + BRT_BuildReportWindow.GetAssetPreview(_selectedResourcesAssetPath) != null) + { + _shouldShowThumbnailOnHoveredAsset = true; + } + else + { + _shouldShowThumbnailOnHoveredAsset = false; + } + } + else + { + // there's only 1 asset being displayed in the asset usage ancestry panel + // which is the resources asset that's selected + // so if the mouse isn't on it, then we're sure it's not on any + // other asset usage ancestry entry + _assetUsageAncestryHoveredIdx = -1; + } + } + + GUILayout.Label(AssetUsageIsAResourcesAssetLabel, labelSingleLineStyle, BRT_BuildReportWindow.LayoutNone); + + GUILayout.EndHorizontal(); + GUILayout.EndVertical(); + + GUILayout.EndArea(); + } + else + { + _assetUsageRect.height = 0; + } + + return; + } + + // at this point, we are sure selectedAssetDependencies isn't null + + var usersFlattened = selectedAssetDependencies.UsersFlattened; + + if (usersFlattened == null || usersFlattened.Count == 0) + { + // no users? + _assetUsageRect.height = 0; + return; + } + + var expandButtonStyle = GUI.skin.FindStyle("ExpandButton"); + if (expandButtonStyle == null) + { + expandButtonStyle = GUI.skin.button; + } + + var availableWidth = position.width - 10; + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("availableWidth: {0}\nexpandButtonStyle.lineHeight: {1}\n", + availableWidth.ToString(CultureInfo.InvariantCulture), + expandButtonStyle.lineHeight.ToString(CultureInfo.InvariantCulture)); + +#endif + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("_selectedAssetUserIdx: {0}\n_showAllAssetUsagesList: {1}\n", + _selectedAssetUserIdx.ToString(), + _showAssetUsagesList.ToString()); +#endif + + // expand button height is the height of the small toolbar + float assetInfoPanelHeight = expandButtonStyle.lineHeight; + + switch (_selectedAssetUsageDisplayIdx) + { + case ASSET_USAGE_DISPLAY_ALL: + { + var numberOfRowsInAssetUsageAncestry = 0; + if (_selectedAssetUserIdx != -1) + { + numberOfRowsInAssetUsageAncestry = + GetNumberOfAssetUsageAncestryRows(_assetUsageAncestry, availableWidth); + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("numberOfRowsInAssetUsageTraceHistory: {0}\n", + numberOfRowsInAssetUsageAncestry.ToString()); +#endif + } + + assetInfoPanelHeight += + (ASSET_INFO_ROW_HEIGHT * numberOfRowsInAssetUsageAncestry) + assetInfoPanelStyle.padding.vertical; + + if (numberOfRowsInAssetUsageAncestry > 1) + { + // asset usage ancestry is using up more than 1 row + // include the spacing in-between rows + assetInfoPanelHeight += ASSET_USAGE_HISTORY_ROW_SPACING * (numberOfRowsInAssetUsageAncestry - 1); + assetInfoPanelHeight += ASSET_USAGE_HISTORY_LAST_ROW_PADDING; + } + + if (_assetUsageAncestryHasFbxUsingDefaultMaterialUsedInScene) + { + assetInfoPanelHeight += + GUI.skin.label.CalcHeight(AssetUsageAncestryDefaultMaterialInFbxOfScene, position.width) + + GUI.skin.label.margin.vertical; + } + + break; + } + + case ASSET_USAGE_DISPLAY_DIRECT: + //assetUsageToolbarHeight += breadcrumbLeftStyle.lineHeight + assetInfoPanelStyle.padding.vertical; + + // height of the breadcrumbs chain + padding + // there's only one row of breadcrumbs so it's a constant value + assetInfoPanelHeight += 20; + break; + } + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("_selectedAssetUsageDisplayIdx: {0}\nassetInfoToolbarHeight: {1}\n", + _selectedAssetUsageDisplayIdx.ToString(), + assetInfoPanelHeight.ToString(CultureInfo.InvariantCulture)); +#endif + // ---------------------------------------------------- + + int assetUsageScrollViewHeight; + int heightToUse; + + var assetUsageListScrollViewHeightIsClamped = false; + + // ---------------------------------------------------- + // getting the height of the asset users list + + float assetUsageListHeight = 0; + float assetUsageListRealHeight = 0; + if (_showAssetUsagesList) + { + switch (_selectedAssetUsageDisplayIdx) + { + case ASSET_USAGE_DISPLAY_ALL: + // currently showing asset usage flattened list + assetUsageListHeight = + (BRT_BuildReportWindow.LIST_HEIGHT * usersFlattened.Count) + 10; // 10 for some padding + assetUsageListRealHeight = assetUsageListHeight; + break; + + case ASSET_USAGE_DISPLAY_DIRECT: + // currently showing asset direct users list + var countToUse = selectedAssetDependencies.Users.Count; + + if (_assetUserCrumbs.Count > 0 && _assetUserCrumbActiveIdx >= 0 && + _assetUserCrumbActiveIdx < _assetUserCrumbs.Count) + { + var activeAssetUserCrumb = _assetUserCrumbs[_assetUserCrumbActiveIdx].AssetPath; + + { + DependencyEntry activeAssetUserCrumbDependencyEntry; + if (dependencies.TryGetValue(activeAssetUserCrumb, out activeAssetUserCrumbDependencyEntry)) + { + countToUse = activeAssetUserCrumbDependencyEntry.Users.Count; + } + } + } + + var initialListViewHeight = + (BRT_BuildReportWindow.LIST_HEIGHT * selectedAssetDependencies.Users.Count) + + 10; // 10 for some padding; + + assetUsageListRealHeight = + (BRT_BuildReportWindow.LIST_HEIGHT * countToUse) + 10; // 10 for some padding + + + if (initialListViewHeight > _preferredDirectAssetUserListViewHeight) + { + _preferredDirectAssetUserListViewHeight = initialListViewHeight; + } + + if (assetUsageListRealHeight > _preferredDirectAssetUserListViewHeight) + { + _preferredDirectAssetUserListViewHeight = assetUsageListRealHeight; + } + + assetUsageListHeight = _preferredDirectAssetUserListViewHeight; + + break; + + case ASSET_USAGE_DISPLAY_END: + { + // currently showing asset end users list + var endUsersList = selectedAssetDependencies.GetEndUserLabels(); + if (endUsersList.Count == 0) + { + BuildReportTool.AssetDependencies.PopulateAssetEndUsers(selectedAsset.Name, assetDependencies); + } + + assetUsageListHeight = + (BRT_BuildReportWindow.LIST_HEIGHT * endUsersList.Count) + 10; // 10 for some padding + assetUsageListRealHeight = assetUsageListHeight; + break; + } + } + + + var properHeight = assetInfoPanelHeight + assetUsageListHeight; + + if (properHeight > position.height / 2) + { + // asset usage panel height is too much. clamp it + // scrollview also has to be limited + heightToUse = Mathf.RoundToInt(position.height / 2); + assetUsageScrollViewHeight = Mathf.RoundToInt(heightToUse - assetInfoPanelHeight); + assetUsageListScrollViewHeightIsClamped = true; + } + else + { + heightToUse = Mathf.RoundToInt(properHeight); + assetUsageScrollViewHeight = Mathf.RoundToInt(assetUsageListHeight); + } + } + else + { + // not showing asset usage flattened list + + heightToUse = Mathf.RoundToInt(assetInfoPanelHeight); + assetUsageScrollViewHeight = 0; + } + + // ---------------------------------------------------- + + heightToUse += 6; // compensate for the bottom edge of the window border + + + // ---------------------------------------------------- + // Reserve the space used for the entire Asset Info Panel + + GUILayout.Space(heightToUse); + + // ---------------------------------------------------- + // We draw the Asset Usage Panel from a GUILayout.Area + // that will occupy that space we reserved just now + + _assetUsageRect = + new Rect(0, position.height - heightToUse, position.width, heightToUse); + + _assetUsageRect.y = Mathf.RoundToInt(_assetUsageRect.y); + if (_showAssetUsagesList) + { + _assetUsageRect.y -= 3; + _assetUsageRect.height += 2; + } + + // ---------------------------------------------------- + + GUILayout.BeginArea(_assetUsageRect); + + // ---------------------------------------------------- + // Asset Info Panel + + GUILayout.BeginVertical(string.Empty, assetInfoPanelStyle, BRT_BuildReportWindow.LayoutNone); + + if (_showAssetUsagesList) + { + // toolbar at top + // reserve space for the toolbar + GUILayout.Space(ASSET_INFO_TOOLBAR_HEIGHT); + } + + DrawAssetInfoPanel(position, availableWidth, buildReportToDisplay, assetDependencies); + + GUILayout.EndVertical(); // end of Asset Info Panel + if (Event.current.type == EventType.Repaint) + { + _assetInfoPanelRect = GUILayoutUtility.GetLastRect(); + //_assetInfoPanelRect.height += ASSET_INFO_TOOLBAR_HEIGHT; + } + + + // ---------------------------------------------------- + // Asset Users List + + var newEntryHoveredIdx = -1; + string newEntryHoveredAssetPath = null; + Rect newEntryHoveredRect = new Rect(); + + if (_showAssetUsagesList) + { + // the rect inside the scrollview. it has the real height of the asset user list + var scrollViewRect = new Rect(0, 0, position.width - 15, assetUsageListRealHeight); + + _assetUsagePanelScrollbarPos = GUI.BeginScrollView( + new Rect(0, _assetInfoPanelRect.height, position.width, assetUsageScrollViewHeight), + _assetUsagePanelScrollbarPos, scrollViewRect); + + switch (_selectedAssetUsageDisplayIdx) + { + case ASSET_USAGE_DISPLAY_ALL: + DrawAllAssetUsers(scrollViewRect.width, assetUsageScrollViewHeight, + assetUsageListScrollViewHeightIsClamped, + selectedAsset.Name, usersFlattened, + out newEntryHoveredIdx, out newEntryHoveredAssetPath, out newEntryHoveredRect); + break; + + case ASSET_USAGE_DISPLAY_DIRECT: + var assetToShowDirectUsersOf = selectedAsset.Name; + + if (_assetUserCrumbs.Count > 0 && _assetUserCrumbActiveIdx >= 0 && + _assetUserCrumbActiveIdx < _assetUserCrumbs.Count) + { + assetToShowDirectUsersOf = _assetUserCrumbs[_assetUserCrumbActiveIdx].AssetPath; + } + + List users = null; + { + DependencyEntry entry; + if (dependencies.TryGetValue(assetToShowDirectUsersOf, out entry)) + { + users = entry.Users; + } + } + + DrawDirectAssetUsers(scrollViewRect.width, assetUsageScrollViewHeight, + assetUsageListScrollViewHeightIsClamped, + users, assetDependencies, + out newEntryHoveredIdx, out newEntryHoveredAssetPath, out newEntryHoveredRect); + break; + + case ASSET_USAGE_DISPLAY_END: + { + var endUsersList = selectedAssetDependencies.GetEndUserLabels(); + if (endUsersList.Count == 0) + { + BuildReportTool.AssetDependencies.PopulateAssetEndUsers(selectedAsset.Name, + endUsersList, assetDependencies); + } + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat( + "endUsersList.Count: {0}\n", + endUsersList.Count.ToString()); +#endif + + DrawEndAssetUsers(scrollViewRect.width, assetUsageScrollViewHeight, + assetUsageListScrollViewHeightIsClamped, endUsersList, + out newEntryHoveredIdx, out newEntryHoveredAssetPath, out newEntryHoveredRect); + } + break; + } + + GUI.EndScrollView(true); + + if (Event.current.type == EventType.Repaint) + { + _assetUserEntryHoveredIdx = newEntryHoveredIdx; + } + } + + GUILayout.EndArea(); // end of Asset Usage Panel + + // ---------------------------------------------------- + // toolbar + + DrawAssetInfoToolbar(position, selectedAsset.Name, assetDependencies); + + // --------------------------------------------------------- + + if (Event.current.type == EventType.Repaint) + { +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat( + "Event.current.mousePosition.y: {0}\n_assetInfoPanelRect: {1}\n_assetUsageRect: {2}\n", + Event.current.mousePosition.y.ToString(CultureInfo.InvariantCulture), + _assetInfoPanelRect.ToString(), + _assetUsageRect.ToString()); +#endif + if (Event.current.mousePosition.y < _assetUsageRect.y + _assetInfoPanelRect.height) + { + // mouse is in the asset info panel + _assetUserEntryHoveredIdx = -1; + } + + if (!_assetUsageRect.Contains(Event.current.mousePosition)) + { + // mouse is outside + _assetUserEntryHoveredIdx = -1; + } + + if (_assetUserEntryHoveredIdx != -1) + { + // ---------------- + // update what is considered the hovered asset, for use later on + // when the tooltip will be drawn + BRT_BuildReportWindow.UpdateHoveredAsset(newEntryHoveredAssetPath, newEntryHoveredRect, + IsShowingUsedAssets, buildReportToDisplay, assetDependencies); + } + } + } + + + void ChangeAssetUserCrumbRootIfNeeded(string assetPath) + { + if (_assetUserCrumbs.Count == 0 || + !_assetUserCrumbs[0].AssetPath.Equals(assetPath, StringComparison.OrdinalIgnoreCase)) + { + _assetUserCrumbs.Clear(); + + AssetUserCrumb newEntry; + newEntry.AssetPath = assetPath; + newEntry.ScrollbarPosY = 0; + _assetUserCrumbs.Add(newEntry); + + _assetUserCrumbActiveIdx = 0; + _preferredDirectAssetUserListViewHeight = 0; + + _assetUsagePanelScrollbarPos.y = 0; + } + } + + void SelectNextAssetUserCrumb(Dictionary dependencies) + { + if (_assetUserCrumbActiveIdx < 0) + { + // do not allow if current active crumb is negative + return; + } + + if (_assetUserCrumbActiveIdx >= _assetUserCrumbs.Count - 1) + { + // do not allow if current active crumb is last in the breadcrumb list + // just clear selection + // if there is only 1 crumb, this also applies + _selectedAssetUserIdx = -1; + return; + } + + var thisAsset = _assetUserCrumbs[_assetUserCrumbActiveIdx].AssetPath; + var nextAsset = _assetUserCrumbs[_assetUserCrumbActiveIdx + 1].AssetPath; + + if (dependencies.ContainsKey(thisAsset)) + { + var thisAssetUsers = dependencies[thisAsset].Users; + var idxOfNextAsset = thisAssetUsers.IndexOf(nextAsset); + if (idxOfNextAsset != -1) + { + _selectedAssetUserIdx = idxOfNextAsset; + } + } + } + + void DrawDirectAssetUsers(float assetUsageScrollViewWidth, int assetUsageScrollViewHeight, + bool assetUsageListScrollViewHeightIsClamped, List directUsers, AssetDependencies assetDependencies, + out int newEntryHoveredIdx, out string newEntryHoveredAssetPath, out Rect newEntryHoveredRect) + { + newEntryHoveredIdx = -1; + newEntryHoveredAssetPath = null; + newEntryHoveredRect = new Rect(); + + float currentY = 0; + + // draw only what's visible in the scrollview + + int directUserN = 0; + int directUserLen = directUsers.Count; + + if (assetUsageListScrollViewHeightIsClamped && directUsers.Count > 0) + { + // figure out which entry to start in + + // for every BRT_BuildReportWindow.LIST_HEIGHT in _assetUsagePanelScrollbarPos.y + // an entry has been hidden and doesn't need to be drawn + // and we only need to draw up until the number of entries that can fit in assetUsageScrollViewHeight + + // minus 1 since the first label at the top is not from the list + var toSkip = + Mathf.FloorToInt(_assetUsagePanelScrollbarPos.y / BRT_BuildReportWindow.LIST_HEIGHT); + + var amountToDraw = (assetUsageScrollViewHeight / BRT_BuildReportWindow.LIST_HEIGHT) + 2; + + if (toSkip >= 0) + { + directUserN = toSkip; + currentY += toSkip * BRT_BuildReportWindow.LIST_HEIGHT; + + directUserLen = toSkip + amountToDraw; + if (directUserLen >= directUsers.Count) + { + directUserLen = directUsers.Count; + } + + if (directUserN >= directUsers.Count) + { + directUserN = directUsers.Count - 1; + directUserLen = 1; + } + } + } + + const int PING_BUTTON_WIDTH = 37; + const int PING_BUTTON_HEIGHT = 18; + + const int INSPECT_BUTTON_WIDTH = 50; + const int INSPECT_BUTTON_HEIGHT = 18; + + var listEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_STYLE_NAME); + var listAltEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_ALT_STYLE_NAME); + var listSelectedEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_SELECTED_NAME); + + if (listEntryStyle == null) + { + listEntryStyle = GUI.skin.label; + } + if (listAltEntryStyle == null) + { + listAltEntryStyle = GUI.skin.label; + } + if (listSelectedEntryStyle == null) + { + listSelectedEntryStyle = GUI.skin.label; + } + + EditorGUIUtility.SetIconSize(BRT_BuildReportWindow.IconSize); + + var dependencies = assetDependencies.GetAssetDependencies(); + + for (; directUserN < directUserLen; ++directUserN) + { + var useAlt = (directUserN % 2) == 0; + + var styleToUse = useAlt ? listAltEntryStyle : listEntryStyle; + if (_selectedAssetUserIdx == directUserN) + { + styleToUse = listSelectedEntryStyle; + } + + // ----------------------------------------------- + + bool labelPressed = false; + + var assetPath = directUsers[directUserN]; + + // ----------------------------------------------- + // Background color + + GUI.Box(new Rect(0, currentY, assetUsageScrollViewWidth, BRT_BuildReportWindow.LIST_HEIGHT), string.Empty, + styleToUse); + + float currentX = 0; + + var labelRect = new Rect( + 0, currentY, + 0, BRT_BuildReportWindow.LIST_HEIGHT); + + // ------------------------- + // Ping button + + if (!BuildReportTool.Options.DoubleClickOnAssetWillPing) + { + if (GUI.Button(new Rect(0, currentY + 1, PING_BUTTON_WIDTH, PING_BUTTON_HEIGHT), "Ping", "ListButton")) + { + // only asset entries inside the top-level assets folder can be pinged + if (assetPath.IsInAssetsFolder()) + { + Utility.PingAssetInProject(assetPath); + } + } + + currentX += PING_BUTTON_WIDTH + 2; // 2 for some spacing + } + + // ----------------------------------------------- + // Inspect button + + var shouldDrawInspectButton = + dependencies.ContainsKey(assetPath) && dependencies[assetPath].Users.Count > 0; + + if (shouldDrawInspectButton) + { + var inspectButtonRect = + new Rect(currentX, currentY + 1, INSPECT_BUTTON_WIDTH, INSPECT_BUTTON_HEIGHT); + if (GUI.Button(inspectButtonRect, "Inspect", "ListButton")) + { + // store the scrollbar pos so that we can return to it + if (_assetUserCrumbs.Count > 0 && _assetUserCrumbActiveIdx >= 0 && + _assetUserCrumbActiveIdx < _assetUserCrumbs.Count) + { + var entryToModify = _assetUserCrumbs[_assetUserCrumbActiveIdx]; + entryToModify.ScrollbarPosY = _assetUsagePanelScrollbarPos.y; + _assetUserCrumbs[_assetUserCrumbActiveIdx] = entryToModify; + } + + // add the current asset user to the breadcrumbs + // if the current asset is already in the breadcrumbs, just switch to it + + var alreadyInBreadcrumbHistory = false; + for (int n = 0, len = _assetUserCrumbs.Count; n < len; ++n) + { + if (_assetUserCrumbs[n].AssetPath.Equals(assetPath, StringComparison.OrdinalIgnoreCase)) + { + // asset is already in breadcrumb history. this is most likely a cyclic dependency + // switch to the existing one + _assetUserCrumbActiveIdx = n; + _assetUsagePanelScrollbarPos.y = _assetUserCrumbs[n].ScrollbarPosY; + SelectNextAssetUserCrumb(dependencies); + alreadyInBreadcrumbHistory = true; + break; + } + } + + if (!alreadyInBreadcrumbHistory) + { + if (_assetUserCrumbActiveIdx != _assetUserCrumbs.Count - 1) + { + // everything after _assetUserCrumbActiveIdx is removed + var removalStartIdx = _assetUserCrumbActiveIdx + 1; + _assetUserCrumbs.RemoveRange(removalStartIdx, _assetUserCrumbs.Count - removalStartIdx); + } + + AssetUserCrumb newEntry; + newEntry.AssetPath = assetPath; + newEntry.ScrollbarPosY = 0; + _assetUserCrumbs.Add(newEntry); + + _assetUserCrumbActiveIdx = _assetUserCrumbs.Count - 1; + + // since this is a newly viewed direct user list, + // reset the scrollbar and currently selected + _assetUsagePanelScrollbarPos.y = 0; + _selectedAssetUserIdx = -1; + } + } + } + + // even if we don't draw the inspect button, we still + // need to add space so that it lines up with the other + // entries that do have that button + currentX += INSPECT_BUTTON_WIDTH; + + // ----------------------------------------------- + // Asset Path/Name + + _assetUsageEntryLabel.text = + GetPrettyAssetPath(assetPath, BuildReportTool.Options.ShowColumnAssetPath, _selectedAssetUserIdx == directUserN); + _assetUsageEntryLabel.image = BuildReportTool.Window.Utility.GetIcon(assetPath); + + if (_assetUsageEntryLabel.image == null) + { + // no icon, leave some space before the label to represent where the icon would be + currentX += BRT_BuildReportWindow.ICON_WIDTH_WITH_PADDING; + } + + labelRect.x = currentX; + // allow asset label width to take up remaining width + labelRect.width = assetUsageScrollViewWidth - labelRect.x; + + labelPressed |= GUI.Button(labelRect, _assetUsageEntryLabel, styleToUse); + + // ----------------------------------------------- + // Respond to Click + + if (labelPressed) + { + // Respond to Double-click Ping if needed + if (BuildReportTool.Options.DoubleClickOnAssetWillPing && + _selectedAssetUserIdx == directUserN && + (EditorApplication.timeSinceStartup - _assetListEntryLastClickedTime) < DOUBLE_CLICK_THRESHOLD && + assetPath.IsInAssetsFolder()) + { + Utility.PingAssetInProject(assetPath); + } + + _selectedAssetUserIdx = directUserN; + _assetListEntryLastClickedTime = EditorApplication.timeSinceStartup; + } + + // ----------------------------------------------- + // Hover Check + + if (Event.current.type == EventType.Repaint) + { + const int ICON_WIDTH = 20; + + var mousePos = Event.current.mousePosition; + + if (labelRect.Contains(mousePos)) + { + newEntryHoveredIdx = directUserN; + newEntryHoveredAssetPath = assetPath; + newEntryHoveredRect = labelRect; + + // ---------------- + // put a border on the icon to signify that it's the one being hovered + // note: _assetUsageEntryLabel.image currently has the icon of the asset we hovered + Rect iconHoveredRect = labelRect; + iconHoveredRect.x += 1; + iconHoveredRect.y += 2; + iconHoveredRect.width = 17; + iconHoveredRect.height = 16; + GUI.Box(iconHoveredRect, _assetUsageEntryLabel.image, "IconHovered"); + + // ---------------- + // if mouse is hovering over the correct area, we signify that + // the tooltip thumbnail should be drawn + if (BuildReportTool.Options.ShowTooltipThumbnail && + (BuildReportTool.Options.ShowThumbnailOnHoverLabelToo || + Mathf.Abs(mousePos.x - labelRect.x) < ICON_WIDTH) && + BRT_BuildReportWindow.GetAssetPreview(assetPath) != null) + { + _shouldShowThumbnailOnHoveredAsset = true; + } + else + { + _shouldShowThumbnailOnHoveredAsset = false; + } + } + } + + // ----------------------------------------------- + + currentY += BRT_BuildReportWindow.LIST_HEIGHT; + } + } + + void DrawEndAssetUsers(float assetUsageScrollViewWidth, int assetUsageScrollViewHeight, + bool assetUsageListScrollViewHeightIsClamped, List endUsers, + out int newEntryHoveredIdx, out string newEntryHoveredAssetPath, out Rect newEntryHoveredRect) + { + newEntryHoveredIdx = -1; + newEntryHoveredAssetPath = null; + newEntryHoveredRect = new Rect(); + + float currentY = 0; + + // draw only what's visible in the scrollview + + int endUserN = 0; + int endUserLen = endUsers.Count; + + if (assetUsageListScrollViewHeightIsClamped && endUsers.Count > 0) + { + // figure out which entry to start in + + // for every BRT_BuildReportWindow.LIST_HEIGHT in _assetUsagePanelScrollbarPos.y + // an entry has been hidden and doesn't need to be drawn + // and we only need to draw up until the number of entries that can fit in assetUsageScrollViewHeight + + // minus 1 since the first label at the top is not from the list + var toSkip = + Mathf.FloorToInt(_assetUsagePanelScrollbarPos.y / BRT_BuildReportWindow.LIST_HEIGHT); + + var amountToDraw = (assetUsageScrollViewHeight / BRT_BuildReportWindow.LIST_HEIGHT) + 2; + + if (toSkip >= 0) + { + endUserN = toSkip; + currentY += toSkip * BRT_BuildReportWindow.LIST_HEIGHT; + + endUserLen = toSkip + amountToDraw; + if (endUserLen >= endUsers.Count) + { + endUserLen = endUsers.Count; + } + + if (endUserN >= endUsers.Count) + { + endUserN = endUsers.Count - 1; + endUserLen = 1; + } + } + } + + const int PING_BUTTON_WIDTH = 37; + const int PING_BUTTON_HEIGHT = 18; + + var listEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_STYLE_NAME); + var listAltEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_ALT_STYLE_NAME); + var listSelectedEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_SELECTED_NAME); + + if (listEntryStyle == null) + { + listEntryStyle = GUI.skin.label; + } + if (listAltEntryStyle == null) + { + listAltEntryStyle = GUI.skin.label; + } + if (listSelectedEntryStyle == null) + { + listSelectedEntryStyle = GUI.skin.label; + } + + EditorGUIUtility.SetIconSize(BRT_BuildReportWindow.IconSize); + + + for (; endUserN < endUserLen; ++endUserN) + { + var useAlt = (endUserN % 2) == 0; + + var styleToUse = useAlt ? listAltEntryStyle : listEntryStyle; + if (_selectedAssetUserIdx == endUserN) + { + styleToUse = listSelectedEntryStyle; + } + + // ----------------------------------------------- + + bool labelPressed = false; + + var assetPath = endUsers[endUserN].tooltip; + + // ----------------------------------------------- + // Background color + + GUI.Box(new Rect(0, currentY, assetUsageScrollViewWidth, BRT_BuildReportWindow.LIST_HEIGHT), string.Empty, + styleToUse); + + var labelRect = new Rect( + 0, currentY, + 0, BRT_BuildReportWindow.LIST_HEIGHT); + + // ------------------------- + // Ping button + + if (!BuildReportTool.Options.DoubleClickOnAssetWillPing) + { + labelRect.x += PING_BUTTON_WIDTH; + if (GUI.Button(new Rect(0, currentY + 1, PING_BUTTON_WIDTH, PING_BUTTON_HEIGHT), "Ping", "ListButton")) + { + // only asset entries inside the top-level assets folder can be pinged + if (assetPath.IsInAssetsFolder()) + { + Utility.PingAssetInProject(assetPath); + } + } + } + + // ----------------------------------------------- + // Asset Path/Name + + _assetUsageEntryLabel.text = + GetPrettyAssetPath(assetPath, BuildReportTool.Options.ShowColumnAssetPath, _selectedAssetUserIdx == endUserN); + _assetUsageEntryLabel.image = endUsers[endUserN].image; + + if (_assetUsageEntryLabel.image == null) + { + // no icon, leave some space before the label to represent where the icon would be + labelRect.x += BRT_BuildReportWindow.ICON_WIDTH_WITH_PADDING; + } + + // allow asset label width to take up remaining width + labelRect.width = assetUsageScrollViewWidth - labelRect.x; + + labelPressed |= GUI.Button(labelRect, _assetUsageEntryLabel, styleToUse); + + // ----------------------------------------------- + // Respond to click + + if (labelPressed) + { + // Double-click Ping + if (BuildReportTool.Options.DoubleClickOnAssetWillPing && + _selectedAssetUserIdx == endUserN && + (EditorApplication.timeSinceStartup - _assetListEntryLastClickedTime) < DOUBLE_CLICK_THRESHOLD && + assetPath.IsInAssetsFolder()) + { + Utility.PingAssetInProject(assetPath); + } + + _selectedAssetUserIdx = endUserN; + _assetListEntryLastClickedTime = EditorApplication.timeSinceStartup; + } + + // ----------------------------------------------- + // Hover Check + + if (Event.current.type == EventType.Repaint) + { + const int ICON_WIDTH = 20; + + var mousePos = Event.current.mousePosition; + + if (labelRect.Contains(mousePos)) + { + newEntryHoveredIdx = endUserN; + newEntryHoveredAssetPath = assetPath; + newEntryHoveredRect = labelRect; + + // ---------------- + // put a border on the icon to signify that it's the one being hovered + // note: _assetUsageEntryLabel.image currently has the icon of the asset we hovered + Rect iconHoveredRect = labelRect; + iconHoveredRect.x += 1; + iconHoveredRect.y += 2; + iconHoveredRect.width = 17; + iconHoveredRect.height = 16; + GUI.Box(iconHoveredRect, _assetUsageEntryLabel.image, "IconHovered"); + + // ---------------- + // if mouse is hovering over the correct area, we signify that + // the tooltip thumbnail should be drawn + if (BuildReportTool.Options.ShowTooltipThumbnail && + (BuildReportTool.Options.ShowThumbnailOnHoverLabelToo || + Mathf.Abs(mousePos.x - labelRect.x) < ICON_WIDTH) && + BRT_BuildReportWindow.GetAssetPreview(assetPath) != null) + { + _shouldShowThumbnailOnHoveredAsset = true; + } + else + { + _shouldShowThumbnailOnHoveredAsset = false; + } + } + } + + // ----------------------------------------------- + + currentY += BRT_BuildReportWindow.LIST_HEIGHT; + } + } + + void DrawAllAssetUsers(float assetUsageScrollViewWidth, int assetUsageScrollViewHeight, + bool assetUsageListScrollViewHeightIsClamped, + string pathOfSelectedAsset, List usersFlattened, + out int newEntryHoveredIdx, out string newEntryHoveredAssetPath, out Rect newEntryHoveredRect) + { + newEntryHoveredIdx = -1; + newEntryHoveredAssetPath = null; + newEntryHoveredRect = new Rect(); + + /* + _assetUsageEntryLabel.image = null; + if (IsShowingUsedAssets) + { + if (_selectedIsAResourcesAsset) + { + _assetUsageEntryLabel.text = "This Resources asset is used by:"; + } + else + { + _assetUsageEntryLabel.text = "Included in the build because it's used by:"; + } + } + else + { + _assetUsageEntryLabel.text = "Used by:"; + } + + var listLabelSize = GUI.skin.label.CalcSize(_assetUsageEntryLabel); + GUI.Label(new Rect(0, 0, scrollViewRect.width, listLabelSize.y), _assetUsageEntryLabel);*/ + + float currentY = 0; + + // draw only what's visible in the scrollview + + int userFlattenedN = 0; + int userFlattenedLen = usersFlattened.Count; + + if (assetUsageListScrollViewHeightIsClamped && usersFlattened.Count > 0) + { + // figure out which entry to start in + + // for every BRT_BuildReportWindow.LIST_HEIGHT in _assetUsagePanelScrollbarPos.y + // an entry has been hidden and doesn't need to be drawn + // and we only need to draw up until the number of entries that can fit in assetUsageScrollViewHeight + + // minus 1 since the first label at the top is not from the list + var toSkip = + Mathf.FloorToInt(_assetUsagePanelScrollbarPos.y / BRT_BuildReportWindow.LIST_HEIGHT); + + var amountToDraw = (assetUsageScrollViewHeight / BRT_BuildReportWindow.LIST_HEIGHT) + 2; + + if (toSkip >= 0) + { + userFlattenedN = toSkip; + currentY += toSkip * BRT_BuildReportWindow.LIST_HEIGHT; + + userFlattenedLen = toSkip + amountToDraw; + if (userFlattenedLen >= usersFlattened.Count) + { + userFlattenedLen = usersFlattened.Count; + } + + if (userFlattenedN >= usersFlattened.Count) + { + userFlattenedN = usersFlattened.Count - 1; + userFlattenedLen = 1; + } + } + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat( + "_assetUsagePanelScrollbarPos.y: {0}\nassetUsageScrollViewHeight: {1}\ntoSkip: {2}\namountToDraw: {3}\ntotal Count: {4}\n", + _assetUsagePanelScrollbarPos.y.ToString(CultureInfo.InvariantCulture), + assetUsageScrollViewHeight.ToString(CultureInfo.InvariantCulture), + toSkip.ToString(CultureInfo.InvariantCulture), + amountToDraw.ToString(CultureInfo.InvariantCulture), + usersFlattened.Count.ToString(CultureInfo.InvariantCulture)); +#endif + } + + const int INDENT_SPACE = 20; + const int PING_BUTTON_WIDTH = 37; + const int PING_BUTTON_HEIGHT = 18; + + var listEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_STYLE_NAME); + var listAltEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_ALT_STYLE_NAME); + var listSelectedEntryStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_SELECTED_NAME); + + if (listEntryStyle == null) + { + listEntryStyle = GUI.skin.label; + } + if (listAltEntryStyle == null) + { + listAltEntryStyle = GUI.skin.label; + } + if (listSelectedEntryStyle == null) + { + listSelectedEntryStyle = GUI.skin.label; + } + + EditorGUIUtility.SetIconSize(BRT_BuildReportWindow.IconSize); + + for (; userFlattenedN < userFlattenedLen; ++userFlattenedN) + { + var useAlt = ((usersFlattened[userFlattenedN].IndentLevel % 2) == 0); + + var styleToUse = useAlt ? listAltEntryStyle : listEntryStyle; + if (_selectedAssetUserIdx == userFlattenedN) + { + styleToUse = listSelectedEntryStyle; + } + + // ----------------------------------------------- + + bool labelPressed = false; + + var assetPath = usersFlattened[userFlattenedN].AssetPath; + + // ----------------------------------------------- + // Background color + + GUI.Box(new Rect(0, currentY, assetUsageScrollViewWidth, BRT_BuildReportWindow.LIST_HEIGHT), string.Empty, + styleToUse); + + var labelRect = new Rect( + (INDENT_SPACE * (usersFlattened[userFlattenedN].IndentLevel - 1)), currentY, + 0, BRT_BuildReportWindow.LIST_HEIGHT); + + // ------------------------- + // Ping button + + var pingButtonUsedWidth = 0; + if (!BuildReportTool.Options.DoubleClickOnAssetWillPing) + { + labelRect.x += PING_BUTTON_WIDTH; + pingButtonUsedWidth = PING_BUTTON_WIDTH; + if (GUI.Button(new Rect(0, currentY + 1, PING_BUTTON_WIDTH, PING_BUTTON_HEIGHT), "Ping", "ListButton")) + { + // only asset entries inside the top-level assets folder can be pinged + if (assetPath.IsInAssetsFolder()) + { + Utility.PingAssetInProject(assetPath); + } + } + } + + // ----------------------------------------------- + // Prefix Label + + if (usersFlattened[userFlattenedN].IndentLevel > 1) + { + var prefixLabelRect = new Rect( + pingButtonUsedWidth + (INDENT_SPACE * (usersFlattened[userFlattenedN].IndentLevel - 1)), currentY, + 0, BRT_BuildReportWindow.LIST_HEIGHT); + + int idxOfPrevious; + if (BuildReportTool.AssetDependencyGenerator.IsFileTypeBeforeAnother(usersFlattened, userFlattenedN, + ".mat", ".fbx", out idxOfPrevious)) + { + prefixLabelRect.width = styleToUse.CalcSize(AssetUsageWhichIsUsedAsDefaultMaterialByLabel).x; + labelPressed |= GUI.Button(prefixLabelRect, AssetUsageWhichIsUsedAsDefaultMaterialByLabel, + styleToUse); + } + else if (assetPath.IsFileOfType(".cs")) + { + prefixLabelRect.width = styleToUse.CalcSize(AssetUsageWhichIsUsedAsDefaultValueByLabel).x; + labelPressed |= GUI.Button(prefixLabelRect, AssetUsageWhichIsUsedAsDefaultValueByLabel, styleToUse); + } + else + { + prefixLabelRect.width = styleToUse.CalcSize(AssetUsageWhichIsUsedByLabel).x; + labelPressed |= GUI.Button(prefixLabelRect, AssetUsageWhichIsUsedByLabel, styleToUse); + } + + labelRect.x += prefixLabelRect.width; + } + + // ----------------------------------------------- + // Asset Path/Name + + _assetUsageEntryLabel.text = GetPrettyAssetPath(usersFlattened[userFlattenedN].AssetPath, BuildReportTool.Options.ShowColumnAssetPath, + _selectedAssetUserIdx == userFlattenedN); + _assetUsageEntryLabel.image = BuildReportTool.Window.Utility.GetIcon(assetPath); + + if (_assetUsageEntryLabel.image == null) + { + // no icon, leave some space before the label to represent where the icon would be + labelRect.x += BRT_BuildReportWindow.ICON_WIDTH_WITH_PADDING; + } + + if (usersFlattened[userFlattenedN].CyclicDependency) + { + // asset has a suffix label, width of the asset label itself should not take up entire remaining width + labelRect.width = listEntryStyle.CalcSize(_assetUsageEntryLabel).x; + } + else + { + // allow asset label width to take up remaining width + labelRect.width = assetUsageScrollViewWidth - labelRect.x; + } + + labelPressed |= GUI.Button(labelRect, _assetUsageEntryLabel, styleToUse); + + // ----------------------------------------------- + // Suffix Label + + if (usersFlattened[userFlattenedN].CyclicDependency) + { + // cyclic dependency means there's a label after the asset name, + // so we can't expand the width for the asset name, or the next label + // would show up away from it + + var suffixLabelRect = new Rect( + labelRect.xMax, currentY, + assetUsageScrollViewWidth - labelRect.xMax, BRT_BuildReportWindow.LIST_HEIGHT); + + labelPressed |= GUI.Button(suffixLabelRect, AssetUsageWhichIsACyclicDependencyLabel, styleToUse); + } + + // ----------------------------------------------- + // Indent Lines + + if (_indentLine == null) + { + var indentStyle = GUI.skin.FindStyle("IndentStyle1"); + if (indentStyle != null) + { + _indentLine = indentStyle.normal.background; + } + } + + var prevColor = GUI.color; + GUI.color = new Color(0, 0, 0, 0.5f); + for (int indentN = 1, indentLen = usersFlattened[userFlattenedN].IndentLevel; + indentN < indentLen; + ++indentN) + { + var indentRect = new Rect(pingButtonUsedWidth + ((indentN - 1) * 20), currentY, 20, 20); + GUI.DrawTexture(indentRect, _indentLine, ScaleMode.StretchToFill); + } + + GUI.color = prevColor; + + // ----------------------------------------------- + // Respond to Click + + if (labelPressed) + { + // --------------------------- + // Respond to Double-click Ping if needed + if (BuildReportTool.Options.DoubleClickOnAssetWillPing && + _selectedAssetUserIdx == userFlattenedN && + (EditorApplication.timeSinceStartup - _assetListEntryLastClickedTime) < DOUBLE_CLICK_THRESHOLD && + assetPath.IsInAssetsFolder()) + { + Utility.PingAssetInProject(assetPath); + } + + // --------------------------- + + SetAssetUsageAncestry(_assetUsageAncestry, usersFlattened, userFlattenedN, + pathOfSelectedAsset); + _assetUsageAncestryHasFbxUsingDefaultMaterialUsedInScene = + DoesAssetUsageAncestryHaveFbxUsingDefaultMaterialUsedInScene(_assetUsageAncestry); + + _selectedAssetUserIdx = userFlattenedN; + _assetListEntryLastClickedTime = EditorApplication.timeSinceStartup; + } + + // ----------------------------------------------- + // Hover Check + + if (Event.current.type == EventType.Repaint) + { + const int ICON_WIDTH = 20; + + var mousePos = Event.current.mousePosition; + + if (labelRect.Contains(mousePos)) + { + newEntryHoveredIdx = userFlattenedN; + newEntryHoveredAssetPath = assetPath; + newEntryHoveredRect = labelRect; + + // ---------------- + // put a border on the icon to signify that it's the one being hovered + // note: _assetUsageEntryLabel.image currently has the icon of the asset we hovered + Rect iconHoveredRect = labelRect; + iconHoveredRect.x += 1; + iconHoveredRect.y += 2; + iconHoveredRect.width = 17; + iconHoveredRect.height = 16; + GUI.Box(iconHoveredRect, _assetUsageEntryLabel.image, "IconHovered"); + + // ---------------- + // if mouse is hovering over the correct area, we signify that + // the tooltip thumbnail should be drawn + if (BuildReportTool.Options.ShowTooltipThumbnail && + (BuildReportTool.Options.ShowThumbnailOnHoverLabelToo || + Mathf.Abs(mousePos.x - labelRect.x) < ICON_WIDTH) && + BRT_BuildReportWindow.GetAssetPreview(assetPath) != null) + { + _shouldShowThumbnailOnHoveredAsset = true; + } + else + { + _shouldShowThumbnailOnHoveredAsset = false; + } + } + } + + // ----------------------------------------------- + + currentY += BRT_BuildReportWindow.LIST_HEIGHT; + } + } + + + void DrawAssetInfoPanel(Rect position, float availableWidth, BuildInfo buildReportToDisplay, + AssetDependencies assetDependencies) + { + if (_selectedAssetUsageDisplayIdx == ASSET_USAGE_DISPLAY_ALL) + { + DrawAssetUsageAncestry(position, availableWidth, buildReportToDisplay, assetDependencies); + } + else if (_selectedAssetUsageDisplayIdx == ASSET_USAGE_DISPLAY_DIRECT) + { + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + + _assetUsageEntryLabel.text = BuildReportTool.Util.GetAssetFilename(_assetUserCrumbs[0].AssetPath); + _assetUsageEntryLabel.image = AssetDatabase.GetCachedIcon(_assetUserCrumbs[0].AssetPath); + if (GUILayout.Toggle(_assetUserCrumbActiveIdx == 0, _assetUsageEntryLabel, BRT_BuildReportWindow.STYLE_BREADCRUMB_LEFT) && + _assetUserCrumbActiveIdx != 0) + { + // before switching, store the scrollbar pos so that we can return to it + if (_assetUserCrumbs.Count > 0 && _assetUserCrumbActiveIdx >= 0 && + _assetUserCrumbActiveIdx < _assetUserCrumbs.Count) + { + var entryToModify = _assetUserCrumbs[_assetUserCrumbActiveIdx]; + entryToModify.ScrollbarPosY = _assetUsagePanelScrollbarPos.y; + _assetUserCrumbs[_assetUserCrumbActiveIdx] = entryToModify; + } + + _assetUserCrumbActiveIdx = 0; + _assetUsagePanelScrollbarPos.y = _assetUserCrumbs[0].ScrollbarPosY; + SelectNextAssetUserCrumb(assetDependencies.GetAssetDependencies()); + } + + for (int crumbN = 1, crumbLen = _assetUserCrumbs.Count; crumbN < crumbLen; ++crumbN) + { + _assetUsageEntryLabel.text = BuildReportTool.Util.GetAssetFilename(_assetUserCrumbs[crumbN].AssetPath); + _assetUsageEntryLabel.image = AssetDatabase.GetCachedIcon(_assetUserCrumbs[crumbN].AssetPath); + + if (GUILayout.Toggle(_assetUserCrumbActiveIdx == crumbN, _assetUsageEntryLabel, + BRT_BuildReportWindow.STYLE_BREADCRUMB_MID) && _assetUserCrumbActiveIdx != crumbN) + { + // before switching, store the scrollbar pos so that we can return to it + if (_assetUserCrumbs.Count > 0 && _assetUserCrumbActiveIdx >= 0 && + _assetUserCrumbActiveIdx < _assetUserCrumbs.Count) + { + var entryToModify = _assetUserCrumbs[_assetUserCrumbActiveIdx]; + entryToModify.ScrollbarPosY = _assetUsagePanelScrollbarPos.y; + _assetUserCrumbs[_assetUserCrumbActiveIdx] = entryToModify; + } + + _assetUserCrumbActiveIdx = crumbN; + _assetUsagePanelScrollbarPos.y = _assetUserCrumbs[crumbN].ScrollbarPosY; + SelectNextAssetUserCrumb(assetDependencies.GetAssetDependencies()); + } + } + + GUILayout.EndHorizontal(); + } + } + + const int ASSET_INFO_TOOLBAR_HEIGHT = 15; + + void DrawAssetInfoToolbar(Rect position, string selectedAssetPath, AssetDependencies assetDependencies) + { + var bgRect = new Rect(0, 0, + position.width, ASSET_INFO_TOOLBAR_HEIGHT); + + if (_showAssetUsagesList) + { + bgRect.y = _assetUsageRect.y + 2; + } + else + { + bgRect.y = position.height - ASSET_INFO_TOOLBAR_HEIGHT; + bgRect.height += 3; + } + + GUI.Box(bgRect, "", "ListButton"); + + const int EXPAND_BUTTON_WIDTH = 150; + var expandButtonRect = new Rect(bgRect.x + ((bgRect.width - EXPAND_BUTTON_WIDTH) / 2), bgRect.y, + EXPAND_BUTTON_WIDTH, ASSET_INFO_TOOLBAR_HEIGHT); + + var showAllUsagesLabel = _showAssetUsagesList + ? "Hide" + : "Show More Usages"; + + var newShowAssetUsersList = + GUI.Toggle(expandButtonRect, _showAssetUsagesList, showAllUsagesLabel, "ExpandButton"); + + if (newShowAssetUsersList != _showAssetUsagesList) + { + _showAssetUsagesList = newShowAssetUsersList; + if (!newShowAssetUsersList) + { + if (_selectedAssetUsageDisplayIdx != ASSET_USAGE_DISPLAY_ALL) + { + _selectedAssetUsageDisplayIdx = ASSET_USAGE_DISPLAY_ALL; + SetAssetUsageHistoryToFirstEndUser(selectedAssetPath, assetDependencies); + } + } + } + + if (_showAssetUsagesList) + { + // --------------------------------------------- + // if asset users list is shown, + // show the toggles to change what kind + // of users list is shown + + const int ASSET_USAGE_LABEL_WIDTH = 40; + var assetUsageLabelRect = + new Rect(bgRect.x + 5, bgRect.y, + ASSET_USAGE_LABEL_WIDTH, ASSET_INFO_TOOLBAR_HEIGHT); + GUI.Label(assetUsageLabelRect, "Show:"); + + var newAssetUsageDisplayIdx = GUI.SelectionGrid( + new Rect(assetUsageLabelRect.xMax, bgRect.y, + 150, ASSET_INFO_TOOLBAR_HEIGHT), + _selectedAssetUsageDisplayIdx, AssetUsageDisplayLabel, 3, "ListButtonRadio"); + + if (newAssetUsageDisplayIdx != _selectedAssetUsageDisplayIdx) + { + // previously showing direct users and is leaving it + // store the scrollbar pos so that we can return to it + if (_selectedAssetUsageDisplayIdx == ASSET_USAGE_DISPLAY_DIRECT) + { + if (_assetUserCrumbs.Count > 0 && _assetUserCrumbActiveIdx >= 0 && + _assetUserCrumbActiveIdx < _assetUserCrumbs.Count) + { + var entryToModify = _assetUserCrumbs[_assetUserCrumbActiveIdx]; + entryToModify.ScrollbarPosY = _assetUsagePanelScrollbarPos.y; + _assetUserCrumbs[_assetUserCrumbActiveIdx] = entryToModify; + } + } + + _selectedAssetUsageDisplayIdx = newAssetUsageDisplayIdx; + + // what asset user list is shown has been changed + // so we need to change what asset user is selected + if (_selectedAssetUsageDisplayIdx == ASSET_USAGE_DISPLAY_ALL) + { + SetAssetUsageHistoryToFirstEndUser(selectedAssetPath, assetDependencies); + } + else + { + _selectedAssetUserIdx = -1; + } + + // switched to showing direct users + // ensure crumbs is showing proper values + if (_selectedAssetUsageDisplayIdx == ASSET_USAGE_DISPLAY_DIRECT) + { + ChangeAssetUserCrumbRootIfNeeded(selectedAssetPath); + + if (_assetUserCrumbs.Count > 0 && _assetUserCrumbActiveIdx >= 0 && + _assetUserCrumbActiveIdx < _assetUserCrumbs.Count) + { + _assetUsagePanelScrollbarPos.y = _assetUserCrumbs[_assetUserCrumbActiveIdx].ScrollbarPosY; + + SelectNextAssetUserCrumb(assetDependencies.GetAssetDependencies()); + } + } + } + } + } + + + void DrawAssetUsageAncestry(Rect position, float availableWidth, BuildInfo buildReportToDisplay, + AssetDependencies assetDependencies) + { + var assetStyle = GUI.skin.FindStyle("Asset"); + var assetHoveredStyle = GUI.skin.FindStyle("AssetHovered"); + var assetLabelInBetweenStyle = GUI.skin.FindStyle("LabelSingleLine"); + var assetUsageArrowStyle = GUI.skin.FindStyle("AssetUsageArrow"); + + if (assetStyle == null) + { + assetStyle = GUI.skin.label; + } + if (assetHoveredStyle == null) + { + assetHoveredStyle = GUI.skin.label; + } + if (assetLabelInBetweenStyle == null) + { + assetLabelInBetweenStyle = GUI.skin.label; + } + Texture2D assetUsageArrow; + if (assetUsageArrowStyle != null) + { + assetUsageArrow = assetUsageArrowStyle.normal.background; + } + else + { + assetUsageArrow = null; + assetUsageArrowStyle = GUI.skin.label; + } + + // draw usage ancestry + // for selected user + + float currentRowWidth = 0; + bool moreThan1Row = false; + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + + var newAssetUsageAncestryEntryHoveredIdx = -1; + + for (int n = 0, len = _assetUsageAncestry.Count; n < len; ++n) + { + // -------------------------- + // width of the asset name itself + var widthToAdd = assetStyle.CalcSize(_assetUsageAncestry[n].Label).x; + +#if BRT_ASSET_LIST_SCREEN_DEBUG + //_debugText.AppendFormat("Actual Item {0} name width: {1}\n", + // n, + // widthToAdd.ToString(CultureInfo.InvariantCulture)); +#endif + + if (currentRowWidth + widthToAdd >= availableWidth) + { + moreThan1Row = true; +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("Actual Row width: {0}\n", + currentRowWidth.ToString(CultureInfo.InvariantCulture)); +#endif + + currentRowWidth = 0; + GUILayout.EndHorizontal(); + GUILayout.Space(ASSET_USAGE_HISTORY_ROW_SPACING); + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + } + + currentRowWidth += widthToAdd; + + // -------------------------- + // asset name + + var assetPressed = GUILayout.Button(_assetUsageAncestry[n].Label, + n == _assetUsageAncestryHoveredIdx ? assetHoveredStyle : assetStyle, + BRT_BuildReportWindow.LayoutHeight21); + + if (Event.current.type == EventType.Repaint && + (Event.current.mousePosition.x < position.width || + Event.current.mousePosition.y < position.height)) + { + var assetUsageAncestryEntryRect = GUILayoutUtility.GetLastRect(); + + if (assetUsageAncestryEntryRect.Contains(Event.current.mousePosition)) + { + newAssetUsageAncestryEntryHoveredIdx = n; + + // ---------------- + // update what is considered the hovered asset, for use later on + // when the tooltip will be drawn + BRT_BuildReportWindow.UpdateHoveredAsset(_assetUsageAncestry[n].AssetPath, + assetUsageAncestryEntryRect, IsShowingUsedAssets, + buildReportToDisplay, assetDependencies); + + // ---------------- + // if mouse is hovering over the correct area, we signify that + // the tooltip thumbnail should be drawn + if (BuildReportTool.Options.ShowTooltipThumbnail && + BRT_BuildReportWindow.GetAssetPreview(_assetUsageAncestry[n].AssetPath) != null) + { + _shouldShowThumbnailOnHoveredAsset = true; + } + else + { + _shouldShowThumbnailOnHoveredAsset = false; + } + } + } + + if (assetPressed) + { + Utility.PingAssetInProject(_assetUsageAncestry[n].AssetPath); + } + + // -------------------------- + // width of the label following the asset + widthToAdd = 0; + + var isMaterialUsedByMesh = IsFileNextToFile(_assetUsageAncestry, n, ".mat", ".fbx"); + var isScriptUsedByAssembly = IsFileNextToFile(_assetUsageAncestry, n, ".cs", ".dll"); + var isAResourcesAsset = _assetUsageAncestry[n].AssetPath.IsInResourcesFolder(); + var isAssetUsedByScript = (n < len - 1) && _assetUsageAncestry[n + 1].AssetPath.IsFileOfType(".cs"); + + if (BuildReportTool.Options.IsAssetUsageLabelTypeOnVerbose) + { + if (n == 0) + { + if (isMaterialUsedByMesh) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageIsUsedAsDefaultMaterialByLabel).x; + } + else if (isAResourcesAsset) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageIsAResourcesAssetButAlsoUsedByLabel).x; + } + else if (isAssetUsedByScript) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageIsUsedAsDefaultValueByLabel).x; + } + else if (isScriptUsedByAssembly) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageIsCompiledIntoLabel).x; + } + else + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageIsUsedByLabel).x; + } + + widthToAdd += assetLabelInBetweenStyle.margin.horizontal; + } + else if (n < len - 1) + { + if (isMaterialUsedByMesh) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageWhichIsUsedAsDefaultMaterialByLabel).x; + } + else if (isAResourcesAsset) + { + widthToAdd = assetLabelInBetweenStyle + .CalcSize(AssetUsageWhichIsAResourcesAssetButAlsoUsedByLabel).x; + } + else if (isAssetUsedByScript) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageWhichIsUsedAsDefaultValueByLabel).x; + } + else + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageWhichIsUsedByLabel).x; + } + + widthToAdd += assetLabelInBetweenStyle.margin.horizontal; + } + else if (n == len - 1) + { + if (_assetUsageAncestry[n].AssetPath.IsSceneFile()) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageWhichIsInTheBuildLabel).x + + assetLabelInBetweenStyle.margin.horizontal; + } + else if (_assetUsageAncestry[n].AssetPath.IsAnAssembly()) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageWhichIsInTheBuildLabel).x + + assetLabelInBetweenStyle.margin.horizontal; + } + else if (_assetUsageAncestry[n].AssetPath.IsInResourcesFolder()) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageWhichIsAResourcesAssetLabel).x + + assetLabelInBetweenStyle.margin.horizontal; + } + else if (_assetUsageAncestry[n].CyclicDependency) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageWhichIsACyclicDependencyLabel).x + + assetLabelInBetweenStyle.margin.horizontal; + } + } + } + else if (BuildReportTool.Options.IsAssetUsageLabelTypeOnStandard) + { + if (n < len - 1) + { + // todo determine if _assetUsageAncestry[n] has extra info and add that to width + widthToAdd = assetUsageArrow.width + assetUsageArrowStyle.padding.horizontal; + } + } + else if (BuildReportTool.Options.IsAssetUsageLabelTypeOnMinimal) + { + if (n < len - 1) + { + widthToAdd = assetUsageArrow.width + assetUsageArrowStyle.padding.horizontal; + } + } + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("Actual Item {0} in-between width: {1}\n", + n.ToString(), + widthToAdd.ToString(CultureInfo.InvariantCulture)); +#endif + + if (currentRowWidth + widthToAdd >= availableWidth) + { + moreThan1Row = true; +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("Actual Row width: {0}\n", + currentRowWidth.ToString(CultureInfo.InvariantCulture)); +#endif + + currentRowWidth = 0; + GUILayout.EndHorizontal(); + GUILayout.Space(ASSET_USAGE_HISTORY_ROW_SPACING); + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + } + + currentRowWidth += widthToAdd; + + // -------------------------- + // label following the asset + + if (BuildReportTool.Options.IsAssetUsageLabelTypeOnVerbose) + { + if (n == 0) + { + if (isMaterialUsedByMesh) + { + GUILayout.Label(AssetUsageIsUsedAsDefaultMaterialByLabel, + assetLabelInBetweenStyle, BRT_BuildReportWindow.LayoutNone); + } + else if (isAResourcesAsset) + { + GUILayout.Label(AssetUsageIsAResourcesAssetButAlsoUsedByLabel, + assetLabelInBetweenStyle, BRT_BuildReportWindow.LayoutNone); + } + else if (isAssetUsedByScript) + { + GUILayout.Label(AssetUsageIsUsedAsDefaultValueByLabel, + assetLabelInBetweenStyle, BRT_BuildReportWindow.LayoutNone); + } + else if (isScriptUsedByAssembly) + { + GUILayout.Label(AssetUsageIsCompiledIntoLabel, + assetLabelInBetweenStyle, BRT_BuildReportWindow.LayoutNone); + } + else + { + GUILayout.Label(AssetUsageIsUsedByLabel, + assetLabelInBetweenStyle, BRT_BuildReportWindow.LayoutNone); + } + } + else if (n < len - 1) + { + if (isMaterialUsedByMesh) + { + GUILayout.Label(AssetUsageWhichIsUsedAsDefaultMaterialByLabel, + assetLabelInBetweenStyle, BRT_BuildReportWindow.LayoutNone); + } + else if (isAResourcesAsset) + { + GUILayout.Label(AssetUsageWhichIsAResourcesAssetButAlsoUsedByLabel, + assetLabelInBetweenStyle, BRT_BuildReportWindow.LayoutNone); + } + else if (isAssetUsedByScript) + { + GUILayout.Label(AssetUsageWhichIsUsedAsDefaultValueByLabel, + assetLabelInBetweenStyle, BRT_BuildReportWindow.LayoutNone); + } + else + { + GUILayout.Label(AssetUsageWhichIsUsedByLabel, + assetLabelInBetweenStyle, BRT_BuildReportWindow.LayoutNone); + } + } + else if (n == len - 1) + { + if (_assetUsageAncestry[n].AssetPath.IsSceneFile()) + { + GUILayout.Label(AssetUsageWhichIsInTheBuildLabel, + assetLabelInBetweenStyle, BRT_BuildReportWindow.LayoutNone); + } + else if (_assetUsageAncestry[n].AssetPath.IsAnAssembly()) + { + GUILayout.Label(AssetUsageWhichIsInTheBuildLabel, + assetLabelInBetweenStyle, BRT_BuildReportWindow.LayoutNone); + } + else if (_assetUsageAncestry[n].AssetPath.IsInResourcesFolder()) + { + GUILayout.Label(AssetUsageWhichIsAResourcesAssetLabel, + assetLabelInBetweenStyle, BRT_BuildReportWindow.LayoutNone); + } + else if (_assetUsageAncestry[n].CyclicDependency) + { + GUILayout.Label(AssetUsageWhichIsACyclicDependencyLabel, + assetLabelInBetweenStyle, BRT_BuildReportWindow.LayoutNone); + } + } + } + else if (BuildReportTool.Options.IsAssetUsageLabelTypeOnStandard) + { + // don't draw arrow after last asset + if (n < len - 1) + { + // todo determine if _assetUsageAncestry[n] has extra info and draw that and different kind of arrow + + var needWidth = assetUsageArrow.width + assetUsageArrowStyle.padding.horizontal; + + // Note: I set the width to 9 for the GetRect(), and it gives me a width of 422 (???) + // I have to force set expand width to false. It seems expand width is set to true, + // even with no style specified. + Rect arrowRect = GUILayoutUtility.GetRect(needWidth, assetUsageArrow.height, + GUILayout.ExpandWidth(false), GUILayout.ExpandHeight(false)); + + //Debug.LogFormat("Event.current.type: {0}\nrequested width x height: {1}x{2}\ngot rect: {3}", + // Event.current.type, needWidth, needHeight, arrowRect); + + if (Event.current.type == EventType.Repaint) + { + arrowRect.y += ((ASSET_INFO_ROW_HEIGHT - assetUsageArrow.height) / 2.0f); + arrowRect.height = assetUsageArrow.height; + GUI.DrawTexture(arrowRect, assetUsageArrow); + } + } + } + else if (BuildReportTool.Options.IsAssetUsageLabelTypeOnMinimal) + { + // don't draw arrow after last asset + if (n < len - 1) + { + var needWidth = assetUsageArrow.width + assetUsageArrowStyle.padding.horizontal; + + // Note: I set the width to 9 for the GetRect(), and it gives me a width of 422 (???) + // I have to force set expand width to false. It seems expand width is set to true, + // even with no style specified. + Rect arrowRect = GUILayoutUtility.GetRect(needWidth, assetUsageArrow.height, + GUILayout.ExpandWidth(false), GUILayout.ExpandHeight(false)); + + //Debug.LogFormat("Event.current.type: {0}\nrequested width x height: {1}x{2}\ngot rect: {3}", + // Event.current.type, needWidth, needHeight, arrowRect); + + if (Event.current.type == EventType.Repaint) + { + arrowRect.y += ((ASSET_INFO_ROW_HEIGHT - assetUsageArrow.height) / 2.0f); + arrowRect.height = assetUsageArrow.height; + GUI.DrawTexture(arrowRect, assetUsageArrow); + } + } + } + + // -------------------------- + } // end of for-loop on asset usage ancestry + + if (Event.current.type == EventType.Repaint) + { + _assetUsageAncestryHoveredIdx = newAssetUsageAncestryEntryHoveredIdx; + } + + GUILayout.EndHorizontal(); + if (moreThan1Row) + { + GUILayout.Space(ASSET_USAGE_HISTORY_LAST_ROW_PADDING); + } + + if (_assetUsageAncestryHasFbxUsingDefaultMaterialUsedInScene) + { + GUILayout.Label(AssetUsageAncestryDefaultMaterialInFbxOfScene, BRT_BuildReportWindow.LayoutNone); + } + } + + + int GetNumberOfAssetUsageAncestryRows(List list, float availableWidth) + { + var assetStyle = GUI.skin.FindStyle("Asset"); + var assetLabelInBetweenStyle = GUI.skin.FindStyle("LabelSingleLine"); + var assetUsageArrowStyle = GUI.skin.FindStyle("AssetUsageArrow"); + + if (assetStyle == null) + { + assetStyle = GUI.skin.label; + } + if (assetLabelInBetweenStyle == null) + { + assetLabelInBetweenStyle = GUI.skin.label; + } + Texture2D assetUsageArrow; + if (assetUsageArrowStyle != null) + { + assetUsageArrow = assetUsageArrowStyle.normal.background; + } + else + { + assetUsageArrow = null; + assetUsageArrowStyle = GUI.skin.label; + } + + var numberOfRowsInAssetUsageAncestry = 1; + + float currentRowWidth = 0; + + for (int n = 0, len = list.Count; n < len; ++n) + { + // -------------------------- + // width of the asset name + + var widthToAdd = assetStyle.CalcSize(list[n].Label).x; + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("Item {0} name width: {1}\n", + n.ToString(), + widthToAdd.ToString(CultureInfo.InvariantCulture)); +#endif + + if (currentRowWidth + widthToAdd >= availableWidth) + { +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("Row {0} width: {1}\n", + numberOfRowsInAssetUsageAncestry.ToString(), + currentRowWidth.ToString(CultureInfo.InvariantCulture)); +#endif + + currentRowWidth = 0; + + ++numberOfRowsInAssetUsageAncestry; + } + + currentRowWidth += widthToAdd; + + // -------------------------- + // width of the label following the asset + + widthToAdd = 0; + + if (BuildReportTool.Options.IsAssetUsageLabelTypeOnVerbose) + { + if (n == 0) + { + if (IsFileNextToFile(list, n, ".mat", ".fbx")) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageIsUsedAsDefaultMaterialByLabel).x; + } + else if (list[n].AssetPath.IsInResourcesFolder()) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageIsAResourcesAssetButAlsoUsedByLabel).x; + } + else if ((n < len - 1) && list[n + 1].AssetPath.IsFileOfType(".cs")) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageIsUsedAsDefaultValueByLabel).x; + } + else if (IsFileNextToFile(list, n, ".cs", ".dll")) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageIsCompiledIntoLabel).x; + } + else + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageIsUsedByLabel).x; + } + + widthToAdd += assetLabelInBetweenStyle.margin.horizontal; + } + else if (n < len - 1) + { + if (IsFileNextToFile(list, n, ".mat", ".fbx")) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageWhichIsUsedAsDefaultMaterialByLabel).x; + } + else if (list[n].AssetPath.IsInResourcesFolder()) + { + widthToAdd = assetLabelInBetweenStyle + .CalcSize(AssetUsageWhichIsAResourcesAssetButAlsoUsedByLabel).x; + } + else if ((n < len - 1) && list[n + 1].AssetPath.IsFileOfType(".cs")) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageWhichIsUsedAsDefaultValueByLabel).x; + } + else + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageWhichIsUsedByLabel).x; + } + + widthToAdd += assetLabelInBetweenStyle.margin.horizontal; + } + else if (n == len - 1) + { + if (list[n].AssetPath.IsSceneFile()) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageWhichIsInTheBuildLabel).x + + assetLabelInBetweenStyle.margin.horizontal; + } + else if (list[n].AssetPath.IsAnAssembly()) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageWhichIsInTheBuildLabel).x + + assetLabelInBetweenStyle.margin.horizontal; + } + else if (list[n].AssetPath.IsInResourcesFolder()) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageWhichIsAResourcesAssetLabel).x + + assetLabelInBetweenStyle.margin.horizontal; + } + else if (list[n].CyclicDependency) + { + widthToAdd = assetLabelInBetweenStyle.CalcSize(AssetUsageWhichIsACyclicDependencyLabel).x + + assetLabelInBetweenStyle.margin.horizontal; + } + } + } + else if (BuildReportTool.Options.IsAssetUsageLabelTypeOnStandard) + { + if (n < len - 1) + { + // todo determine if list[n] has extra info and add that to width + widthToAdd = assetUsageArrow.width + assetUsageArrowStyle.padding.horizontal; + } + } + else if (BuildReportTool.Options.IsAssetUsageLabelTypeOnMinimal) + { + if (n < len - 1) + { + widthToAdd = assetUsageArrow.width + assetUsageArrowStyle.padding.horizontal; + } + } + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("Item {0} in-between label width: {1}\n", + n, + widthToAdd.ToString(CultureInfo.InvariantCulture)); +#endif + + if (currentRowWidth + widthToAdd >= availableWidth) + { +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("Row {0} width: {1}\n", + numberOfRowsInAssetUsageAncestry.ToString(), + currentRowWidth.ToString(CultureInfo.InvariantCulture)); +#endif + + currentRowWidth = 0; + + ++numberOfRowsInAssetUsageAncestry; + } + + currentRowWidth += widthToAdd; + } + +#if BRT_ASSET_LIST_SCREEN_DEBUG + _debugText.AppendFormat("numberOfRowsInAssetUsageTraceHistory: {0}\n", + numberOfRowsInAssetUsageAncestry.ToString()); +#endif + + + return numberOfRowsInAssetUsageAncestry; + } + + + /// + /// Trace the ancestry + /// "end user" is either a scene that's included in the build, or a Resources asset. + /// + /// the asset whose usage we are inspecting + /// + void SetAssetUsageHistoryToFirstEndUser(string rootAsset, AssetDependencies assetDependencies) + { + if (assetDependencies == null) + { + return; + } + + var dependencies = assetDependencies.GetAssetDependencies(); + + if (!dependencies.ContainsKey(rootAsset)) + { + return; + } + + var selectedAssetDependencies = dependencies[rootAsset]; + var selectedAssetUsers = selectedAssetDependencies.Users; + + if (selectedAssetUsers.Count <= 0) + { + // asset isn't used by any other asset + return; + } + + var usersFlattened = selectedAssetDependencies.UsersFlattened; + + if (usersFlattened.Count <= 0) + { + // asset has no flattened users list + return; + } + + + // ---------------- + // find first scene + + for (int n = 0, len = usersFlattened.Count; n < len; ++n) + { + if (usersFlattened[n].AssetPath.IsSceneFile()) + { + _selectedAssetUserIdx = n; + SetAssetUsageAncestry(_assetUsageAncestry, usersFlattened, n, rootAsset); + _assetUsageAncestryHasFbxUsingDefaultMaterialUsedInScene = + DoesAssetUsageAncestryHaveFbxUsingDefaultMaterialUsedInScene(_assetUsageAncestry); + return; + } + } + + // ---------------- + // no scene found, now check if a Resources asset uses it + + for (int n = 0, len = usersFlattened.Count; n < len; ++n) + { + if (usersFlattened[n].AssetPath.IsInResourcesFolder()) + { + _selectedAssetUserIdx = n; + SetAssetUsageAncestry(_assetUsageAncestry, usersFlattened, n, rootAsset); + _assetUsageAncestryHasFbxUsingDefaultMaterialUsedInScene = false; + return; + } + } + + // ---------------- + // no end user found, just select the first user + + _selectedAssetUserIdx = 0; + SetAssetUsageAncestry(_assetUsageAncestry, usersFlattened, 0, rootAsset); + _assetUsageAncestryHasFbxUsingDefaultMaterialUsedInScene = false; + } + + + /// + /// Check special case when a scene is using an fbx directly (did not save it as a prefab first). + /// In this case, it's impossible to tell whether the fbx in that scene is using its + /// default material, or if it's overriden to use no material. So, without opening the scene + /// and checking directly, we cannot be sure of the Asset Usage Ancestry in this situation. + /// + /// + /// + static bool DoesAssetUsageAncestryHaveFbxUsingDefaultMaterialUsedInScene(List list) + { + if (list.Count >= 3 && + list[list.Count - 1].AssetPath.IsSceneFile() && + list[list.Count - 2].AssetPath.IsMeshFile() && + list[list.Count - 3].AssetPath.IsMaterialFile()) + { + return true; + } + else + { + return false; + } + } + + /// + /// Trace the ancestry of asset usage gor a given asset, and assign it to the destination List. + /// + /// + /// Entire asset usage chain + /// + /// the asset whose usage we are inspecting + static void SetAssetUsageAncestry(List destination, List source, + int idxChosenFromSource, string rootAsset) + { + destination.Clear(); + + // -------------------------------------- + + AssetUsageAncestry lastEntry; + lastEntry.AssetPath = source[idxChosenFromSource].AssetPath; + lastEntry.CyclicDependency = source[idxChosenFromSource].CyclicDependency; + lastEntry.Label = + new GUIContent( + lastEntry.AssetPath.GetFileNameOnly(), + BuildReportTool.Window.Utility.GetIcon(lastEntry.AssetPath)); + + destination.Add(lastEntry); + + // -------------------------------------- + + var currentIndentLevel = source[idxChosenFromSource].IndentLevel; + + // go backwards and insert each one in front of the destination list + for (int traceN = idxChosenFromSource - 1; traceN >= 0; --traceN) + { + // we need only the entries that move to upper indent levels each time + if (source[traceN].IndentLevel >= currentIndentLevel) + { + continue; + } + + currentIndentLevel = source[traceN].IndentLevel; + + AssetUsageAncestry newEntry; + newEntry.AssetPath = source[traceN].AssetPath; + newEntry.CyclicDependency = source[traceN].CyclicDependency; + newEntry.Label = + new GUIContent( + newEntry.AssetPath.GetFileNameOnly(), + BuildReportTool.Window.Utility.GetIcon(newEntry.AssetPath)); + + destination.Insert(0, newEntry); + } + + // -------------------------------------- + + AssetUsageAncestry firstEntry; + firstEntry.AssetPath = rootAsset; + firstEntry.CyclicDependency = false; + firstEntry.Label = + new GUIContent( + firstEntry.AssetPath.GetFileNameOnly(), + BuildReportTool.Window.Utility.GetIcon(firstEntry.AssetPath)); + destination.Insert(0, firstEntry); + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_AssetUsage.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_AssetUsage.cs.meta new file mode 100644 index 00000000..b9a9235b --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_AssetUsage.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: d550d5e908734d6499daded04dac1812 +timeCreated: 1558433314 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_Delete.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_Delete.cs new file mode 100644 index 00000000..897242f0 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_Delete.cs @@ -0,0 +1,301 @@ +using UnityEngine; +using UnityEditor; +using System.Collections.Generic; + +namespace BuildReportTool.Window.Screen +{ + public partial class AssetList + { + bool ShouldShowDeleteButtons(BuildInfo buildReportToDisplay) + { + return + (IsShowingUnusedAssets && buildReportToDisplay.HasUnusedAssets) || + (buildReportToDisplay.HasUsedAssets && BuildReportTool.Options.AllowDeletingOfUsedAssets); + } + + + void InitiateDeleteSelectedUsed(BuildInfo buildReportToDisplay) + { + BuildReportTool.AssetList listToDeleteFrom = GetAssetListToDisplay(buildReportToDisplay); + + InitiateDeleteSelectedInAssetList(buildReportToDisplay, listToDeleteFrom); + } + + void InitiateDeleteSelectedInAssetList(BuildInfo buildReportToDisplay, BuildReportTool.AssetList listToDeleteFrom) + { + if (listToDeleteFrom.IsNothingSelected) + { + return; + } + + + BuildReportTool.SizePart[] all = listToDeleteFrom.All; + + int numOfFilesRequestedToDelete = listToDeleteFrom.GetSelectedCount(); + int numOfFilesToDelete = numOfFilesRequestedToDelete; + int systemDeletionFileCount = 0; + int brtFilesSelectedForDelete = 0; + + + // filter out files that shouldn't be deleted + // and identify unrecoverable files + for (int n = 0, len = all.Length; n < len; ++n) + { + BuildReportTool.SizePart b = all[n]; + bool isThisFileToBeDeleted = listToDeleteFrom.InSumSelection(b); + + if (isThisFileToBeDeleted) + { + if (BuildReportTool.Util.IsFileInBuildReportFolder(b.Name) && + !BuildReportTool.Util.IsUselessFile(b.Name)) + { + //Debug.Log("BRT file? " + b.Name); + --numOfFilesToDelete; + ++brtFilesSelectedForDelete; + } + else if (BuildReportTool.Util.HaveToUseSystemForDelete(b.Name)) + { + ++systemDeletionFileCount; + } + } + } + + if (numOfFilesToDelete <= 0) + { + if (brtFilesSelectedForDelete > 0) + { + EditorApplication.Beep(); + EditorUtility.DisplayDialog("Can't delete!", + "Take note that for safety, Build Report Tool assets themselves will not be included for deletion.", + "OK"); + } + + return; + } + + + // prepare warning message for user + + bool deletingSystemFilesOnly = (systemDeletionFileCount == numOfFilesToDelete); + bool deleteIsRecoverable = !deletingSystemFilesOnly; + + string plural = ""; + if (numOfFilesToDelete > 1) + { + plural = "s"; + } + + string message; + + if (numOfFilesRequestedToDelete != numOfFilesToDelete) + { + message = "Among " + numOfFilesRequestedToDelete + " file" + plural + " requested to be deleted, only " + + numOfFilesToDelete + " will be deleted."; + } + else + { + message = "This will delete " + numOfFilesToDelete + " asset" + plural + " in your project."; + } + + // add warning about BRT files that are skipped + if (brtFilesSelectedForDelete > 0) + { + message += "\n\nTake note that for safety, " + brtFilesSelectedForDelete + " file" + + ((brtFilesSelectedForDelete > 1) ? "s" : "") + + " found to be Build Report Tool assets are not included for deletion."; + } + + // add warning about unrecoverable files + if (systemDeletionFileCount > 0) + { + if (deletingSystemFilesOnly) + { + message += "\n\nThe deleted file" + plural + " will not be recoverable from the " + + BuildReportTool.Util.NameOfOSTrashFolder + ", unless you have your own backup."; + } + else + { + message += "\n\nAmong the " + numOfFilesToDelete + " file" + plural + " for deletion, " + + systemDeletionFileCount + " will not be recoverable from the " + + BuildReportTool.Util.NameOfOSTrashFolder + ", unless you have your own backup."; + } + + message += + "\n\nThis is a limitation in Unity and .NET code. To ensure deleting will move the files to the " + + BuildReportTool.Util.NameOfOSTrashFolder + + " instead, delete your files the usual way using your project view."; + } + else + { + message += "\n\nThe deleted file" + plural + " can be recovered from your " + + BuildReportTool.Util.NameOfOSTrashFolder + "."; + } + + message += + "\n\nDeleting a large number of files may take a long time as Unity will rebuild the project's Library folder.\n\nProceed with deleting?"; + + EditorApplication.Beep(); + if (!EditorUtility.DisplayDialog("Delete?", message, "Yes", "No")) + { + return; + } + + List allList = new List(all); + List toRemove = new List(all.Length / 4); + + // finally, delete the files + int deletedCount = 0; + for (int n = 0, len = allList.Count; n < len; ++n) + { + BuildReportTool.SizePart b = allList[n]; + + + bool okToDelete = BuildReportTool.Util.IsUselessFile(b.Name) || + !BuildReportTool.Util.IsFileInBuildReportFolder(b.Name); + + if (listToDeleteFrom.InSumSelection(b) && okToDelete) + { + // delete this + + if (BuildReportTool.Util.ShowFileDeleteProgress(deletedCount, numOfFilesToDelete, b.Name, + deleteIsRecoverable)) + { + return; + } + + BuildReportTool.Util.DeleteSizePartFile(b); + toRemove.Add(b); + ++deletedCount; + } + } + + EditorUtility.ClearProgressBar(); + + + // refresh the asset lists + allList.RemoveAll(i => toRemove.Contains(i)); + BuildReportTool.SizePart[] allWithRemoved = allList.ToArray(); + + // recreate per category list (maybe just remove from existing per category lists instead?) + BuildReportTool.SizePart[][] perCategoryOfList = + BuildReportTool.ReportGenerator.SegregateAssetSizesPerCategory(allWithRemoved, + buildReportToDisplay.FileFilters); + + listToDeleteFrom.Reinit(allWithRemoved, perCategoryOfList, + IsShowingUsedAssets + ? BuildReportTool.Options.NumberOfTopLargestUsedAssetsToShow + : BuildReportTool.Options.NumberOfTopLargestUnusedAssetsToShow); + listToDeleteFrom.ClearSelection(); + + + // print info about the delete operation to console + string finalMessage = string.Format("{0} file{1} removed from your project.", deletedCount.ToString(), plural); + if (deleteIsRecoverable) + { + finalMessage += " They can be recovered from your " + BuildReportTool.Util.NameOfOSTrashFolder + "."; + } + + EditorApplication.Beep(); + EditorUtility.DisplayDialog("Delete successful", finalMessage, "OK"); + + Debug.LogWarning(finalMessage); + } + + + void InitiateDeleteAllUnused(BuildInfo buildReportToDisplay) + { + BuildReportTool.AssetList list = buildReportToDisplay.UnusedAssets; + BuildReportTool.SizePart[] all = list.All; + + int filesToDeleteCount = 0; + + for (int n = 0, len = all.Length; n < len; ++n) + { + BuildReportTool.SizePart b = all[n]; + + bool okToDelete = BuildReportTool.Util.IsFileOkForDeleteAllOperation(b.Name); + + if (okToDelete) + { + //Debug.Log("added " + b.Name + " for deletion"); + ++filesToDeleteCount; + } + } + + if (filesToDeleteCount == 0) + { + const string NOTHING_TO_DELETE = + "Take note that for safety, Build Report Tool assets, Unity editor assets, version control metadata, and Unix-style hidden files will not be included for deletion.\n\nYou can force deleting them by selecting them (via the checkbox) and using \"Delete selected\", or simply delete them the normal way in your project view."; + + EditorApplication.Beep(); + EditorUtility.DisplayDialog("Nothing to delete!", NOTHING_TO_DELETE, "Ok"); + return; + } + + string plural = ""; + if (filesToDeleteCount > 1) + { + plural = "s"; + } + + EditorApplication.Beep(); + if (!EditorUtility.DisplayDialog("Delete?", + string.Format( + "Among {0} file{1} in your project, {2} will be deleted.\n\nBuild Report Tool assets themselves, Unity editor assets, version control metadata, and Unix-style hidden files will not be included for deletion. You can force-delete those by selecting them (via the checkbox) and use \"Delete selected\", or simply delete them the normal way in your project view.\n\nDeleting a large number of files may take a long time as Unity will rebuild the project's Library folder.\n\nAre you sure about this?\n\nThe file{1} can be recovered from your {3}.", + all.Length.ToString(), plural, filesToDeleteCount.ToString(), + BuildReportTool.Util.NameOfOSTrashFolder), "Yes", "No")) + { + return; + } + + List newAll = new List(); + + int deletedCount = 0; + for (int n = 0, len = all.Length; n < len; ++n) + { + BuildReportTool.SizePart b = all[n]; + + bool okToDelete = BuildReportTool.Util.IsFileOkForDeleteAllOperation(b.Name); + + if (okToDelete) + { + // delete this + if (BuildReportTool.Util.ShowFileDeleteProgress(deletedCount, filesToDeleteCount, b.Name, true)) + { + return; + } + + BuildReportTool.Util.DeleteSizePartFile(b); + ++deletedCount; + } + else + { + //Debug.Log("added " + b.Name + " to new list"); + newAll.Add(b); + } + } + + EditorUtility.ClearProgressBar(); + + BuildReportTool.SizePart[] newAllArr = newAll.ToArray(); + + BuildReportTool.SizePart[][] perCategoryUnused = + BuildReportTool.ReportGenerator.SegregateAssetSizesPerCategory(newAllArr, buildReportToDisplay.FileFilters); + + list.Reinit(newAllArr, perCategoryUnused, + IsShowingUsedAssets + ? BuildReportTool.Options.NumberOfTopLargestUsedAssetsToShow + : BuildReportTool.Options.NumberOfTopLargestUnusedAssetsToShow); + list.ClearSelection(); + + + string finalMessage = string.Format( + "{0} file{1} removed from your project. They can be recovered from your {2}.", + filesToDeleteCount.ToString(), plural, BuildReportTool.Util.NameOfOSTrashFolder); + Debug.LogWarning(finalMessage); + + EditorApplication.Beep(); + EditorUtility.DisplayDialog("Delete successful", finalMessage, "OK"); + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_Delete.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_Delete.cs.meta new file mode 100644 index 00000000..6a488ab2 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_Delete.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: efebaeab01dc93649b337f28445f59cf +timeCreated: 1558438027 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_Search.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_Search.cs new file mode 100644 index 00000000..3d377121 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_Search.cs @@ -0,0 +1,199 @@ +using System; +using System.Collections.Generic; +using UnityEngine; +using UnityEditor; +using FuzzyString; + +namespace BuildReportTool.Window.Screen +{ + public partial class AssetList + { + BuildReportTool.SizePart[] _searchResults; + + const double SEARCH_DELAY = 0.75f; + double _lastSearchTime; + string _lastSearchText = string.Empty; + + string _searchTextInput = string.Empty; + + int _searchViewOffset; + + bool _showSearchOptions; + Rect _searchTextfieldRect; + + // Search algorithms that will weigh in for the comparison + readonly FuzzyStringComparisonOptions[] _searchOptions = + { + FuzzyStringComparisonOptions.UseOverlapCoefficient, + FuzzyStringComparisonOptions.UseLongestCommonSubsequence, + FuzzyStringComparisonOptions.UseLongestCommonSubstring + }; + + void ClearSearch() + { + _searchTextInput = ""; + _lastSearchText = null; + _searchResults = null; + } + + void UpdateSearch(double timeNow, BuildInfo buildReportToDisplay) + { + if (string.IsNullOrEmpty(_searchTextInput) && !string.IsNullOrEmpty(_lastSearchText)) + { + // cancel search + ClearSearch(); + if (buildReportToDisplay != null) + { + buildReportToDisplay.FlagOkToRefresh(); + } + + _searchViewOffset = 0; + } + else if ((timeNow - _lastSearchTime >= SEARCH_DELAY) && + !_searchTextInput.Equals(_lastSearchText, StringComparison.Ordinal)) + { + UpdateSearchNow(buildReportToDisplay); + _lastSearchTime = timeNow; + } + } + + public void UpdateSearchNow(BuildInfo buildReportToDisplay) + { + if (string.IsNullOrEmpty(_searchTextInput)) + { + return; + } + + // update search + _lastSearchText = _searchTextInput; + _lastSearchTime = EditorApplication.timeSinceStartup; + + if (buildReportToDisplay != null) + { + Search(_lastSearchText, BuildReportTool.Options.SearchType, BuildReportTool.Options.SearchFilenameOnly, BuildReportTool.Options.SearchCaseSensitive, buildReportToDisplay); + buildReportToDisplay.FlagOkToRefresh(); + } + + _searchViewOffset = 0; + _currentSortType = BuildReportTool.AssetList.SortType.None; + } + + void Search(string searchText, SearchType searchType, bool searchFilenameOnly, bool caseSensitive, BuildInfo buildReportToDisplay) + { + if (string.IsNullOrEmpty(searchText)) + { + _searchResults = null; + return; + } + + BuildReportTool.AssetList list = GetAssetListToDisplay(buildReportToDisplay); + + + BuildReportTool.FileFilterGroup filter = buildReportToDisplay.FileFilters; + + if (BuildReportTool.Options.ShouldUseConfiguredFileFilters()) + { + filter = _configuredFileFilterGroup; + } + + List searchResults = new List(); + + + BuildReportTool.SizePart[] assetListToSearchFrom = list.GetListToDisplay(filter); + + var options = caseSensitive ? System.Text.RegularExpressions.RegexOptions.None : System.Text.RegularExpressions.RegexOptions.IgnoreCase; + + for (int n = 0; n < assetListToSearchFrom.Length; ++n) + { + string input; + if (searchFilenameOnly) + { + input = assetListToSearchFrom[n].Name.GetFileNameOnly(); + } + else + { + input = assetListToSearchFrom[n].Name; + } + + bool assetIsMatch; + + if (string.IsNullOrEmpty(input)) + { + assetIsMatch = false; + } + else + { + switch (searchType) + { + case SearchType.Regex: + try + { + assetIsMatch = System.Text.RegularExpressions.Regex.IsMatch(input, searchText, options); + } + catch (ArgumentException) + { + assetIsMatch = false; + } + break; + case SearchType.Fuzzy: + assetIsMatch = IsANearStringMatch(input, searchText); + break; + default: + // default is SearchType.Basic + assetIsMatch = System.Text.RegularExpressions.Regex.IsMatch(input, BuildReportTool.Util.WildCardToRegex(searchText), options); + break; + } + } + + if (assetIsMatch) + { + searchResults.Add(assetListToSearchFrom[n]); + } + } + + if (searchResults.Count > 0) + { + searchResults.Sort((a, b) => + GetFuzzyEqualityScore(searchText, a.Name).CompareTo(GetFuzzyEqualityScore(searchText, b.Name))); + } + + _searchResults = searchResults.ToArray(); + } + + void SortBySearchRank(BuildReportTool.SizePart[] assetList, string searchText) + { + if (assetList.Length <= 0) + { + return; + } + + System.Array.Sort(assetList, (entry1, entry2) => + GetFuzzyEqualityScore(searchText, entry1.Name) + .CompareTo(GetFuzzyEqualityScore(searchText, entry2.Name))); + } + + bool IsANearStringMatch(string source, string target) + { + if (string.IsNullOrEmpty(target)) + { + return false; + } + + // Choose the relative strength of the comparison - is it almost exactly equal? or is it just close? + const FuzzyStringComparisonTolerance TOLERANCE = FuzzyStringComparisonTolerance.Strong; + + // Get a boolean determination of approximate equality + return source.ApproximatelyEquals(target, TOLERANCE, _searchOptions); + } + + double GetFuzzyEqualityScore(string source, string target) + { + if (string.IsNullOrEmpty(target)) + { + return 0; + } + + return source.GetFuzzyEqualityScore(target, _searchOptions); + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_Search.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_Search.cs.meta new file mode 100644 index 00000000..c5ad00a0 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_AssetListScreen_Search.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: ff62cfa86a1e48b4a8e515cf84089be5 +timeCreated: 1558436086 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BaseScreen.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BaseScreen.cs new file mode 100644 index 00000000..ef5fbef5 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BaseScreen.cs @@ -0,0 +1,34 @@ +using UnityEngine; + +namespace BuildReportTool.Window.Screen +{ + public abstract class BaseScreen + { + public abstract string Name { get; } + + public abstract void RefreshData(BuildInfo buildReport, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, UnityBuildReport unityBuildReport); + + public abstract void DrawGUI(Rect position, + BuildInfo buildReportToDisplay, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, + UnityBuildReport unityBuildReport, BuildReportTool.ExtraData extraData, + out bool requestRepaint); + + public virtual void Update(double timeNow, double deltaTime, BuildInfo buildReportToDisplay, + AssetDependencies assetDependencies) + { + } + + + protected void DrawCentralMessage(Rect position, string msg) + { + float w = 300; + float h = 100; + float x = (position.width - w) * 0.5f; + float y = (position.height - h) * 0.35f; + + GUI.Label(new Rect(x, y, w, h), msg); + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BaseScreen.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BaseScreen.cs.meta new file mode 100644 index 00000000..54423994 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BaseScreen.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0c71aee836c3a1f4cb66debe8a94495d +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BuildSettingsScreen.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BuildSettingsScreen.cs new file mode 100644 index 00000000..185ea059 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BuildSettingsScreen.cs @@ -0,0 +1,1618 @@ +using UnityEngine; +using UnityEditor; + +namespace BuildReportTool.Window.Screen +{ + public class BuildSettings : BaseScreen + { + public override string Name + { + get { return Labels.BUILD_SETTINGS_CATEGORY_LABEL; } + } + + public override void RefreshData(BuildInfo buildReport, AssetDependencies assetDependencies, TextureData textureData, MeshData meshData, PrefabData prefabData, UnityBuildReport unityBuildReport) + { + _selectedSettingsIdxFromDropdownBox = UnityBuildSettingsUtility.GetIdxFromBuildReportValues(buildReport); + } + + Vector2 _scrollPos; + + const int SETTING_SPACING = 4; + const int SETTINGS_GROUP_TITLE_SPACING = 3; + const int SETTINGS_GROUP_SPACING = 18; + const int SETTINGS_GROUP_MINOR_SPACING = 12; + + const int DEFAULT_SHORT_COMMIT_HASH_LENGTH_DISPLAYED = 10; + + void DrawSetting(string name, bool val, bool showEvenIfEmpty = true) + { + DrawSetting(name, val.ToString(), showEvenIfEmpty); + } + + void DrawSetting(string name, int val, bool showEvenIfEmpty = true) + { + DrawSetting(name, val.ToString(), showEvenIfEmpty); + } + + void DrawSetting(string name, int val, string textToDisplayIfZero, bool showEvenIfEmpty = true) + { + DrawSetting(name, val == 0 ? textToDisplayIfZero: val.ToString(), showEvenIfEmpty); + } + + void DrawSetting(string name, uint val, bool showEvenIfEmpty = true) + { + DrawSetting(name, val.ToString(), showEvenIfEmpty); + } + + void DrawSetting(string name, string val, bool showEvenIfEmpty = true) + { + if (string.IsNullOrEmpty(val) && !showEvenIfEmpty) + { + return; + } + + var nameStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.SETTING_NAME_STYLE_NAME); + if (nameStyle == null) + { + nameStyle = GUI.skin.label; + } + + var valueStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.SETTING_VALUE_NO_WRAP_STYLE_NAME); + if (valueStyle == null) + { + valueStyle = GUI.skin.label; + } + + var groupStyle = GUI.skin.FindStyle("ProjectSettingsGroup"); + if (groupStyle == null) + { + groupStyle = GUI.skin.label; + } + + GUILayout.BeginHorizontal(GUIContent.none, groupStyle, NoExpandWidth); + GUILayout.Label(name, nameStyle, BRT_BuildReportWindow.LayoutNone); + GUILayout.Space(2); + if (!string.IsNullOrEmpty(val)) + { + GUILayout.TextField(val, valueStyle, BRT_BuildReportWindow.LayoutNone); + } + + GUILayout.EndHorizontal(); + GUILayout.Space(SETTING_SPACING); + } + + void DrawSetting(string name, string[] val, bool showEvenIfEmpty = true) + { + if ((val == null || val.Length == 0) && !showEvenIfEmpty) + { + return; + } + + var nameStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.SETTING_NAME_STYLE_NAME); + if (nameStyle == null) + { + nameStyle = GUI.skin.label; + } + + var valueStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.SETTING_VALUE_NO_WRAP_STYLE_NAME); + if (valueStyle == null) + { + valueStyle = GUI.skin.label; + } + + var groupStyle = GUI.skin.FindStyle("ProjectSettingsGroup"); + if (groupStyle == null) + { + groupStyle = GUI.skin.label; + } + + GUILayout.BeginHorizontal(GUIContent.none, groupStyle, BRT_BuildReportWindow.LayoutNone); + GUILayout.Label(name, nameStyle, BRT_BuildReportWindow.LayoutNone); + GUILayout.Space(2); + + + if (val != null) + { + GUILayout.BeginVertical(GUIContent.none, groupStyle, BRT_BuildReportWindow.LayoutNone); + for (int n = 0, len = val.Length; n < len; ++n) + { + GUILayout.TextField(val[n], valueStyle, BRT_BuildReportWindow.LayoutNone); + } + + GUILayout.EndVertical(); + } + + GUILayout.EndHorizontal(); + GUILayout.Space(SETTING_SPACING); + } + + void DrawSetting2Lines(string name, string val, bool showEvenIfEmpty = true) + { + if (string.IsNullOrEmpty(val) && !showEvenIfEmpty) + { + return; + } + + var nameStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.SETTING_NAME_STYLE_NAME); + if (nameStyle == null) + { + nameStyle = GUI.skin.label; + } + + var valueStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.SETTING_VALUE_NO_WRAP_STYLE_NAME); + if (valueStyle == null) + { + valueStyle = GUI.skin.label; + } + + var groupStyle = GUI.skin.FindStyle("ProjectSettingsGroup"); + if (groupStyle == null) + { + groupStyle = GUI.skin.label; + } + + GUILayout.Label(name, nameStyle, BRT_BuildReportWindow.LayoutNone); + if (!string.IsNullOrEmpty(val)) + { + GUILayout.BeginHorizontal(GUIContent.none, groupStyle, NoExpandWidth); + GUILayout.Space(10); + GUILayout.TextField(val, valueStyle, BRT_BuildReportWindow.LayoutNone); + GUILayout.EndHorizontal(); + } + + GUILayout.Space(SETTING_SPACING); + } + + void DrawSettingsGroupTitle(string name) + { + var titleStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME); + if (titleStyle == null) + { + titleStyle = GUI.skin.label; + } + + GUILayout.Label(name, titleStyle, BRT_BuildReportWindow.LayoutNone); + GUILayout.Space(SETTINGS_GROUP_TITLE_SPACING); + } + + // ================================================================================= + + BuildSettingCategory _settingsShown = BuildSettingCategory.None; + + // ---------------------------------------------- + + bool IsShowingWebPlayerSettings + { + get { return _settingsShown == BuildSettingCategory.WebPlayer; } + } + + bool IsShowingWebGlSettings + { + get { return _settingsShown == BuildSettingCategory.WebGL; } + } + + // ---------------------------------------------- + + bool IsShowingStandaloneSettings + { + get { return IsShowingWindowsDesktopSettings || IsShowingMacSettings || IsShowingLinuxSettings; } + } + + bool IsShowingWindowsDesktopSettings + { + get { return _settingsShown == BuildSettingCategory.WindowsDesktopStandalone; } + } + + bool IsShowingWindowsStoreAppSettings + { + get { return _settingsShown == BuildSettingCategory.WindowsStoreApp; } + } + + bool IsShowingMacSettings + { + get { return _settingsShown == BuildSettingCategory.MacStandalone; } + } + + bool IsShowingLinuxSettings + { + get { return _settingsShown == BuildSettingCategory.LinuxStandalone; } + } + + // ---------------------------------------------- + + bool IsShowingMobileSettings + { + get { return IsShowingiOSSettings || IsShowingAndroidSettings || IsShowingBlackberrySettings; } + } + + bool IsShowingiOSSettings + { + get { return _settingsShown == BuildSettingCategory.iOS; } + } + + bool IsShowingTvOSSettings + { + get { return _settingsShown == BuildSettingCategory.tvOS; } + } + + bool IsShowingAndroidSettings + { + get { return _settingsShown == BuildSettingCategory.Android; } + } + + bool IsShowingBlackberrySettings + { + get { return _settingsShown == BuildSettingCategory.Blackberry; } + } + + // ---------------------------------------------- + + bool IsShowingXbox360Settings + { + get { return _settingsShown == BuildSettingCategory.Xbox360; } + } + + bool IsShowingXboxOneSettings + { + get { return _settingsShown == BuildSettingCategory.XboxOne; } + } + + bool IsShowingPS3Settings + { + get { return _settingsShown == BuildSettingCategory.PS3; } + } + + bool IsShowingPS4Settings + { + get { return _settingsShown == BuildSettingCategory.PS4; } + } + + bool IsShowingPSVitaSettings + { + get { return _settingsShown == BuildSettingCategory.PSVita; } + } + + // ---------------------------------------------- + + bool IsShowingSamsungTvSettings + { + get { return _settingsShown == BuildSettingCategory.SamsungTV; } + } + + // ================================================================================= + + int _selectedSettingsIdxFromDropdownBox; + + GUIContent[] _settingDropdownBoxLabels; + string _buildTargetOfReport = string.Empty; + + void InitializeDropdownBoxLabelsIfNeeded() + { + if (_settingDropdownBoxLabels != null) + { + return; + } + + _settingDropdownBoxLabels = UnityBuildSettingsUtility.GetBuildSettingsCategoryListForDropdownBox(); + } + + static readonly GUILayoutOption[] NoExpandWidth = { GUILayout.ExpandWidth(false) }; + + // ================================================================================= + + Rect _projectSettingsRect; + Rect _pathSettingsRect; + Rect _buildSettingsRect; + Rect _runtimeSettingsRect; + Rect _debugSettingsRect; + Rect _codeSettingsRect; + Rect _graphicsSettingsRect; + + float _column1Width; + + void DrawProjectSettings(BuildInfo buildReportToDisplay, UnityBuildSettings settings) + { + var groupStyle = GUI.skin.FindStyle("ProjectSettingsGroup"); + if (groupStyle == null) + { + groupStyle = GUI.skin.label; + } + GUILayout.BeginVertical(GUIContent.none, groupStyle, NoExpandWidth); + DrawSettingsGroupTitle("Project"); + + DrawSetting("Product name:", settings.ProductName); + if (IsShowingiOSSettings || IsShowingTvOSSettings || IsShowingMacSettings) + { + DrawSetting("Bundle identifier:", settings.MobileBundleIdentifier); + } + else if (IsShowingAndroidSettings) + { + DrawSetting("Package identifier:", settings.MobileBundleIdentifier); + } + else + { + DrawSetting("Application identifier:", settings.ApplicationIdentifier); + } + DrawSetting("Company name:", settings.CompanyName); + DrawSetting("Build type:", buildReportToDisplay.BuildType); + DrawSetting("Unity version:", buildReportToDisplay.UnityVersion); + DrawSetting("Using Pro license:", settings.UsingAdvancedLicense); + + if (IsShowingiOSSettings) + { + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + DrawSetting("App display name:", settings.iOSAppDisplayName); + DrawSetting("Bundle version:", settings.MobileBundleVersion); + } + else if (IsShowingAndroidSettings) + { + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + DrawSetting("Version name:", settings.MobileBundleVersion); + DrawSetting("Bundle Version code:", settings.AndroidVersionCode); + } + else if (IsShowingXbox360Settings) + { + DrawSetting("Title ID:", settings.Xbox360TitleId); + } + else if (IsShowingXboxOneSettings) + { + DrawSetting("Title ID:", settings.XboxOneTitleId); + DrawSetting("Content ID:", settings.XboxOneContentId); + DrawSetting("Product ID:", settings.XboxOneProductId); + DrawSetting("Sandbox ID:", settings.XboxOneSandboxId); + DrawSetting("Service Configuration ID:", settings.XboxOneServiceConfigId); + DrawSetting("Xbox One version:", settings.XboxOneVersion); + DrawSetting("Description:", settings.XboxOneDescription); + } + else if (IsShowingPS4Settings) + { + DrawSetting("App type:", settings.PS4AppType); + DrawSetting("App version:", settings.PS4AppVersion); + DrawSetting("Category:", settings.PS4Category); + DrawSetting("Content ID:", settings.PS4ContentId); + DrawSetting("Master version:", settings.PS4MasterVersion); + } + else if (IsShowingPSVitaSettings) + { + DrawSetting("Short title:", settings.PSVShortTitle); + DrawSetting("App version:", settings.PSVAppVersion); + DrawSetting("App category:", settings.PSVAppCategory); + DrawSetting("Content ID:", settings.PSVContentId); + DrawSetting("Master version:", settings.PSVMasterVersion); + } + GUILayout.EndVertical(); + if (Event.current.type == EventType.Repaint) + { + _projectSettingsRect = GUILayoutUtility.GetLastRect(); + } + } + + void DrawBuildSettings(BuildInfo buildReportToDisplay, UnityBuildSettings settings, UnityBuildReport unityBuildReport) + { + var groupStyle = GUI.skin.FindStyle("ProjectSettingsGroup"); + if (groupStyle == null) + { + groupStyle = GUI.skin.label; + } + + GUILayout.BeginVertical(GUIContent.none, groupStyle, NoExpandWidth); + DrawSettingsGroupTitle("Build Settings"); + + // -------------------------------------------------- + // build settings + + if (unityBuildReport != null) + { +#if UNITY_2021_2_OR_NEWER + DrawSetting("Clean Build:", + unityBuildReport.HasBuildOption(BuildOptions.CleanBuildCache)); +#endif + DrawSetting("Build Asset Bundle for streamed scenes:", + unityBuildReport.HasBuildOption(BuildOptions.BuildAdditionalStreamedScenes)); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + + if (IsShowingStandaloneSettings) + { + DrawSetting("Headless (server) build:", settings.EnableHeadlessMode); + } + else if (IsShowingWindowsStoreAppSettings) + { + DrawSetting("Generate reference projects:", settings.WSAGenerateReferenceProjects); + DrawSetting("Target Windows Store App SDK:", settings.WSASDK); + } + else if (IsShowingMacSettings) + { + DrawSetting("Xcode project scheme:", settings.MacXcodeBuildConfig); + } + else if (IsShowingWebPlayerSettings) + { + DrawSetting("Web player streaming:", settings.WebPlayerEnableStreaming); + DrawSetting("Web player offline deployment:", settings.WebPlayerDeployOffline); + DrawSetting("First streamed level with \"Resources\" assets:", + settings.WebPlayerFirstStreamedLevelWithResources); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingWebGlSettings) + { + DrawSetting("WebGL Template used:", settings.WebGLTemplatePath); + DrawSetting("WebGL optimization level:", + UnityBuildSettingsUtility.GetReadableWebGLOptimizationLevel(settings.WebGLOptimizationLevel), false); + + DrawSetting("Compression format:", settings.WebGLCompressionFormat); + + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingiOSSettings) + { + DrawSetting("SDK version:", settings.iOSSDKVersionUsed); + DrawSetting("Target iOS version:", settings.iOSTargetOSVersion); + DrawSetting("Target device:", settings.iOSTargetDevice); +#if UNITY_2021_2_OR_NEWER + if (unityBuildReport != null) + { + DrawSetting("Symlink libraries:", + unityBuildReport.HasBuildOption(BuildOptions.SymlinkSources)); + } +#else + DrawSetting("Symlink libraries:", settings.iOSSymlinkLibraries); +#endif + DrawSetting("Xcode project scheme:", settings.iOSXcodeBuildConfig); + if (unityBuildReport != null) + { + DrawSetting("Append to existing Xcode project:", + unityBuildReport.HasBuildOption(BuildOptions.AcceptExternalModificationsToPlayer)); + } + + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingAndroidSettings) + { + DrawSetting("Min SDK version:", settings.AndroidMinSDKVersion); + DrawSetting("Target SDK version:", settings.AndroidTargetSDKVersion); + DrawSetting("Target device:", settings.AndroidTargetDevice); + DrawSetting("Target architectures:", settings.AndroidTargetArchitectures); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + if (unityBuildReport != null) + { + DrawSetting("Patch existing app on device (instead of building):", +#if UNITY_2019_1_OR_NEWER + // Application patching was added in 2019.1 + unityBuildReport.HasBuildOption(BuildOptions.PatchPackage)); +#else + false); +#endif + DrawSetting("Symlink Sources:", +#if UNITY_2021_1_OR_NEWER + unityBuildReport.HasBuildOption(BuildOptions.SymlinkSources)); +#else + unityBuildReport.HasBuildOption(BuildOptions.SymlinkLibraries)); +#endif + } + DrawSetting("Build a separate APK for each CPU architecture:", settings.AndroidBuildApkPerCpuArch); + DrawSetting("Build APK Expansion File (.obb file):", settings.AndroidUseAPKExpansionFiles); + DrawSetting("Build Google Play App Bundle (.aab file):", settings.AndroidAppBundle); + DrawSetting("Export Android Studio/Gradle project:", settings.AndroidAsAndroidProject); + if (unityBuildReport != null) + { + DrawSetting("Create Android Studio/Eclipse project on each build:", + unityBuildReport.HasBuildOption(BuildOptions.AcceptExternalModificationsToPlayer)); + } + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + + DrawSetting("Is game:", settings.AndroidIsGame); + DrawSetting("TV-compatible:", settings.AndroidTvCompatible); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + + DrawSetting("Force Internet permission:", settings.AndroidForceInternetPermission); + DrawSetting("Force SD card permission:", settings.AndroidForceSDCardPermission); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + + DrawSetting("Key alias name:", settings.AndroidKeyAliasName); + DrawSetting("Keystore name:", settings.AndroidKeystoreName); + } + else if (IsShowingBlackberrySettings) + { + DrawSetting("Build subtarget:", settings.BlackBerryBuildSubtarget); + DrawSetting("Build type:", settings.BlackBerryBuildType); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + if (buildReportToDisplay.IsUnityVersionAtMost(4, 0, 0)) + { + DrawSetting("Author ID:", settings.BlackBerryAuthorID); + } + + DrawSetting("Device address:", settings.BlackBerryDeviceAddress); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + DrawSetting("Save log path:", settings.BlackBerrySaveLogPath); + DrawSetting("Token path:", settings.BlackBerryTokenPath); + + DrawSetting("Token author:", settings.BlackBerryTokenAuthor); + DrawSetting("Token expiration:", settings.BlackBerryTokenExpiration); + } + else if (IsShowingXbox360Settings) + { + DrawSetting("Build subtarget:", settings.Xbox360BuildSubtarget); + DrawSetting("Run method:", settings.Xbox360RunMethod); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + DrawSetting("Image .xex filepath:", settings.Xbox360ImageXexFilePath); + DrawSetting(".spa filepath:", settings.Xbox360SpaFilePath); + DrawSetting("Auto-generate .spa:", settings.Xbox360AutoGenerateSpa); + DrawSetting("Additional title memory size:", settings.Xbox360AdditionalTitleMemSize); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingXboxOneSettings) + { + DrawSetting("Deploy method:", settings.XboxOneDeployMethod); + DrawSetting("Is content package:", settings.XboxOneIsContentPackage); + DrawSetting("Packaging encryption level:", settings.XboxOnePackagingEncryptionLevel); + DrawSetting("Allowed product IDs:", settings.XboxOneAllowedProductIds); + DrawSetting("Disable Kinect GPU reservation:", settings.XboxOneDisableKinectGpuReservation); + DrawSetting("Enable variable GPU:", settings.XboxOneEnableVariableGPU); + DrawSetting("Streaming install launch range:", settings.XboxOneStreamingInstallLaunchRange); + DrawSetting("Persistent local storage size:", settings.XboxOnePersistentLocalStorageSize); + DrawSetting("Socket names:", settings.XboxOneSocketNames); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + DrawSetting("Game OS override path:", settings.XboxOneGameOsOverridePath); + DrawSetting("App manifest override path:", settings.XboxOneAppManifestOverridePath); + DrawSetting("Packaging override path:", settings.XboxOnePackagingOverridePath); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingPS3Settings) + { + DrawSetting("Build subtarget:", settings.SCEBuildSubtarget); + + DrawSetting("NP Communications ID:", settings.PS3NpCommsId); + DrawSetting("NP Communications Signature:", settings.PS3NpCommsSig); + DrawSetting("NP Age Rating:", settings.PS3NpAgeRating); + + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + DrawSetting("Title config filepath:", settings.PS3TitleConfigFilePath); + DrawSetting("DLC config filepath:", settings.PS3DLCConfigFilePath); + DrawSetting("Thumbnail filepath:", settings.PS3ThumbnailFilePath); + DrawSetting("Background image filepath:", settings.PS3BackgroundImageFilePath); + DrawSetting("Background sound filepath:", settings.PS3BackgroundSoundFilePath); + DrawSetting("Trophy package path:", settings.PS3TrophyPackagePath); + + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + DrawSetting("Compress build with PS Arc:", settings.CompressBuildWithPsArc); + DrawSetting("Need submission materials:", settings.NeedSubmissionMaterials); + + DrawSetting("In trial mode:", settings.PS3InTrialMode); + DrawSetting("Disable Dolby encoding:", settings.PS3DisableDolbyEncoding); + DrawSetting("Enable Move support:", settings.PS3EnableMoveSupport); + DrawSetting("Use SPU for Umbra:", settings.PS3UseSPUForUmbra); + + DrawSetting("Video memory for vertex buffers:", settings.PS3VideoMemoryForVertexBuffers); + DrawSetting("Video memory for audio:", settings.PS3VideoMemoryForAudio); + DrawSetting("Boot check max save game size (KB):", settings.PS3BootCheckMaxSaveGameSizeKB); + DrawSetting("Save game slots:", settings.PS3SaveGameSlots); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingPS4Settings) + { + DrawSetting("Build subtarget:", settings.PS4BuildSubtarget); + + DrawSetting("App parameter 1:", settings.PS4AppParameter1); + DrawSetting("App parameter 2:", settings.PS4AppParameter2); + DrawSetting("App parameter 3:", settings.PS4AppParameter3); + DrawSetting("App parameter 4:", settings.PS4AppParameter4); + + + DrawSetting("Enter button assignment:", settings.PS4EnterButtonAssignment); + DrawSetting("Remote play key assignment:", settings.PS4RemotePlayKeyAssignment); + + DrawSetting("NP Age rating:", settings.PS4NpAgeRating); + DrawSetting("Parental level:", settings.PS4ParentalLevel); + + DrawSetting("Enable friend push notifications:", settings.PS4EnableFriendPushNotifications); + DrawSetting("Enable presence push notifications:", settings.PS4EnablePresencePushNotifications); + DrawSetting("Enable session push notifications:", settings.PS4EnableSessionPushNotifications); + DrawSetting("Enable game custom data push notifications:", + settings.PS4EnableGameCustomDataPushNotifications); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + DrawSetting("Background image path:", settings.PS4BgImagePath); + DrawSetting("Background music path:", settings.PS4BgMusicPath); + DrawSetting("Startup image path:", settings.PS4StartupImagePath); + DrawSetting("Save data image path:", settings.PS4SaveDataImagePath); + + DrawSetting("Params sfx path:", settings.PS4ParamSfxPath); + DrawSetting("NP Title dat path:", settings.PS4NpTitleDatPath); + DrawSetting("NP Trophy Package path:", settings.PS4NpTrophyPackagePath); + DrawSetting("Pronunciations SIG path:", settings.PS4PronunciationSigPath); + DrawSetting("Pronunciations XML path:", settings.PS4PronunciationXmlPath); + + DrawSetting("Share file path:", settings.PS4ShareFilePath); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingPSVitaSettings) + { + DrawSetting("Build subtarget:", settings.PSVBuildSubtarget); + + DrawSetting("DRM type:", settings.PSVDrmType); + DrawSetting("Upgradable:", settings.PSVUpgradable); + DrawSetting("TV boot mode:", settings.PSVTvBootMode); + DrawSetting("Parental Level:", settings.PSVParentalLevel); + DrawSetting("Health warning:", settings.PSVHealthWarning); + DrawSetting("Enter button assignment:", settings.PSVEnterButtonAssignment); + + DrawSetting("Acquire BGM:", settings.PSVAcquireBgm); + DrawSetting("Allow Twitter Dialog:", settings.PSVAllowTwitterDialog); + + DrawSetting("NP Communications ID:", settings.PSVNpCommsId); + DrawSetting("NP Communications Signature:", settings.PSVNpCommsSig); + DrawSetting("Age Rating:", settings.PSVNpAgeRating); + + DrawSetting("Power mode:", settings.PSVPowerMode); + DrawSetting("Media capacity:", settings.PSVMediaCapacity); + DrawSetting("Storage type:", settings.PSVStorageType); + DrawSetting("TV disable emu:", settings.PSVTvDisableEmu); + DrawSetting("Support Game Boot Message or Game Joining Presence:", settings.PSVNpSupportGbmOrGjp); + DrawSetting("Use lib location:", settings.PSVUseLibLocation); + + DrawSetting("Info bar color:", settings.PSVInfoBarColor); + DrawSetting("Show info bar on startup:", settings.PSVShowInfoBarOnStartup); + DrawSetting("Save data quota:", settings.PSVSaveDataQuota); + + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + DrawSetting("Manual filepath:", settings.PSVManualPath); + DrawSetting("Trophy package filepath:", settings.PSVTrophyPackagePath); + DrawSetting("Params Sfx filepath:", settings.PSVParamSfxPath); + DrawSetting("Patch change info filepath:", settings.PSVPatchChangeInfoPath); + DrawSetting("Patch original filepath:", settings.PSVPatchOriginalPackPath); + DrawSetting("Keystone filepath:", settings.PSVKeystoneFilePath); + DrawSetting("Live Area BG image filepath:", settings.PSVLiveAreaBgImagePath); + DrawSetting("Live Area Gate image filepath:", settings.PSVLiveAreaGateImagePath); + DrawSetting("Custom Live Area path:", settings.PSVCustomLiveAreaPath); + DrawSetting("Live Area trial path:", settings.PSVLiveAreaTrialPath); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingSamsungTvSettings) + { + DrawSetting("Device address:", settings.SamsungTVDeviceAddress); + DrawSetting("Author:", settings.SamsungTVAuthor); + DrawSetting("Author email:", settings.SamsungTVAuthorEmail); + DrawSetting("Website:", settings.SamsungTVAuthorWebsiteUrl); + DrawSetting("Category:", settings.SamsungTVCategory); + DrawSetting("Description:", settings.SamsungTVDescription); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + + if (unityBuildReport != null) + { + DrawSetting("Scripts only build:", unityBuildReport.HasBuildOption(BuildOptions.BuildScriptsOnly)); + } + + DrawSetting("Install in build folder:", settings.InstallInBuildFolder); + + if (buildReportToDisplay.IsUnityVersionAtMost(4, 0, 0)) + { + DrawSetting("Physics code stripped:", settings.StripPhysicsCode); + } + + DrawSetting("Prebake collision meshes:", settings.BakeCollisionMeshes); + DrawSetting("Optimize mesh data:", settings.StripUnusedMeshComponents); + + if (unityBuildReport != null) + { +#if UNITY_5_6_OR_NEWER + if (unityBuildReport.HasBuildOption(BuildOptions.CompressWithLz4)) + { + DrawSetting("Compression Method:", "LZ4"); + } +#endif +#if UNITY_2017_2_OR_NEWER + else if (unityBuildReport.HasBuildOption(BuildOptions.CompressWithLz4HC)) + { + DrawSetting("Compression Method:", "LZ4HC"); + } +#endif +#if UNITY_5_6_OR_NEWER + else +#endif + { + DrawSetting("Compression Method:", "Default"); + } +#if UNITY_2018_1_OR_NEWER + DrawSetting("Test Assemblies included in build:", unityBuildReport.HasBuildOption(BuildOptions.IncludeTestAssemblies)); +#endif +#if UNITY_5_6_OR_NEWER + DrawSetting("No Unique Identifier (force build GUID to all zeros):", unityBuildReport.HasBuildOption(BuildOptions.NoUniqueIdentifier)); +#endif +#if UNITY_2020_1_OR_NEWER + DrawSetting("Detailed Build Report:", unityBuildReport.HasBuildOption(BuildOptions.DetailedBuildReport)); +#endif + } + +#if UNITY_2018_3_OR_NEWER + DrawSetting("Managed stripping level:", settings.StrippingLevelUsed); +#else + if (IsShowingMobileSettings) + { + DrawSetting("Stripping level:", settings.StrippingLevelUsed); + } +#endif + + DrawSetting("Strip unused engine code (IL2CPP-only):", settings.StripEngineCode); + DrawSetting("Strip unused mips from textures:", settings.StripUnusedMips); + + GUILayout.EndVertical(); + if (Event.current.type == EventType.Repaint) + { + _buildSettingsRect = GUILayoutUtility.GetLastRect(); + } + } + + void DrawRuntimeSettings(BuildInfo buildReportToDisplay, UnityBuildSettings settings) + { + var groupStyle = GUI.skin.FindStyle("ProjectSettingsGroup"); + if (groupStyle == null) + { + groupStyle = GUI.skin.label; + } + + GUILayout.BeginVertical(GUIContent.none, groupStyle, NoExpandWidth); + DrawSettingsGroupTitle("Runtime Settings"); + + if (IsShowingMobileSettings) + { + DrawSetting("Mute other audio sources:", settings.MuteOtherAudioSources); + } + + if (IsShowingiOSSettings) + { + DrawSetting("Hide status bar:", settings.MobileHideStatusBar); + DrawSetting("Status bar style:", settings.iOSStatusBarStyle); + DrawSetting("Accelerometer frequency:", settings.MobileAccelerometerFrequency); + DrawSetting("Requires persistent Wi-Fi:", settings.iOSRequiresPersistentWiFi); + + if (buildReportToDisplay.IsUnityVersionAtMost(4, 0, 0)) + { + DrawSetting("Exit on suspend:", settings.iOSExitOnSuspend); + } + + if (buildReportToDisplay.IsUnityVersionAtLeast(5, 0, 0)) + { + DrawSetting("App-in-background behavior:", settings.iOSAppInBackgroundBehavior); + } + + + DrawSetting("Activity indicator on loading:", settings.iOSShowProgressBarInLoadingScreen); + + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingAndroidSettings) + { + DrawSetting("Hide status bar:", settings.MobileHideStatusBar); + DrawSetting("Accelerometer frequency:", settings.MobileAccelerometerFrequency); + DrawSetting("Activity indicator on loading:", settings.AndroidShowProgressBarInLoadingScreen); + DrawSetting("Splash screen scale:", settings.AndroidSplashScreenScaleMode); + + DrawSetting("Preferred install location:", settings.AndroidPreferredInstallLocation); + + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingWebGlSettings) + { + DrawSetting("Automatically cache WebGL assets data:", settings.WebGLAutoCacheAssetsData); + DrawSetting("WebGL Memory Size:", settings.WebGLMemorySize); + + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + + + if (!IsShowingiOSSettings && !IsShowingAndroidSettings && IsShowingMobileSettings) // any mobile except iOS, Android + { + DrawSetting("Hide status bar:", settings.MobileHideStatusBar); + DrawSetting("Accelerometer frequency:", settings.MobileAccelerometerFrequency); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + + if (IsShowingXbox360Settings) + { + DrawSetting("Enable avatar:", settings.Xbox360EnableAvatar); + DrawSetting("Enable Kinect:", settings.Xbox360EnableKinect); + DrawSetting("Enable Kinect auto-tracking:", settings.Xbox360EnableKinectAutoTracking); + + DrawSetting("Deploy Kinect resources:", settings.Xbox360DeployKinectResources); + DrawSetting("Deploy Kinect head orientation:", settings.Xbox360DeployKinectHeadOrientation); + DrawSetting("Deploy Kinect head position:", settings.Xbox360DeployKinectHeadPosition); + + DrawSetting("Enable speech:", settings.Xbox360EnableSpeech); + DrawSetting("Speech DB:", settings.Xbox360SpeechDB); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingBlackberrySettings) + { + DrawSetting("Has camera permissions:", settings.BlackBerryHasCamPermissions); + DrawSetting("Has microphone permissions:", settings.BlackBerryHasMicPermissions); + DrawSetting("Has GPS permissions:", settings.BlackBerryHasGpsPermissions); + DrawSetting("Has ID permissions:", settings.BlackBerryHasIdPermissions); + DrawSetting("Has shared permissions:", settings.BlackBerryHasSharedPermissions); + } + + if (IsShowingStandaloneSettings || IsShowingWebPlayerSettings || IsShowingBlackberrySettings) + { + DrawSetting("Run in background:", settings.RunInBackground); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + + if (IsShowingWindowsDesktopSettings) + { + DrawSetting("Desired API for gamepad input:", settings.WinGamepadInputHint); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + + // -------------------------------------------------- + // security settings + if (IsShowingMacSettings) + { + DrawSetting("Use App Store validation:", settings.MacUseAppStoreValidation); + } + else if (IsShowingAndroidSettings) + { + DrawSetting("Use license verification:", settings.AndroidUseLicenseVerification); + DrawSetting("Enable ARMv9 security features:", settings.AndroidEnableArmV9SecurityFeatures); + } + DrawSetting("Allow plain-text (insecure) HTTP connections:", settings.InsecureHttpOption); + + GUILayout.EndVertical(); + if (Event.current.type == EventType.Repaint) + { + _runtimeSettingsRect = GUILayoutUtility.GetLastRect(); + } + } + + void DrawDebugSettings(BuildInfo buildReportToDisplay, UnityBuildSettings settings, UnityBuildReport unityBuildReport) + { + var groupStyle = GUI.skin.FindStyle("ProjectSettingsGroup"); + if (groupStyle == null) + { + groupStyle = GUI.skin.label; + } + + GUILayout.BeginVertical(GUIContent.none, groupStyle, NoExpandWidth); + DrawSettingsGroupTitle("Debug Settings"); + + DrawSetting("Is development build:", settings.EnableDevelopmentBuild); + if (IsShowingWindowsDesktopSettings) + { + DrawSetting("PDB files for native DLLs included in build:", settings.WinIncludeNativePdbFilesInBuild); + DrawSetting("Create Visual Studio Solution:", settings.WinCreateVisualStudioSolution); + } + DrawSetting("Debug Log enabled:", settings.EnableDebugLog); + + if (buildReportToDisplay.IsUnityVersionAtLeast(5, 4, 0)) + { + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + DrawSetting2Lines("Stack trace for regular logs:", + UnityBuildSettingsUtility.GetReadableStackTraceType(settings.StackTraceForLog), false); + DrawSetting2Lines("Stack trace for warning logs:", + UnityBuildSettingsUtility.GetReadableStackTraceType(settings.StackTraceForWarning), false); + DrawSetting2Lines("Stack trace for error logs:", + UnityBuildSettingsUtility.GetReadableStackTraceType(settings.StackTraceForError), false); + DrawSetting2Lines("Stack trace for assert logs:", + UnityBuildSettingsUtility.GetReadableStackTraceType(settings.StackTraceForAssert), false); + DrawSetting2Lines("Stack trace for exception logs:", + UnityBuildSettingsUtility.GetReadableStackTraceType(settings.StackTraceForException), false); + } + + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + if (IsShowingPS3Settings) + { + DrawSetting("Enable verbose memory stats:", settings.PS3EnableVerboseMemoryStats); + + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingiOSSettings) + { + if (buildReportToDisplay.IsUnityVersionAtLeast(5, 0, 0)) + { + DrawSetting("Log Objective-C uncaught exceptions:", settings.iOSLogObjCUncaughtExceptions); + } + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingAndroidSettings) + { + DrawSetting("Create symbol package:", settings.AndroidCreateSymbols); + } + else if (IsShowingWebGlSettings) + { + DrawSetting("Use pre-built WebGL Unity engine:", settings.WebGLUsePreBuiltUnityEngine); + DrawSetting("Create WebGL debug symbols file:", settings.WebGLCreateDebugSymbolsFile); + DrawSetting("WebGL debug symbols mode:", settings.WebGLDebugSymbolMode); + DrawSetting("WebGL exception support:", settings.WebGLExceptionSupportType); + + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + + DrawSetting("Enable explicit null checks:", settings.EnableExplicitNullChecks); + + if (buildReportToDisplay.IsUnityVersionAtLeast(5, 4, 0)) + { + DrawSetting("Enable explicit divide-by-zero checks:", settings.EnableExplicitDivideByZeroChecks); + } + DrawSetting("Enable explicit array bounds checks:", settings.EnableArrayBoundsChecks); + + if (buildReportToDisplay.IsUnityVersionAtLeast(5, 0, 0)) + { + DrawSetting("Action on unhandled .NET exception:", settings.ActionOnDotNetUnhandledException); + + DrawSetting("Enable internal profiler:", settings.EnableInternalProfiler); + + DrawSetting("Enable CrashReport API:", settings.EnableCrashReportApi); + } + + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + DrawSetting("Auto-connect to Unity Editor Profiler:", settings.ConnectProfiler); + if (unityBuildReport != null) + { +#if UNITY_2019_3_OR_NEWER + DrawSetting("Deep profiling support:", unityBuildReport.HasBuildOption(BuildOptions.EnableDeepProfilingSupport)); +#endif +#if UNITY_5_2 || UNITY_5_3_OR_NEWER + DrawSetting("Force enable assertions in release build:", unityBuildReport.HasBuildOption(BuildOptions.ForceEnableAssertions)); +#endif + } + DrawSetting("Allow remote script debuggers:", settings.EnableSourceDebugging); + DrawSetting("Wait for Managed Debugger before executing scripts:", settings.WaitForManagedDebugger); + + DrawSetting("Collect CPU/GPU frame timing statistics:", settings.FrameTimingStats); + + GUILayout.EndVertical(); + if (Event.current.type == EventType.Repaint) + { + _debugSettingsRect = GUILayoutUtility.GetLastRect(); + } + } + + void DrawCodeSettings(BuildInfo buildReportToDisplay, UnityBuildSettings settings, UnityBuildReport unityBuildReport) + { + var groupStyle = GUI.skin.FindStyle("ProjectSettingsGroup"); + if (groupStyle == null) + { + groupStyle = GUI.skin.label; + } + + GUILayout.BeginVertical(GUIContent.none, groupStyle, NoExpandWidth); + DrawSettingsGroupTitle("Code Settings"); + + DrawSetting("Scripting Backend:", settings.ScriptingBackend); + DrawSetting(".NET API compatibility level:", settings.NETApiCompatibilityLevel); + DrawSetting("Incremental garbage collection:", settings.IncrementalGC); + DrawSetting("Suppress common C# warnings:", settings.SuppressCommonWarnings); + DrawSetting("Allow 'unsafe' code:", settings.AllowUnsafeCode); + DrawSetting("Exact version matching for Strong-named assemblies:", settings.AssemblyVersionValidation); + DrawSetting("IL2CPP code generation:", settings.IL2CPPCodeGeneration); + DrawSetting("IL2CPP compiler configuration:", settings.IL2CPPCompilerConfig); + + DrawSetting("AOT options:", settings.AOTOptions); + DrawSetting("Location usage description:", settings.LocationUsageDescription); + + if (unityBuildReport != null) + { +#if UNITY_2019_2_OR_NEWER + DrawSetting("Enable Code Coverage:", + unityBuildReport.HasBuildOption(BuildOptions.EnableCodeCoverage)); +#endif + } + if (IsShowingiOSSettings) + { + DrawSetting("Script call optimized:", settings.iOSScriptCallOptimizationUsed); + //GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingPS4Settings) + { + DrawSetting("Mono environment variables:", settings.PS4MonoEnvVars); + DrawSetting("Enable Player Prefs support:", settings.PS4EnablePlayerPrefsSupport); + } + + DrawSetting("Additional Compiler Arguments:", settings.AdditionalCompilerArguments); + DrawSetting("Additional IL2CPP Arguments:", settings.AdditionalIL2CPPArguments); + DrawSetting("Script Compilation Defines:", settings.CompileDefines); + + GUILayout.EndVertical(); + if (Event.current.type == EventType.Repaint) + { + _codeSettingsRect = GUILayoutUtility.GetLastRect(); + } + } + + void DrawGraphicsSettings(BuildInfo buildReportToDisplay, UnityBuildSettings settings, UnityBuildReport unityBuildReport) + { + var groupStyle = GUI.skin.FindStyle("ProjectSettingsGroup"); + if (groupStyle == null) + { + groupStyle = GUI.skin.label; + } + + GUILayout.BeginVertical(GUIContent.none, groupStyle, NoExpandWidth); + DrawSettingsGroupTitle("Graphics Settings"); + + if (IsShowingAndroidSettings) + { + DrawSetting("Texture Compression:", settings.AndroidBuildSubtarget); + } + + DrawSetting("Max Texture Size Override:", settings.OverrideMaxTextureSize, "No Override"); + DrawSetting("Texture Compression Override:", settings.OverrideTextureCompression); + + DrawSetting("Use HDR display if available:", settings.UseHDRDisplay); + DrawSetting("Allow HDR display support:", settings.AllowHDRDisplaySupport); + DrawSetting("HDR bit depth:", settings.HdrBitDepth); + DrawSetting("Use 32-bit display buffer:", settings.Use32BitDisplayBuffer); + if (IsShowingMacSettings) + { + DrawSetting("Enable Retina support:", settings.MacRetinaSupport); + } + DrawSetting("Rendering path:", settings.RenderingPathUsed); + DrawSetting("Color space:", settings.ColorSpaceUsed); + DrawSetting("Use multi-threaded rendering:", settings.UseMultithreadedRendering); + DrawSetting("Virtual texturing support enabled:", settings.VirtualTexturingSupportEnabled); + DrawSetting("Use graphics jobs:", settings.UseGraphicsJobs); + DrawSetting("Graphics jobs mode:", settings.GraphicsJobsType); + DrawSetting("Use GPU skinning:", settings.UseGPUSkinning); + DrawSetting("Clamp BlendShape weights (deprecated):", settings.LegacyClampBlendShapeWeights); + DrawSetting("Enable Virtual Reality Support:", settings.EnableVirtualRealitySupport); + DrawSetting("Stereo rendering path:", settings.StereoRenderingPath); + + if (IsShowingWindowsDesktopSettings || IsShowingMacSettings) + { + DrawSetting("Enable 360 stereo capture:", settings.Enable360StereoCapture); + } + + if (IsShowingiOSSettings || IsShowingTvOSSettings || IsShowingAndroidSettings) + { + DrawSetting("Normal map encoding:", settings.NormalMapEncoding); + } + + DrawSetting("Shader chunk count for platform:", settings.ShaderChunkCountForPlatform); + DrawSetting("Shader chunk size in MB for platform:", settings.ShaderChunkSizeInMBForPlatform); + DrawSetting("Shader precision model:", settings.ShaderPrecisionModel); + DrawSetting("Strict shader variant matching:", settings.StrictShaderVariantMatching); + DrawSetting("Max vertex limit for Sprite batching:", settings.SpriteBatchVertexThreshold); + +#if UNITY_2020_2_OR_NEWER && !UNITY_2023_1_OR_NEWER + // Shader Live Link added in 2020.2, removed in 2023.1 + if (unityBuildReport != null) + { + DrawSetting("Enable Shader Livelink Support:", + unityBuildReport.HasBuildOption(BuildOptions.ShaderLivelinkSupport)); + } +#endif + + if (buildReportToDisplay.IsUnityVersionAtLeast(5, 2, 0)) + { + DrawSetting("Graphics APIs Used:", settings.GraphicsAPIsUsed); + } + + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + + if (IsShowingMobileSettings) + { + DrawSetting("Default interface orientation:", settings.MobileDefaultOrientationUsed); + + DrawSetting("Use OS screen auto-rotate:", settings.MobileEnableOSAutorotation); + DrawSetting("Auto-rotate to portrait:", settings.MobileEnableAutorotateToPortrait); + DrawSetting("Auto-rotate to reverse portrait:", settings.MobileEnableAutorotateToReversePortrait); + DrawSetting("Auto-rotate to landscape left:", settings.MobileEnableAutorotateToLandscapeLeft); + DrawSetting("Auto-rotate to landscape right:", settings.MobileEnableAutorotateToLandscapeRight); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingStandaloneSettings) + { + string standaloneScreenSize = + string.Format("{0} x {1}", settings.StandaloneDefaultScreenWidth.ToString(), settings.StandaloneDefaultScreenHeight.ToString()); + DrawSetting("Default screen size:", standaloneScreenSize); + DrawSetting("Resolution dialog:", settings.StandaloneResolutionDialogSettingUsed); + + // removed in Unity 2018 + if (buildReportToDisplay.IsUnityVersionAtLeast(2017, 0, 0)) + { + DrawSetting("Full-screen by default:", settings.StandaloneFullScreenByDefault); + } + + DrawSetting("Resizable window:", settings.StandaloneEnableResizableWindow); + + // added in Unity 2018 + if (buildReportToDisplay.IsUnityVersionAtLeast(2018, 0, 0)) + { + DrawSetting("Fullscreen Mode:", settings.StandaloneFullScreenModeUsed); + } + + if (IsShowingWindowsDesktopSettings) + { + // not needed in Unity 5.3 since settings.GraphicsAPIsUsed shows better information + if (buildReportToDisplay.IsUnityVersionAtMost(5, 2, 0)) + { + DrawSetting("Use Direct3D11 if available:", settings.WinUseDirect3D11IfAvailable); + } + + // removed in 2017 + if (buildReportToDisplay.IsUnityVersionAtLeast(5, 0, 0)) + { + DrawSetting("Direct3D9 Fullscreen Mode:", settings.WinDirect3D9FullscreenModeUsed); + } + + // removed in 2018 + if (buildReportToDisplay.IsUnityVersionAtLeast(2017, 0, 0)) + { + DrawSetting("Direct3D11 Fullscreen Mode:", settings.WinDirect3D11FullscreenModeUsed); + } + + DrawSetting("Use DXGI flip model swap chain if possible (for Direct3D11):", settings.WinUseFlipModelSwapchain); + + DrawSetting("Visible in background (for Fullscreen Windowed mode):", settings.VisibleInBackground); + } + else if (IsShowingMacSettings) + { + // removed in 2018 + if (buildReportToDisplay.IsUnityVersionAtLeast(2017, 0, 0) && + buildReportToDisplay.IsUnityVersionAtMost(2017, 4, 0)) + { + DrawSetting("Fullscreen mode:", settings.MacFullscreenModeUsed); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + } + + DrawSetting("Allow OS switching between full-screen and window mode:", + settings.StandaloneAllowFullScreenSwitch); + DrawSetting("Darken secondary monitors on full-screen:", settings.StandaloneCaptureSingleScreen); + DrawSetting("Force single instance:", settings.StandaloneForceSingleInstance); + + DrawSetting("Stereoscopic Rendering:", settings.StandaloneUseStereoscopic3d); + DrawSetting("Supported aspect ratios:", settings.AspectRatiosAllowed); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + + if (IsShowingWebPlayerSettings) + { + string webScreenSize = string.Format("{0} x {1}", settings.WebPlayerDefaultScreenWidth.ToString(), settings.WebPlayerDefaultScreenHeight.ToString()); + DrawSetting("Screen size:", webScreenSize); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingiOSSettings) + { + if (buildReportToDisplay.IsUnityVersionAtMost(5, 2, 0)) + { + // Unity 5.3 has a Screen.resolutions but I don't know + // which of those in the array would be the iOS target resolution + DrawSetting("Target resolution:", settings.iOSTargetResolution); + } + + if (buildReportToDisplay.IsUnityVersionAtMost(5, 1, 0)) + { + // not used in Unity 5.2 since settings.GraphicsAPIsUsed shows better information + DrawSetting("Target graphics:", settings.iOSTargetGraphics); + } + + + DrawSetting("App icon pre-rendered:", settings.iOSIsIconPrerendered); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingAndroidSettings) + { + if (buildReportToDisplay.IsUnityVersionAtMost(4, 0, 0)) + { + DrawSetting("Use 24-bit depth buffer:", settings.AndroidUse24BitDepthBuffer); + } + + if (buildReportToDisplay.IsUnityVersionAtLeast(5, 0, 0)) + { + DrawSetting("Disable depth and stencil buffers:", settings.AndroidDisableDepthAndStencilBuffers); + } + + DrawSetting("Preserve alpha in framebuffer:", settings.AndroidPreserveFramebufferAlpha); + + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + else if (IsShowingPS4Settings) + { + DrawSetting("Video out pixel format:", settings.PS4VideoOutPixelFormat); + DrawSetting("Video out resolution:", settings.PS4VideoOutResolution); + GUILayout.Space(SETTINGS_GROUP_MINOR_SPACING); + } + + DrawSetting("Enable SetSRGBWrite on Vulkan:", settings.VulkanEnableSetSRGBWrite); + DrawSetting("Number of swapchain buffers on Vulkan:", settings.vulkanNumSwapchainBuffers); + DrawSetting("Acquire swapchain image as late as possible on Vulkan:", settings.VulkanEnableLateAcquireNextImage); + if (IsShowingAndroidSettings) + { + DrawSetting("Apply display rotation during rendering:", settings.VulkanEnablePreTransform); + } + + GUILayout.EndVertical(); + if (Event.current.type == EventType.Repaint) + { + _graphicsSettingsRect = GUILayoutUtility.GetLastRect(); + } + } + + void DrawPackageSettings(BuildInfo buildReportToDisplay, UnityBuildSettings settings) + { + var packageList = settings.PackageEntries; + var builtInPackageList = settings.BuiltInPackageEntries; + + bool packageListIsEmpty = packageList == null || packageList.Count == 0; + bool builtInPackageListIsEmpty = builtInPackageList == null || builtInPackageList.Count == 0; + + if (packageListIsEmpty && builtInPackageListIsEmpty) + { + return; + } + + var nameStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.SETTING_NAME_STYLE_NAME); + if (nameStyle == null) + { + nameStyle = GUI.skin.label; + } + + var valueStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.SETTING_VALUE_STYLE_NAME); + if (valueStyle == null) + { + valueStyle = GUI.skin.label; + } + + var groupStyle = GUI.skin.FindStyle("ProjectSettingsGroup"); + if (groupStyle == null) + { + groupStyle = GUI.skin.label; + } + + GUILayout.BeginVertical(GUIContent.none, groupStyle, NoExpandWidth); + + if (!packageListIsEmpty) + { + DrawSettingsGroupTitle("Packages"); + for (int n = 0, len = packageList.Count; n < len; ++n) + { + if (!string.IsNullOrEmpty(packageList[n].DisplayName)) + { + if (!string.IsNullOrEmpty(packageList[n].Location) && packageList[n].Location.EndsWith(".git") && packageList[n].VersionUsed.Length > 7) + { + // show commit hash as short + GUILayout.BeginHorizontal(GUIContent.none, groupStyle, NoExpandWidth); + GUILayout.Label(packageList[n].DisplayName, nameStyle); + GUILayout.Space(4); + GUILayout.TextField(packageList[n].VersionUsed.Substring(0, DEFAULT_SHORT_COMMIT_HASH_LENGTH_DISPLAYED), valueStyle); + GUILayout.Space(4); + DrawPackagePingButton(packageList[n]); + GUILayout.EndHorizontal(); + GUILayout.TextField(packageList[n].PackageName, valueStyle); + } + else if (packageList[n].VersionUsed.Length <= 10) + { + // version is short enough, put it in the same line as the Package Name + GUILayout.BeginHorizontal(GUIContent.none, groupStyle, NoExpandWidth); + GUILayout.Label(packageList[n].DisplayName, nameStyle); + GUILayout.Space(4); + GUILayout.TextField(packageList[n].VersionUsed, valueStyle); + GUILayout.Space(4); + DrawPackagePingButton(packageList[n]); + GUILayout.EndHorizontal(); + GUILayout.TextField(packageList[n].PackageName, valueStyle); + } + else + { + // version is too long, put it as a 2nd line after the Display Name + GUILayout.Label(packageList[n].DisplayName, nameStyle); + GUILayout.TextField(packageList[n].VersionUsed, valueStyle); + GUILayout.TextField(packageList[n].PackageName, valueStyle); + DrawPackagePingButton(packageList[n]); + } + } + else + { + // no display name + if (packageList[n].VersionUsed.Length <= 10) + { + // version is short enough, put it in the same line as the Package Name + GUILayout.BeginHorizontal(GUIContent.none, groupStyle, NoExpandWidth); + GUILayout.TextField(packageList[n].PackageName, nameStyle); + GUILayout.Space(4); + GUILayout.TextField(packageList[n].VersionUsed, valueStyle); + GUILayout.Space(4); + DrawPackagePingButton(packageList[n]); + GUILayout.EndHorizontal(); + } + else + { + // version is too long, put it as a 2nd line after the Package Name + GUILayout.TextField(packageList[n].PackageName, nameStyle); + GUILayout.TextField(packageList[n].VersionUsed, valueStyle); + DrawPackagePingButton(packageList[n]); + } + } + + if (!string.IsNullOrEmpty(packageList[n].Location) && packageList[n].Location != BuildReportTool.UnityBuildSettingsUtility.DEFAULT_REGISTRY_URL) + { + GUILayout.TextField(packageList[n].Location, valueStyle); + } + + GUILayout.Space(10); + } + + if (!builtInPackageListIsEmpty) + { + GUILayout.Space(14); + } + } + + if (!builtInPackageListIsEmpty) + { + DrawSettingsGroupTitle("Built-In Packages"); + for (int n = 0, len = builtInPackageList.Count; n < len; ++n) + { + if (!string.IsNullOrEmpty(builtInPackageList[n].DisplayName)) + { + GUILayout.Label(builtInPackageList[n].DisplayName, nameStyle); + GUILayout.TextField(builtInPackageList[n].PackageName, valueStyle); + } + else + { + // no display name + GUILayout.Label(builtInPackageList[n].PackageName, nameStyle); + } + + GUILayout.Space(5); + } + } + + GUILayout.EndVertical(); + if (Event.current.type == EventType.Repaint) + { + _pathSettingsRect = GUILayoutUtility.GetLastRect(); + } + } + + void DrawPackagePingButton(BuildReportTool.UnityBuildSettings.PackageEntry packageEntry) + { + if (!string.IsNullOrEmpty(packageEntry.LocalPath)) + { + if (GUILayout.Button("Ping", "MiniButton")) + { + Utility.PingAssetInProject(string.Format("Packages/{0}/package.json", packageEntry.PackageName)); + } + if (GUILayout.Button("Explore", "MiniButton")) + { + BuildReportTool.Util.OpenInFileBrowser(packageEntry.LocalPath); + } + } + } + + void DrawPathSettings(BuildInfo buildReportToDisplay, UnityBuildSettings settings) + { + var groupStyle = GUI.skin.FindStyle("ProjectSettingsGroup"); + if (groupStyle == null) + { + groupStyle = GUI.skin.label; + } + + GUILayout.BeginVertical(GUIContent.none, groupStyle, NoExpandWidth); + DrawSettingsGroupTitle("Paths"); + + DrawSetting2Lines("Unity path:", buildReportToDisplay.EditorAppContentsPath); + DrawSetting2Lines("Project path:", buildReportToDisplay.ProjectAssetsPath); + DrawSetting2Lines("Build path:", buildReportToDisplay.BuildFilePath); + GUILayout.EndVertical(); + if (Event.current.type == EventType.Repaint) + { + _pathSettingsRect = GUILayoutUtility.GetLastRect(); + } + } + + + public override void DrawGUI(Rect position, + BuildInfo buildReportToDisplay, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, + UnityBuildReport unityBuildReport, BuildReportTool.ExtraData extraData, + out bool requestRepaint) + { + if (buildReportToDisplay == null) + { + requestRepaint = false; + return; + } + + BuildSettingCategory b = ReportGenerator.GetBuildSettingCategoryFromBuildValues(buildReportToDisplay); + _buildTargetOfReport = UnityBuildSettingsUtility.GetReadableBuildSettingCategory(b); + + UnityBuildSettings settings = buildReportToDisplay.UnityBuildSettings; + + if (settings == null) + { + Utility.DrawCentralMessage(position, "No \"Project Settings\" recorded in this build report."); + requestRepaint = false; + return; + } + + var topBarBgStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TOP_BAR_BG_STYLE_NAME); + if (topBarBgStyle == null) + { + topBarBgStyle = GUI.skin.box; + } + + var topBarLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TOP_BAR_LABEL_STYLE_NAME); + if (topBarLabelStyle == null) + { + topBarLabelStyle = GUI.skin.label; + } + + var fileFilterPopupStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.FILE_FILTER_POPUP_STYLE_NAME); + if (fileFilterPopupStyle == null) + { + fileFilterPopupStyle = GUI.skin.label; + } + + // ---------------------------------------------------------- + // top bar + + GUILayout.Space(1); + GUILayout.BeginHorizontal(); + + GUILayout.Label(" ", topBarBgStyle); + + GUILayout.Space(8); + GUILayout.Label("Build Target: ", topBarLabelStyle); + + InitializeDropdownBoxLabelsIfNeeded(); + _selectedSettingsIdxFromDropdownBox = EditorGUILayout.Popup(_selectedSettingsIdxFromDropdownBox, + _settingDropdownBoxLabels, fileFilterPopupStyle); + GUILayout.Space(15); + + GUILayout.Label(string.Format("Note: Project was built in {0} target", _buildTargetOfReport), topBarLabelStyle); + GUILayout.FlexibleSpace(); + + BuildReportTool.Options.ShowProjectSettingsInMultipleColumns = GUILayout.Toggle(BuildReportTool.Options.ShowProjectSettingsInMultipleColumns, "Multiple Columns"); + GUILayout.Space(30); + + GUILayout.EndHorizontal(); + + _settingsShown = UnityBuildSettingsUtility.GetSettingsCategoryFromIdx(_selectedSettingsIdxFromDropdownBox); + + // ---------------------------------------------------------- + + var showMultiColumn = BuildReportTool.Options.ShowProjectSettingsInMultipleColumns; + + _scrollPos = GUILayout.BeginScrollView(_scrollPos); + + GUILayout.BeginHorizontal(NoExpandWidth); + + // left padding + GUILayout.Space(10); + GUILayout.BeginVertical(NoExpandWidth); + + // top padding + GUILayout.Space(10); + + // columns + GUILayout.BeginHorizontal(NoExpandWidth); + + // column 1 + GUILayout.BeginVertical(NoExpandWidth); + + bool putCodeSettingsInColumn2 = showMultiColumn && _codeSettingsRect.width > 0 && _column1Width + _codeSettingsRect.width < position.width; + bool putGraphicsSettingsInColumn3 = showMultiColumn && _graphicsSettingsRect.width > 0 && _column1Width + _codeSettingsRect.width + _graphicsSettingsRect.width < position.width; + + + // ================================================================= + DrawProjectSettings(buildReportToDisplay, settings); + GUILayout.Space(SETTINGS_GROUP_SPACING); + + + // ================================================================= + DrawPathSettings(buildReportToDisplay, settings); + GUILayout.Space(SETTINGS_GROUP_SPACING); + + + // ================================================================= + DrawBuildSettings(buildReportToDisplay, settings, unityBuildReport); + GUILayout.Space(SETTINGS_GROUP_SPACING); + + + // ================================================================= + DrawRuntimeSettings(buildReportToDisplay, settings); + GUILayout.Space(SETTINGS_GROUP_SPACING); + + + // ================================================================= + DrawDebugSettings(buildReportToDisplay, settings, unityBuildReport); + GUILayout.Space(SETTINGS_GROUP_SPACING); + + + if (putGraphicsSettingsInColumn3) + { + GUILayout.EndVertical(); // end of column 1 + + // column 2 + GUILayout.BeginVertical(NoExpandWidth); + } + // ================================================================= + DrawGraphicsSettings(buildReportToDisplay, settings, unityBuildReport); + GUILayout.Space(SETTINGS_GROUP_SPACING); + + // ================================================================= + DrawPackageSettings(buildReportToDisplay, settings); + GUILayout.Space(SETTINGS_GROUP_SPACING); + + if (putCodeSettingsInColumn2) + { + GUILayout.EndVertical(); // end of column 1 or 2 + + // column 2 or 2 + GUILayout.BeginVertical(NoExpandWidth); + } + // ================================================================= + DrawCodeSettings(buildReportToDisplay, settings, unityBuildReport); + GUILayout.Space(SETTINGS_GROUP_SPACING); + + + GUILayout.EndVertical(); // end of last column + GUILayout.EndHorizontal(); // end columns + + // bottom padding + GUILayout.Space(10); + GUILayout.EndVertical(); + GUILayout.EndHorizontal(); + GUILayout.EndScrollView(); + requestRepaint = false; + + // ================================================================= + + if (Event.current.type == EventType.Repaint) + { + _column1Width = 0; + _column1Width = Mathf.Max(_projectSettingsRect.width, _column1Width); + _column1Width = Mathf.Max(_pathSettingsRect.width, _column1Width); + _column1Width = Mathf.Max(_buildSettingsRect.width, _column1Width); + _column1Width = Mathf.Max(_runtimeSettingsRect.width, _column1Width); + _column1Width = Mathf.Max(_debugSettingsRect.width, _column1Width); + //_column1Width = Mathf.Max(_graphicsSettingsRect.width, _column1Width); + } + //_column1Width = Mathf.Max(_codeSettingsRect.width, _column1Width); + } + } +} + + +public static class ScriptReference +{ + // + // Example usage: + // + // if (GUILayout.Button("doc")) + // { + // ScriptReference.GoTo("EditorUserBuildSettings.development"); + // } + // + public static void GoTo(string pageName) + { + string pageUrl = "file:///"; + + pageUrl += EditorApplication.applicationContentsPath; + + // unity 3 + pageUrl += "/Documentation/Documentation/ScriptReference/"; + + pageUrl += pageName.Replace(".", "-"); + pageUrl += ".html"; + + Debug.Log("going to: " + pageUrl); + + Application.OpenURL(pageUrl); + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BuildSettingsScreen.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BuildSettingsScreen.cs.meta new file mode 100644 index 00000000..743f47f6 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BuildSettingsScreen.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9f63c3db014dad04a8a0b65ae2ac44e3 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BuildStepsScreen.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BuildStepsScreen.cs new file mode 100644 index 00000000..ee51cffb --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BuildStepsScreen.cs @@ -0,0 +1,1086 @@ +using System; +using System.Collections.Generic; +using System.Reflection; +using UnityEngine; +using UnityEditor; + +namespace BuildReportTool.Window.Screen +{ + public class BuildStepsScreen : BaseScreen + { + public override string Name { get { return "Build Steps"; } } + + public override void RefreshData(BuildInfo buildReport, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, UnityBuildReport unityBuildReport) + { + if (unityBuildReport != null) + { + SelectStep(-1, unityBuildReport.BuildProcessSteps); + } + } + + Vector2 _scrollPos; + Vector2 _logMessagesScrollPos; + Texture _indentLine; + + int _selectedStepIdx = -1; + int _selectedLogStepIdx = -1; + int _selectedLogIdx = -1; + + Texture2D _logIcon; + Texture2D _warnIcon; + Texture2D _errorIcon; + + readonly GUIContent _logFilterLabel = new GUIContent("0"); + readonly GUIContent _warnFilterLabel = new GUIContent("0"); + readonly GUIContent _errorFilterLabel = new GUIContent("0"); + + readonly GUIContent _tableItemLabel = new GUIContent(); + + Rect _stepsViewRect; + + bool _showLogMessagesCollapsed; + bool _showLogMessages = true; + bool _showWarnMessages = true; + bool _showErrorMessages = true; + + int _infoMessageCount; + int _warnMessageCount; + int _errorMessageCount; + + int _collapsedInfoMessageCount; + int _collapsedWarnMessageCount; + int _collapsedErrorMessageCount; + + int _totalVisibleMessageCount; + + struct LogMsgIdx + { + public int StepIdx; + public int LogIdx; + } + + static LogMsgIdx MakeLogMsgIdx(int stepIdx, int logIdx) + { + LogMsgIdx newEntry; + newEntry.StepIdx = stepIdx; + newEntry.LogIdx = logIdx; + return newEntry; + } + + readonly Dictionary _logRects = new Dictionary(); + + float _buildStepsHeightPercent = 0.5f; + + Rect _dividerRect; + bool _draggingDivider; + float _mouseYOnDividerDragStart; + float _heightOnDividerDragStart; + + int _logMessageToShowStartOffset = 0; + + bool _showPageNumbers = true; + + // ================================================================================================ + + public override void DrawGUI(Rect position, + BuildInfo buildReportToDisplay, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, + UnityBuildReport unityBuildReport, BuildReportTool.ExtraData extraData, + out bool requestRepaint) + { + requestRepaint = false; + if (unityBuildReport == null) + { + return; + } + + var steps = unityBuildReport.BuildProcessSteps; + if (steps == null) + { + return; + } + + if (_logIcon == null) + { + var logIcons = GUI.skin.FindStyle("LogMessageIcons"); + if (logIcons != null) + { + _logIcon = logIcons.normal.background; + _warnIcon = logIcons.hover.background; + _errorIcon = logIcons.active.background; + + _logFilterLabel.image = _logIcon; + _warnFilterLabel.image = _warnIcon; + _errorFilterLabel.image = _errorIcon; + } + } + + if (_indentLine == null) + { + var indentStyle = GUI.skin.FindStyle("IndentStyle1"); + if (indentStyle != null) + { + _indentLine = indentStyle.normal.background; + } + } + + Texture2D prevArrow; + var prevArrowStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.BIG_LEFT_ARROW_ICON_STYLE_NAME); + if (prevArrowStyle != null) + { + prevArrow = prevArrowStyle.normal.background; + } + else + { + prevArrow = null; + } + + Texture2D nextArrow; + var nextArrowStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.BIG_RIGHT_ARROW_ICON_STYLE_NAME); + if (nextArrowStyle != null) + { + nextArrow = nextArrowStyle.normal.background; + } + else + { + nextArrow = null; + } + + var buttonStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TOP_BAR_BTN_STYLE_NAME); + if (buttonStyle == null) + { + buttonStyle = GUI.skin.button; + } + + var topBarBgStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TOP_BAR_BG_STYLE_NAME); + if (topBarBgStyle == null) + { + topBarBgStyle = GUI.skin.label; + } + + var topBarLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TOP_BAR_LABEL_STYLE_NAME); + if (topBarLabelStyle == null) + { + topBarLabelStyle = GUI.skin.label; + } + + var columnHeaderStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_COLUMN_HEADER_STYLE_NAME); + if (columnHeaderStyle == null) + { + columnHeaderStyle = GUI.skin.label; + } + + var hiddenHorizontalScrollbarStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME); + if (hiddenHorizontalScrollbarStyle == null) + { + hiddenHorizontalScrollbarStyle = GUI.skin.horizontalScrollbar; + } + + var hiddenVerticalScrollbarStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.HIDDEN_SCROLLBAR_STYLE_NAME); + if (hiddenVerticalScrollbarStyle == null) + { + hiddenVerticalScrollbarStyle = GUI.skin.verticalScrollbar; + } + + var verticalScrollbarStyle = GUI.skin.verticalScrollbar; + + var listNormalStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_STYLE_NAME); + if (listNormalStyle == null) + { + listNormalStyle = GUI.skin.label; + } + + var listAltStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_ALT_STYLE_NAME); + if (listAltStyle == null) + { + listAltStyle = GUI.skin.label; + } + + var listSelectedStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_SMALL_SELECTED_NAME); + if (listSelectedStyle == null) + { + listSelectedStyle = GUI.skin.label; + } + + // -------------------------------- + + #region Steps + float height = position.height * _buildStepsHeightPercent; + var maxHeight = (steps.Length+1) * 20; + if (height > maxHeight) + { + height = maxHeight; + } + GUILayout.BeginHorizontal(GUILayout.Height(height)); + + #region Column 1 (Step Name) + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Step", columnHeaderStyle); + _scrollPos = GUILayout.BeginScrollView(_scrollPos, + hiddenHorizontalScrollbarStyle, + hiddenVerticalScrollbarStyle, BRT_BuildReportWindow.LayoutNone); + + bool useAlt = true; + for (int i = 0; i < steps.Length; ++i) + { + var styleToUse = useAlt ? listAltStyle : listNormalStyle; + if (i == _selectedStepIdx) + { + styleToUse = listSelectedStyle; + } + + GUILayout.BeginHorizontal(styleToUse); + GUILayout.Space(steps[i].Depth * 20); + + _tableItemLabel.text = steps[i].Name; + _tableItemLabel.tooltip = _tableItemLabel.text; + + if (GUILayout.Button(_tableItemLabel, styleToUse, BRT_BuildReportWindow.LayoutListHeight)) + { + SelectStep(i, steps); + } + GUILayout.EndHorizontal(); + if (Event.current.type == EventType.Repaint && _indentLine != null) + { + Rect labelRect = GUILayoutUtility.GetLastRect(); + + var prevColor = GUI.color; + GUI.color = new Color(0, 0, 0, 0.5f); + for (int indentN = 0, indentLen = steps[i].Depth; + indentN < indentLen; + ++indentN) + { + var indentRect = new Rect((indentN * 20), labelRect.y, 20, labelRect.height); + GUI.DrawTexture(indentRect, _indentLine, ScaleMode.ScaleAndCrop); + } + + GUI.color = prevColor; + } + + useAlt = !useAlt; + } + + GUILayout.EndScrollView(); + GUILayout.EndVertical(); + #endregion + + #region Column 2 (Warning Count) + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Warnings", columnHeaderStyle, BRT_BuildReportWindow.LayoutMinWidth63); + _scrollPos = GUILayout.BeginScrollView(_scrollPos, + hiddenHorizontalScrollbarStyle, + hiddenVerticalScrollbarStyle, BRT_BuildReportWindow.LayoutNone); + useAlt = true; + for (int i = 0; i < steps.Length; ++i) + { + var styleToUse = useAlt ? listAltStyle : listNormalStyle; + if (i == _selectedStepIdx) + { + styleToUse = listSelectedStyle; + } + + if (steps[i].WarnLogCount > 0) + { + if (GUILayout.Button(steps[i].WarnLogCount.ToString(), styleToUse, BRT_BuildReportWindow.LayoutListHeight)) + { + SelectStep(i, steps); + } + } + else + { + GUILayout.Label(GUIContent.none, styleToUse, BRT_BuildReportWindow.LayoutListHeight); + } + useAlt = !useAlt; + } + GUILayout.EndScrollView(); + GUILayout.EndVertical(); + #endregion + + #region Column 3 (Error Count) + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Errors", columnHeaderStyle, BRT_BuildReportWindow.LayoutMinWidth44); + _scrollPos = GUILayout.BeginScrollView(_scrollPos, + hiddenHorizontalScrollbarStyle, + hiddenVerticalScrollbarStyle, BRT_BuildReportWindow.LayoutNone); + useAlt = true; + for (int i = 0; i < steps.Length; ++i) + { + var styleToUse = useAlt ? listAltStyle : listNormalStyle; + if (i == _selectedStepIdx) + { + styleToUse = listSelectedStyle; + } + + if (steps[i].ErrorLogCount > 0) + { + if (GUILayout.Button(steps[i].ErrorLogCount.ToString(), styleToUse, BRT_BuildReportWindow.LayoutListHeight)) + { + SelectStep(i, steps); + } + } + else + { + GUILayout.Label(GUIContent.none, styleToUse, BRT_BuildReportWindow.LayoutListHeight); + } + useAlt = !useAlt; + } + GUILayout.EndScrollView(); + GUILayout.EndVertical(); + #endregion + + #region Last Column (Duration) + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Duration", columnHeaderStyle, BRT_BuildReportWindow.LayoutMinWidth84); + _scrollPos = GUILayout.BeginScrollView(_scrollPos, + hiddenHorizontalScrollbarStyle, + verticalScrollbarStyle, BRT_BuildReportWindow.LayoutNone); + + + useAlt = true; + for (int i = 0; i < steps.Length; ++i) + { + var styleToUse = useAlt ? listAltStyle : listNormalStyle; + if (i == _selectedStepIdx) + { + styleToUse = listSelectedStyle; + } + + string duration; + if (i == 0) + { + duration = unityBuildReport.TotalBuildTime.ToReadableString(); + } + else + { + duration = steps[i].Duration.ToReadableString(); + } + + _tableItemLabel.text = duration; + GUILayout.Label(_tableItemLabel, styleToUse, + GUILayout.Height(BRT_BuildReportWindow.LIST_HEIGHT), + GUILayout.ExpandHeight(false), + GUILayout.MinWidth(styleToUse.CalcSize(_tableItemLabel).x)); + + useAlt = !useAlt; + } + + GUILayout.EndScrollView(); + GUILayout.EndVertical(); + #endregion + + GUILayout.EndHorizontal(); + if (Event.current.type == EventType.Repaint) + { + _stepsViewRect = GUILayoutUtility.GetLastRect(); + } + #endregion + + // -------------------------------- + + #region Logs + GUILayout.BeginHorizontal(); + + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + + #region Logs Toolbar + GUILayout.BeginHorizontal(topBarBgStyle, BRT_BuildReportWindow.LayoutHeight18); + GUILayout.Space(10); + string logMessagesTitle; + bool hasStepSelected = _selectedStepIdx != -1 && + steps[_selectedStepIdx].BuildLogMessages != null && + steps[_selectedStepIdx].BuildLogMessages.Length > 0; + if (hasStepSelected) + { + logMessagesTitle = string.Format("Log Messages of: {0}", steps[_selectedStepIdx].Name); + } + else + { + logMessagesTitle = "Log Messages (Total)"; + } + GUILayout.Label(logMessagesTitle, topBarLabelStyle, BRT_BuildReportWindow.LayoutNoExpandWidth); + if (Event.current.type == EventType.Repaint) + { + _dividerRect = GUILayoutUtility.GetLastRect(); + } + GUILayout.FlexibleSpace(); + + int messagePaginationLength = BuildReportTool.Options.LogMessagePaginationLength; + + bool prevButton = (prevArrow != null + ? GUILayout.Button(prevArrow, buttonStyle) + : GUILayout.Button("Previous", buttonStyle)); + if (prevButton && (_logMessageToShowStartOffset - messagePaginationLength >= 0)) + { + _logMessageToShowStartOffset -= messagePaginationLength; + } + if (Event.current.type == EventType.Repaint) + { + var prevArrowRect = GUILayoutUtility.GetLastRect(); + _dividerRect.xMax = prevArrowRect.x; + } + + string paginateLabel; + if (_showPageNumbers) + { + int totalPageNumbers = _totalVisibleMessageCount/messagePaginationLength; + if (_totalVisibleMessageCount % messagePaginationLength > 0) + { + ++totalPageNumbers; + } + + // the max number of digits for the displayed offset counters + string assetCountDigitNumFormat = string.Format("D{0}", totalPageNumbers.ToString().Length.ToString()); + + paginateLabel = string.Format("Page {0} of {1}", + ((_logMessageToShowStartOffset/messagePaginationLength)+1).ToString(assetCountDigitNumFormat), + totalPageNumbers.ToString()); + } + else + { + // number of assets in current page + int pageLength = Mathf.Min(_logMessageToShowStartOffset + messagePaginationLength, _totalVisibleMessageCount); + + int offsetNonZeroBased = _logMessageToShowStartOffset + (pageLength > 0 ? 1 : 0); + + // the max number of digits for the displayed offset counters + string assetCountDigitNumFormat = string.Format("D{0}", _totalVisibleMessageCount.ToString().Length.ToString()); + + paginateLabel = string.Format("Page {0} - {1} of {2}", + offsetNonZeroBased.ToString(assetCountDigitNumFormat), + pageLength.ToString(assetCountDigitNumFormat), + _totalVisibleMessageCount.ToString(assetCountDigitNumFormat)); + } + + if (GUILayout.Button(paginateLabel, topBarLabelStyle, BRT_BuildReportWindow.LayoutNone)) + { + _showPageNumbers = !_showPageNumbers; + } + + bool nextButton = nextArrow != null + ? GUILayout.Button(nextArrow, buttonStyle) + : GUILayout.Button("Next", buttonStyle); + if (nextButton && (_logMessageToShowStartOffset + messagePaginationLength < _totalVisibleMessageCount)) + { + _logMessageToShowStartOffset += messagePaginationLength; + } + + GUILayout.Space(8); + + var newShowLogMessagesCollapsed = GUILayout.Toggle(_showLogMessagesCollapsed, "Collapse", + buttonStyle, BRT_BuildReportWindow.LayoutNoExpandWidth); + if (newShowLogMessagesCollapsed != _showLogMessagesCollapsed) + { + _showLogMessagesCollapsed = newShowLogMessagesCollapsed; + RefreshTotalVisibleMessageCount(); + } + GUILayout.Space(8); + bool newShowLogMessages = GUILayout.Toggle(_showLogMessages, _logFilterLabel, + buttonStyle, BRT_BuildReportWindow.LayoutNoExpandWidth); + bool newShowWarnMessages = GUILayout.Toggle(_showWarnMessages, _warnFilterLabel, + buttonStyle, BRT_BuildReportWindow.LayoutNoExpandWidth); + bool newShowErrorMessages = GUILayout.Toggle(_showErrorMessages, _errorFilterLabel, + buttonStyle, BRT_BuildReportWindow.LayoutNoExpandWidth); + if (newShowLogMessages != _showLogMessages) + { + _showLogMessages = newShowLogMessages; + RefreshTotalVisibleMessageCount(); + } + if (newShowWarnMessages != _showWarnMessages) + { + _showWarnMessages = newShowWarnMessages; + RefreshTotalVisibleMessageCount(); + } + if (newShowErrorMessages != _showErrorMessages) + { + _showErrorMessages = newShowErrorMessages; + RefreshTotalVisibleMessageCount(); + } + GUILayout.Space(8); + GUILayout.EndHorizontal(); + + EditorGUIUtility.AddCursorRect(_dividerRect, MouseCursor.ResizeVertical); + #endregion + + if (Event.current.type == EventType.MouseDown && + Event.current.button == 0 && + _dividerRect.Contains(Event.current.mousePosition)) + { + _draggingDivider = true; + _mouseYOnDividerDragStart = Event.current.mousePosition.y; + _heightOnDividerDragStart = height; + requestRepaint = true; + } + + if (Event.current.type == EventType.MouseUp) + { + _draggingDivider = false; + requestRepaint = true; + } + + if (_draggingDivider) + { + var newHeight = _heightOnDividerDragStart + (Event.current.mousePosition.y - _mouseYOnDividerDragStart); + _buildStepsHeightPercent = newHeight / position.height; + requestRepaint = true; + } + + _logMessagesScrollPos = GUILayout.BeginScrollView(_logMessagesScrollPos, + hiddenHorizontalScrollbarStyle, + verticalScrollbarStyle, BRT_BuildReportWindow.LayoutNone); + + if (_showLogMessages || _showWarnMessages || _showErrorMessages) + { + if (hasStepSelected) + { + BuildLogMessage[] messages; + if (_showLogMessagesCollapsed) + { + messages = steps[_selectedStepIdx].CollapsedBuildLogMessages; + } + else + { + messages = steps[_selectedStepIdx].BuildLogMessages; + } + + int totalToShow = 0; + if (_showLogMessages) + { + totalToShow += steps[_selectedStepIdx].InfoLogCount; + } + if (_showWarnMessages) + { + totalToShow += steps[_selectedStepIdx].WarnLogCount; + } + if (_showErrorMessages) + { + totalToShow += steps[_selectedStepIdx].ErrorLogCount; + } + + if (totalToShow > 0) + { + useAlt = true; + + int messageToStartIdx = 0; + + int messageToStartCount = 0; + for (int m = 0; m < messages.Length; ++m) + { + var logTypeIcon = GetLogIcon(messages[m].LogType); + if (logTypeIcon == _logIcon && !_showLogMessages) + { + continue; + } + if (logTypeIcon == _warnIcon && !_showWarnMessages) + { + continue; + } + if (logTypeIcon == _errorIcon && !_showErrorMessages) + { + continue; + } + + ++messageToStartCount; + if (messageToStartCount-1 == _logMessageToShowStartOffset) + { + messageToStartIdx = m; + break; + } + } + + DrawMessages(messages, messageToStartIdx, messagePaginationLength, + _selectedStepIdx, 0, ref useAlt, ref requestRepaint); + } + } + else + { + useAlt = true; + + int messageToStartIdx = 0; + int stepToStartIdx = 0; + + int messageToStartCount = 0; + for (int s = 0; s < steps.Length; ++s) + { + var step = steps[s]; + + BuildLogMessage[] messages; + if (_showLogMessagesCollapsed) + { + messages = step.CollapsedBuildLogMessages; + } + else + { + messages = step.BuildLogMessages; + } + + if (messages == null || messages.Length == 0) + { + continue; + } + + int totalToShow = 0; + if (_showLogMessages) + { + totalToShow += step.InfoLogCount; + } + + if (_showWarnMessages) + { + totalToShow += step.WarnLogCount; + } + + if (_showErrorMessages) + { + totalToShow += step.ErrorLogCount; + } + + if (totalToShow == 0) + { + continue; + } + + for (int m = 0; m < messages.Length; ++m) + { + var logTypeIcon = GetLogIcon(messages[m].LogType); + if (logTypeIcon == _logIcon && !_showLogMessages) + { + continue; + } + + if (logTypeIcon == _warnIcon && !_showWarnMessages) + { + continue; + } + + if (logTypeIcon == _errorIcon && !_showErrorMessages) + { + continue; + } + + ++messageToStartCount; + if (messageToStartCount - 1 == _logMessageToShowStartOffset) + { + messageToStartIdx = m; + stepToStartIdx = s; + break; + } + } + } + + int totalShownSoFar = 0; + for (int s = stepToStartIdx; s < steps.Length; ++s) + { + var step = steps[s]; + + BuildLogMessage[] messages; + if (_showLogMessagesCollapsed) + { + messages = step.CollapsedBuildLogMessages; + } + else + { + messages = step.BuildLogMessages; + } + + if (messages == null || messages.Length == 0) + { + continue; + } + + int totalToShow = 0; + if (_showLogMessages) + { + if (_showLogMessagesCollapsed) + { + totalToShow += step.CollapsedInfoLogCount; + } + else + { + totalToShow += step.InfoLogCount; + } + } + if (_showWarnMessages) + { + if (_showLogMessagesCollapsed) + { + totalToShow += step.CollapsedWarnLogCount; + } + else + { + totalToShow += step.WarnLogCount; + } + + } + if (_showErrorMessages) + { + if (_showLogMessagesCollapsed) + { + totalToShow += step.CollapsedErrorLogCount; + } + else + { + totalToShow += step.ErrorLogCount; + } + } + + if (totalToShow == 0) + { + continue; + } + + var styleToUse = useAlt ? listAltStyle : listNormalStyle; + + GUILayout.BeginHorizontal(styleToUse, BRT_BuildReportWindow.LayoutNone); + GUILayout.Space(8); + GUILayout.Button(step.Name, styleToUse, BRT_BuildReportWindow.LayoutHeight25); + GUILayout.EndHorizontal(); + + useAlt = !useAlt; + + DrawMessages(messages, messageToStartIdx, messagePaginationLength - totalShownSoFar, + s, 20, ref useAlt, ref requestRepaint); + + totalShownSoFar += totalToShow; + + if (totalShownSoFar >= messagePaginationLength) + { + break; + } + } + } + } + + GUILayout.EndScrollView(); + GUILayout.EndVertical(); + + GUILayout.EndHorizontal(); + #endregion + + // if clicked on nothing interactable, then remove selection + if (GUI.Button(_stepsViewRect, GUIContent.none, hiddenVerticalScrollbarStyle)) + { + SelectStep(-1, steps); + } + } + + void DrawMessages(BuildLogMessage[] messages, int messagesStartIdx, int messageLength, int stepIdx, int leftIndent, ref bool useAlt, ref bool requestRepaint) + { + GUISkin nativeSkin = + EditorGUIUtility.GetBuiltinSkin(EditorGUIUtility.isProSkin ? EditorSkin.Scene : EditorSkin.Inspector); + var logCountStyle = nativeSkin.FindStyle("CN CountBadge"); + + var listNormalStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_NORMAL_STYLE_NAME); + if (listNormalStyle == null) + { + listNormalStyle = GUI.skin.label; + } + + var listAltStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_NORMAL_ALT_STYLE_NAME); + if (listAltStyle == null) + { + listAltStyle = GUI.skin.label; + } + + var listSelectedStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_NORMAL_SELECTED_NAME); + if (listSelectedStyle == null) + { + listSelectedStyle = GUI.skin.label; + } + + var textureStyle = GUI.skin.FindStyle("DrawTexture"); + if (textureStyle == null) + { + textureStyle = GUI.skin.label; + } + + var textStyle = GUI.skin.FindStyle("Text"); + if (textStyle == null) + { + textStyle = GUI.skin.label; + } + + var textSelectedStyle = GUI.skin.FindStyle("TextSelected"); + if (textSelectedStyle == null) + { + textSelectedStyle = GUI.skin.label; + } + + + int messagesShown = 0; + for (int m = messagesStartIdx; m < messages.Length; ++m) + { + if (messagesShown >= messageLength) + { + break; + } + + var logTypeIcon = GetLogIcon(messages[m].LogType); + if (logTypeIcon == _logIcon && !_showLogMessages) + { + continue; + } + if (logTypeIcon == _warnIcon && !_showWarnMessages) + { + continue; + } + if (logTypeIcon == _errorIcon && !_showErrorMessages) + { + continue; + } + + var logStyleToUse = useAlt ? listAltStyle : listNormalStyle; + var logMessageStyleToUse = textStyle; + if (stepIdx == _selectedLogStepIdx && m == _selectedLogIdx) + { + logStyleToUse = listSelectedStyle; + logMessageStyleToUse = textSelectedStyle; + } + + GUILayout.BeginHorizontal(logStyleToUse, BRT_BuildReportWindow.LayoutMinHeight30); + GUILayout.Space(leftIndent); + GUILayout.Label(logTypeIcon, textureStyle, BRT_BuildReportWindow.Layout20x16); + GUILayout.Label(messages[m].Message, logMessageStyleToUse, BRT_BuildReportWindow.LayoutNone); + + if (_showLogMessagesCollapsed && messages[m].Count > 0) + { + GUILayout.FlexibleSpace(); + GUILayout.Label(messages[m].Count.ToString(), logCountStyle, BRT_BuildReportWindow.LayoutNoExpandWidth); + } + + GUILayout.EndHorizontal(); + + ++messagesShown; + + var logMsgIdx = MakeLogMsgIdx(stepIdx, m); + if (Event.current.type == EventType.Repaint) + { + if (_logRects.ContainsKey(logMsgIdx)) + { + _logRects[logMsgIdx] = GUILayoutUtility.GetLastRect(); + } + else + { + _logRects.Add(logMsgIdx, GUILayoutUtility.GetLastRect()); + } + } + + if (_logRects.ContainsKey(logMsgIdx) && + _logRects[logMsgIdx].Contains(Event.current.mousePosition) && + Event.current.type == EventType.MouseDown) + { + requestRepaint = true; + SelectLogMessage(stepIdx, m); + + if (Event.current.clickCount == 2) + { + if (messages[m].Message.StartsWith("Script attached to '")) + { + SearchPrefabFromLog(messages[m].Message); + } + else + { + OpenScriptFromLog(messages[m].Message); + } + } + } + useAlt = !useAlt; + } + } + + void SelectStep(int stepIdx, BuildProcessStep[] steps) + { + _selectedStepIdx = stepIdx; + + // count info, warn, and error messages + _infoMessageCount = 0; + _warnMessageCount = 0; + _errorMessageCount = 0; + + _collapsedInfoMessageCount = 0; + _collapsedWarnMessageCount = 0; + _collapsedErrorMessageCount = 0; + + if (_selectedStepIdx > -1 && steps[_selectedStepIdx].BuildLogMessages != null && steps[_selectedStepIdx].BuildLogMessages.Length > 0) + { + _infoMessageCount = steps[_selectedStepIdx].InfoLogCount; + _warnMessageCount = steps[_selectedStepIdx].WarnLogCount; + _errorMessageCount = steps[_selectedStepIdx].ErrorLogCount; + + _collapsedInfoMessageCount = steps[_selectedStepIdx].CollapsedInfoLogCount; + _collapsedWarnMessageCount = steps[_selectedStepIdx].CollapsedWarnLogCount; + _collapsedErrorMessageCount = steps[_selectedStepIdx].CollapsedErrorLogCount; + } + else + { + for (int i = 0; i < steps.Length; ++i) + { + _infoMessageCount += steps[i].InfoLogCount; + _warnMessageCount += steps[i].WarnLogCount; + _errorMessageCount += steps[i].ErrorLogCount; + + _collapsedInfoMessageCount += steps[i].CollapsedInfoLogCount; + _collapsedWarnMessageCount += steps[i].CollapsedWarnLogCount; + _collapsedErrorMessageCount += steps[i].CollapsedErrorLogCount; + } + } + + RefreshTotalVisibleMessageCount(); + + _logFilterLabel.text = _infoMessageCount.ToString(); + _warnFilterLabel.text = _warnMessageCount.ToString(); + _errorFilterLabel.text = _errorMessageCount.ToString(); + } + + void RefreshTotalVisibleMessageCount() + { + _totalVisibleMessageCount = 0; + + if (_showLogMessages) + { + if (_showLogMessagesCollapsed) + { + _totalVisibleMessageCount += _collapsedInfoMessageCount; + } + else + { + _totalVisibleMessageCount += _infoMessageCount; + } + } + if (_showWarnMessages) + { + if (_showLogMessagesCollapsed) + { + _totalVisibleMessageCount += _collapsedWarnMessageCount; + } + else + { + _totalVisibleMessageCount += _warnMessageCount; + } + } + if (_showErrorMessages) + { + if (_showLogMessagesCollapsed) + { + _totalVisibleMessageCount += _collapsedErrorMessageCount; + } + else + { + _totalVisibleMessageCount += _errorMessageCount; + } + } + + // ------------------------ + + if (_logMessageToShowStartOffset > _totalVisibleMessageCount) + { + int messagePaginationLength = BuildReportTool.Options.LogMessagePaginationLength; + _logMessageToShowStartOffset = messagePaginationLength * (_totalVisibleMessageCount / messagePaginationLength); + } + } + + void SelectLogMessage(int stepIdx, int logMessageIdx) + { + _selectedLogStepIdx = stepIdx; + _selectedLogIdx = logMessageIdx; + } + + Texture2D GetLogIcon(string logType) + { + if (logType.Contains("Warn")) + { + return _warnIcon; + } + else if (logType.Contains("Log")) + { + return _logIcon; + } + else + { + return _errorIcon; + } + } + + static void OpenScriptFromLog(string message) + { + if (string.IsNullOrEmpty(message)) + { + return; + } + + int lineNumIdx = message.IndexOf(".cs(", StringComparison.OrdinalIgnoreCase); + if (lineNumIdx < 0) + { + return; + } + lineNumIdx += 4; + int lineNumEndIdx = message.IndexOf(",", lineNumIdx, StringComparison.OrdinalIgnoreCase); + + string filename = message.Substring(0, lineNumIdx - 1); + string lineNumText = message.Substring(lineNumIdx, lineNumEndIdx - lineNumIdx); + //Debug.Log(string.Format("filename: {0} lineNumText: {1}", filename, lineNumText)); + + int line = int.Parse(lineNumText); + UnityEditorInternal.InternalEditorUtility.OpenFileAtLineExternal(filename, line); + } + + static void SearchPrefabFromLog(string message) + { + if (!message.StartsWith("Script attached to '")) + { + return; + } + + int lastQuote = message.IndexOf("'", 20, StringComparison.OrdinalIgnoreCase); + if (lastQuote > -1) + { + string prefabName = message.Substring(20, lastQuote - 20); + //Debug.Log(prefabName); + SearchPrefab(prefabName); + } + } + + /// + /// + /// + static readonly System.Type ProjectBrowserType = Type.GetType("UnityEditor.ProjectBrowser,UnityEditor"); + + /// + /// + /// + static readonly System.Reflection.MethodInfo ProjectBrowserSetSearchMethod = ProjectBrowserType.GetMethod("SetSearch", + System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance, + null, CallingConventions.Any, new[]{typeof(string)}, null); + + /// + /// + /// + static readonly System.Reflection.MethodInfo ProjectBrowserSelectAllMethod = ProjectBrowserType.GetMethod("SelectAll", + System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + + static void SearchPrefab(string prefabName) + { + if (ProjectBrowserType == null) + { + return; + } + + var projectWindow = UnityEditor.EditorWindow.GetWindow(ProjectBrowserType, false, "Project", true); + if (projectWindow == null) + { + return; + } + + if (ProjectBrowserSetSearchMethod == null) + { + return; + } + ProjectBrowserSetSearchMethod.Invoke(projectWindow, new object[] { prefabName }); + + if (ProjectBrowserSelectAllMethod != null) + { + ProjectBrowserSelectAllMethod.Invoke(projectWindow, null); + } + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BuildStepsScreen.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BuildStepsScreen.cs.meta new file mode 100644 index 00000000..48b89ce4 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_BuildStepsScreen.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ca162eceac09e3a40942072a422784ba +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_ExtraDataScreen.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_ExtraDataScreen.cs new file mode 100644 index 00000000..f1610bc0 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_ExtraDataScreen.cs @@ -0,0 +1,65 @@ +using UnityEngine; + +namespace BuildReportTool.Window.Screen +{ + public class ExtraData : BaseScreen + { + Vector2 _scrollPos = Vector2.zero; + + public override string Name + { + get { return Labels.EXTRA_DATA_CATEGORY_LABEL; } + } + + public override void RefreshData(BuildInfo buildReport, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, UnityBuildReport unityBuildReport) + { + } + + public override void DrawGUI(Rect position, + BuildInfo buildReportToDisplay, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, + UnityBuildReport unityBuildReport, BuildReportTool.ExtraData extraData, + out bool requestRepaint) + { + if (buildReportToDisplay == null || string.IsNullOrEmpty(extraData.Contents)) + { + requestRepaint = false; + return; + } + + requestRepaint = false; + + + var textStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.SETTING_VALUE_STYLE_NAME); + if (textStyle == null) + { + textStyle = GUI.skin.label; + } + + + GUILayout.Space(2); // top padding for scrollbar + + _scrollPos = GUILayout.BeginScrollView(_scrollPos); + + GUILayout.BeginHorizontal(); + GUILayout.Space(10); // extra left padding + + + GUILayout.BeginVertical(); + + GUILayout.Space(10); // top padding + + GUILayout.Label(extraData.Contents, textStyle); + + GUILayout.Space(10); // bottom padding + + GUILayout.EndVertical(); + + GUILayout.Space(20); // extra right padding + GUILayout.EndHorizontal(); + + GUILayout.EndScrollView(); + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_ExtraDataScreen.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_ExtraDataScreen.cs.meta new file mode 100644 index 00000000..9875db77 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_ExtraDataScreen.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e7327b12fdfe098469e599f517b20202 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_HelpScreen.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_HelpScreen.cs new file mode 100644 index 00000000..f8bdeb16 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_HelpScreen.cs @@ -0,0 +1,153 @@ +using UnityEngine; +using UnityEditor; + +namespace BuildReportTool.Window.Screen +{ + public class Help : BaseScreen + { + public override string Name + { + get { return Labels.HELP_CATEGORY_LABEL; } + } + + const int LABEL_LENGTH = 16000; + + public override void RefreshData(BuildInfo buildReport, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, UnityBuildReport unityBuildReport) + { + const string README_FILENAME = "README.txt"; + string readmeContents = BuildReportTool.Util.GetPackageFileContents(README_FILENAME); + + const string CHANGELOG_FILENAME = "VERSION.txt"; + string changelogContents = BuildReportTool.Util.GetPackageFileContents(CHANGELOG_FILENAME); + + if (!string.IsNullOrEmpty(readmeContents) && readmeContents.Length > LABEL_LENGTH) + { + readmeContents = readmeContents.Substring(0, LABEL_LENGTH); + } + + if (!string.IsNullOrEmpty(changelogContents) && changelogContents.Length > LABEL_LENGTH) + { + changelogContents = changelogContents.Substring(0, LABEL_LENGTH); + } + + if (_readmeGuiContent == null) + { + _readmeGuiContent = new GUIContent(); + } + if (!string.IsNullOrEmpty(readmeContents)) + { + _readmeGuiContent.text = readmeContents; + } + else + { + _readmeGuiContent.text = "README.txt not found"; + } + _needToUpdateReadmeHeight = true; + + if (_changelogGuiContent == null) + { + _changelogGuiContent = new GUIContent(); + } + if (!string.IsNullOrEmpty(changelogContents)) + { + _changelogGuiContent.text = changelogContents; + } + else + { + _changelogGuiContent.text = "VERSION.txt not found"; + } + _needToUpdateChangelogHeight = true; + } + + static readonly GUILayoutOption[] ButtonsLayout = { GUILayout.Width(230), GUILayout.Height(60) }; + + public override void DrawGUI(Rect position, + BuildInfo buildReportToDisplay, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, + UnityBuildReport unityBuildReport, BuildReportTool.ExtraData extraData, + out bool requestRepaint) + { + requestRepaint = false; + + var helpTextStyle = GUI.skin.FindStyle(HELP_CONTENT_GUI_STYLE); + if (helpTextStyle == null) + { + helpTextStyle = GUI.skin.label; + } + + if (_needToUpdateReadmeHeight) + { + _readmeHeight = helpTextStyle.CalcHeight(_readmeGuiContent, HELP_CONTENT_WIDTH); + _needToUpdateReadmeHeight = false; + } + + if (_needToUpdateChangelogHeight) + { + _changelogHeight = helpTextStyle.CalcHeight(_changelogGuiContent, HELP_CONTENT_WIDTH); + _needToUpdateChangelogHeight = false; + } + + GUI.SetNextControlName("BRT_HelpUnfocuser"); + GUI.TextField(new Rect(-100, -100, 10, 10), ""); + + GUILayout.Space(10); // extra top padding + + GUILayout.BeginHorizontal(); + int newSelectedHelpIdx = GUILayout.SelectionGrid(_selectedHelpContentsIdx, _helpTypeLabels, 1, ButtonsLayout); + + if (newSelectedHelpIdx != _selectedHelpContentsIdx) + { + GUI.FocusControl("BRT_HelpUnfocuser"); + } + + _selectedHelpContentsIdx = newSelectedHelpIdx; + + //GUILayout.Space((position.width - HELP_CONTENT_WIDTH) * 0.5f); + + if (_selectedHelpContentsIdx == HELP_TYPE_README_IDX) + { + _readmeScrollPos = GUILayout.BeginScrollView( + _readmeScrollPos); + + EditorGUILayout.SelectableLabel(_readmeGuiContent.text, helpTextStyle, + GUILayout.Width(HELP_CONTENT_WIDTH), GUILayout.Height(_readmeHeight)); + + GUILayout.EndScrollView(); + } + else if (_selectedHelpContentsIdx == HELP_TYPE_CHANGELOG_IDX) + { + _changelogScrollPos = GUILayout.BeginScrollView( + _changelogScrollPos); + + EditorGUILayout.SelectableLabel(_changelogGuiContent.text, helpTextStyle, + GUILayout.Width(HELP_CONTENT_WIDTH), GUILayout.Height(_changelogHeight)); + + GUILayout.EndScrollView(); + } + + GUILayout.EndHorizontal(); + } + + + int _selectedHelpContentsIdx; + const int HELP_TYPE_README_IDX = 0; + const int HELP_TYPE_CHANGELOG_IDX = 1; + + const string HELP_CONTENT_GUI_STYLE = "label"; + const int HELP_CONTENT_WIDTH = 500; + + readonly string[] _helpTypeLabels = {"Help (README)", "Version Changelog"}; + + Vector2 _readmeScrollPos; + float _readmeHeight; + bool _needToUpdateReadmeHeight; + + Vector2 _changelogScrollPos; + float _changelogHeight; + bool _needToUpdateChangelogHeight; + + GUIContent _readmeGuiContent; + GUIContent _changelogGuiContent; + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_HelpScreen.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_HelpScreen.cs.meta new file mode 100644 index 00000000..134f140c --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_HelpScreen.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: cc69ea23bc7ed484cb7609b6e3779145 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_OptionsScreen.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_OptionsScreen.cs new file mode 100644 index 00000000..b2b46c7d --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_OptionsScreen.cs @@ -0,0 +1,1458 @@ +using UnityEngine; +using UnityEditor; +using System.Text.RegularExpressions; +using UnityEditorInternal; + +namespace BuildReportTool.Window.Screen +{ + public class Options : BaseScreen + { + public override string Name + { + get { return Labels.OPTIONS_CATEGORY_LABEL; } + } + + string[] _saveTypeLabels; + + /// + /// 0: always use configured file filters
+ /// 1: use file filters embedded in opened build report, if available + ///
+ static readonly string[] FileFilterToUseType = + {Labels.FILTER_GROUP_TO_USE_CONFIGURED_LABEL, Labels.FILTER_GROUP_TO_USE_EMBEDDED_LABEL}; + + /// + /// 0: mouse is hovering over icon
+ /// 1: mouse is hovering over icon or label + ///
+ static readonly string[] ShowThumbnailOnHoverTypeLabels = + {"Mouse is hovering over asset's icon", "Mouse is hovering over asset's icon or label"}; + + /// + /// 0: dedicated ping button before each asset
+ /// 1: double-click on asset label will ping + ///
+ static readonly string[] AssetPingTypeLabels = + {"Dedicated ping button before each asset", "Double-clicking on asset will ping"}; + + /// + /// 0: verbose
+ /// 1: standard
+ /// 2: minimal + ///
+ static readonly string[] AssetUsageLabelTypeLabels = + { + "Verbose\n(use words only)", + "Standard\n(use arrows when possible, show any extra info with words)", + "Minimal\n(use arrows only, don't show any extra info even if available)" + }; + + static readonly string[] SearchTypeLabels = + { + "Basic", + "Regex", + "Fuzzy Search" + }; + + string OPEN_IN_FILE_BROWSER_OS_SPECIFIC_LABEL + { + get + { + if (BuildReportTool.Util.IsInWinOS) + return Labels.OPEN_IN_FILE_BROWSER_WIN_LABEL; + if (BuildReportTool.Util.IsInMacOS) + return Labels.OPEN_IN_FILE_BROWSER_MAC_LABEL; + + return Labels.OPEN_IN_FILE_BROWSER_DEFAULT_LABEL; + } + } + + string SAVE_PATH_TYPE_PERSONAL_OS_SPECIFIC_LABEL + { + get + { + if (BuildReportTool.Util.IsInWinOS) + return Labels.SAVE_PATH_TYPE_PERSONAL_WIN_LABEL; + if (BuildReportTool.Util.IsInMacOS) + return Labels.SAVE_PATH_TYPE_PERSONAL_MAC_LABEL; + + return Labels.SAVE_PATH_TYPE_PERSONAL_DEFAULT_LABEL; + } + } + + + static readonly string[] CalculationTypeLabels = + { + Labels.CALCULATION_LEVEL_FULL_NAME, + Labels.CALCULATION_LEVEL_NO_PREFAB_NAME, + Labels.CALCULATION_LEVEL_NO_UNUSED_NAME, + Labels.CALCULATION_LEVEL_MINIMAL_NAME + }; + + int _selectedCalculationLevelIdx; + + string CalculationLevelDescription + { + get + { + switch (_selectedCalculationLevelIdx) + { + case 0: + return Labels.CALCULATION_LEVEL_FULL_DESC; + case 1: + return Labels.CALCULATION_LEVEL_NO_PREFAB_DESC; + case 2: + return Labels.CALCULATION_LEVEL_NO_UNUSED_DESC; + case 3: + return Labels.CALCULATION_LEVEL_MINIMAL_DESC; + } + + return ""; + } + } + + int GetCalculationLevelGuiIdxFromOptions() + { + if (BuildReportTool.Options.IsCurrentCalculationLevelAtFull) + { + return 0; + } + + if (BuildReportTool.Options.IsCurrentCalculationLevelAtNoUnusedPrefabs) + { + return 1; + } + + if (BuildReportTool.Options.IsCurrentCalculationLevelAtNoUnusedAssets) + { + return 2; + } + + if (BuildReportTool.Options.IsCurrentCalculationLevelAtOverviewOnly) + { + return 3; + } + + return 0; + } + + void SetCalculationLevelFromGuiIdx(int selectedIdx) + { + switch (selectedIdx) + { + case 0: + BuildReportTool.Options.SetCalculationLevelToFull(); + break; + case 1: + BuildReportTool.Options.SetCalculationLevelToNoUnusedPrefabs(); + break; + case 2: + BuildReportTool.Options.SetCalculationLevelToNoUnusedAssets(); + break; + case 3: + BuildReportTool.Options.SetCalculationLevelToOverviewOnly(); + break; + } + } + + + Vector2 _assetListScrollPos; + + + public override void RefreshData(BuildInfo buildReport, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, UnityBuildReport unityBuildReport) + { + if (_saveTypeLabels == null) + { + _saveTypeLabels = new[] {SAVE_PATH_TYPE_PERSONAL_OS_SPECIFIC_LABEL, Labels.SAVE_PATH_TYPE_PROJECT_LABEL}; + } + + _selectedCalculationLevelIdx = GetCalculationLevelGuiIdxFromOptions(); + } + + GUIStyle _linkStyle; + GUIStyle _textBesideLinkStyle; + + static readonly GUILayoutOption[] LayoutMinWidth100 = new[] { GUILayout.MinWidth(100) }; + static readonly GUILayoutOption[] LayoutMinWidth200 = new[] { GUILayout.MinWidth(200) }; + static readonly GUILayoutOption[] LayoutMinWidth250 = new[] { GUILayout.MinWidth(250) }; + static readonly GUILayoutOption[] LayoutMaxWidth525 = new[] { GUILayout.MaxWidth(525) }; + static readonly GUILayoutOption[] LayoutMaxWidth593 = new[] { GUILayout.MaxWidth(593) }; + static readonly GUILayoutOption[] LayoutMaxWidth848 = new[] { GUILayout.MaxWidth(848) }; + static readonly GUILayoutOption[] LayoutMaxWidth500MinHeight75 = new[] { GUILayout.MaxWidth(500), GUILayout.MinHeight(75) }; + + static readonly GUILayoutOption[] LayoutWidth300 = new[] { GUILayout.Width(300) }; + static readonly GUILayoutOption[] LayoutHeight26 = new[] { GUILayout.Height(26) }; + + static readonly GUILayoutOption[] LayoutNoExpandWidth = new[] { GUILayout.ExpandWidth(false) }; + + string _hoveredControlTooltipText; + readonly GUIContent _tooltipLabel = new GUIContent(); + + ReorderableList _ignorePatternList; + readonly GUIContent _basicSearchRadioLabel = new GUIContent("Basic"); + readonly GUIContent _regexSearchRadioLabel = new GUIContent("Regex"); + + Texture2D _iconValid; + Texture2D _iconInvalid; + + public override void DrawGUI(Rect position, + BuildInfo buildReportToDisplay, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, + UnityBuildReport unityBuildReport, BuildReportTool.ExtraData extraData, + out bool requestRepaint) + { + if (Event.current.type == EventType.Repaint) + { + _hoveredControlTooltipText = null; + } + + var validityStyle = GUI.skin.FindStyle("IconValidity"); + if (validityStyle != null) + { + _iconValid = validityStyle.normal.background; + _iconInvalid = validityStyle.hover.background; + } + + requestRepaint = true; + + if (!BRT_BuildReportWindow.MouseMovedNow && !BRT_BuildReportWindow.LastMouseMoved) + { + // mouse hasn't moved + // no need to repaint because nothing has changed + // set requestRepaint to false to help lessen cpu usage + requestRepaint = false; + } + + var boxedLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.BOXED_LABEL_STYLE_NAME); + if (boxedLabelStyle == null) + { + boxedLabelStyle = GUI.skin.box; + } + + var header1Style = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME); + if (header1Style == null) + { + header1Style = GUI.skin.label; + } + + var header2Style = GUI.skin.FindStyle(BuildReportTool.Window.Settings.SUB_TITLE_STYLE_NAME); + if (header2Style == null) + { + header2Style = GUI.skin.label; + } + + var prevEnabled = GUI.enabled; + + GUILayout.Space(10); // extra top padding + + + _assetListScrollPos = GUILayout.BeginScrollView(_assetListScrollPos, BRT_BuildReportWindow.LayoutNone); + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Space(20); // extra left padding + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + + if (!string.IsNullOrEmpty(BuildReportTool.Options.FoundPathForSavedOptions)) + { + GUILayout.BeginHorizontal(boxedLabelStyle, BRT_BuildReportWindow.LayoutNone); + GUILayout.Label(string.Format("Using options file in: {0}", + BuildReportTool.Options.FoundPathForSavedOptions), BRT_BuildReportWindow.LayoutNone); + GUILayout.FlexibleSpace(); + if (GUILayout.Button("Reload", BRT_BuildReportWindow.LayoutNone)) + { + BuildReportTool.Options.RefreshOptions(); + } + + GUILayout.EndHorizontal(); + + GUILayout.Space(10); + } + + // === Main Options === + + GUILayout.Label("Main Options", header1Style, BRT_BuildReportWindow.LayoutNone); + + + BuildReportTool.Options.CollectBuildInfo = GUILayout.Toggle(BuildReportTool.Options.CollectBuildInfo, + "Automatically generate and save a Build Report file after building (does not include batchmode builds)", BRT_BuildReportWindow.LayoutNone); + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Space(20); + GUILayout.Label( + "Note: For batchmode builds, to create build reports, call BuildReportTool.ReportGenerator.CreateReport() after BuildPipeline.BuildPlayer() in your build scripts.\n\nThe Build Report is automatically saved as an XML file.", + boxedLabelStyle, LayoutMaxWidth593); + GUILayout.EndHorizontal(); + GUILayout.Space(10); + + BuildReportTool.Options.AutoShowWindowAfterNormalBuild = GUILayout.Toggle( + BuildReportTool.Options.AutoShowWindowAfterNormalBuild, + "Automatically show Build Report Window after building (if it is not open yet)", BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.AutoResortAssetsWhenUnityEditorRegainsFocus = GUILayout.Toggle( + BuildReportTool.Options.AutoResortAssetsWhenUnityEditorRegainsFocus, + "Re-sort assets automatically whenever the Unity Editor regains focus", BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.AllowDeletingOfUsedAssets = GUILayout.Toggle( + BuildReportTool.Options.AllowDeletingOfUsedAssets, + "Allow deleting of Used Assets (practice caution!)", BRT_BuildReportWindow.LayoutNone); + + GUILayout.Space(20); + + BuildReportTool.Options.KeepCopyOfLogOfLastSuccessfulBuild = GUILayout.Toggle( + BuildReportTool.Options.KeepCopyOfLogOfLastSuccessfulBuild, + "Keep a copy of the last successful build's Editor.log, which will be re-used if no build was detected in the current Editor.log.", + BRT_BuildReportWindow.LayoutNone); + + GUILayout.Space(20); + + BuildReportTool.Options.UseThreadedReportGeneration = GUILayout.Toggle( + BuildReportTool.Options.UseThreadedReportGeneration, + "When generating Build Reports, use a separate thread", BRT_BuildReportWindow.LayoutNone); + GUILayout.BeginHorizontal(LayoutNoExpandWidth); + GUILayout.Space(20); + GUILayout.Label( + "Note: For batchmode builds, report generation with BuildReportTool.ReportGenerator.CreateReport() is always non-threaded.", + boxedLabelStyle, LayoutMaxWidth593); + GUILayout.EndHorizontal(); + GUILayout.Space(10); + + BuildReportTool.Options.UseThreadedFileLoading = GUILayout.Toggle( + BuildReportTool.Options.UseThreadedFileLoading, + "When loading Build Report files, use a separate thread", BRT_BuildReportWindow.LayoutNone); + + //GUILayout.Space(20); + + GUILayout.Space(BuildReportTool.Window.Settings.CATEGORY_VERTICAL_SPACING); + + // === Data to include in the Build Report === + + GUILayout.Label("Data to include in the Build Report", header1Style, BRT_BuildReportWindow.LayoutNone); + + GUILayout.Space(5); + + #region Calculation Level + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Calculation Level: ", BRT_BuildReportWindow.LayoutNone); + + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + int newSelectedCalculationLevelIdx = EditorGUILayout.Popup(_selectedCalculationLevelIdx, CalculationTypeLabels, + "Popup", LayoutWidth300); + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Space(20); + GUILayout.Label(CalculationLevelDescription, LayoutMaxWidth500MinHeight75); + GUILayout.EndHorizontal(); + GUILayout.EndVertical(); + + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + if (newSelectedCalculationLevelIdx != _selectedCalculationLevelIdx) + { + _selectedCalculationLevelIdx = newSelectedCalculationLevelIdx; + SetCalculationLevelFromGuiIdx(newSelectedCalculationLevelIdx); + } + #endregion + + GUILayout.Space(10); + GUILayout.Label("Sizes", header2Style, BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.IncludeBuildSizeInReportCreation = GUILayout.Toggle( + BuildReportTool.Options.IncludeBuildSizeInReportCreation, + "Get build's file size upon creation of a build report", BRT_BuildReportWindow.LayoutNone); + + GUILayout.Space(10); + + //BuildReportTool.Options.GetImportedSizesForUsedAssets = GUILayout.Toggle(BuildReportTool.Options.GetImportedSizesForUsedAssets, + // "Get imported sizes of Used Assets upon creation of a build report"); + + BuildReportTool.Options.GetImportedSizesForUnusedAssets = GUILayout.Toggle( + BuildReportTool.Options.GetImportedSizesForUnusedAssets, + "Get imported sizes of Unused Assets upon creation of a build report", BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.GetSizeBeforeBuildForUsedAssets = GUILayout.Toggle( + BuildReportTool.Options.GetSizeBeforeBuildForUsedAssets, + "Get size-before-build of Used Assets upon creation of a build report", BRT_BuildReportWindow.LayoutNone); + + #region ShowCalcSizesForUsed + BuildReportTool.Options.ShowImportedSizeForUsedAssets = GUILayout.Toggle( + BuildReportTool.Options.ShowImportedSizeForUsedAssets, + "Show calculated sizes of Used Assets instead of reported sizes", BRT_BuildReportWindow.LayoutNone); + + if (_linkStyle == null) + { + _linkStyle = new GUIStyle(GUI.skin.label); + _linkStyle.normal.textColor = new Color(0.266f, 0.533f, 1); + _linkStyle.hover.textColor = new Color(0.118f, 0.396f, 1); + _linkStyle.stretchWidth = false; + _linkStyle.margin.bottom = 0; + _linkStyle.padding.bottom = 0; + } + + if (_textBesideLinkStyle == null) + { + _textBesideLinkStyle = new GUIStyle(GUI.skin.label); + _textBesideLinkStyle.stretchWidth = false; + _textBesideLinkStyle.margin.right = 0; + _textBesideLinkStyle.padding.right = 0; + _textBesideLinkStyle.margin.bottom = 0; + _textBesideLinkStyle.padding.bottom = 0; + } + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Note: This option is a workaround for the ", _textBesideLinkStyle, BRT_BuildReportWindow.LayoutNone); + if (GUILayout.Button("Unity bug with Issue ID 885258", _linkStyle, BRT_BuildReportWindow.LayoutNone)) + { + Application.OpenURL( + "https://issuetracker.unity3d.com/issues/unity-reports-incorrect-textures-size-in-the-editor-dot-log-after-building-on-standalone"); + } + + GUILayout.EndHorizontal(); + GUILayout.Label( + "This bug has already been fixed in Unity 2017.1, 5.5.3p1 and 5.6.0p1. Only enable this if you are affected by the bug.", BRT_BuildReportWindow.LayoutNone); + #endregion + + GUILayout.Space(15); + GUILayout.Label("In Unused Assets List", header2Style, BRT_BuildReportWindow.LayoutNone); + + // process unused assets in batches? + + BuildReportTool.Options.ProcessUnusedAssetsInBatches = + GUILayout.Toggle(BuildReportTool.Options.ProcessUnusedAssetsInBatches, "Process unused assets in batches (Warning: report generation can become slow for large projects when turned off)", BRT_BuildReportWindow.LayoutNone); + + GUILayout.Space(2); + + // unused assets entries per batch + GUI.enabled = prevEnabled && BuildReportTool.Options.ProcessUnusedAssetsInBatches; + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Batch count (only process this much files at a time when checking for unused assets):", BRT_BuildReportWindow.LayoutNone); + string entriesPerBatchInput = + GUILayout.TextField(BuildReportTool.Options.UnusedAssetsEntriesPerBatch.ToString(), LayoutMinWidth100); + entriesPerBatchInput = + Regex.Replace(entriesPerBatchInput, @"[^0-9]", ""); // positive numbers only, no fractions + if (string.IsNullOrEmpty(entriesPerBatchInput)) + { + entriesPerBatchInput = "0"; + } + + BuildReportTool.Options.UnusedAssetsEntriesPerBatch = int.Parse(entriesPerBatchInput); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + GUI.enabled = prevEnabled; + if (BuildReportTool.Options.ProcessUnusedAssetsInBatches) + { + GUILayout.BeginHorizontal(LayoutNoExpandWidth); + GUILayout.Space(20); + GUILayout.Label( + string.Format("Note: Due to the batch processing, only the first {0:N0} assets at most will be included for the Unused Assets List in the saved Build Report file.", BuildReportTool.Options.UnusedAssetsEntriesPerBatch), + boxedLabelStyle, LayoutMaxWidth593); + GUILayout.EndHorizontal(); + } + + GUILayout.Space(10); + + BuildReportTool.Options.IncludeSvnInUnused = + GUILayout.Toggle(BuildReportTool.Options.IncludeSvnInUnused, Labels.INCLUDE_SVN_LABEL, BRT_BuildReportWindow.LayoutNone); + BuildReportTool.Options.IncludeGitInUnused = + GUILayout.Toggle(BuildReportTool.Options.IncludeGitInUnused, Labels.INCLUDE_GIT_LABEL, BRT_BuildReportWindow.LayoutNone); + BuildReportTool.Options.IncludeBuildReportToolAssetsInUnused = + GUILayout.Toggle(BuildReportTool.Options.IncludeBuildReportToolAssetsInUnused, Labels.INCLUDE_BRT_LABEL, BRT_BuildReportWindow.LayoutNone); + + GUILayout.Space(10); + + // ------------------------------- + + #region Ignore Patterns + if (_ignorePatternList == null) + { + _ignorePatternList = new ReorderableList(BuildReportTool.Options.IgnorePatternsForUnused, typeof(SavedOptions.IgnorePattern)); + _ignorePatternList.onAddCallback = OnAddPattern; + _ignorePatternList.drawHeaderCallback = rect => GUI.Label(rect, "Ignore Patterns for Unused Assets"); + _ignorePatternList.elementHeight = 25; + _ignorePatternList.drawElementCallback = + (elementRect, index, isActive, isFocused) => + { + var element = BuildReportTool.Options.IgnorePatternsForUnused[index]; + + var radioLeftStyle = GUI.skin.FindStyle("RadioLeft"); + if (radioLeftStyle == null) + { + radioLeftStyle = GUI.skin.toggle; + } + var radioRightStyle = GUI.skin.FindStyle("RadioRight"); + if (radioRightStyle == null) + { + radioRightStyle = GUI.skin.toggle; + } + + var basicSearchSize = radioLeftStyle.CalcSize(_basicSearchRadioLabel); + var regexSearchSize = radioRightStyle.CalcSize(_regexSearchRadioLabel); + + int spacing = 3; + + Rect textFieldRect = new Rect(elementRect); + textFieldRect.y += 4; + textFieldRect.height = GUI.skin.textField.lineHeight + GUI.skin.textField.padding.vertical + 1; + textFieldRect.width -= basicSearchSize.x + regexSearchSize.x + spacing; + + + if (element.SearchType == SavedOptions.SEARCH_METHOD_REGEX) + { + if (_iconValid != null && _iconInvalid != null) + { + spacing += 18; + textFieldRect.width -= spacing; + EditorGUI.DrawTextureTransparent(new Rect(textFieldRect.xMax + 3, elementRect.y + 5, 16, 16), + BuildReportTool.Util.IsRegexValid(element.Pattern) ? _iconValid : _iconInvalid); + } + else + { + spacing += 50; + textFieldRect.width -= spacing; + GUI.Label(new Rect(textFieldRect.xMax + 3, elementRect.y + 5, 50, 16), + BuildReportTool.Util.IsRegexValid(element.Pattern) ? "Valid" : "Invalid"); + } + } + + element.Pattern = GUI.TextField(textFieldRect, element.Pattern); + var patternChanged = element.Pattern != BuildReportTool.Options.IgnorePatternsForUnused[index].Pattern; + + Rect basicToggleRect = new Rect(textFieldRect.xMax + spacing, elementRect.y + 2, basicSearchSize.x, basicSearchSize.y); + var pressedBasic = GUI.Toggle(basicToggleRect, + element.SearchType == SavedOptions.SEARCH_METHOD_BASIC, _basicSearchRadioLabel, radioLeftStyle); + var basicChanged = pressedBasic && element.SearchType != SavedOptions.SEARCH_METHOD_BASIC; + if (basicChanged) + { + element.SearchType = SavedOptions.SEARCH_METHOD_BASIC; + } + + Rect regexToggleRect = new Rect(textFieldRect.xMax + spacing + basicSearchSize.x, elementRect.y + 2, regexSearchSize.x, regexSearchSize.y); + var pressedRegex = GUI.Toggle(regexToggleRect, + element.SearchType == SavedOptions.SEARCH_METHOD_REGEX, _regexSearchRadioLabel, radioRightStyle); + var regexChanged = pressedRegex && element.SearchType != SavedOptions.SEARCH_METHOD_REGEX; + if (regexChanged) + { + element.SearchType = SavedOptions.SEARCH_METHOD_REGEX; + } + + if (patternChanged || basicChanged || regexChanged) + { + BuildReportTool.Options.IgnorePatternsForUnused[index] = element; + BuildReportTool.Options.SaveOptions(); + } + }; + _ignorePatternList.onChangedCallback = OnIgnorePatternChanged; + } + + GUILayout.BeginVertical(LayoutMaxWidth848); + _ignorePatternList.DoLayoutList(); + GUILayout.EndVertical(); + GUILayout.Space(1); + GUILayout.Label("Assets that match these search patterns will not be included in the Unused Assets list. The search will be performed on the asset's relative path, starting from the top \"Assets\" folder.", + boxedLabelStyle, LayoutMaxWidth848); + #endregion + + // ------------------------------- + + GUILayout.Space(15); + GUILayout.Label("Extra Data to include", header2Style, BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.GetProjectSettings = GUILayout.Toggle(BuildReportTool.Options.GetProjectSettings, + "Get Unity project settings upon creation of a build report", BRT_BuildReportWindow.LayoutNone); + + GUILayout.Space(10); + + BuildReportTool.Options.CalculateAssetDependencies = GUILayout.Toggle( + BuildReportTool.Options.CalculateAssetDependencies, + "Calculate Asset Dependencies upon creation of a build report", BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.CalculateAssetDependenciesOnUnusedToo = GUILayout.Toggle( + BuildReportTool.Options.CalculateAssetDependenciesOnUnusedToo, + "Include Unused Assets in Asset Dependency calculations", BRT_BuildReportWindow.LayoutNone); + + GUILayout.Space(10); + + BuildReportTool.Options.CollectTextureImportSettings = GUILayout.Toggle( + BuildReportTool.Options.CollectTextureImportSettings, + "Collect Texture Import Settings upon creation of a build report", BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.CollectTextureImportSettingsOnUnusedToo = GUILayout.Toggle( + BuildReportTool.Options.CollectTextureImportSettingsOnUnusedToo, + "Include Unused Assets in Texture Import Settings collecting", BRT_BuildReportWindow.LayoutNone); + + GUILayout.Space(10); + + BuildReportTool.Options.CollectMeshData = GUILayout.Toggle( + BuildReportTool.Options.CollectMeshData, + "Collect Mesh Data upon creation of a build report", BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.CollectMeshDataOnUnusedToo = GUILayout.Toggle( + BuildReportTool.Options.CollectMeshDataOnUnusedToo, + "Include Unused Assets in Mesh Data collecting", BRT_BuildReportWindow.LayoutNone); + + + GUILayout.Space(BuildReportTool.Window.Settings.CATEGORY_VERTICAL_SPACING); + // === Editor Log File === + + GUILayout.Label("Editor Log File", header1Style, BRT_BuildReportWindow.LayoutNone); + + // which Editor.log is used + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label(string.Format("{0}{1}: {2}", Labels.EDITOR_LOG_LABEL, BuildReportTool.Util.EditorLogPathOverrideMessage, BuildReportTool.Util.UsedEditorLogPath), + BRT_BuildReportWindow.LayoutNone); + if (GUILayout.Button(OPEN_IN_FILE_BROWSER_OS_SPECIFIC_LABEL, BRT_BuildReportWindow.LayoutNone) && BuildReportTool.Util.UsedEditorLogExists) + { + BuildReportTool.Util.OpenInFileBrowser(BuildReportTool.Util.UsedEditorLogPath); + } + + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + if (!BuildReportTool.Util.UsedEditorLogExists) + { + if (BuildReportTool.Util.IsDefaultEditorLogPathOverridden) + { + GUILayout.Label(Labels.OVERRIDE_LOG_NOT_FOUND_MSG, BRT_BuildReportWindow.LayoutNone); + } + else + { + GUILayout.Label(Labels.DEFAULT_EDITOR_LOG_NOT_FOUND_MSG, BRT_BuildReportWindow.LayoutNone); + } + } + + // override which log is opened + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + if (GUILayout.Button(Labels.SET_OVERRIDE_LOG_LABEL, BRT_BuildReportWindow.LayoutNone)) + { + string filepath = EditorUtility.OpenFilePanel( + "", // title + "", // default path + ""); // file type (only one type allowed?) + + if (!string.IsNullOrEmpty(filepath)) + { + BuildReportTool.Options.EditorLogOverridePath = filepath; + } + } + + if (GUILayout.Button(Labels.CLEAR_OVERRIDE_LOG_LABEL, BRT_BuildReportWindow.LayoutNone)) + { + BuildReportTool.Options.EditorLogOverridePath = ""; + } + + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + GUILayout.Space(BuildReportTool.Window.Settings.CATEGORY_VERTICAL_SPACING); + + + // === Asset Lists === + + GUILayout.Label("Asset Lists", header1Style, BRT_BuildReportWindow.LayoutNone); + + + // top largest used + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Number of Top Largest Used Assets to display in Overview Tab:", BRT_BuildReportWindow.LayoutNone); + string numberOfTopUsedInput = + GUILayout.TextField(BuildReportTool.Options.NumberOfTopLargestUsedAssetsToShow.ToString(), LayoutMinWidth100); + numberOfTopUsedInput = + Regex.Replace(numberOfTopUsedInput, @"[^0-9]", ""); // positive numbers only, no fractions + if (string.IsNullOrEmpty(numberOfTopUsedInput)) + { + numberOfTopUsedInput = "0"; + } + + BuildReportTool.Options.NumberOfTopLargestUsedAssetsToShow = int.Parse(numberOfTopUsedInput); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + + // top largest unused + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Number of Top Largest Unused Assets to display in Overview Tab:", BRT_BuildReportWindow.LayoutNone); + string numberOfTopUnusedInput = + GUILayout.TextField(BuildReportTool.Options.NumberOfTopLargestUnusedAssetsToShow.ToString(), LayoutMinWidth100); + numberOfTopUnusedInput = + Regex.Replace(numberOfTopUnusedInput, @"[^0-9]", ""); // positive numbers only, no fractions + if (string.IsNullOrEmpty(numberOfTopUnusedInput)) + { + numberOfTopUnusedInput = "0"; + } + + BuildReportTool.Options.NumberOfTopLargestUnusedAssetsToShow = int.Parse(numberOfTopUnusedInput); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Space(20); + GUILayout.Label( + "Note: To disable the display of Top Largest Assets, use a value of 0.", + boxedLabelStyle, LayoutMaxWidth525); + GUILayout.EndHorizontal(); + + // -------------------------------------------- + + GUILayout.Space(10); + GUILayout.Label("Texture Data", header2Style, BRT_BuildReportWindow.LayoutNone); + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Name of File Filter where Texture Import Settings will be shown:", BRT_BuildReportWindow.LayoutNone); + BuildReportTool.Options.FileFilterNameForTextureData = + GUILayout.TextField(BuildReportTool.Options.FileFilterNameForTextureData, LayoutMinWidth200); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + GUILayout.Space(3); + GUILayout.Label("Texture Import Settings To Show in Asset Lists:", BRT_BuildReportWindow.LayoutNone); + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Space(10); + + #region Column 1 + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.ShowTextureColumnTextureType = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnTextureType, "Texture Type", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.TextureType); + requestRepaint = true; + } + + BuildReportTool.Options.ShowTextureColumnIsSRGB = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnIsSRGB, "Is sRGB (Color Texture)", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.IsSRGB); + } + + BuildReportTool.Options.ShowTextureColumnAlphaSource = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnAlphaSource, "Alpha Source", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.AlphaSource); + } + + BuildReportTool.Options.ShowTextureColumnAlphaIsTransparency = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnAlphaIsTransparency, "Alpha Is Transparency", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.AlphaIsTransparency); + } + + BuildReportTool.Options.ShowTextureColumnIgnorePngGamma = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnIgnorePngGamma, "Ignore PNG Gamma", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.IgnorePngGamma); + } + + BuildReportTool.Options.ShowTextureColumnNPotScale = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnNPotScale, "Non-Power of 2 Scale", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.NPotScale); + } + + BuildReportTool.Options.ShowTextureColumnIsReadable = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnIsReadable, "Read/Write Enabled", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.IsReadable); + } + + GUILayout.EndVertical(); + #endregion + + GUILayout.Space(30); + + #region Column 2 + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.ShowTextureColumnMipMapGenerated = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnMipMapGenerated, "Mip Map Generated", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.MipMapGenerated); + } + + BuildReportTool.Options.ShowTextureColumnMipMapFilter = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnMipMapFilter, "Mip Map Filter", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.MipMapFilter); + } + + BuildReportTool.Options.ShowTextureColumnStreamingMipMaps = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnStreamingMipMaps, "Streaming Mip Maps", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.StreamingMipMaps); + } + + BuildReportTool.Options.ShowTextureColumnBorderMipMaps = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnBorderMipMaps, "Border Mip Maps", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.BorderMipMaps); + } + + BuildReportTool.Options.ShowTextureColumnPreserveCoverageMipMaps = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnPreserveCoverageMipMaps, "Preserve Coverage Mip Maps", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.PreserveCoverageMipMaps); + } + + BuildReportTool.Options.ShowTextureColumnFadeOutMipMaps = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnFadeOutMipMaps, "Fade Mip Maps", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.FadeOutMipMaps); + } + + GUILayout.EndVertical(); + #endregion + + GUILayout.Space(30); + + #region Column 3 + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.ShowTextureColumnSpriteImportMode = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnSpriteImportMode, "Sprite Mode", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.SpriteImportMode); + } + + BuildReportTool.Options.ShowTextureColumnSpritePackingTag = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnSpritePackingTag, "Sprite Packing Tag", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.SpritePackingTag); + } + + BuildReportTool.Options.ShowTextureColumnSpritePixelsPerUnit = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnSpritePixelsPerUnit, "Sprite Pixels Per Unit", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.SpritePixelsPerUnit); + } + + BuildReportTool.Options.ShowTextureColumnQualifiesForSpritePacking = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnQualifiesForSpritePacking, "Qualifies for Sprite Packing", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.QualifiesForSpritePacking); + } + + BuildReportTool.Options.ShowTextureColumnWrapMode = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnWrapMode, "Wrap Mode", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.WrapMode); + } + + BuildReportTool.Options.ShowTextureColumnWrapModeU = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnWrapModeU, "Wrap Mode U", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.WrapModeU); + } + + BuildReportTool.Options.ShowTextureColumnWrapModeV = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnWrapModeV, "Wrap Mode V", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.WrapModeV); + } + + BuildReportTool.Options.ShowTextureColumnWrapModeW = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnWrapModeW, "Wrap Mode W", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.WrapModeW); + } + + BuildReportTool.Options.ShowTextureColumnFilterMode = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnFilterMode, "Filter Mode", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.FilterMode); + } + + BuildReportTool.Options.ShowTextureColumnAnisoLevel = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnAnisoLevel, "Anisotropic Filtering Level", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.AnisoLevel); + } + + GUILayout.EndVertical(); + #endregion + + GUILayout.Space(30); + + #region Column 4 + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.ShowTextureColumnMaxTextureSize = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnMaxTextureSize, "Max Texture Size", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.MaxTextureSize); + } + + BuildReportTool.Options.ShowTextureColumnResizeAlgorithm = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnResizeAlgorithm, "Resize Algorithm", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.TextureResizeAlgorithm); + } + + BuildReportTool.Options.ShowTextureColumnTextureFormat = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnTextureFormat, "Texture Format", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.TextureFormat); + } + + BuildReportTool.Options.ShowTextureColumnCompressionType = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnCompressionType, "Compression Type", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.CompressionType); + } + + BuildReportTool.Options.ShowTextureColumnCompressionIsCrunched = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnCompressionIsCrunched, "Compression Crunched", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.CompressionIsCrunched); + } + + BuildReportTool.Options.ShowTextureColumnCompressionQuality = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnCompressionQuality, "Compression Quality", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.CompressionQuality); + } + + BuildReportTool.Options.ShowTextureColumnImportedWidthAndHeight = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnImportedWidthAndHeight, "Imported Width & Height", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.ImportedWidthAndHeight); + } + + BuildReportTool.Options.ShowTextureColumnRealWidthAndHeight = GUILayout.Toggle( + BuildReportTool.Options.ShowTextureColumnRealWidthAndHeight, "Source Width & Height", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.TextureData.GetTooltipTextFromId(BuildReportTool.TextureData.DataId.RealWidthAndHeight); + } + + GUILayout.EndVertical(); + #endregion + + GUILayout.FlexibleSpace(); + + GUILayout.EndHorizontal(); + + // -------------------------------------------- + + GUILayout.Space(10); + GUILayout.Label("Mesh Data", header2Style, BRT_BuildReportWindow.LayoutNone); + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Name of File Filter where Mesh Data will be shown:", BRT_BuildReportWindow.LayoutNone); + BuildReportTool.Options.FileFilterNameForMeshData = + GUILayout.TextField(BuildReportTool.Options.FileFilterNameForMeshData, LayoutMinWidth200); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + GUILayout.Space(3); + GUILayout.Label("Texture Import Settings To Show in Asset Lists:", BRT_BuildReportWindow.LayoutNone); + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Space(10); + + #region Column 1 + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.ShowMeshColumnMeshFilterCount = GUILayout.Toggle( + BuildReportTool.Options.ShowMeshColumnMeshFilterCount, "Non-Skinned Mesh Count", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.MeshData.GetTooltipTextFromId(BuildReportTool.MeshData.DataId.MeshFilterCount); + } + + BuildReportTool.Options.ShowMeshColumnSkinnedMeshRendererCount = GUILayout.Toggle( + BuildReportTool.Options.ShowMeshColumnSkinnedMeshRendererCount, "Skinned Mesh Count", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.MeshData.GetTooltipTextFromId(BuildReportTool.MeshData.DataId.SkinnedMeshRendererCount); + } + + GUILayout.EndVertical(); + #endregion + + GUILayout.Space(30); + + #region Column 2 + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.ShowMeshColumnSubMeshCount = GUILayout.Toggle( + BuildReportTool.Options.ShowMeshColumnSubMeshCount, "Sub-mesh Count", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.MeshData.GetTooltipTextFromId(BuildReportTool.MeshData.DataId.SubMeshCount); + } + + BuildReportTool.Options.ShowMeshColumnVertexCount = GUILayout.Toggle( + BuildReportTool.Options.ShowMeshColumnVertexCount, "Vertex Count", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.MeshData.GetTooltipTextFromId(BuildReportTool.MeshData.DataId.VertexCount); + } + + BuildReportTool.Options.ShowMeshColumnTriangleCount = GUILayout.Toggle( + BuildReportTool.Options.ShowMeshColumnTriangleCount, "Face Count", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.MeshData.GetTooltipTextFromId(BuildReportTool.MeshData.DataId.TriangleCount); + } + + GUILayout.EndVertical(); + #endregion + + GUILayout.Space(30); + + #region Column 3 + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.ShowMeshColumnAnimationType = GUILayout.Toggle( + BuildReportTool.Options.ShowMeshColumnAnimationType, "Animation Type", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.MeshData.GetTooltipTextFromId(BuildReportTool.MeshData.DataId.AnimationType); + } + + BuildReportTool.Options.ShowMeshColumnAnimationClipCount = GUILayout.Toggle( + BuildReportTool.Options.ShowMeshColumnAnimationClipCount, "Animation Clip Count", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.MeshData.GetTooltipTextFromId(BuildReportTool.MeshData.DataId.AnimationClipCount); + } + + GUILayout.EndVertical(); + #endregion + + GUILayout.FlexibleSpace(); + + GUILayout.EndHorizontal(); + + // -------------------------------------------- + + GUILayout.Space(10); + GUILayout.Label("Prefab Data", header2Style, BRT_BuildReportWindow.LayoutNone); + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Name of File Filter where Prefab Data will be shown:", BRT_BuildReportWindow.LayoutNone); + BuildReportTool.Options.FileFilterNameForPrefabData = + GUILayout.TextField(BuildReportTool.Options.FileFilterNameForPrefabData, LayoutMinWidth200); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + GUILayout.Space(3); + GUILayout.Label("Prefab Data To Show in Asset Lists:", BRT_BuildReportWindow.LayoutNone); + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Space(10); + + #region Column 1 + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.ShowPrefabColumnContributeGI = GUILayout.Toggle( + BuildReportTool.Options.ShowPrefabColumnContributeGI, "Contribute Global Illumination", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.PrefabData.GetTooltipTextFromId(BuildReportTool.PrefabData.DataId.ContributeGI); + } + + BuildReportTool.Options.ShowPrefabColumnBatchingStatic = GUILayout.Toggle( + BuildReportTool.Options.ShowPrefabColumnBatchingStatic, "Static Batching", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.PrefabData.GetTooltipTextFromId(BuildReportTool.PrefabData.DataId.BatchingStatic); + } + + BuildReportTool.Options.ShowPrefabColumnReflectionProbeStatic = GUILayout.Toggle( + BuildReportTool.Options.ShowPrefabColumnReflectionProbeStatic, "Reflection Probe Static", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.PrefabData.GetTooltipTextFromId(BuildReportTool.PrefabData.DataId.ReflectionProbeStatic); + } + + GUILayout.EndVertical(); + #endregion + + GUILayout.Space(30); + + #region Column 2 + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.ShowPrefabColumnOccluderStatic = GUILayout.Toggle( + BuildReportTool.Options.ShowPrefabColumnOccluderStatic, "Occluder Static", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.PrefabData.GetTooltipTextFromId(BuildReportTool.PrefabData.DataId.OccluderStatic); + } + + BuildReportTool.Options.ShowPrefabColumnOccludeeStatic = GUILayout.Toggle( + BuildReportTool.Options.ShowPrefabColumnOccludeeStatic, "Occludee Static", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.PrefabData.GetTooltipTextFromId(BuildReportTool.PrefabData.DataId.OccludeeStatic); + } + + BuildReportTool.Options.ShowPrefabColumnNavigationStatic = GUILayout.Toggle( + BuildReportTool.Options.ShowPrefabColumnNavigationStatic, "Navigation Static", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.PrefabData.GetTooltipTextFromId(BuildReportTool.PrefabData.DataId.NavigationStatic); + } + + BuildReportTool.Options.ShowPrefabColumnOffMeshLinkGeneration = GUILayout.Toggle( + BuildReportTool.Options.ShowPrefabColumnOffMeshLinkGeneration, "Off-Mesh Link Generation", BRT_BuildReportWindow.LayoutNone); + if (Event.current.type == EventType.Repaint && GUILayoutUtility.GetLastRect().Contains(Event.current.mousePosition)) + { + _hoveredControlTooltipText = BuildReportTool.PrefabData.GetTooltipTextFromId(BuildReportTool.PrefabData.DataId.OffMeshLinkGeneration); + } + + GUILayout.EndVertical(); + #endregion + + GUILayout.FlexibleSpace(); + + GUILayout.EndHorizontal(); + + // -------------------------------------------- + + GUILayout.Space(10); + GUILayout.Label("List Pagination", header2Style, BRT_BuildReportWindow.LayoutNone); + + // pagination length + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Asset List entries per page:", BRT_BuildReportWindow.LayoutNone); + string pageInput = GUILayout.TextField(BuildReportTool.Options.AssetListPaginationLength.ToString(), LayoutMinWidth100); + pageInput = Regex.Replace(pageInput, @"[^0-9]", ""); // positive numbers only, no fractions + if (string.IsNullOrEmpty(pageInput)) + { + pageInput = "0"; + } + + BuildReportTool.Options.AssetListPaginationLength = int.Parse(pageInput); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + GUILayout.Space(2); + + // log messages + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Log Messages per page:", BRT_BuildReportWindow.LayoutNone); + string logMessagesInput = + GUILayout.TextField(BuildReportTool.Options.LogMessagePaginationLength.ToString(), LayoutMinWidth100); + logMessagesInput = + Regex.Replace(logMessagesInput, @"[^0-9]", ""); // positive numbers only, no fractions + if (string.IsNullOrEmpty(logMessagesInput)) + { + logMessagesInput = "0"; + } + + BuildReportTool.Options.LogMessagePaginationLength = int.Parse(logMessagesInput); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + GUILayout.Space(10); + + GUILayout.Label("Asset Search", header2Style, BRT_BuildReportWindow.LayoutNone); + + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Search Method:", BRT_BuildReportWindow.LayoutNone); + BuildReportTool.Options.SearchTypeInt = GUILayout.SelectionGrid( + BuildReportTool.Options.SearchTypeInt, SearchTypeLabels, 3, BRT_BuildReportWindow.LayoutNone); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + BuildReportTool.Options.SearchFilenameOnly = GUILayout.Toggle( + BuildReportTool.Options.SearchFilenameOnly, + "Search through filenames only (ignore path when searching)", BRT_BuildReportWindow.LayoutNone); + + var usingFuzzy = BuildReportTool.Options.SearchType == SearchType.Fuzzy; + var caseSensitiveLabel = usingFuzzy ? "Case Sensitive Search (Not applicable to Fuzzy Search. Fuzzy Search is always Case Insensitive.)" : "Case Sensitive Search"; + GUI.enabled = prevEnabled && !usingFuzzy; + BuildReportTool.Options.SearchCaseSensitive = GUILayout.Toggle( + BuildReportTool.Options.SearchCaseSensitive, + caseSensitiveLabel, BRT_BuildReportWindow.LayoutNone); + GUI.enabled = prevEnabled; + + GUILayout.Space(10); + GUILayout.Label("File Filters", header2Style, BRT_BuildReportWindow.LayoutNone); + + // choose which file filter group to use + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label(Labels.FILTER_GROUP_TO_USE_LABEL, BRT_BuildReportWindow.LayoutNone); + BuildReportTool.Options.FilterToUseInt = GUILayout.SelectionGrid(BuildReportTool.Options.FilterToUseInt, + FileFilterToUseType, FileFilterToUseType.Length, BRT_BuildReportWindow.LayoutNone); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + // display which file filter group is used + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label(string.Format("{0}{1}", Labels.FILTER_GROUP_FILE_PATH_LABEL, BuildReportTool.FiltersUsed.GetProperFileFilterGroupToUseFilePath()), + BRT_BuildReportWindow.LayoutNone); // display path to used file filter + if (GUILayout.Button(OPEN_IN_FILE_BROWSER_OS_SPECIFIC_LABEL, BRT_BuildReportWindow.LayoutNone)) + { + BuildReportTool.Util.OpenInFileBrowser(BuildReportTool.FiltersUsed.GetProperFileFilterGroupToUseFilePath()); + } + + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + GUILayout.Space(10); + GUILayout.Label("Asset Pinging", header2Style, BRT_BuildReportWindow.LayoutNone); + + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Asset Ping method:", BRT_BuildReportWindow.LayoutNone); + BuildReportTool.Options.DoubleClickOnAssetWillPing = GUILayout.SelectionGrid( + BuildReportTool.Options.DoubleClickOnAssetWillPing + ? 1 + : 0, + AssetPingTypeLabels, 2, LayoutHeight26) == 1; + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Space(20); + + GUILayout.Label( + BuildReportTool.Options.DoubleClickOnAssetWillPing + ? "Note: To ping multiple assets, select the assets, and hold Alt while double-clicking one of them." + : "Note: To ping multiple assets, select the assets, and hold Alt while pressing one of their Ping buttons.", + boxedLabelStyle, LayoutMaxWidth593); + + GUILayout.EndHorizontal(); + + GUILayout.Space(10); + + //AssetUsageLabelTypeLabels + GUILayout.Label("Asset Usages/Dependencies", header2Style, BRT_BuildReportWindow.LayoutNone); + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Asset usage labels:", BRT_BuildReportWindow.LayoutNone); + BuildReportTool.Options.AssetUsageLabelType = GUILayout.SelectionGrid( + BuildReportTool.Options.AssetUsageLabelType, AssetUsageLabelTypeLabels, 1, BRT_BuildReportWindow.LayoutNone); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + GUILayout.Space(10); + + BuildReportTool.Options.ShowAssetPrimaryUsersInTooltipIfAvailable = GUILayout.Toggle( + BuildReportTool.Options.ShowAssetPrimaryUsersInTooltipIfAvailable, + "Show end users in asset tooltip (if available)", BRT_BuildReportWindow.LayoutNone); + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Space(20); + GUILayout.Label( + "Note: \"End users\" are the scenes (or Resources assets) that use a given asset (directly or indirectly), they are the main reason why that asset got included in the build.", + boxedLabelStyle, LayoutMaxWidth525); + GUILayout.EndHorizontal(); + + GUILayout.Space(10); + GUILayout.Label("Thumbnails", header2Style, BRT_BuildReportWindow.LayoutNone); + + BuildReportTool.Options.ShowTooltipThumbnail = GUILayout.Toggle( + BuildReportTool.Options.ShowTooltipThumbnail, + "Show thumbnail in asset tooltip", BRT_BuildReportWindow.LayoutNone); + + GUI.enabled = prevEnabled && BuildReportTool.Options.ShowTooltipThumbnail; + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label("Show thumbnail when:", BRT_BuildReportWindow.LayoutNone); + BuildReportTool.Options.ShowThumbnailOnHoverType = GUILayout.SelectionGrid( + BuildReportTool.Options.ShowThumbnailOnHoverType, ShowThumbnailOnHoverTypeLabels, + ShowThumbnailOnHoverTypeLabels.Length, LayoutHeight26); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + + GUILayout.Label("Thumbnail Tooltip Width:", BRT_BuildReportWindow.LayoutNone); + string tooltipThumbnailWidthInput = + GUILayout.TextField(BuildReportTool.Options.TooltipThumbnailWidth.ToString(), LayoutMinWidth100); + tooltipThumbnailWidthInput = + Regex.Replace(tooltipThumbnailWidthInput, @"[^0-9]", ""); // positive numbers only, no fractions + if (string.IsNullOrEmpty(tooltipThumbnailWidthInput)) + { + tooltipThumbnailWidthInput = "0"; + } + + BuildReportTool.Options.TooltipThumbnailWidth = int.Parse(tooltipThumbnailWidthInput); + + GUILayout.Space(3); + + GUILayout.Label("Height:", BRT_BuildReportWindow.LayoutNone); + string tooltipThumbnailHeightInput = + GUILayout.TextField(BuildReportTool.Options.TooltipThumbnailHeight.ToString(), LayoutMinWidth100); + tooltipThumbnailHeightInput = + Regex.Replace(tooltipThumbnailHeightInput, @"[^0-9]", ""); // positive numbers only, no fractions + if (string.IsNullOrEmpty(tooltipThumbnailHeightInput)) + { + tooltipThumbnailHeightInput = "0"; + } + + BuildReportTool.Options.TooltipThumbnailHeight = int.Parse(tooltipThumbnailHeightInput); + + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + + GUILayout.Label("Thumbnail Tooltip Zoomed-in Width:", BRT_BuildReportWindow.LayoutNone); + string tooltipThumbnailZoomedInWidthInput = + GUILayout.TextField(BuildReportTool.Options.TooltipThumbnailZoomedInWidth.ToString(), LayoutMinWidth100); + tooltipThumbnailZoomedInWidthInput = + Regex.Replace(tooltipThumbnailZoomedInWidthInput, @"[^0-9]", ""); // positive numbers only, no fractions + if (string.IsNullOrEmpty(tooltipThumbnailZoomedInWidthInput)) + { + tooltipThumbnailZoomedInWidthInput = "0"; + } + + BuildReportTool.Options.TooltipThumbnailZoomedInWidth = int.Parse(tooltipThumbnailZoomedInWidthInput); + + GUILayout.Space(3); + + GUILayout.Label("Height:", BRT_BuildReportWindow.LayoutNone); + string tooltipThumbnailZoomedInHeightInput = + GUILayout.TextField(BuildReportTool.Options.TooltipThumbnailZoomedInHeight.ToString(), LayoutMinWidth100); + tooltipThumbnailZoomedInHeightInput = + Regex.Replace(tooltipThumbnailZoomedInHeightInput, @"[^0-9]", ""); // positive numbers only, no fractions + if (string.IsNullOrEmpty(tooltipThumbnailZoomedInHeightInput)) + { + tooltipThumbnailZoomedInHeightInput = "0"; + } + + BuildReportTool.Options.TooltipThumbnailZoomedInHeight = int.Parse(tooltipThumbnailZoomedInHeightInput); + + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + GUI.enabled = prevEnabled; + + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Space(20); + GUILayout.Label( + "Note: Hold Ctrl while a thumbnail tooltip is shown to zoom-in.", + boxedLabelStyle, LayoutMaxWidth525); + GUILayout.EndHorizontal(); + + + GUILayout.Space(BuildReportTool.Window.Settings.CATEGORY_VERTICAL_SPACING); + + + // === Build Report Files === + + GUILayout.Label("Build Report Files", header1Style, BRT_BuildReportWindow.LayoutNone); + + // build report files save path + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label(string.Format("{0}{1}", Labels.SAVE_PATH_LABEL, BuildReportTool.Options.BuildReportSavePath), BRT_BuildReportWindow.LayoutNone); + if (GUILayout.Button(OPEN_IN_FILE_BROWSER_OS_SPECIFIC_LABEL, BRT_BuildReportWindow.LayoutNone)) + { + BuildReportTool.Util.OpenInFileBrowser(BuildReportTool.Options.BuildReportSavePath); + } + + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + // change name of build reports folder + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label(Labels.SAVE_FOLDER_NAME_LABEL, BRT_BuildReportWindow.LayoutNone); + BuildReportTool.Options.BuildReportFolderName = + GUILayout.TextField(BuildReportTool.Options.BuildReportFolderName, LayoutMinWidth250); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + // where to save build reports (my docs/home, or beside project) + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutNone); + GUILayout.Label(Labels.SAVE_PATH_TYPE_LABEL, BRT_BuildReportWindow.LayoutNone); + + if (_saveTypeLabels == null) + { + _saveTypeLabels = new[] + {SAVE_PATH_TYPE_PERSONAL_OS_SPECIFIC_LABEL, Labels.SAVE_PATH_TYPE_PROJECT_LABEL}; + } + + BuildReportTool.Options.SaveType = GUILayout.SelectionGrid(BuildReportTool.Options.SaveType, _saveTypeLabels, + _saveTypeLabels.Length, BRT_BuildReportWindow.LayoutNone); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + GUILayout.Space(BuildReportTool.Window.Settings.CATEGORY_VERTICAL_SPACING); + + + GUILayout.EndVertical(); + GUILayout.Space(20); // extra right padding + GUILayout.EndHorizontal(); + + GUILayout.EndScrollView(); + + //if (BuildReportTool.Options.SaveType == BuildReportTool.Options.SAVE_TYPE_PERSONAL) + //{ + // changed to user's personal folder + //BuildReportTool.ReportGenerator.ChangeSavePathToUserPersonalFolder(); + //} + //else if (BuildReportTool.Options.SaveType == BuildReportTool.Options.SAVE_TYPE_PROJECT) + //{ + // changed to project folder + //BuildReportTool.ReportGenerator.ChangeSavePathToProjectFolder(); + //} + + if (Event.current.type == EventType.Repaint && !string.IsNullOrEmpty(_hoveredControlTooltipText)) + { + _tooltipLabel.text = _hoveredControlTooltipText; + var tooltipTextStyle = GUI.skin.FindStyle("TooltipText"); + if (tooltipTextStyle == null) + { + tooltipTextStyle = GUI.skin.label; + } + + const int MAX_TOOLTIP_WIDTH = 240; + var tooltipSize = tooltipTextStyle.CalcSize(_tooltipLabel); + if (tooltipSize.x > MAX_TOOLTIP_WIDTH) + { + tooltipSize.x = MAX_TOOLTIP_WIDTH; + tooltipSize.y = tooltipTextStyle.CalcHeight(_tooltipLabel, tooltipSize.x); + } + + var tooltipRect = BRT_BuildReportWindow.DrawTooltip(position, tooltipSize.x, tooltipSize.y, 5); + GUI.Label(tooltipRect, _tooltipLabel, tooltipTextStyle); + } + } + + static void OnAddPattern(ReorderableList list) + { + SavedOptions.IgnorePattern newEntry; + newEntry.Pattern = ""; + newEntry.SearchType = SavedOptions.SEARCH_METHOD_BASIC; + BuildReportTool.Options.IgnorePatternsForUnused.Add(newEntry); + } + + static void OnIgnorePatternChanged(ReorderableList list) + { + BuildReportTool.Options.SaveOptions(); + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_OptionsScreen.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_OptionsScreen.cs.meta new file mode 100644 index 00000000..0d9c49fc --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_OptionsScreen.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a070a9f986a60664c8dd6e5beb865cd8 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_OverviewScreen.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_OverviewScreen.cs new file mode 100644 index 00000000..d8916a79 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_OverviewScreen.cs @@ -0,0 +1,706 @@ +using System.Globalization; +using UnityEngine; +using UnityEditor; + +namespace BuildReportTool.Window.Screen +{ + public class Overview : BaseScreen + { + Vector2 _scrollPos = Vector2.zero; + + bool _showTopUsed; + bool _showTopUnused; + + int _assetUsedEntryHoveredIdx = -1; + int _assetUnusedEntryHoveredIdx = -1; + + + bool _shouldShowThumbnailOnHoveredAsset; + + + public override string Name + { + get { return Labels.OVERVIEW_CATEGORY_LABEL; } + } + + public override void RefreshData(BuildInfo buildReport, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, UnityBuildReport unityBuildReport) + { + } + + public override void DrawGUI(Rect position, + BuildInfo buildReportToDisplay, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, + UnityBuildReport unityBuildReport, BuildReportTool.ExtraData extraData, + out bool requestRepaint) + { + if (buildReportToDisplay == null) + { + requestRepaint = false; + return; + } + + var titleStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.MAIN_TITLE_STYLE_NAME); + if (titleStyle == null) + { + titleStyle = GUI.skin.label; + } + + var bigLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME); + if (bigLabelStyle == null) + { + bigLabelStyle = GUI.skin.label; + } + + var bigValueStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_SUBTITLE_STYLE_NAME); + if (bigValueStyle == null) + { + bigValueStyle = GUI.skin.label; + } + + var bigNumberStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.BIG_NUMBER_STYLE_NAME); + if (bigNumberStyle == null) + { + bigNumberStyle = GUI.skin.label; + } + + var smallLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.SETTING_NAME_STYLE_NAME); + if (smallLabelStyle == null) + { + smallLabelStyle = GUI.skin.label; + } + + var smallValueStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.SETTING_VALUE_STYLE_NAME); + if (smallValueStyle == null) + { + smallValueStyle = GUI.skin.label; + } + + var helpDescriptionStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TINY_HELP_STYLE_NAME); + if (helpDescriptionStyle == null) + { + helpDescriptionStyle = GUI.skin.label; + } + + var infoDescriptionStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_TEXT_STYLE_NAME); + if (infoDescriptionStyle == null) + { + infoDescriptionStyle = GUI.skin.label; + } + + + GUILayout.Space(2); // top padding for scrollbar + + _scrollPos = GUILayout.BeginScrollView(_scrollPos); + + GUILayout.BeginHorizontal(); + GUILayout.Space(10); // extra left padding + + + GUILayout.BeginVertical(); + + GUILayout.Space(10); // top padding + + + // report title + GUILayout.Label(buildReportToDisplay.SuitableTitle, titleStyle); + + + GUILayout.Space(10); + + + // two-column layout + GUILayout.BeginVertical(); + + GUILayout.BeginHorizontal(); + // 1st column + GUILayout.BeginVertical(GUILayout.MaxWidth(350)); + GUILayout.Label(Labels.TIME_OF_BUILD_LABEL, bigLabelStyle); + GUILayout.Label(buildReportToDisplay.GetTimeReadable(), bigValueStyle); + + GUILayout.Space(10); + GUILayout.Label("Project building took:", bigLabelStyle); + GUILayout.Label("How long the project building took. This is the time between OnPreprocessBuild and OnPostprocessBuild.", helpDescriptionStyle); + GUILayout.Label(buildReportToDisplay.BuildDurationTime.ToString(), bigValueStyle); + + GUILayout.Space(10); + GUILayout.Label("Report generation took:", bigLabelStyle); + GUILayout.Label("How long the Build Report Generation took.", helpDescriptionStyle); + GUILayout.Label(buildReportToDisplay.ReportGenerationTime.ToString(), bigValueStyle); + + if (!string.IsNullOrEmpty(buildReportToDisplay.TotalBuildSize) && + !string.IsNullOrEmpty(buildReportToDisplay.BuildFilePath)) + { + GUILayout.Space(10); + GUILayout.BeginVertical(); + GUILayout.Label(Labels.BUILD_TOTAL_SIZE_LABEL, bigLabelStyle); + + GUILayout.Label(BuildReportTool.Util.GetBuildSizePathDescription(buildReportToDisplay), helpDescriptionStyle); + + GUILayout.Label(buildReportToDisplay.TotalBuildSize, bigNumberStyle); + GUILayout.EndVertical(); + } + + GUILayout.Space(20); + + string emphasisColor = "black"; + if (EditorGUIUtility.isProSkin || BRT_BuildReportWindow.FORCE_USE_DARK_SKIN) + { + emphasisColor = "white"; + } + + string largestAssetCategoryLabel = string.Format( + "{1} are the largest,\ntaking up {2}% of the build{3}", + emphasisColor, buildReportToDisplay.BuildSizes[0].Name, + buildReportToDisplay.BuildSizes[0].Percentage.ToString(CultureInfo.InvariantCulture), + (!buildReportToDisplay.HasStreamingAssets + ? "\n(not counting streaming assets)" + : "")); + + GUILayout.Label(largestAssetCategoryLabel, infoDescriptionStyle); + GUILayout.Space(20); + GUILayout.EndVertical(); + + GUILayout.Space(20); + + // 2nd column + GUILayout.BeginVertical(GUILayout.MaxWidth(250)); + GUILayout.Label("Made for:", bigLabelStyle); + GUILayout.Label(buildReportToDisplay.BuildType, bigValueStyle); + + GUILayout.Space(10); + GUILayout.Label("Built in:", bigLabelStyle); + GUILayout.Label(buildReportToDisplay.UnityVersionDisplayed, bigValueStyle); + GUILayout.EndVertical(); + + DrawScenesInBuild(buildReportToDisplay.ScenesInBuild); + + GUILayout.EndHorizontal(); + + + GUILayout.BeginHorizontal(); + + var numberOfTopUsed = + buildReportToDisplay.HasUsedAssets ? buildReportToDisplay.UsedAssets.NumberOfTopLargest : 0; + var numberOfTopUnused = buildReportToDisplay.HasUnusedAssets + ? buildReportToDisplay.UnusedAssets.NumberOfTopLargest + : 0; + if (Event.current.type == EventType.Layout) + { + _showTopUsed = numberOfTopUsed > 0 && buildReportToDisplay.UsedAssets.TopLargest != null; + _showTopUnused = numberOfTopUnused > 0 && buildReportToDisplay.UnusedAssets.TopLargest != null; + } + + // 1st column + GUILayout.BeginVertical(); + if (_showTopUsed) + { + GUILayout.Label(string.Format("Top {0} largest in build:", numberOfTopUsed.ToString()), + bigLabelStyle); + + GUILayout.Space(4); + if (!BuildReportTool.Options.AutoResortAssetsWhenUnityEditorRegainsFocus && + GUILayout.Button("Refresh", GUILayout.Height(20), GUILayout.MaxWidth(520))) + { + buildReportToDisplay.RecategorizeUsedAssets(); + buildReportToDisplay.FlagOkToRefresh(); + } + + DrawAssetList(buildReportToDisplay.UsedAssets, true, buildReportToDisplay, assetDependencies); + } + + GUILayout.EndVertical(); + + GUILayout.Space(50); + + // 2nd column + GUILayout.BeginVertical(); + if (_showTopUnused) + { + GUILayout.Label(string.Format("Top {0} largest not in build:", numberOfTopUnused.ToString()), + bigLabelStyle); + + GUILayout.Space(4); + if (!BuildReportTool.Options.AutoResortAssetsWhenUnityEditorRegainsFocus && + GUILayout.Button("Refresh", GUILayout.Height(20), GUILayout.MaxWidth(520))) + { + buildReportToDisplay.RecategorizeUnusedAssets(); + buildReportToDisplay.FlagOkToRefresh(); + } + + DrawAssetList(buildReportToDisplay.UnusedAssets, false, buildReportToDisplay, assetDependencies); + } + + GUILayout.EndVertical(); + GUILayout.EndHorizontal(); + + GUILayout.EndVertical(); + + + GUILayout.Space(20); + + if (assetDependencies != null && !string.IsNullOrEmpty(assetDependencies.SavedPath)) + { + GUILayout.Label("Asset Dependencies file used:", smallLabelStyle); + GUILayout.Label(assetDependencies.SavedPath, smallValueStyle); + + GUILayout.Space(10); + } + + if (textureData != null && !string.IsNullOrEmpty(textureData.SavedPath)) + { + GUILayout.Label("Texture Data file used:", smallLabelStyle); + GUILayout.Label(textureData.SavedPath, smallValueStyle); + + GUILayout.Space(10); + } + + if (unityBuildReport != null && !string.IsNullOrEmpty(unityBuildReport.SavedPath)) + { + GUILayout.Label("Additional Unity Build Report file used:", smallLabelStyle); + GUILayout.Label(unityBuildReport.SavedPath, smallValueStyle); + + GUILayout.Space(10); + } + + if (!string.IsNullOrEmpty(extraData.Contents)) + { + GUILayout.Label("Extra Data file used:", smallLabelStyle); + GUILayout.Label(extraData.SavedPath, smallValueStyle); + + GUILayout.Space(10); + } + + GUILayout.Space(20); + + GUILayout.EndVertical(); + + GUILayout.Space(20); // extra right padding + GUILayout.EndHorizontal(); + + GUILayout.EndScrollView(); + + // ------------------------------------------------------ + + // Continually request repaint, since we need to check the rects + // generated by the GUILayout (using GUILayoutUtility.GetLastRect()) + // to make the hover checks work. That's because GetLastRect() only + // works during repaint event. + // + // Later checks below can set requestRepaint to false if there's no + // need to repaint, to help lessen cpu usage. + requestRepaint = true; + + if (Event.current.mousePosition.y >= position.height || + Event.current.mousePosition.y <= 0 || + Event.current.mousePosition.x <= 0 || + Event.current.mousePosition.x >= position.width) + { + // mouse is outside the window, no need to repaint, can't show tooltip anyway + // set requestRepaint to false to help lessen cpu usage + requestRepaint = false; + } + + var showThumbnailNow = BuildReportTool.Options.ShowTooltipThumbnail && + _shouldShowThumbnailOnHoveredAsset && + (_assetUsedEntryHoveredIdx != -1 || _assetUnusedEntryHoveredIdx != -1); + + var zoomInChanged = false; + if (showThumbnailNow) + { + var prevZoomedIn = BRT_BuildReportWindow.ZoomedInThumbnails; + + // if thumbnail is currently showing, we process the inputs + // (ctrl zooms in on thumbnail, alt toggles alpha blend) + BRT_BuildReportWindow.ProcessThumbnailControls(); + + if (prevZoomedIn != BRT_BuildReportWindow.ZoomedInThumbnails) + { + zoomInChanged = true; + } + } + else + { + // no thumbnail currently shown. ensure the controls that + // need to be reset to initial state are reset + BRT_BuildReportWindow.ResetThumbnailControls(); + } + + if (!zoomInChanged && !Event.current.alt && + !BRT_BuildReportWindow.MouseMovedNow && !BRT_BuildReportWindow.LastMouseMoved) + { + // mouse hasn't moved, and no request to zoom-in thumbnail or toggle thumbnail alpha + // no need to repaint because nothing has changed + // set requestRepaint to false to help lessen cpu usage + requestRepaint = false; + } + + var shouldShowAssetEndUsersTooltipNow = BuildReportTool.Options.ShowAssetPrimaryUsersInTooltipIfAvailable && + BRT_BuildReportWindow.ShouldHoveredAssetShowEndUserTooltip( + assetDependencies) && + (_assetUsedEntryHoveredIdx != -1 || _assetUnusedEntryHoveredIdx != -1); + + if (Event.current.type == EventType.Repaint) + { + if (showThumbnailNow && shouldShowAssetEndUsersTooltipNow) + { + // draw thumbnail and end users below it + BRT_BuildReportWindow.DrawThumbnailEndUsersTooltip(position, assetDependencies, textureData); + } + else if (shouldShowAssetEndUsersTooltipNow) + { + // draw only end users in tooltip + BRT_BuildReportWindow.DrawEndUsersTooltip(position, assetDependencies); + } + else if (showThumbnailNow) + { + // draw only thumbnail in tooltip + BRT_BuildReportWindow.DrawThumbnailTooltip(position, textureData); + } + } + } + + void DrawAssetList(BuildReportTool.AssetList assetList, bool usedAssets, BuildInfo buildReportToDisplay, + AssetDependencies assetDependencies) + { + if (assetList == null || assetList.TopLargest == null) + { + //Debug.LogError("no top ten largest"); + return; + } + + BuildReportTool.SizePart[] assetsToShow = assetList.TopLargest; + + if (assetsToShow == null) + { + //Debug.LogError("no top ten largest"); + return; + } + + var listNormalStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_NORMAL_STYLE_NAME); + if (listNormalStyle == null) + { + listNormalStyle = GUI.skin.label; + } + + var listAltStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_NORMAL_ALT_STYLE_NAME); + if (listAltStyle == null) + { + listAltStyle = GUI.skin.label; + } + + var listIconNormalStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_ICON_STYLE_NAME); + if (listIconNormalStyle == null) + { + listIconNormalStyle = GUI.skin.label; + } + + var listIconAltStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_ICON_ALT_STYLE_NAME); + if (listIconAltStyle == null) + { + listIconAltStyle = GUI.skin.label; + } + + var iconHoveredStyle = GUI.skin.FindStyle("IconHovered"); + if (iconHoveredStyle == null) + { + iconHoveredStyle = GUI.skin.label; + } + + bool useAlt = true; + + var newEntryHoveredIdx = -1; + BuildReportTool.SizePart newEntryHovered = null; + Rect newEntryHoveredRect = new Rect(); + Rect iconRect = new Rect(); + var hoveringOverIcon = false; + //var hoveringOverLabel = false; + + GUILayout.BeginHorizontal(); + + // 1st column: name + GUILayout.BeginVertical(); + for (int n = 0; n < assetsToShow.Length; ++n) + { + BuildReportTool.SizePart b = assetsToShow[n]; + + var styleToUse = useAlt ? listAltStyle : listNormalStyle; + var iconStyleToUse = useAlt ? listIconAltStyle : listIconNormalStyle; + + if (styleToUse == null) + { + styleToUse = GUI.skin.label; + } + if (iconStyleToUse == null) + { + iconStyleToUse = GUI.skin.label; + } + + Texture icon = AssetDatabase.GetCachedIcon(b.Name); + + GUILayout.BeginHorizontal(); + if (icon == null) + { + // no icon, just add space so it aligns with the other entries + GUILayout.Label(string.Empty, iconStyleToUse, BRT_BuildReportWindow.Layout28x30); + } + else + { + GUILayout.Button(icon, iconStyleToUse, BRT_BuildReportWindow.Layout28x30); + } + + if (Event.current.type == EventType.Repaint) + { + iconRect = GUILayoutUtility.GetLastRect(); + + // if mouse is hovering over asset entry's icon (not the label) + // draw a border on the asset icon + if (iconRect.Contains(Event.current.mousePosition)) + { + hoveringOverIcon = true; + newEntryHoveredIdx = n; + newEntryHovered = b; + newEntryHoveredRect = iconRect; + + GUI.Box(iconRect, icon, iconHoveredStyle); + } + } + + string prettyName = string.Format(" {0}. {1}", (n + 1).ToString(), BuildReportTool.Util.GetAssetFilename(b.Name)); + if (GUILayout.Button(prettyName, styleToUse, BRT_BuildReportWindow.Layout100To400x30)) + { + Utility.PingAssetInProject(b.Name); + } + + if (newEntryHoveredIdx == -1 && Event.current.type == EventType.Repaint) + { + var labelRect = GUILayoutUtility.GetLastRect(); + + // if mouse is hovering over asset entry's label + // draw a border on the asset icon + if (labelRect.Contains(Event.current.mousePosition)) + { + //hoveringOverLabel = true; + newEntryHoveredIdx = n; + newEntryHovered = b; + newEntryHoveredRect = labelRect; + + GUI.Box(iconRect, icon, iconHoveredStyle); + } + } + + GUILayout.EndHorizontal(); + + useAlt = !useAlt; + } + + GUILayout.EndVertical(); + + + if (Event.current.type == EventType.Repaint) + { + if (usedAssets) + { + _assetUsedEntryHoveredIdx = newEntryHoveredIdx; + } + else + { + _assetUnusedEntryHoveredIdx = newEntryHoveredIdx; + } + + if (newEntryHoveredIdx != -1) + { + string hoveredAssetPath = newEntryHovered != null ? newEntryHovered.Name : null; + + // ---------------- + // update what is considered the hovered asset, for use later on + // when the tooltip will be drawn + BRT_BuildReportWindow.UpdateHoveredAsset(hoveredAssetPath, newEntryHoveredRect, + usedAssets, buildReportToDisplay, assetDependencies); + + // ---------------- + // if mouse is hovering over the correct area, we signify that + // the tooltip thumbnail should be drawn + if (BuildReportTool.Options.ShowTooltipThumbnail && + (BuildReportTool.Options.ShowThumbnailOnHoverLabelToo || hoveringOverIcon) && + BRT_BuildReportWindow.GetAssetPreview(hoveredAssetPath) != null) + { + _shouldShowThumbnailOnHoveredAsset = true; + } + else + { + _shouldShowThumbnailOnHoveredAsset = false; + } + } + } + + // 2nd column: size + + var useRawSize = (usedAssets && !BuildReportTool.Options.ShowImportedSizeForUsedAssets) || !usedAssets; + + useAlt = true; + GUILayout.BeginVertical(); + for (int n = 0; n < assetsToShow.Length; ++n) + { + BuildReportTool.SizePart b = assetsToShow[n]; + + var styleToUse = useAlt ? listAltStyle : listNormalStyle; + + GUILayout.Label(useRawSize ? b.RawSize : b.ImportedSize, styleToUse, BRT_BuildReportWindow.LayoutTo100x30); + + useAlt = !useAlt; + } + + GUILayout.EndVertical(); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + } + + void DrawScenesInBuild(BuildReportTool.BuildInfo.SceneInBuild[] scenesInBuild) + { + if (scenesInBuild == null || scenesInBuild.Length == 0) + { + //Debug.LogError("no top ten largest"); + return; + } + + + var bigLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME); + if (bigLabelStyle == null) + { + bigLabelStyle = GUI.skin.label; + } + + var listNormalStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_NORMAL_STYLE_NAME); + if (listNormalStyle == null) + { + listNormalStyle = GUI.skin.label; + } + + var listAltStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_NORMAL_ALT_STYLE_NAME); + if (listAltStyle == null) + { + listAltStyle = GUI.skin.label; + } + + var listIconNormalStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_ICON_STYLE_NAME); + if (listIconNormalStyle == null) + { + listIconNormalStyle = GUI.skin.label; + } + + var listIconAltStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_ICON_ALT_STYLE_NAME); + if (listIconAltStyle == null) + { + listIconAltStyle = GUI.skin.label; + } + + bool useAlt = true; + + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutExpandWidth); + GUILayout.Label("Scenes in Build:", bigLabelStyle); + + var prevColor = GUI.contentColor; + + //GUILayout.BeginHorizontal(); + // 1st column: name + GUILayout.BeginVertical(BRT_BuildReportWindow.LayoutExpandWidth); + var usedIdx = -1; + for (int n = 0; n < scenesInBuild.Length; ++n) + { + if (scenesInBuild[n].Enabled) + { + ++usedIdx; + } + + var styleToUse = useAlt ? listAltStyle : listNormalStyle; + var iconStyleToUse = useAlt ? listIconAltStyle : listIconNormalStyle; + + + Texture icon = AssetDatabase.GetCachedIcon(scenesInBuild[n].Path); + + GUILayout.BeginHorizontal(styleToUse, BRT_BuildReportWindow.LayoutExpandWidth); + + // enabled status + //GUILayout.Toggle(scenesInBuild[n].Enabled, string.Empty, GUILayout.Width(20), GUILayout.Height(30)); + + // icon + if (icon == null) + { + //GUILayout.Space(22); + GUILayout.Label(string.Empty, iconStyleToUse, BRT_BuildReportWindow.Layout28x30); + } + else + { + if (!scenesInBuild[n].Enabled) + { + GUI.contentColor = new Color(1.0f, 1.0f, 1.0f, 0.4f); + } + + GUILayout.Button(icon, iconStyleToUse, BRT_BuildReportWindow.Layout28x30); + if (!scenesInBuild[n].Enabled) + { + GUI.contentColor = prevColor; + } + } + + + // scene index + if (scenesInBuild[n].Enabled) + { + if (GUILayout.Button(usedIdx.ToString(), styleToUse, BRT_BuildReportWindow.Layout20x30)) + { + Utility.PingAssetInProject(scenesInBuild[n].Path); + } + } + else + { + GUILayout.Label(string.Empty, iconStyleToUse, BRT_BuildReportWindow.Layout20x30); + } + + // path + string prettyName; + if (string.IsNullOrEmpty(scenesInBuild[n].Path)) + { + prettyName = string.Format("Missing", + BuildReportTool.Window.Screen.AssetList.GetPathColor(false)); + } + else + { + var pathName = BuildReportTool.Util.GetAssetPath(scenesInBuild[n].Path); + var fileName = scenesInBuild[n].Path.GetFileNameOnly(); + + if (scenesInBuild[n].Enabled) + { + prettyName = string.Format("{1}{2}", + BuildReportTool.Window.Screen.AssetList.GetPathColor(false), + pathName, fileName); + } + else + { + prettyName = string.Format("{1}{2}", + BuildReportTool.Window.Screen.AssetList.GetPathColor(false), + pathName, fileName); + } + } + + if (GUILayout.Button(prettyName, styleToUse, BRT_BuildReportWindow.Layout100x30)) + { + Utility.PingAssetInProject(scenesInBuild[n].Path); + } + + GUILayout.EndHorizontal(); + + useAlt = !useAlt; + } + + GUILayout.EndVertical(); + + + GUILayout.FlexibleSpace(); + //GUILayout.EndHorizontal(); + GUILayout.Space(5); // bottom padding + GUILayout.EndVertical(); + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_OverviewScreen.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_OverviewScreen.cs.meta new file mode 100644 index 00000000..34b9b517 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_OverviewScreen.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b2dde6e05918e124c9bfb66365e31e49 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_SizeStatsScreen.cs b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_SizeStatsScreen.cs new file mode 100644 index 00000000..1f20a458 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_SizeStatsScreen.cs @@ -0,0 +1,489 @@ +using System.Globalization; +using UnityEngine; + +namespace BuildReportTool.Window.Screen +{ + public class SizeStats : BaseScreen + { + public override string Name + { + get { return Labels.SIZE_STATS_CATEGORY_LABEL; } + } + + public override void RefreshData(BuildInfo buildReport, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, UnityBuildReport unityBuildReport) + { + } + + Vector2 _assetListScrollPos; + + bool _hasTotalBuildSize; + bool _hasUsedAssetsTotalSize; + bool _hasBuildSizes; + bool _hasCompressedBuildSize; + bool _hasMonoDLLsToDisplay; + bool _hasUnityEngineDLLsToDisplay; + bool _hasScriptDLLsToDisplay; + + public override void DrawGUI(Rect position, + BuildInfo buildReportToDisplay, AssetDependencies assetDependencies, + TextureData textureData, MeshData meshData, PrefabData prefabData, + UnityBuildReport unityBuildReport, BuildReportTool.ExtraData extraData, + out bool requestRepaint) + { + if (buildReportToDisplay == null) + { + requestRepaint = false; + return; + } + + requestRepaint = false; + + if (Event.current.type == EventType.Layout) + { + _hasTotalBuildSize = !string.IsNullOrEmpty(buildReportToDisplay.TotalBuildSize) && + !string.IsNullOrEmpty(buildReportToDisplay.BuildFilePath); + + _hasUsedAssetsTotalSize = !string.IsNullOrEmpty(buildReportToDisplay.UsedTotalSize); + _hasCompressedBuildSize = !string.IsNullOrEmpty(buildReportToDisplay.CompressedBuildSize); + _hasBuildSizes = buildReportToDisplay.BuildSizes != null; + _hasMonoDLLsToDisplay = buildReportToDisplay.MonoDLLs != null && buildReportToDisplay.MonoDLLs.Length > 0; + + _hasUnityEngineDLLsToDisplay = buildReportToDisplay.UnityEngineDLLs != null && + buildReportToDisplay.UnityEngineDLLs.Length > 0; + + _hasScriptDLLsToDisplay = + buildReportToDisplay.ScriptDLLs != null && buildReportToDisplay.ScriptDLLs.Length > 0; + } + + + GUILayout.Space(2); // top padding for scrollbar + + _assetListScrollPos = GUILayout.BeginScrollView(_assetListScrollPos); + + GUILayout.Space(10); // top padding for content + + GUILayout.BeginHorizontal(); + GUILayout.Space(10); // extra left padding + + DrawTotalSize(buildReportToDisplay); + + GUILayout.Space(BuildReportTool.Window.Settings.CATEGORY_HORIZONTAL_SPACING); + GUILayout.BeginVertical(); + + DrawBuildSizes(buildReportToDisplay); + + GUILayout.Space(BuildReportTool.Window.Settings.CATEGORY_VERTICAL_SPACING); + + DrawDLLList(buildReportToDisplay); + + GUILayout.EndVertical(); + GUILayout.Space(20); // extra right padding + GUILayout.EndHorizontal(); + + GUILayout.EndScrollView(); + } + + + void DrawTotalSize(BuildReportTool.BuildInfo buildReportToDisplay) + { + GUILayout.BeginVertical(); + + var bigLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME); + if (bigLabelStyle == null) + { + bigLabelStyle = GUI.skin.label; + } + + var descStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.TINY_HELP_STYLE_NAME); + if (descStyle == null) + { + descStyle = GUI.skin.label; + } + + var valueStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.BIG_NUMBER_STYLE_NAME); + if (valueStyle == null) + { + valueStyle = GUI.skin.label; + } + + if (buildReportToDisplay.HasOldSizeValues) + { + // in old sizes: + // TotalBuildSize is really the used assets size + // CompressedBuildSize if present is the total build size + + BuildReportTool.Window.Utility.DrawLargeSizeDisplay(Labels.USED_TOTAL_SIZE_LABEL, + Labels.USED_TOTAL_SIZE_DESC, buildReportToDisplay.TotalBuildSize); + GUILayout.Space(40); + BuildReportTool.Window.Utility.DrawLargeSizeDisplay(Labels.BUILD_TOTAL_SIZE_LABEL, + BuildReportTool.Window.Utility.GetProperBuildSizeDesc(buildReportToDisplay), + buildReportToDisplay.CompressedBuildSize); + } + else + { + // Total Build Size + if (_hasTotalBuildSize) + { + GUILayout.BeginVertical(); + + var buildPlatform = + BuildReportTool.ReportGenerator.GetBuildPlatformFromString(buildReportToDisplay.BuildType, + buildReportToDisplay.BuildTargetUsed); + + GUILayout.Label( + buildPlatform == BuildPlatform.iOS ? Labels.BUILD_XCODE_SIZE_LABEL : Labels.BUILD_TOTAL_SIZE_LABEL, + bigLabelStyle); + + GUILayout.Label(BuildReportTool.Util.GetBuildSizePathDescription(buildReportToDisplay), + descStyle); + + GUILayout.Label(buildReportToDisplay.TotalBuildSize, valueStyle); + GUILayout.EndVertical(); + + DrawAuxiliaryBuildSizes(buildReportToDisplay); + GUILayout.Space(40); + } + + + // Used Assets + if (_hasUsedAssetsTotalSize) + { + BuildReportTool.Window.Utility.DrawLargeSizeDisplay(Labels.USED_TOTAL_SIZE_LABEL, + Labels.USED_TOTAL_SIZE_DESC, buildReportToDisplay.UsedTotalSize); + GUILayout.Space(40); + } + + + // Unused Assets + if (buildReportToDisplay.UnusedAssetsIncludedInCreation) + { + BuildReportTool.Window.Utility.DrawLargeSizeDisplay(Labels.UNUSED_TOTAL_SIZE_LABEL, + Labels.UNUSED_TOTAL_SIZE_DESC, buildReportToDisplay.UnusedTotalSize); + + if (buildReportToDisplay.ProcessUnusedAssetsInBatches) + { + GUILayout.Space(10); + + GUILayout.BeginHorizontal(); + var warning = GUI.skin.FindStyle("Icon-Warning"); + if (warning != null) + { + var warningIcon = warning.normal.background; + + var iconWidth = warning.fixedWidth; + var iconHeight = warning.fixedHeight; + + GUI.DrawTexture(GUILayoutUtility.GetRect(iconWidth, iconHeight), warningIcon); + } + GUILayout.Label(string.Format(Labels.UNUSED_TOTAL_IS_FROM_BATCH, buildReportToDisplay.UnusedAssetsEntriesPerBatch), descStyle); + GUILayout.EndHorizontal(); + } + } + } + + GUILayout.EndVertical(); + } + + + void DrawAuxiliaryBuildSizes(BuildReportTool.BuildInfo buildReportToDisplay) + { + BuildReportTool.BuildPlatform buildPlatform = + BuildReportTool.ReportGenerator.GetBuildPlatformFromString(buildReportToDisplay.BuildType, + buildReportToDisplay.BuildTargetUsed); + + var bigLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME); + if (bigLabelStyle == null) + { + bigLabelStyle = GUI.skin.label; + } + + var medLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_SUBTITLE_BOLD_STYLE_NAME); + if (medLabelStyle == null) + { + medLabelStyle = GUI.skin.label; + } + + var valueStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.BIG_NUMBER_STYLE_NAME); + if (valueStyle == null) + { + valueStyle = GUI.skin.label; + } + + if (buildPlatform == BuildReportTool.BuildPlatform.Web) + { + GUILayout.Space(20); + GUILayout.BeginVertical(); + GUILayout.Label(Labels.WEB_UNITY3D_FILE_SIZE_LABEL, medLabelStyle); + GUILayout.Label(buildReportToDisplay.WebFileBuildSize, valueStyle); + GUILayout.EndVertical(); + } + else if (buildPlatform == BuildReportTool.BuildPlatform.Android) + { + if (!buildReportToDisplay.AndroidCreateProject && buildReportToDisplay.AndroidUseAPKExpansionFiles) + { + GUILayout.Space(20); + GUILayout.BeginVertical(); + GUILayout.Label(Labels.ANDROID_APK_FILE_SIZE_LABEL, medLabelStyle); + GUILayout.Label(buildReportToDisplay.AndroidApkFileBuildSize, bigLabelStyle); + GUILayout.EndVertical(); + + GUILayout.Space(20); + GUILayout.BeginVertical(); + GUILayout.Label(Labels.ANDROID_OBB_FILE_SIZE_LABEL, medLabelStyle); + GUILayout.Label(buildReportToDisplay.AndroidObbFileBuildSize, bigLabelStyle); + GUILayout.EndVertical(); + } + else if (buildReportToDisplay.AndroidCreateProject && buildReportToDisplay.AndroidUseAPKExpansionFiles) + { + GUILayout.Space(20); + GUILayout.BeginVertical(); + GUILayout.Label(Labels.ANDROID_OBB_FILE_SIZE_LABEL, medLabelStyle); + GUILayout.Label(buildReportToDisplay.AndroidObbFileBuildSize, bigLabelStyle); + GUILayout.EndVertical(); + } + } + + // Streaming Assets + if (buildReportToDisplay.HasStreamingAssets) + { + GUILayout.Space(20); + BuildReportTool.Window.Utility.DrawLargeSizeDisplay(Labels.STREAMING_ASSETS_TOTAL_SIZE_LABEL, + Labels.STREAMING_ASSETS_SIZE_DESC, buildReportToDisplay.StreamingAssetsSize); + } + } + + + void DrawBuildSizes(BuildReportTool.BuildInfo buildReportToDisplay) + { + if (_hasCompressedBuildSize) + { + GUILayout.BeginVertical(); + } + + var bigLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME); + if (bigLabelStyle == null) + { + bigLabelStyle = GUI.skin.label; + } + + var medLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_SUBTITLE_BOLD_STYLE_NAME); + if (medLabelStyle == null) + { + medLabelStyle = GUI.skin.label; + } + + var labelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_SUBTITLE_STYLE_NAME); + if (labelStyle == null) + { + labelStyle = GUI.skin.label; + } + + GUILayout.Label(Labels.TOTAL_SIZE_BREAKDOWN_LABEL, bigLabelStyle); + + if (_hasCompressedBuildSize) + { + GUILayout.BeginHorizontal(); + GUILayout.Label(Labels.TOTAL_SIZE_BREAKDOWN_MSG_PRE_BOLD, labelStyle); + GUILayout.Label(Labels.TOTAL_SIZE_BREAKDOWN_MSG_BOLD, medLabelStyle); + GUILayout.Label(Labels.TOTAL_SIZE_BREAKDOWN_MSG_POST_BOLD, labelStyle); + GUILayout.FlexibleSpace(); + GUILayout.EndHorizontal(); + + GUILayout.EndVertical(); + } + + if (_hasBuildSizes) + { + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutMaxWidth500); + + DrawNames(buildReportToDisplay.BuildSizes); + DrawReadableSizes(buildReportToDisplay.BuildSizes); + DrawPercentages(buildReportToDisplay.BuildSizes); + + GUILayout.EndHorizontal(); + } + } + + void DrawDLLList(BuildReportTool.BuildInfo buildReportToDisplay) + { + BuildReportTool.BuildPlatform buildPlatform = + BuildReportTool.ReportGenerator.GetBuildPlatformFromString(buildReportToDisplay.BuildType, + buildReportToDisplay.BuildTargetUsed); + + var bigLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME); + if (bigLabelStyle == null) + { + bigLabelStyle = GUI.skin.label; + } + + GUILayout.BeginHorizontal(); + + // column 1 + GUILayout.BeginVertical(); + if (_hasMonoDLLsToDisplay) + { + GUILayout.Label(Labels.MONO_DLLS_LABEL, bigLabelStyle); + { + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutMaxWidth500); + DrawNames(buildReportToDisplay.MonoDLLs); + DrawReadableSizes(buildReportToDisplay.MonoDLLs); + GUILayout.EndHorizontal(); + } + + GUILayout.Space(20); + } + + if (_hasUnityEngineDLLsToDisplay) + { + DrawScriptDLLsList(buildReportToDisplay, buildPlatform); + } + + GUILayout.EndVertical(); + + GUILayout.Space(15); + + // column 2 + GUILayout.BeginVertical(); + if (_hasUnityEngineDLLsToDisplay) + { + GUILayout.Label(Labels.UNITY_ENGINE_DLLS_LABEL, bigLabelStyle); + { + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutMaxWidth500); + DrawNames(buildReportToDisplay.UnityEngineDLLs); + DrawReadableSizes(buildReportToDisplay.UnityEngineDLLs); + GUILayout.EndHorizontal(); + } + } + else + { + DrawScriptDLLsList(buildReportToDisplay, buildPlatform); + } + + GUILayout.Space(20); + GUILayout.EndVertical(); + + GUILayout.EndHorizontal(); + } + + void DrawScriptDLLsList(BuildReportTool.BuildInfo buildReportToDisplay, + BuildReportTool.BuildPlatform buildPlatform) + { + if (!_hasScriptDLLsToDisplay) + { + return; + } + + var bigLabelStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.INFO_TITLE_STYLE_NAME); + if (bigLabelStyle == null) + { + bigLabelStyle = GUI.skin.label; + } + + GUILayout.Label(Labels.SCRIPT_DLLS_LABEL, bigLabelStyle); + { + GUILayout.BeginHorizontal(BRT_BuildReportWindow.LayoutMaxWidth500); + DrawNames(buildReportToDisplay.ScriptDLLs); + DrawReadableSizes(buildReportToDisplay.ScriptDLLs); + GUILayout.EndHorizontal(); + } + } + + + void DrawNames(BuildReportTool.SizePart[] list) + { + if (list == null) + { + return; + } + + var listNormalStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_NORMAL_STYLE_NAME); + if (listNormalStyle == null) + { + listNormalStyle = GUI.skin.label; + } + + var listAltStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_NORMAL_ALT_STYLE_NAME); + if (listAltStyle == null) + { + listAltStyle = GUI.skin.label; + } + + GUILayout.BeginVertical(); + bool useAlt = false; + foreach (BuildReportTool.SizePart b in list) + { + if (b.IsTotal) continue; + var styleToUse = useAlt ? listAltStyle : listNormalStyle; + GUILayout.Label(b.Name, styleToUse); + useAlt = !useAlt; + } + + GUILayout.EndVertical(); + } + + void DrawReadableSizes(BuildReportTool.SizePart[] list) + { + if (list == null) + { + return; + } + + var listNormalStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_NORMAL_STYLE_NAME); + if (listNormalStyle == null) + { + listNormalStyle = GUI.skin.label; + } + + var listAltStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_NORMAL_ALT_STYLE_NAME); + if (listAltStyle == null) + { + listAltStyle = GUI.skin.label; + } + + GUILayout.BeginVertical(); + bool useAlt = false; + foreach (BuildReportTool.SizePart b in list) + { + if (b.IsTotal) continue; + var styleToUse = useAlt ? listAltStyle : listNormalStyle; + GUILayout.Label(b.Size, styleToUse); + useAlt = !useAlt; + } + + GUILayout.EndVertical(); + } + + void DrawPercentages(BuildReportTool.SizePart[] list) + { + if (list == null) + { + return; + } + + var listNormalStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_NORMAL_STYLE_NAME); + if (listNormalStyle == null) + { + listNormalStyle = GUI.skin.label; + } + + var listAltStyle = GUI.skin.FindStyle(BuildReportTool.Window.Settings.LIST_NORMAL_ALT_STYLE_NAME); + if (listAltStyle == null) + { + listAltStyle = GUI.skin.label; + } + + GUILayout.BeginVertical(); + bool useAlt = false; + foreach (BuildReportTool.SizePart b in list) + { + if (b.IsTotal) continue; + var styleToUse = useAlt ? listAltStyle : listNormalStyle; + GUILayout.Label(string.Format("{0}%", b.Percentage.ToString(CultureInfo.InvariantCulture)), styleToUse); + useAlt = !useAlt; + } + + GUILayout.EndVertical(); + } + } +} \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_SizeStatsScreen.cs.meta b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_SizeStatsScreen.cs.meta new file mode 100644 index 00000000..67f9dee7 --- /dev/null +++ b/Assets/Third Parties/BuildReport/Scripts/Editor/Window/Screen/BRT_SizeStatsScreen.cs.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: a1eddc9758ce9e145be925a22b65fd09 +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} diff --git a/Assets/Third Parties/BuildReport/VERSION.txt b/Assets/Third Parties/BuildReport/VERSION.txt new file mode 100644 index 00000000..62ec0f05 --- /dev/null +++ b/Assets/Third Parties/BuildReport/VERSION.txt @@ -0,0 +1,654 @@ +Version 3.11.9 +- FIX: Fixed incompatibility with Unity 2021.3.0. + +Version 3.11.8 +- FIX: Fixed incompatibility with Unity 2021.3.12 and below. + +Version 3.11.7 +- FIX: Fixed ArgumentNullException for a project with new SessionData. + +Version 3.11.6 +- FIX: Updated project settings to include new values, such as + whether the build is a clean build or incremental build. +- FIX: Minor fix in the Build Report Tool window GUI + when text is too long. +- FIX: Other minor fixes. + +Version 3.11.5 +- NEW: Asset dependencies for scripts are now populated with + the assembly dll file that they are compiled into. +- NEW: Added texture info (format, width, and height) + in the tooltip of a sprite atlas. +- FIX: Sprites now recognize the asset dependency of + a sprite atlas to them. +- FIX: Fixed the Used Assets list getting scripts that aren't + really in the build. +- FIX: Fixed exceptions when the Editor log file doesn't exist. + +Version 3.11.4 +- NEW: Prefab data in Build Reports now include detection of + static editor flags in the prefab's child GameObjects. + +Version 3.11.3 +- NEW: Added prefab static editor flags to Build Reports. +- FIX: SpriteAtlas V2 files are now added to the Textures filter. +- FIX: Fix when log has timestamp prefix on each line. +- FIX: Replaced usage of EditorPrefs with a serialized xml file. +- FIX: Minor fix on build start time when player data is not rebuilt. + +Version 3.11.2 +- FIX: 2nd attempt to fix wrong path to Editor.log for Linux. + +Version 3.11.1 +- FIX: Fixed wrong path to Editor.log for Linux. + +Version 3.11 +- NEW: Added option to keep a copy of the last successful build's Editor.log, + to allow you to recreate a Build Report even after closing then re-opening + the Unity Editor. This is turned on by default. + +Version 3.10.3 +- FIX: Added Assembly Reference to Build Report Tool, to fix + build errors for users who have a project-wide Assembly Reference + that overrides the Editor folder functionality. + Build scripts that utilize Build Report Tool's API will need to + reference BuildReportTool.asmdef. + +Version 3.10.2 +- FIX: Fixed compatibility with Unity 2023.1+. + +Version 3.10.1 +- FIX: Fixed compatibility with Unity 2022.2+. + +Version 3.10 +- NEW: When manually creating a Build Report from a build script, + you can now specify the folder where the XML files will be saved to. +- NEW: When manually creating a Build Report from a build script, + you can now save any extra string data and have it displayed + in the Build Report window. + +Version 3.9.6 +- FIX: Fixed compatibility with Unity 5 in response to a user request. + +Version 3.9.5 +- NEW: Unused Asset batching can now be turned off (default value is on), + to include all assets in the project when checking for Unused Assets. +- NEW: Default value for Unused Asset batch count is increased + from 1,000 to 10,000. +- NEW: The Size Stats tab will now add a notice message if the + Total Unused Assets Size is only accounting for a batch, + due to the Unused Asset batching. + +Version 3.9.4 +- FIX: Removed console log error message when README.txt or + VERSION.txt is missing. +- FIX: Build Report Window will now be functional (in a limited + manner) even when the GUI Skin is missing. + +Version 3.9.3 +- FIX: Fixed warnings in Unity 2021.2+. + +Version 3.9.2 +- FIX: Fixed textures sometimes mistakenly identified + as used and included in a scene when they really aren't. +- FIX: Fixed null reference exception sometimes occuring + when searching. + +Version 3.9.1 +- FIX: Fixed compile errors for particular users. +- FIX: Fixed null reference exception if a + UnityEditor.Build.Reporting.BuildReport is not available. + +Version 3.9 +- NEW: Mesh data (vertex/polygon count, animation type, etc.) + are now included in the Build Report. When looking at the + Used/Unused Assets List in the Textures Filter, new sortable + columns for the Mesh Data are now shown. + Which ones are shown can be changed from the Options Screen. +- NEW: Added Ping and Explore buttons for each User Package in + the Project Settings Tab. +- FIX: Added compatibility for Unity 2019+ style of Package manifest + lock (i.e. packages-lock.json file). +- FIX: Fixed wrong number sometimes displaying for asset in + Asset List when selected. + +Version 3.8.4 +- NEW: Added a few more info to the Project Settings tab, + coming from UnityEditor.Build.Reporting.BuildReport. +- FIX: Fixed temporary files getting included in the list of build + files, causing an ArgumentOutOfRangeException. + +Version 3.8.3 +- FIX: Fixed Report Generator unexpectedly stopping, when it encounters + a filename with a dash character at the end. +- FIX: Fixed ArgumentException for invalid path chars. + +Version 3.8.2 +- FIX: Fixed null reference exception when no BuildReportFile is + displayed. + +Version 3.8.1 +- NEW: Divider in the Build Process tab is now draggable. +- NEW: Log Messages in the Build Process tab is now paginated. +- CHANGE: Pagination labels are now in a compact format by default + (click on label to toggle back to verbose format). +- FIX: Fixed null reference exception when BuildType of opened + TextureData file is null. +- FIX: Fixed compatibility with Unity 2020.1.5f1. + +Version 3.8 +- NEW: Build Report Generation now records project build time. This + value shows up in the Overview tab. +- NEW: If user is using Unity 2018.1 or newer, data from + UnityEditor.Build.Reporting.BuildReport is now utilized to display + even more information about the build. +- CHANGE: Minor change in Build Report Window's GUI and font usage. + +Version 3.7 +- NEW: Packages used by the project (as seen in the Package Manager) + are now recorded in the Build Report, under the Project Settings. + Note: User Packages only exist in Unity 2018.2 and above. +- NEW: Project Settings tab can now be shown in a multi-column view, + if the window has enough extra width to show more columns. +- NEW: Added option to specify Ignore Search Patterns for the Unused + Assets List. This allows users to stop certain files from showing + up in the Unused Assets List. + +Version 3.6.2 +- FIX: Fixed compatibility with Unity 2020.2+. + +Version 3.6.1 +- FIX: Fixed compatibility with Unity 2019.4. + +Version 3.6 +- NEW: Texture Import Settings are now included in the Build Report. + When looking at the Used/Unused Assets List in the Textures Filter, + new sortable columns for the Texture Import Settings are now shown. + Which ones are shown can be changed from the Options Screen. +- NEW: Added option to disable Fuzzy type search. User can now choose + between 3 search methods: + Basic (asterisk wildcards), Regex, and Fuzzy Search. + For Basic and Regex, there is a checkbox for toggling case-sensitive search. + User also now has the option to search through filenames only, + or use the entire path. +- NEW: Added option to hide Build Report Tool assets from the Unused Assets List. + Normally, Build Report Tool assets are allowed to be seen in the Unused Assets + List to prove that they are not getting included in the build, but if that is + bothersome, there is now the option to hide them. + +Version 3.5.5 +- FIX: Fixed FBX files not being reported as used, if + they were only used as Static in a scene. +- FIX: Made explicit usage of namespace for + System.IO.TextWriter to minimize chance of + naming conflict with user code. + + +Version 3.5.4 +- FIX: Fixed null reference exception when viewing the + Used/Unused Assets List without any generated + Asset Usage data. + + +Version 3.5.3 +- FIX: Fixed bug with showing the wrong category for largest + size taken up in build. + + +Version 3.5.2 +- FIX: Fixed compatibility with Unity 2019.3.15f1. +- FIX: Fixed error when a scene in build is an empty string + (happens when a scene is missing/deleted but the build settings + was not updated). +- CHANGE: Minor reformatting of code. + + +Version 3.5.1 +- FIX: Added fixes for potential null reference exceptions. + + +Version 3.5 +- NEW: In Used/Unused Assets Lists, added the Asset Usage Panel, to + show you why an asset has been included in the build. +- NEW: Added checkbox in Used/Unused Assets List to show only filename + or complete path starting from the project's Assets folder. +- NEW: Added tooltips on asset entries in the Used/Unused Assets List. + Tooltips can show thumbnail previews and/or indicate which scenes + use that asset. +- NEW: Added multi-ping command to select multiple assets (hold Alt + while pinging). +- NEW: Added list of scenes in build. This will later on be used + to hold more info on the build. +- NEW: Added new methods to the ReportGenerator's public API, allowing + custom build scripts to explicitly specify the scenes in the build, + the build location, and the build platform target. Check the file + in BuildReport/CustomBuildScriptExample.txt for example code on how + it's done. + + +Version 3.4.14 +- FIX: Fixed compatibility with Unity 2019.1.0f2. + + +Version 3.4.13 +- FIX: Fixed bug with getting wrong values when generating report + in Unity 2018. + + +Version 3.4.12 +- FIX: Removed wrong options file in the folder. Updated README file + regarding how the saved options file behaves. + + +Version 3.4.11 +- FIX: Fixed an error with getting a duplicate "Total Size" entry in + the size stats. +- NEW: Added optional argument in + BuildReportTool.ReportGenerator.CreateReport to specify a custom + Editor Log file path. + + +Version 3.4.10 +- FIX: Fixed an error when attempting to get file size from log. + + +Version 3.4.9 +- FIX: Further updated compatibility for Unity 2018.3. + + +Version 3.4.8 +- FIX: Updated compatibility for Unity 2018.3. + + +Version 3.4.7 +- FIX: Fixed error when used in a computer whose locale uses comma + for decimal separator. +- FIX: Fixed compile error when used in versions of Unity 5.1 to 5.6. + + +Version 3.4.6 +- FIX: Updated compatibility for Unity 2018. +- FIX: Fixed issue with parsing numbers when the computer is set to a + locale that uses comma as the decimal separator. + + +Version 3.4.5 +- FIX: Fixed Build Report Tool becoming unresponsive when generating a + build report but the actual build's folder doesn't exist anymore. +- FIX: Fixed Build Report Tool becoming unresponsive if its saved options + file was somehow broken. +- FIX: Added fix for assets that show up in both used and unused assets + list. +- CHANGE: Clicking on "Show Build Report" from the Unity Editor will now + close any existing Build Report Window and create a new one. Use this + to restart the Build Report Tool in case it became unresponsive to + user-input. + + +Version 3.4.4 +- FIX: Fixed error preventing user from opening a build report XML file + in Unity 2017.3. +- FIX: Fixed wrong total build size displayed for standalone builds in + Unity 2017. +- FIX: Fixed wrong total used asset size and percentages being displayed. + + +Version 3.4.3 +- FIX: Fixed bug with not getting proper "size before build" for + files that have special symbols in their filenames. +- CHANGE: Changed default value of option "Show calculated sizes of + Used Assets instead of reported sizes" from true to false, since + it's only needed for older versions of Unity. + + +Version 3.4.2 +- FIX: Fixed compatibility with Unity 2017.3 +- FIX: Fixed problem with being unable to load saved Build Report files + when the build data did not find any script DLL files. +- FIX: Fixed layout error in Overview screen. +- CHANGE: Updated build settings gathered in report. + + +Version 3.4.1 +- NEW: Added option to disable Build Report Window's auto re-sorting whenever + the Unity Editor regains focus (when you alt+tab). If this is turned off, + the GUI will then have buttons for manually refreshing the sizes displayed. +- FIX: Fixed asset list sort getting inconsistent results when filenames are + the same. +- CHANGE: Cleaned up the options screen. Removed some options that became + redundant and useless, and added some new ones. + + +Version 3.4 +- NEW: Batchmode builds can now use an API for creating a Build Report, using + BuildReportTool.ReportGenerator.CreateReport(). Call it after + BuildPipeline.BuildPlayer() in your build scripts. +- NEW: Used Assets list now show the asset's size before it was packed into + the build (its file size in the Assets folder). This is to help the user + determine what is happening to the asset's size upon build. +- FIX: Assets list will no longer change sort order whenever alt+tabbing back + to Unity. +- FIX: Fixed percentage values sometimes going over 100%. +- CHANGE: Added a simpler, more straightforward license.txt + + +Version 3.3 +- NEW: Added option to change the number of items in the Top Largest Assets + in the Overview screen. You can set it to 0 to disable it. +- CHANGE: The checkbox for selection of assets in the Used/Unused Assets List + screens are replaced with a ping button. Now, clicking on the asset will + select it. You can use ctrl+click to toggle selection, and shift+click to + select from previously selected up to the current one. +- FIX: Fixed bug with Top Largest Assets not showing the same file size as + in the Used/Unused Assets List screens. + + +Version 3.2.4 +- FIX: Fixed error when filename is empty for Built-in Texture2D assets. +- FIX: Fixed error with some percentage values being over 100% + + +Version 3.2.3 +- FIX: Fixed compatibility with Unity 5.6.0p3 + + +Version 3.2.2 +- NEW: Added option to show calculated size of used assets instead of the + reported size from the build log, as workaround for the Unity bug: + https://issuetracker.unity3d.com/issues/unity-reports-incorrect-textures-size-in-the-editor-dot-log-after-building-on-standalone + Note: The bug has been fixed in Unity 2017.1, 5.5.3p1 and 5.6.0p1. + This option is included for users who can't update to using those new + versions. +- FIX: Fixed compatibility with Unity 2017.1 beta 2. +- FIX: Fixed report generation when percentage is missing in the build log. +- FIX: Percentage for all used assets is now calculated properly. +- FIX: Resources assets that are inside an Editor subfolder are now no + longer mistakenly marked as used assets. +- CHANGE: Streaming Assets is now included in the table for sizes. + + +Version 3.2.1 +- FIX: Threaded file loading is now optional, and turned off by default. + + +Version 3.2 +- NEW: Options are now saved to an XML file named + "BuildReportToolOptions.xml". By default this file is saved inside the + BuildReport folder, but can be moved to, and will be recognized at certain + paths: at the topmost Assets folder, outside the topmost Assets folder, + in the project's ProjectSettings folder, and in the user's My Documents + (inside where Build Report XML files are saved). This is in prioritized + order, so even if there is an options file in the My Documents folder, + if there is also one in the project folder, it will use the one in the + project folder instead. + + +Version 3.1.2 +- FIX: Fixed syntax errors in Unity 5.4 + + +Version 3.1.1 +- FIX: Added compatibility for Unity 5.6.0b4 +- FIX: Got rid of syntax errors when user has their own class named Path. + + +Version 3.1 +- FIX: Added compatibility for Unity 5.5.0f2 +- NEW: Used and Unused Asset Lists now have search textfields + + +Version 3.0.21 +- FIX: Disabled fix for "Resources" assets size for Unity 5.2.1 (and greater) + since Unity fixed it now. + + +Version 3.0.20 +- FIX: Removed unneeded "Recalc Imported Size" button in Used Assets list. +- FIX: Fixed file size of Resources assets in Used Assets list. + + +Version 3.0.19 +- FIX: Got rid of warnings in Unity 5.3.1 +- FIX: Added compatibility for Unity 5.4.0b15 + + +Version 3.0.18 +- FIX: Fixed exception if the last known build path is an empty string + (happens when build was created using BuildPipeline.BuildPlayer) + + +Version 3.0.17 +- FIX: Added fix for null error when generating a report with minimal info. +- FIX: Added fix for bug when getting stuck on the "Getting values..." message. +- FIX: Removed compilation warnings. + + +Version 3.0.16 +- FIX: Fixed bug where file size for Script DLLs sometimes do not show up. +- FIX: Fixed bug where code could not find build path of a Linux build. +- FIX: Fixed bug where code could not determine what platform the build was being made for if it was changed. +- FIX: Fixed a syntax error when using Build Report Tool on Unity 5.2.1 and below. +- FIX: Fixed bug where size for the .unity3d file for WebPlayer build was not showing. +- EDT: Build Size displayed now also indicates the path of the build folder. + + +Version 3.0.15 +- FIX: Fixed bug where assets in Resources folder are not taken into account in the Used Assets list and the Size Assets table. + + +Version 3.0.14 +- FIX: Added compatibility for Unity 5.3 +- FIX: Fixed compatibility with Unity 4.6.5 +- FIX: Fixed bug where report generation could not determine the build type. +- FIX: Fixed bug where texture size was not showing in size stats screen. + + +Version 3.0.13 +- FIX: Added compatibility for Unity 5.2.1 + + +Version 3.0.12 +- FIX: Added fix for report not being created if user is building for iOS without Xcode present. + + +Version 3.0.11 +- FIX: Fixed bug when project is using Multiplatform Toolkit (naming conflict with AspectRatio) + + +Version 3.0.10 +- FIX: Added fix for error of getting aspect ratios used in project settings. + + +Version 3.0.9 +- FIX: Updated build settings shown to be compatible for Unity 5. + + +Version 3.0.8 +- FIX: Fixed small glitch in GUI skin for popup widgets. + + +Version 3.0.7 +- FIX: Fixed code so Settings class is always referred to by its fully qualified name, to prevent code conflicts with user code. + + +Version 3.0.6 +- FIX: Removed automatic correction for Euro symbol in build report xml files since it was causing a syntax error in computers using an East Asian language setting. + + +Version 3.0.4 +- FIX: Ensured no resolution conflict for the BuildReportTool.Window.Settings class. + + +Version 3.0.3 +- EDT: Added workaround for when Unity reports a used asset's size to be 0 when it really isn't, just that the file is so small the value gets rounded off to 0. +- EDT: Added assets in "Resources" folders as a new filter in the default file filters. + + +Version 3.0.2 +- EDT: Project Settings section now also shows script compilation defines made in smcs.rsp, us.rsp, and boo.rsp files. + + +Version 3.0.1 +- EDT: Removed unneeded debug/diagnostic menu entries. + + +Version 3.0 +- EDT: Now requires at least Unity 4.5.0. The old version of Build Report Tool is bundled as a .unitypackage file for users who cannot use Unity 4.5.0 or greater. Note: the next update will remove this supplementary .unitypackage +- EDT: New GUI made to look more like native Unity Editor skin. +- NEW: New report section: "Project Settings", showing the project settings used upon time of building. Recording of Project Settings into the build report can be disabled in the Options. +- NEW: New report section: "Overview", shows a summary of the report. The previous "Overview" section is now renamed to "Size Stats". +- NEW: "Unused Assets" section now differentiates between the imported (i.e. compressed) size of the asset as used by Unity, versus its file size on disk. Note: The size reading on the "Used Assets" section is already the imported size. +- NEW: You can now sort the asset list by file path, filename only, or size. + + +Version 2.2.4 +- FIX: Got rid of problem where Build Report Tool was hanging on report generation for Windows, if gotten build location was a folder instead of the expected executable file (can happen if user has custom build code). + + +Version 2.2.3 +- EDT: Re-uploaded using Unity 3.5.3 + + +Version 2.2.2 +- FIX: Fixed compatibility with Unity 4.5. +- EDT: Reversed ordering of build sizes shown. + + +Version 2.2.1 +- FIX: Any unfinished thread used for file loading will now be forcibly closed when the Build Report Window is closed by the user. +- FIX: Improved code for making sure Build Report Tool assets will not be deleted. This detection is based on the folder names and file names, so don't rename the folders or files in the Build Report Tool. + + +Version 2.2 +- NEW: Revamped size readings in the Overview section. +- NEW: Added option to allow batch deleting of used assets. +- NEW: Added option to choose not to show the Build Report window in batch-mode builds. +- FIX: Fixed compatibility with Unity 4.3 + + +Version 2.1.4 +- FIX: Fixed null exception bug when trying to get Unity Editor log file when using Windows XP Professional x64 Edition. + + +Version 2.1.3 +- FIX: Fixed bug where streaming assets were not accounted for in the "Used Assets" section. The default file filters generated also now has a "Streaming Assets" group. + + +Version 2.1.2 +- FIX: Fixed bug where asset listing did not take entries of built-in assets properly. This also fixes the bug where some assets that are used are mistakenly identified as unused. The default file filter config XML file generated now also takes built-in asset entries into account. Note: Built-in assets as entries in the log file was introduced in Unity 4.2.x +- FIX: Fixed bug where the file filters displayed would always show the one embedded in the opened XML file, even if Build Report Tool was configured to use an external file filter config XML file. + + +Version 2.1.1 +- FIX: Prefixed all source code files with either "BRT_" or "DldUtil_" to ensure no conflicts with source code files of user. +- EDT: Created new namespace DldUtil for the utility classes BigFileReader, and TraverseDirectory. +- EDT: Removed minor warning messages from build unless BRT_SHOW_MINOR_WARNINGS is enabled. + + +Version 2.1 +- EDT: Optimized prefab usage detection. + + +Version 2.0 +- FIX: Unused assets are now processed per batch, to prevent out-of-memory issues on projects with large number of files. This also helps lessen time to generate a build report that has unused assets info. The number of files to process per batch can be changed in the Options. +- EDT: Optimized editor log parsing and file traversing codes. +- FIX: Fixed bug with displaying of escaped HTML characters in asset entry names. + + +Version 1.11 +- FIX: Ensured compatibility with Unity 4.2 + + +Version 1.10 + +- NEW: In the Used/Unused Assets List: Added a "Select All" which will select all asset entries in current filter. +- FIX: Fixed bug with escaped HTML characters in asset entry names. +- FIX: Fixed bug when reloading file filters and current filter displayed would erroneously always reset to first one. + + +Version 1.9 + +- Changed manner of how to select files for size summation: each entry in the asset list now has a checkbox before it. +- NEW: Added batch delete feature: "Delete selected" and "Delete all" buttons for the Unused Assets list. +- NEW: Added bug fix for locating editor log file properly in Windows XP. + + +Version 1.8 + +- NEW: Added "Calculation Levels" in the Options screen. This allows you to skip generating certain parts of the build report at varying levels, to speed up the build report generation process, at the expense of having lesser information. Depending on your situation, this may be the only option if you get out of memory errors when generating build reports. +- NEW: Generating a build report (and opening a build report from file) is now done asynchronously (on a separate thread), minimizing the GUI's unresponsiveness on heavy computations. +- NEW: Added pagination on the asset lists. This is used to minimize lag on the GUI when having hundreds to thousands of entries in asset lists. The number of entries per page can be set in the Options screen. +- NEW: Which native plugins were included in the build is now properly recognized in the asset lists. +- NEW: Added "Help & Info" screen showing the README and VERSION files. +- NEW: Re-ordered layout of options in the Options screen. +- NEW: Properly segregated managed DLLs into the "Script DLLs" category. +- FIX: Added fix for dealing with invalid XML characters. +- FIX: Minor bug fixes. + + +Version 1.7.1 + +- FIX: Fixed error about the missing FileFiltersUsed.xml when opening the Build Report window on a clean environment. + + +Version 1.7 + +- FIX: Moved as much code as possible into its own namespace "BuildReportTool" to minimize naming conflicts with users' codes. +- NEW: File filters are now serialized in an XML file to allow user-configuration. A FileFiltersUsed.xml with default values will be generated in ~/UnityBuildReports/ if it does not exist yet. That file can be used as a starting point for custom file filters. If there is a FileFiltersUsed.xml in the Assets/BuildReport/ folder in your project, it will use that instead to allow per-project file filters. +- FIX: Made a much more reliable way of getting build info automatically after a build. The Build Report Window showing blank information should not happen any more. +- NEW: Added buttons to open folder of path settings in options screen (a la "Reveal in Finder" or "Show in Explorer"). +- NEW: Added version of Unity used to build project in build info. +- FIX: Minor bug fixes. + + +Version 1.6 + +- NEW: Added option to manually override what Editor.log to look at. +- NEW: Added option to select files in an asset list. All selected files have their total file size and percentage displayed. + + +Version 1.5 + +- NEW: Added options screen + - Can now specify if Build Report Tool will collect information automatically or not. + - Can now specify whether svn/git metadata get included in unused assets scan. + - File filters can now be either a drop down box or the previous buttons. +- NEW: Build info can now be serialized (saved) into XML files for later viewing. Top row of buttons now have "Open" and "Save" for accessing and saving XML files, respectively. + - Automatically gathered build info are also automatically saved, either in the user's personal folder (My Documents/Home) or beside the project folder. This can be changed in the options screen. + + +Version 1.4 + +- NEW: The Build Report Window will now show automatically after building your project. +- NEW: The Build Report Window is now a dockable window. Layout is changed, segregated in three major parts: Overview, Used Assets, and Unused Assets. The Asset Breakdown list is now in Used Assets. +- NEW: The Used Assets List (formerly Asset Breakdown List), can now be filtered. There are two types of filters: 1) by file type, and 2) by folder name. + - By file type: the usual textures, models, scripts, sounds category. This is determined by the file type extension name of the file. + - By folder name: you can filter assets based on what folder they reside in. For example, there's a filter to get all assets inside any folder named "Standard Assets". This will filter for any parent folder of the file. + - Filters can be customized by editing FiltersUsed.cs (found in the BuildReport/Scripts/Editor/UserConfigurable folder) and adding/editing the entries. It's pretty much self-explanatory, and the entries there serve as samples on how to use it. Prepend your entries with a dot to indicate that it's a file type filter, or put a slash "/" before and after to indicate that it's a folder type filter. + - NOTE: Take note that upgrading to newer versions in the future may overwrite your FiltersUsed.cs. Backup first before updating the Build Report Tool to a new version. +- NEW: The Build Report Window can now show UNUSED assets in your project. This is for determining files that you no longer use. Same with the Used Assets List, this list can be filtered by file type or folder. The filters used in the Used Assets List is the same one used for this Unused Assets List. +- NOTE: Avatar Mask files (.mask files, used only in Unity 4) are not shown in the Unused Assets List. Right now, there is no reliable way of determining if an Avatar Mask file is used in the build or not. +- NEW: The Build Report Tool can now show prefabs that are not referenced as variables or residing in a Resources folder but nevertheless used in a build. See notes below on "Prefab Instances in Scenes" for details. +- FIX: Fixed a bug when unable to get DLL file size when using Unity 4. + + +Version 1.3 + +- NEW: The DLL list now shows the file size for each DLL, and is sorted by size, large to small. In particular, if you enable size stripping for mscorlib.dll, you'll see the file size of that DLL reflected properly. +- NEW: The DLL list is now separated into two lists: DLLs made from your scripts, and DLLs of standard Mono libraries that your project uses. +- NEW: The total compressed build size now shows for Android builds (this is simply the file size of the resulting .apk file). + + +Version 1.2 + +- NEW: Added support for Pro dark skin. + + +Version 1.1 + +- FIX: Fixed bug when certain asset filenames are not recognized. + + +Version 1.0 + +- Initial release. \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/VERSION.txt.meta b/Assets/Third Parties/BuildReport/VERSION.txt.meta new file mode 100644 index 00000000..86c893d1 --- /dev/null +++ b/Assets/Third Parties/BuildReport/VERSION.txt.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 894f598bdb1492e4ba3dbd83974a081e diff --git a/Assets/Third Parties/BuildReport/license.txt b/Assets/Third Parties/BuildReport/license.txt new file mode 100644 index 00000000..da16b9a9 --- /dev/null +++ b/Assets/Third Parties/BuildReport/license.txt @@ -0,0 +1,15 @@ +Build Report Tool uses the following: + +FuzzyString, an approximate string comparision library. +https://github.com/kdjones/fuzzystring +FuzzyString is licensed under the Eclipse Public License -v 1.0. +A copy of the license can be found in BuildReport/Scripts/Editor/FuzzyString/FuzzyStringLicense.txt + +---- + +MiniJSON, a small JSON parser. Copyright (c) 2013 Calvin Rien +https://github.com/AnomalousUnderdog/MiniJSON.cs +MiniJSON is licensed under the MIT License. +A copy of the license can be found in BuildReport/Scripts/Editor/MiniJSON/MiniJSON.cs + +---- \ No newline at end of file diff --git a/Assets/Third Parties/BuildReport/license.txt.meta b/Assets/Third Parties/BuildReport/license.txt.meta new file mode 100644 index 00000000..67302878 --- /dev/null +++ b/Assets/Third Parties/BuildReport/license.txt.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 98b9179185ffd644ab484b4a7da68ebb +timeCreated: 1512017891 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/vFavorites/VFavoritesLibs.cs b/Assets/Third Parties/vFavorites/VFavoritesLibs.cs index da67d641..d7e51710 100644 --- a/Assets/Third Parties/vFavorites/VFavoritesLibs.cs +++ b/Assets/Third Parties/vFavorites/VFavoritesLibs.cs @@ -318,9 +318,42 @@ namespace VFavorites.Libs - public static T GetFieldValue(this object o, string fieldName, bool exceptionIfNotFound = true) => (T)o.GetFieldValue(fieldName, exceptionIfNotFound); - public static T GetPropertyValue(this object o, string propertyName, bool exceptionIfNotFound = true) => (T)o.GetPropertyValue(propertyName, exceptionIfNotFound); - public static T GetMemberValue(this object o, string memberName, bool exceptionIfNotFound = true) => (T)o.GetMemberValue(memberName, exceptionIfNotFound); + public static T GetFieldValue(this object o, string fieldName, bool exceptionIfNotFound = true) + { + var val = o.GetFieldValue(fieldName, exceptionIfNotFound); + if (val == null) return default; + if (typeof(T) == typeof(List) && val is System.Collections.IEnumerable ienum && !(val is List)) + { + var list = new List(); + foreach (var item in ienum) { try { list.Add((int)(dynamic)item); } catch { list.Add(item.GetHashCode()); } } + return (T)(object)list; + } + return (T)val; + } + public static T GetPropertyValue(this object o, string propertyName, bool exceptionIfNotFound = true) + { + var val = o.GetPropertyValue(propertyName, exceptionIfNotFound); + if (val == null) return default; + if (typeof(T) == typeof(List) && val is System.Collections.IEnumerable ienum && !(val is List)) + { + var list = new List(); + foreach (var item in ienum) { try { list.Add((int)(dynamic)item); } catch { list.Add(item.GetHashCode()); } } + return (T)(object)list; + } + return (T)val; + } + public static T GetMemberValue(this object o, string memberName, bool exceptionIfNotFound = true) + { + var val = o.GetMemberValue(memberName, exceptionIfNotFound); + if (val == null) return default; + if (typeof(T) == typeof(List) && val is System.Collections.IEnumerable ienum && !(val is List)) + { + var list = new List(); + foreach (var item in ienum) { try { list.Add((int)(dynamic)item); } catch { list.Add(item.GetHashCode()); } } + return (T)(object)list; + } + return (T)val; + } public static T InvokeMethod(this object o, string methodName, params object[] parameters) => (T)o.InvokeMethod(methodName, parameters); diff --git a/Assets/Third Parties/vFolders/VFolders.cs b/Assets/Third Parties/vFolders/VFolders.cs index 7058777b..0ba3eea7 100644 --- a/Assets/Third Parties/vFolders/VFolders.cs +++ b/Assets/Third Parties/vFolders/VFolders.cs @@ -96,7 +96,7 @@ namespace VFolders if (rowIndex < 0) return; if (tree.data == null) return; - treeItem = (TreeViewItem)Tree.mi_data_GetItem.Invoke(tree.data, new object[] { rowIndex }); + treeItem = tree.GetItem(rowIndex); } void set_treeItem_byInstanceId() @@ -105,9 +105,18 @@ namespace VFolders if (treeItem != null) return; if (isFavorite || isFavoritesRoot) return; - var instanceId = typeof(AssetDatabase).InvokeMethod("GetMainAssetOrInProgressProxyInstanceID", guid.ToPath()); + object instanceId = null; - treeItem = tree.treeViewController.InvokeMethod("FindItem", instanceId); + try { instanceId = typeof(AssetDatabase).InvokeMethod("GetMainAssetOrInProgressProxyInstanceID", guid.ToPath()); } + catch + { + var asset = AssetDatabase.LoadMainAssetAtPath(guid.ToPath()); + if (asset) instanceId = asset.GetInstanceID(); + } + + if (instanceId == null) return; + + treeItem = tree.FindItem(instanceId); } @@ -1376,10 +1385,48 @@ namespace VFolders public int VisibleRowIndex(int instanceId) => treeViewController.GetPropertyValue("data").InvokeMethod("GetRow", instanceId); - public bool animatingExpansion => treeViewController.GetPropertyValue("animatingExpansion"); + public bool animatingExpansion => treeViewController != null && treeViewController.GetPropertyValue("animatingExpansion", exceptionIfNotFound: false); public bool IsExpanded(TreeViewItem treeItem) => expandedIds.Contains(treeItem.id); + public TreeViewItem GetItem(int rowIndex) + { + if (data == null) return null; + if (rowIndex < 0) return null; + + var item = InvokeTreeViewItem(data, "GetItem", rowIndex); + if (item != null) return item; + + var rows = GetRows(data); + + if (rows is IList list) + return rowIndex < list.Count ? list[rowIndex] as TreeViewItem : null; + + if (rows is IEnumerable enumerable) + { + var i = 0; + + foreach (var row in enumerable) + { + if (i == rowIndex) return row as TreeViewItem; + + i++; + } + } + + return null; + + } + + public TreeViewItem FindItem(object instanceId) + { + if (treeViewController == null) return null; + if (instanceId == null) return null; + + return InvokeTreeViewItem(treeViewController, "FindItem", instanceId); + + } + public List expandQueue_toAnimate = new List(); public List expandQueue_toCollapseAfterAnimation = new List(); @@ -1425,7 +1472,100 @@ namespace VFolders - public static MethodInfo mi_data_GetItem = typeof(Editor).Assembly.GetType("UnityEditor.IMGUI.Controls.ITreeViewDataSource").GetMethod("GetItem", maxBindingFlags); + public static MethodInfo mi_data_GetItem = typeof(Editor).Assembly.GetType("UnityEditor.IMGUI.Controls.ITreeViewDataSource")?.GetMethod("GetItem", maxBindingFlags, null, new[] { typeof(int) }, null); + + static TreeViewItem InvokeTreeViewItem(object target, string methodName, params object[] args) + { + if (target == null) return null; + + var methodInfos = new List(); + + if (methodName == "GetItem" && args.Length == 1 && args[0] is int && mi_data_GetItem != null) + methodInfos.Add(mi_data_GetItem); + + var concreteMethodInfo = GetMethod(target.GetType(), methodName, args.Select(r => r.GetType()).ToArray()); + + if (concreteMethodInfo != null && !methodInfos.Contains(concreteMethodInfo)) + methodInfos.Add(concreteMethodInfo); + + foreach (var methodInfo in methodInfos) + try + { + if (methodInfo.Invoke(target, args) is TreeViewItem treeViewItem) + return treeViewItem; + } + catch { } + + return null; + + } + + static object GetRows(object data) + { + if (data == null) return null; + + var methodInfo = GetMethod(data.GetType(), "GetRows"); + + if (methodInfo != null) + try { return methodInfo.Invoke(data, null); } + catch { } + + return data.GetMemberValue("rows", exceptionIfNotFound: false) ?? + data.GetMemberValue("m_Rows", exceptionIfNotFound: false); + + } + + static MethodInfo GetMethod(Type type, string methodName, params Type[] argumentTypes) + { + if (type == null) return null; + + MethodInfo getMethod(Type curType) + { + foreach (var methodInfo in curType.GetMethods(maxBindingFlags)) + { + if (methodInfo.Name != methodName) continue; + + var parameters = methodInfo.GetParameters(); + + if (parameters.Length != argumentTypes.Length) continue; + + if (parameters.Select(r => r.ParameterType).SequenceEqual(argumentTypes)) + return methodInfo; + + } + + foreach (var methodInfo in curType.GetMethods(maxBindingFlags)) + { + if (methodInfo.Name != methodName) continue; + + var parameters = methodInfo.GetParameters(); + + if (parameters.Length != argumentTypes.Length) continue; + + var compatible = true; + + for (var i = 0; i < parameters.Length; i++) + compatible &= parameters[i].ParameterType.IsAssignableFrom(argumentTypes[i]); + + if (compatible) return methodInfo; + + } + + return null; + + } + + for (var curType = type; curType != null; curType = curType.BaseType) + if (getMethod(curType) is MethodInfo methodInfo) + return methodInfo; + + foreach (var interfaceType in type.GetInterfaces()) + if (getMethod(interfaceType) is MethodInfo methodInfo) + return methodInfo; + + return null; + + } } diff --git a/Assets/Third Parties/vFolders/VFoldersLibs.cs b/Assets/Third Parties/vFolders/VFoldersLibs.cs index 8f09ba10..42bb874b 100644 --- a/Assets/Third Parties/vFolders/VFoldersLibs.cs +++ b/Assets/Third Parties/vFolders/VFoldersLibs.cs @@ -331,9 +331,42 @@ namespace VFolders.Libs - public static T GetFieldValue(this object o, string fieldName, bool exceptionIfNotFound = true) => (T)o.GetFieldValue(fieldName, exceptionIfNotFound); - public static T GetPropertyValue(this object o, string propertyName, bool exceptionIfNotFound = true) => (T)o.GetPropertyValue(propertyName, exceptionIfNotFound); - public static T GetMemberValue(this object o, string memberName, bool exceptionIfNotFound = true) => (T)o.GetMemberValue(memberName, exceptionIfNotFound); + public static T GetFieldValue(this object o, string fieldName, bool exceptionIfNotFound = true) + { + var val = o.GetFieldValue(fieldName, exceptionIfNotFound); + if (val == null) return default; + if (typeof(T) == typeof(List) && val is System.Collections.IEnumerable ienum && !(val is List)) + { + var list = new List(); + foreach (var item in ienum) { try { list.Add((int)(dynamic)item); } catch { list.Add(item.GetHashCode()); } } + return (T)(object)list; + } + return (T)val; + } + public static T GetPropertyValue(this object o, string propertyName, bool exceptionIfNotFound = true) + { + var val = o.GetPropertyValue(propertyName, exceptionIfNotFound); + if (val == null) return default; + if (typeof(T) == typeof(List) && val is System.Collections.IEnumerable ienum && !(val is List)) + { + var list = new List(); + foreach (var item in ienum) { try { list.Add((int)(dynamic)item); } catch { list.Add(item.GetHashCode()); } } + return (T)(object)list; + } + return (T)val; + } + public static T GetMemberValue(this object o, string memberName, bool exceptionIfNotFound = true) + { + var val = o.GetMemberValue(memberName, exceptionIfNotFound); + if (val == null) return default; + if (typeof(T) == typeof(List) && val is System.Collections.IEnumerable ienum && !(val is List)) + { + var list = new List(); + foreach (var item in ienum) { try { list.Add((int)(dynamic)item); } catch { list.Add(item.GetHashCode()); } } + return (T)(object)list; + } + return (T)val; + } public static T InvokeMethod(this object o, string methodName, params object[] parameters) => (T)o.InvokeMethod(methodName, parameters); diff --git a/Assets/Third Parties/vHierarchy/VHierarchyLibs.cs b/Assets/Third Parties/vHierarchy/VHierarchyLibs.cs index d520f07f..3525a0fd 100644 --- a/Assets/Third Parties/vHierarchy/VHierarchyLibs.cs +++ b/Assets/Third Parties/vHierarchy/VHierarchyLibs.cs @@ -366,9 +366,42 @@ namespace VHierarchy.Libs - public static T GetFieldValue(this object o, string fieldName, bool exceptionIfNotFound = true) => (T)o.GetFieldValue(fieldName, exceptionIfNotFound); - public static T GetPropertyValue(this object o, string propertyName, bool exceptionIfNotFound = true) => (T)o.GetPropertyValue(propertyName, exceptionIfNotFound); - public static T GetMemberValue(this object o, string memberName, bool exceptionIfNotFound = true) => (T)o.GetMemberValue(memberName, exceptionIfNotFound); + public static T GetFieldValue(this object o, string fieldName, bool exceptionIfNotFound = true) + { + var val = o.GetFieldValue(fieldName, exceptionIfNotFound); + if (val == null) return default; + if (typeof(T) == typeof(List) && val is System.Collections.IEnumerable ienum && !(val is List)) + { + var list = new List(); + foreach (var item in ienum) { try { list.Add((int)(dynamic)item); } catch { list.Add(item.GetHashCode()); } } + return (T)(object)list; + } + return (T)val; + } + public static T GetPropertyValue(this object o, string propertyName, bool exceptionIfNotFound = true) + { + var val = o.GetPropertyValue(propertyName, exceptionIfNotFound); + if (val == null) return default; + if (typeof(T) == typeof(List) && val is System.Collections.IEnumerable ienum && !(val is List)) + { + var list = new List(); + foreach (var item in ienum) { try { list.Add((int)(dynamic)item); } catch { list.Add(item.GetHashCode()); } } + return (T)(object)list; + } + return (T)val; + } + public static T GetMemberValue(this object o, string memberName, bool exceptionIfNotFound = true) + { + var val = o.GetMemberValue(memberName, exceptionIfNotFound); + if (val == null) return default; + if (typeof(T) == typeof(List) && val is System.Collections.IEnumerable ienum && !(val is List)) + { + var list = new List(); + foreach (var item in ienum) { try { list.Add((int)(dynamic)item); } catch { list.Add(item.GetHashCode()); } } + return (T)(object)list; + } + return (T)val; + } public static T InvokeMethod(this object o, string methodName, params object[] parameters) => (T)o.InvokeMethod(methodName, parameters); diff --git a/Assets/Third Parties/vHierarchy/vHierarchy Data.asset b/Assets/Third Parties/vHierarchy/vHierarchy Data.asset new file mode 100644 index 00000000..c5418237 --- /dev/null +++ b/Assets/Third Parties/vHierarchy/vHierarchy Data.asset @@ -0,0 +1,27 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3a9752b0c8e144801967e6897679604b, type: 3} + m_Name: vHierarchy Data + m_EditorClassIdentifier: VHierarchy::VHierarchy.VHierarchyData + sceneDatas_byGuid: + keys: + - f6f338855ad36644f8143c150efa4089 + values: + - goDatas_byGlobalId: + keys: + - globalObjectIdString: GlobalObjectId_V1-2-f6f338855ad36644f8143c150efa4089-1997343488-0 + - globalObjectIdString: GlobalObjectId_V1-2-f6f338855ad36644f8143c150efa4089-1142785471-0 + values: + - colorIndex: 9 + iconNameOrGuid: Terrain Icon + - colorIndex: 4 + iconNameOrGuid: AvatarMask On Icon diff --git a/Assets/Third Parties/vHierarchy/vHierarchy Data.asset.meta b/Assets/Third Parties/vHierarchy/vHierarchy Data.asset.meta new file mode 100644 index 00000000..797678c7 --- /dev/null +++ b/Assets/Third Parties/vHierarchy/vHierarchy Data.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a6f37a37b2229e3419f073c28944b77a +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/vHierarchy/vHierarchy Palette.asset b/Assets/Third Parties/vHierarchy/vHierarchy Palette.asset new file mode 100644 index 00000000..eea6e323 --- /dev/null +++ b/Assets/Third Parties/vHierarchy/vHierarchy Palette.asset @@ -0,0 +1,78 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 61290d425f1c94a8cbfb56f754ca6757, type: 3} + m_Name: vHierarchy Palette + m_EditorClassIdentifier: VHierarchy::VHierarchy.VHierarchyPalette + colors: + - {r: 0.16, g: 0.16, b: 0.16, a: 1} + - {r: 0.609, g: 0.231, b: 0.23100014, a: 0.1} + - {r: 0.55825, g: 0.471625, b: 0.21175, a: 0.1} + - {r: 0.34999996, g: 0.5075, b: 0.1925, a: 0.1} + - {r: 0.1925, g: 0.5075, b: 0.27124998, a: 0.1} + - {r: 0.1925, g: 0.50750005, b: 0.5075, a: 0.1} + - {r: 0.259875, g: 0.36618757, b: 0.685125, a: 0.1} + - {r: 0.4550001, g: 0.25024998, b: 0.65975, a: 0.1} + - {r: 0.53287494, g: 0.20212498, b: 0.4501876, a: 0.1} + colorsEnabled: 1 + iconRows: + - builtinIcons: + - Folder Icon + - Canvas Icon + - AvatarMask On Icon + - cs Script Icon + - StandaloneInputModule Icon + - EventSystem Icon + - Terrain Icon + - ScriptableObject Icon + customIcons: [] + enabled: 1 + - builtinIcons: + - Camera Icon + - ParticleSystem Icon + - TrailRenderer Icon + - Material Icon + - ReflectionProbe Icon + customIcons: [] + enabled: 1 + - builtinIcons: + - Light Icon + - DirectionalLight Icon + - LightmapParameters Icon + - LightProbes Icon + customIcons: [] + enabled: 1 + - builtinIcons: + - Rigidbody Icon + - BoxCollider Icon + - SphereCollider Icon + - CapsuleCollider Icon + - WheelCollider Icon + - MeshCollider Icon + customIcons: [] + enabled: 1 + - builtinIcons: + - AudioSource Icon + - AudioClip Icon + - AudioListener Icon + - AudioEchoFilter Icon + - AudioReverbZone Icon + customIcons: [] + enabled: 1 + - builtinIcons: + - PreMatCube + - PreMatSphere + - PreMatCylinder + - PreMatQuad + - Favorite + - Settings Icon + customIcons: [] + enabled: 1 diff --git a/Assets/Third Parties/vHierarchy/vHierarchy Palette.asset.meta b/Assets/Third Parties/vHierarchy/vHierarchy Palette.asset.meta new file mode 100644 index 00000000..7b253ae6 --- /dev/null +++ b/Assets/Third Parties/vHierarchy/vHierarchy Palette.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7eadb4f5b6328a54688feff6c64815b3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Third Parties/vTabs/VTabs.cs b/Assets/Third Parties/vTabs/VTabs.cs index c22cf90a..12cbf535 100644 --- a/Assets/Third Parties/vTabs/VTabs.cs +++ b/Assets/Third Parties/vTabs/VTabs.cs @@ -575,11 +575,16 @@ namespace VTabs void lockToFolder_twoColumns() { if (!isLocked) return; + if (!projectBrowserWrappingSupported) return; if (window.GetMemberValue("m_ViewMode") != 1) return; if (folderGuid.IsNullOrEmpty()) return; - var iid = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(folderGuid)).GetInstanceID(); + var folder = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(folderGuid)); + + if (!folder) return; + + var iid = folder.GetInstanceID(); window.GetFieldValue("m_ListAreaState").SetFieldValue("m_SelectedInstanceIDs", new List { iid }); @@ -592,6 +597,7 @@ namespace VTabs void lockToFolder_oneColumn() { if (!isLocked) return; + if (!projectBrowserWrappingSupported) return; if (window.GetMemberValue("m_ViewMode") != 0) return; if (folderGuid.IsNullOrEmpty()) return; @@ -600,7 +606,11 @@ namespace VTabs var folderPath = folderGuid.ToPath(); - var folderIid = AssetDatabase.LoadAssetAtPath(folderPath).GetInstanceID(); + var folder = AssetDatabase.LoadAssetAtPath(folderPath); + + if (!folder) return; + + var folderIid = folder.GetInstanceID(); data.SetMemberValue("m_rootInstanceID", folderIid); @@ -905,19 +915,38 @@ namespace VTabs static void UpdateGUIWrappingForBrowser(EditorWindow browser) { - if (!browser.hasFocus) return; + if (!browser) return; + + var hostView = browser.GetMemberValue("m_Parent", exceptionIfNotFound: false); + if (hostView == null) return; + + var isWrapped = hostView.GetMemberValue("m_OnGUI", exceptionIfNotFound: false)?.Method.Name == nameof(WrappedBrowserOnGUI); + + if (!projectBrowserWrappingSupported) + { + if (isWrapped) + RestoreDefaultBrowserGUI(browser); + + if (browser.GetPropertyValue("isLocked", exceptionIfNotFound: false)) + { + browser.SetPropertyValue("isLocked", false, exceptionIfNotFound: false); + UpdateBrowserTitle(browser); + } + + return; + } + if (mi_VFavorites_CanBrowserBeWrapped != null && mi_VFavorites_CanBrowserBeWrapped.Invoke(null, new[] { browser }).Equals(false)) return; var isLocked = browser.GetMemberValue("isLocked"); - var isWrapped = browser.GetMemberValue("m_Parent").GetMemberValue("m_OnGUI").Method.Name == nameof(WrappedBrowserOnGUI); + + if (!browser.hasFocus) return; void wrap() { if (!isLocked) return; if (isWrapped) return; - var hostView = browser.GetMemberValue("m_Parent"); - var newDelegate = typeof(VTabs).GetMethod(nameof(WrappedBrowserOnGUI), maxBindingFlags).CreateDelegate(t_EditorWindowDelegate, browser); hostView.SetMemberValue("m_OnGUI", newDelegate); @@ -933,13 +962,7 @@ namespace VTabs if (isLocked) return; if (!isWrapped) return; - var hostView = browser.GetMemberValue("m_Parent"); - - var originalDelegate = hostView.InvokeMethod("CreateDelegate", "OnGUI"); - - hostView.SetMemberValue("m_OnGUI", originalDelegate); - - browser.Repaint(); + RestoreDefaultBrowserGUI(browser); } @@ -949,6 +972,27 @@ namespace VTabs } static void UpdateGUIWrappingForAllBrowsers() => allBrowsers.ForEach(r => UpdateGUIWrappingForBrowser(r)); + static bool projectBrowserWrappingSupported => !Application.unityVersion.StartsWith("6000.3"); + + static void RestoreDefaultBrowserGUI(EditorWindow browser) + { + var hostView = browser.GetMemberValue("m_Parent", exceptionIfNotFound: false); + + if (hostView == null) return; + + try + { + var originalDelegate = hostView.InvokeMethod("CreateDelegate", "OnGUI"); + + hostView.SetMemberValue("m_OnGUI", originalDelegate); + + browser.Repaint(); + + } + catch { } + + } + static void WrappedBrowserOnGUI(EditorWindow browser) { var headerHeight = 26; diff --git a/Assets/Third Parties/vTabs/VTabsLibs.cs b/Assets/Third Parties/vTabs/VTabsLibs.cs index 063608ea..72f12fbf 100644 --- a/Assets/Third Parties/vTabs/VTabsLibs.cs +++ b/Assets/Third Parties/vTabs/VTabsLibs.cs @@ -308,9 +308,42 @@ namespace VTabs.Libs - public static T GetFieldValue(this object o, string fieldName, bool exceptionIfNotFound = true) => (T)o.GetFieldValue(fieldName, exceptionIfNotFound); - public static T GetPropertyValue(this object o, string propertyName, bool exceptionIfNotFound = true) => (T)o.GetPropertyValue(propertyName, exceptionIfNotFound); - public static T GetMemberValue(this object o, string memberName, bool exceptionIfNotFound = true) => (T)o.GetMemberValue(memberName, exceptionIfNotFound); + public static T GetFieldValue(this object o, string fieldName, bool exceptionIfNotFound = true) + { + var val = o.GetFieldValue(fieldName, exceptionIfNotFound); + if (val == null) return default; + if (typeof(T) == typeof(List) && val is System.Collections.IEnumerable ienum && !(val is List)) + { + var list = new List(); + foreach (var item in ienum) { try { list.Add((int)(dynamic)item); } catch { list.Add(item.GetHashCode()); } } + return (T)(object)list; + } + return (T)val; + } + public static T GetPropertyValue(this object o, string propertyName, bool exceptionIfNotFound = true) + { + var val = o.GetPropertyValue(propertyName, exceptionIfNotFound); + if (val == null) return default; + if (typeof(T) == typeof(List) && val is System.Collections.IEnumerable ienum && !(val is List)) + { + var list = new List(); + foreach (var item in ienum) { try { list.Add((int)(dynamic)item); } catch { list.Add(item.GetHashCode()); } } + return (T)(object)list; + } + return (T)val; + } + public static T GetMemberValue(this object o, string memberName, bool exceptionIfNotFound = true) + { + var val = o.GetMemberValue(memberName, exceptionIfNotFound); + if (val == null) return default; + if (typeof(T) == typeof(List) && val is System.Collections.IEnumerable ienum && !(val is List)) + { + var list = new List(); + foreach (var item in ienum) { try { list.Add((int)(dynamic)item); } catch { list.Add(item.GetHashCode()); } } + return (T)(object)list; + } + return (T)val; + } public static T InvokeMethod(this object o, string methodName, params object[] parameters) => (T)o.InvokeMethod(methodName, parameters); diff --git a/Assets/_Recovery/0 (15).unity b/Assets/_Recovery/0 (15).unity new file mode 100644 index 00000000..decbe07d --- /dev/null +++ b/Assets/_Recovery/0 (15).unity @@ -0,0 +1,847 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 10 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 13 + m_BakeOnSceneLoad: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 2 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 1 + m_PVRFilteringGaussRadiusAO: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 20201, guid: 0000000000000000f000000000000000, type: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 3 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + buildHeightMesh: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &1731533 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1731534} + - component: {fileID: 1731536} + - component: {fileID: 1731535} + m_Layer: 0 + m_Name: _PlayerDataManger + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1731534 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731533} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1142785474} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1731535 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731533} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: -1552182283, guid: e725a070cec140c4caffb81624c8c787, type: 3} + m_Name: + m_EditorClassIdentifier: Fusion.Runtime.dll::Fusion.NetworkObject + SortKey: 2400956606 + ObjectInterest: 1 + Flags: 262145 + NestedObjects: [] + NetworkedBehaviours: + - {fileID: 1731536} + ForceRemoteRenderTimeframe: 0 +--- !u!114 &1731536 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1731533} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: b3d9934ebd60c9c4ea3e464b77fd7ae0, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::_PlayerDataManager + _Players: + _items: [] +--- !u!1 &200732282 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 200732284} + - component: {fileID: 200732283} + - component: {fileID: 200732285} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &200732283 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 200732282} + m_Enabled: 1 + serializedVersion: 12 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_InnerSpotAngle: 21.80208 + m_CookieSize2D: {x: 0.5, y: 0.5} + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_CullingMatrixOverride: + e00: 1 + e01: 0 + e02: 0 + e03: 0 + e10: 0 + e11: 1 + e12: 0 + e13: 0 + e20: 0 + e21: 0 + e22: 1 + e23: 0 + e30: 0 + e31: 0 + e32: 0 + e33: 1 + m_UseCullingMatrixOverride: 0 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingLayerMask: 1 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} + m_UseBoundingSphereOverride: 0 + m_UseViewFrustumForShadowCasterCull: 1 + m_ForceVisible: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 + m_LightUnit: 1 + m_LuxAtDistance: 1 + m_EnableSpotReflector: 1 +--- !u!4 &200732284 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 200732282} + serializedVersion: 2 + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 3.5546, y: -2.7962599, z: 4.39807} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1368410213} + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} +--- !u!114 &200732285 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 200732282} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 474bcb49853aa07438625e644c072ee6, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.UniversalAdditionalLightData + m_UsePipelineSettings: 1 + m_AdditionalLightsShadowResolutionTier: 2 + m_CustomShadowLayers: 0 + m_LightCookieSize: {x: 1, y: 1} + m_LightCookieOffset: {x: 0, y: 0} + m_SoftShadowQuality: 0 + m_RenderingLayersMask: + serializedVersion: 0 + m_Bits: 1 + m_ShadowRenderingLayersMask: + serializedVersion: 0 + m_Bits: 1 + m_Version: 4 + m_LightLayerMask: 1 + m_ShadowLayerMask: 1 + m_RenderingLayers: 1 + m_ShadowRenderingLayers: 1 +--- !u!1 &390662298 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 390662299} + m_Layer: 0 + m_Name: Container + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &390662299 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 390662298} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1439162687} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!4 &442028708 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 2207112960010484425, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + m_PrefabInstance: {fileID: 3886963620680427248} + m_PrefabAsset: {fileID: 0} +--- !u!1 &1142785471 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1142785474} + m_Layer: 0 + m_Name: _MANAGER + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1142785474 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1142785471} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 345, y: 194, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1731534} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1185172173 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1185172175} + - component: {fileID: 1185172174} + m_Layer: 0 + m_Name: Global Volume + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1185172174 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1185172173} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 172515602e62fb746b5d573b38a5fe58, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Core.Runtime::UnityEngine.Rendering.Volume + m_IsGlobal: 1 + priority: 0 + blendDistance: 0 + weight: 1 + sharedProfile: {fileID: 11400000, guid: 66d4e46db74eed8459b64c8476ecb24a, type: 2} +--- !u!4 &1185172175 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1185172173} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.7860072, y: -0.3591547, z: 10.121648} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1368410213} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1313417866 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1313417867} + m_Layer: 0 + m_Name: _MAP + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1313417867 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1313417866} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1439162687} + - {fileID: 1437922952} + - {fileID: 2064388939} + m_Father: {fileID: 1997343489} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1368410212 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1368410213} + m_Layer: 0 + m_Name: _Enviroment + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1368410213 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1368410212} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 200732284} + - {fileID: 1185172175} + m_Father: {fileID: 1997343489} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1437922948 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1437922952} + - component: {fileID: 1437922951} + - component: {fileID: 1437922950} + - component: {fileID: 1437922949} + m_Layer: 6 + m_Name: Ground + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!64 &1437922949 +MeshCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1437922948} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 5 + m_Convex: 0 + m_CookingOptions: 30 + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &1437922950 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1437922948} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: e2e2684e969402049b87d7f81417c603, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1437922951 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1437922948} + m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} +--- !u!4 &1437922952 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1437922948} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: -10, z: 0} + m_LocalScale: {x: 50, y: 1, z: 50} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1313417867} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1439162686 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1439162687} + - component: {fileID: 1439162688} + m_Layer: 0 + m_Name: MazeController + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1439162687 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1439162686} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 390662299} + m_Father: {fileID: 1313417867} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1439162688 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1439162686} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f30df611110713742ab984f5bead5d88, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::Hallucinate.GameSetup.Maze.MazeRenderer + visualProfile: {fileID: 11400000, guid: 15b745b0bb979b84ea937c679ee0f1ed, type: 2} + floorHeight: 3.5 +--- !u!1 &1997343488 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1997343489} + m_Layer: 0 + m_Name: _SCENE + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1997343489 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1997343488} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -3.5546, y: 5.79626, z: -4.39807} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 442028708} + - {fileID: 1313417867} + - {fileID: 1368410213} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2064388938 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2064388939} + - component: {fileID: 2064388940} + m_Layer: 0 + m_Name: MazeManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2064388939 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2064388938} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1313417867} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &2064388940 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2064388938} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 3607adabe0c29c34591af73b414eb17a, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::Hallucinate.GameSetup.Maze.MazeManager + mazes: + - scale: 1 + - scale: 1 + floorHeight: 1.5 + connectionsPerFloor: 2 + selectedAlgorithm: 0 + width: 30 + depth: 30 + debugMode: 1 + visualizationInterval: 0.05 + mazeRenderer: {fileID: 1439162688} + mazeContainer: {fileID: 390662299} + straightManHoleLadder: {fileID: 919132149155446097, guid: bea94d2de5b89ea4cba759f4a73149d4, type: 3} + straightManHoleUp: {fileID: 919132149155446097, guid: df993452c905ccd4a8db16303509c4aa, type: 3} + deadendManHoleLadder: {fileID: 919132149155446097, guid: c7b8e72ff8d936143a810e1baa494428, type: 3} + deadendManHoleUp: {fileID: 919132149155446097, guid: 1e0fe08755c202644ab57e3ecb75ea61, type: 3} +--- !u!1001 &3886963620680427248 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 1997343489} + m_Modifications: + - target: {fileID: 2207112960010484425, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: m_LocalPosition.x + value: 3.5546 + objectReference: {fileID: 0} + - target: {fileID: 2207112960010484425, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: m_LocalPosition.y + value: -4.79626 + objectReference: {fileID: 0} + - target: {fileID: 2207112960010484425, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: m_LocalPosition.z + value: -5.60193 + objectReference: {fileID: 0} + - target: {fileID: 2207112960010484425, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2207112960010484425, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: m_LocalRotation.x + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 2207112960010484425, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: m_LocalRotation.y + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 2207112960010484425, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: m_LocalRotation.z + value: -0 + objectReference: {fileID: 0} + - target: {fileID: 2207112960010484425, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2207112960010484425, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2207112960010484425, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 2771692228748849855, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: m_Name + value: Main Camera + objectReference: {fileID: 0} + - target: {fileID: 2771692228748849855, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: m_Layer + value: 8 + objectReference: {fileID: 0} + - target: {fileID: 3657229949309460766, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: fpvTarget + value: + objectReference: {fileID: 0} + - target: {fileID: 3657229949309460766, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: inputReader + value: + objectReference: {fileID: 0} + - target: {fileID: 3657229949309460766, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: sensitivity + value: 10 + objectReference: {fileID: 0} + - target: {fileID: 3657229949309460766, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: followTarget + value: + objectReference: {fileID: 0} + - target: {fileID: 3657229949309460766, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: 'characterRenderers.Array.data[0]' + value: + objectReference: {fileID: 0} + - target: {fileID: 3657229949309460766, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: 'characterFading.characterRenderers.Array.data[0]' + value: + objectReference: {fileID: 0} + - target: {fileID: 8391577239842762580, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} + propertyPath: m_RenderPostProcessing + value: 1 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: fb7874830b9e56341bf88f2a1123c677, type: 3} +--- !u!1660057539 &9223372036854775807 +SceneRoots: + m_ObjectHideFlags: 0 + m_Roots: + - {fileID: 1997343489} + - {fileID: 1142785474} diff --git a/Assets/_Recovery/0 (15).unity.meta b/Assets/_Recovery/0 (15).unity.meta new file mode 100644 index 00000000..acdadeb0 --- /dev/null +++ b/Assets/_Recovery/0 (15).unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3dff56f4eb44d924abde5b5d1d1253d4 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset index 9b03129c..7389b4a8 100644 --- a/ProjectSettings/ProjectSettings.asset +++ b/ProjectSettings/ProjectSettings.asset @@ -836,7 +836,7 @@ PlayerSettings: webWasm2023: 0 webEnableSubmoduleStrippingCompatibility: 0 scriptingDefineSymbols: - Standalone: FUSION_LOGLEVEL_INFO;FUSION_WEAVER;FUSION2;FUSION_2;FUSION_2_0;FUSION_2_0_11;FUSION_2_OR_NEWER;FUSION_2_0_OR_NEWER;INVECTOR_BASIC;INVECTOR_MELEE;INVECTOR_SHOOTER + Standalone: FUSION_LOGLEVEL_INFO;FUSION_WEAVER;FUSION2;FUSION_2;FUSION_2_0;FUSION_2_0_11;FUSION_2_OR_NEWER;FUSION_2_0_OR_NEWER;INVECTOR_BASIC;INVECTOR_MELEE;INVECTOR_SHOOTER;ODIN_INSPECTOR;ODIN_INSPECTOR_3;ODIN_INSPECTOR_3_1;ODIN_INSPECTOR_3_2;ODIN_INSPECTOR_3_3 additionalCompilerArguments: {} platformArchitecture: {} scriptingBackend: