WuhuIslandTesting/Library/PackageCache/com.unity.addressables@1.21.12/Editor/GUI/AddressableAssetGroupInspector.cs
2025-01-07 02:06:59 +01:00

317 lines
12 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using UnityEditor.AddressableAssets.Settings;
using UnityEditor.AddressableAssets.Settings.GroupSchemas;
using UnityEngine;
// ReSharper disable DelegateSubtraction
namespace UnityEditor.AddressableAssets.GUI
{
[CustomEditor(typeof(AddressableAssetGroup)), CanEditMultipleObjects]
class AddressableAssetGroupInspector : Editor
{
AddressableAssetGroup m_GroupTarget;
List<Type> m_SchemaTypes;
// Used for Multi-group editing
AddressableAssetGroup[] m_GroupTargets;
// Stores a 2D list of schemas found on the other selected asset groups.
// Each schema list contains only schemas of the same type (e.g. BundledAssetGroupSchema).
List<List<AddressableAssetGroupSchema>> m_GroupSchemas;
private GUIContent m_InspectAASettings = new GUIContent("Inspect Top Level Settings", "View Addressable Asset Settings");
void OnEnable()
{
m_GroupTargets = new AddressableAssetGroup[targets.Length];
for (int i = 0; i < targets.Length; i++)
{
m_GroupTargets[i] = targets[i] as AddressableAssetGroup;
}
// use item with largest index as base
m_GroupTarget = m_GroupTargets[m_GroupTargets.Length - 1];
if (m_GroupTarget != null)
{
m_GroupTarget.Settings.OnModification += OnSettingsModification;
m_SchemaTypes = AddressableAssetUtility.GetTypes<AddressableAssetGroupSchema>();
}
}
void OnDisable()
{
if (m_GroupTarget != null)
m_GroupTarget.Settings.OnModification -= OnSettingsModification;
}
void OnSettingsModification(AddressableAssetSettings settings, AddressableAssetSettings.ModificationEvent evnt, object o)
{
switch (evnt)
{
case AddressableAssetSettings.ModificationEvent.GroupAdded:
case AddressableAssetSettings.ModificationEvent.GroupRemoved:
case AddressableAssetSettings.ModificationEvent.GroupRenamed:
case AddressableAssetSettings.ModificationEvent.BatchModification:
case AddressableAssetSettings.ModificationEvent.ActiveProfileSet:
case AddressableAssetSettings.ModificationEvent.GroupSchemaAdded:
case AddressableAssetSettings.ModificationEvent.GroupSchemaModified:
case AddressableAssetSettings.ModificationEvent.GroupSchemaRemoved:
Repaint();
break;
}
}
void DrawDivider()
{
GUILayout.Space(1.5f);
Rect r = EditorGUILayout.GetControlRect(GUILayout.Height(2.5f));
r.x = 0;
r.width = EditorGUIUtility.currentViewWidth;
r.height = 1;
Color color = new Color(0.6f, 0.6f, 0.6f, 1.333f);
if (EditorGUIUtility.isProSkin)
{
color.r = 0.12f;
color.g = 0.12f;
color.b = 0.12f;
}
EditorGUI.DrawRect(r, color);
}
public override bool RequiresConstantRepaint()
{
return true;
}
public override void OnInspectorGUI()
{
try
{
serializedObject.Update();
DrawSchemas(GetSchemasToDraw());
serializedObject.ApplyModifiedProperties();
}
catch (UnityEngine.ExitGUIException)
{
throw;
}
catch (Exception e)
{
Debug.LogException(e);
}
}
List<AddressableAssetGroupSchema> GetSchemasToDraw()
{
List<AddressableAssetGroupSchema> values = new List<AddressableAssetGroupSchema>();
if (m_GroupTargets == null || m_GroupTargets.Length == 0)
return values;
values.AddRange(m_GroupTarget.Schemas);
foreach (var group in m_GroupTargets)
{
if (group != m_GroupTarget)
values = values.Intersect(group.Schemas, new GroupSchemasCompare()).ToList();
}
return values;
}
List<AddressableAssetGroupSchema> GetSchemasForOtherTargets(AddressableAssetGroupSchema schema)
{
List<AddressableAssetGroupSchema> values = m_GroupTargets
.Where(t => t.HasSchema(schema.GetType()) && t != m_GroupTarget)
.Select(t => t.GetSchema(schema.GetType())).ToList();
return values;
}
void DrawSchemas(List<AddressableAssetGroupSchema> schemas)
{
GUILayout.Space(6);
EditorGUILayout.BeginHorizontal();
var activeProfileName = m_GroupTarget.Settings.profileSettings.GetProfileName(m_GroupTarget.Settings.activeProfileId);
if (string.IsNullOrEmpty(activeProfileName))
{
m_GroupTarget.Settings.activeProfileId = null; //this will reset it to default.
activeProfileName = m_GroupTarget.Settings.profileSettings.GetProfileName(m_GroupTarget.Settings.activeProfileId);
}
EditorGUILayout.PrefixLabel("Active Profile: " + activeProfileName);
if (GUILayout.Button(m_InspectAASettings))
{
EditorGUIUtility.PingObject(AddressableAssetSettingsDefaultObject.Settings);
Selection.activeObject = AddressableAssetSettingsDefaultObject.Settings;
}
EditorGUILayout.EndHorizontal();
GUILayout.Space(6);
bool doDrawDivider = false;
EditorGUILayout.BeginVertical();
for (int i = 0; i < schemas.Count; i++)
{
var schema = schemas[i];
var schemaType = schema.GetType();
int currentIndex = i;
string foldoutKey = "Addressables.GroupSchema." + schemaType.Name;
bool foldoutActive = AddressablesGUIUtility.GetFoldoutValue(foldoutKey);
string helpUrl = null;
if (schemaType == typeof(BundledAssetGroupSchema))
helpUrl = AddressableAssetUtility.GenerateDocsURL("editor/groups/ContentPackingAndLoadingSchema.html");
if (schemaType == typeof(ContentUpdateGroupSchema))
helpUrl = AddressableAssetUtility.GenerateDocsURL("editor/groups/UpdateRestrictionSchema.html");
Action helpAction = () => { Application.OpenURL(helpUrl); };
Action<Rect> menuAction = rect =>
{
var menu = new GenericMenu();
menu.AddItem(AddressableAssetGroup.RemoveSchemaContent, false, () =>
{
if (EditorUtility.DisplayDialog("Remove selected schema?",
"Are you sure you want to remove " + AddressableAssetUtility.GetCachedTypeDisplayName(schemaType) + " schema?\n\nYou cannot undo this action.", "Yes", "No"))
{
m_GroupTarget.RemoveSchema(schemaType);
}
});
menu.AddItem(AddressableAssetGroup.MoveSchemaUpContent, false, () =>
{
if (currentIndex > 0)
{
m_GroupTarget.Schemas[currentIndex] = m_GroupTarget.Schemas[currentIndex - 1];
m_GroupTarget.Schemas[currentIndex - 1] = schema;
}
});
menu.AddItem(AddressableAssetGroup.MoveSchemaDownContent, false, () =>
{
if (currentIndex < m_GroupTarget.Schemas.Count - 1)
{
m_GroupTarget.Schemas[currentIndex] = m_GroupTarget.Schemas[currentIndex + 1];
m_GroupTarget.Schemas[currentIndex + 1] = schema;
}
});
menu.AddSeparator("");
menu.AddItem(AddressableAssetGroup.ExpandSchemaContent, false, () =>
{
if (foldoutActive == false)
{
foldoutActive = true;
AddressablesGUIUtility.SetFoldoutValue(foldoutKey, foldoutActive);
}
foreach (var targetSchema in m_GroupTarget.Schemas)
targetSchema.ShowAllProperties();
});
menu.ShowAsContext();
};
EditorGUI.BeginChangeCheck();
foldoutActive = AddressablesGUIUtility.BeginFoldoutHeaderGroupWithHelp(foldoutActive, new GUIContent(AddressableAssetUtility.GetCachedTypeDisplayName(schemaType)),
string.IsNullOrEmpty(helpUrl) ? null : helpAction, 0, m_GroupTarget.ReadOnly ? null : menuAction);
if (EditorGUI.EndChangeCheck())
AddressablesGUIUtility.SetFoldoutValue(foldoutKey, foldoutActive);
EditorGUI.EndFoldoutHeaderGroup();
if (foldoutActive)
{
try
{
EditorGUI.indentLevel++;
if (m_GroupTargets.Length == 1)
schema.OnGUI();
else
schema.OnGUIMultiple(GetSchemasForOtherTargets(schema));
EditorGUI.indentLevel--;
}
catch (Exception se)
{
Debug.LogException(se);
}
GUILayout.Space(10);
}
if (foldoutActive && i == schemas.Count - 1)
doDrawDivider = true;
}
if (doDrawDivider)
DrawDivider();
GUILayout.Space(10);
EditorGUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
GUIStyle addSchemaButton = new GUIStyle(UnityEngine.GUI.skin.button);
addSchemaButton.fontSize = 12;
addSchemaButton.fixedWidth = 225;
addSchemaButton.fixedHeight = 22;
if (!m_GroupTarget.ReadOnly)
{
if (EditorGUILayout.DropdownButton(new GUIContent("Add Schema", "Add new schema to this group."), FocusType.Keyboard, addSchemaButton))
{
var menu = new GenericMenu();
for (int i = 0; i < m_SchemaTypes.Count; i++)
{
var type = m_SchemaTypes[i];
if (m_GroupTarget.GetSchema(type) == null)
{
menu.AddItem(new GUIContent(AddressableAssetUtility.GetCachedTypeDisplayName(type), ""), false, () => OnAddSchema(type));
}
else
{
menu.AddDisabledItem(new GUIContent(AddressableAssetUtility.GetCachedTypeDisplayName(type), ""), true);
}
}
menu.ShowAsContext();
}
}
GUILayout.FlexibleSpace();
EditorGUILayout.EndHorizontal();
EditorGUILayout.EndVertical();
}
void OnAddSchema(Type schemaType, bool multiSelect = false)
{
if (targets.Length > 1)
{
foreach (var t in m_GroupTargets)
if (!t.HasSchema(schemaType))
t.AddSchema(schemaType);
}
else
m_GroupTarget.AddSchema(schemaType);
}
class GroupSchemasCompare : IEqualityComparer<AddressableAssetGroupSchema>
{
public bool Equals(AddressableAssetGroupSchema x, AddressableAssetGroupSchema y)
{
if (x.GetType() == y.GetType())
return true;
return false;
}
public int GetHashCode(AddressableAssetGroupSchema obj)
{
return obj.GetType().GetHashCode();
}
}
}
}