AkiraPixelWind/Assets/Scripts/Editor/AssetBundleBorwer/AssetBundleBrowserMain.cs
2022-12-29 18:20:40 +08:00

252 lines
8.2 KiB
C#

using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
[assembly: System.Runtime.CompilerServices.InternalsVisibleToAttribute("Unity.AssetBundleBrowser.Editor.Tests")]
namespace AssetBundleBrowser
{
public class AssetBundleBrowserMain : EditorWindow, IHasCustomMenu, ISerializationCallbackReceiver
{
private static AssetBundleBrowserMain s_instance = null;
internal static AssetBundleBrowserMain instance
{
get
{
if (s_instance == null)
s_instance = GetWindow<AssetBundleBrowserMain>();
return s_instance;
}
}
internal const float kButtonWidth = 150;
enum Mode
{
Browser,
Builder,
Inspect,
}
[SerializeField]
Mode m_Mode;
[SerializeField]
int m_DataSourceIndex;
[SerializeField]
internal AssetBundleManageTab m_ManageTab;
[SerializeField]
internal AssetBundleBuildTab m_BuildTab;
[SerializeField]
internal AssetBundleInspectTab m_InspectTab;
private Texture2D m_RefreshTexture;
const float k_ToolbarPadding = 15;
const float k_MenubarPadding = 32;
[MenuItem("Window/AssetBundle Browser", priority = 2050)]
static void ShowWindow()
{
s_instance = null;
instance.titleContent = new GUIContent("AssetBundles");
instance.Show();
}
[SerializeField]
internal bool multiDataSource = false;
List<AssetBundleDataSource.ABDataSource> m_DataSourceList = null;
public virtual void AddItemsToMenu(GenericMenu menu)
{
if(menu != null)
menu.AddItem(new GUIContent("Custom Sources"), multiDataSource, FlipDataSource);
}
internal void FlipDataSource()
{
multiDataSource = !multiDataSource;
}
private void OnEnable()
{
Rect subPos = GetSubWindowArea();
if(m_ManageTab == null)
m_ManageTab = new AssetBundleManageTab();
m_ManageTab.OnEnable(subPos, this);
if(m_BuildTab == null)
m_BuildTab = new AssetBundleBuildTab();
m_BuildTab.OnEnable(this);
if (m_InspectTab == null)
m_InspectTab = new AssetBundleInspectTab();
m_InspectTab.OnEnable(subPos);
m_RefreshTexture = EditorGUIUtility.FindTexture("Refresh");
InitDataSources();
}
private void InitDataSources()
{
//determine if we are "multi source" or not...
multiDataSource = false;
m_DataSourceList = new List<AssetBundleDataSource.ABDataSource>();
foreach (var info in AssetBundleDataSource.ABDataSourceProviderUtility.CustomABDataSourceTypes)
{
m_DataSourceList.AddRange(info.GetMethod("CreateDataSources").Invoke(null, null) as List<AssetBundleDataSource.ABDataSource>);
}
if (m_DataSourceList.Count > 1)
{
multiDataSource = true;
if (m_DataSourceIndex >= m_DataSourceList.Count)
m_DataSourceIndex = 0;
AssetBundleModel.Model.DataSource = m_DataSourceList[m_DataSourceIndex];
}
}
private void OnDisable()
{
if (m_BuildTab != null)
m_BuildTab.OnDisable();
if (m_InspectTab != null)
m_InspectTab.OnDisable();
}
public void OnBeforeSerialize()
{
}
public void OnAfterDeserialize()
{
}
private Rect GetSubWindowArea()
{
float padding = k_MenubarPadding;
if (multiDataSource)
padding += k_MenubarPadding * 0.5f;
Rect subPos = new Rect(0, padding, position.width, position.height - padding);
return subPos;
}
private void Update()
{
switch (m_Mode)
{
case Mode.Builder:
break;
case Mode.Inspect:
break;
case Mode.Browser:
default:
m_ManageTab.Update();
break;
}
}
private void OnGUI()
{
ModeToggle();
switch(m_Mode)
{
case Mode.Builder:
m_BuildTab.OnGUI();
break;
case Mode.Inspect:
m_InspectTab.OnGUI(GetSubWindowArea());
break;
case Mode.Browser:
default:
m_ManageTab.OnGUI(GetSubWindowArea());
break;
}
}
void ModeToggle()
{
GUILayout.BeginHorizontal();
GUILayout.Space(k_ToolbarPadding);
bool clicked = false;
switch(m_Mode)
{
case Mode.Browser:
clicked = GUILayout.Button(m_RefreshTexture);
if (clicked)
m_ManageTab.ForceReloadData();
break;
case Mode.Builder:
GUILayout.Space(m_RefreshTexture.width + k_ToolbarPadding);
break;
case Mode.Inspect:
clicked = GUILayout.Button(m_RefreshTexture);
if (clicked)
m_InspectTab.RefreshBundles();
break;
}
float toolbarWidth = position.width - k_ToolbarPadding * 4 - m_RefreshTexture.width;
//string[] labels = new string[2] { "Configure", "Build"};
string[] labels = new string[3] { "Configure", "Build", "Inspect" };
m_Mode = (Mode)GUILayout.Toolbar((int)m_Mode, labels, "LargeButton", GUILayout.Width(toolbarWidth) );
GUILayout.FlexibleSpace();
GUILayout.EndHorizontal();
if(multiDataSource)
{
//GUILayout.BeginArea(r);
GUILayout.BeginHorizontal();
using (new EditorGUILayout.HorizontalScope(EditorStyles.toolbar))
{
GUILayout.Label("Bundle Data Source:");
GUILayout.FlexibleSpace();
var c = new GUIContent(string.Format("{0} ({1})", AssetBundleModel.Model.DataSource.Name, AssetBundleModel.Model.DataSource.ProviderName), "Select Asset Bundle Set");
if (GUILayout.Button(c , EditorStyles.toolbarPopup) )
{
GenericMenu menu = new GenericMenu();
for (int index = 0; index < m_DataSourceList.Count; index++)
{
var ds = m_DataSourceList[index];
if (ds == null)
continue;
if (index > 0)
menu.AddSeparator("");
var counter = index;
menu.AddItem(new GUIContent(string.Format("{0} ({1})", ds.Name, ds.ProviderName)), false,
() =>
{
m_DataSourceIndex = counter;
var thisDataSource = ds;
AssetBundleModel.Model.DataSource = thisDataSource;
m_ManageTab.ForceReloadData();
}
);
}
menu.ShowAsContext();
}
GUILayout.FlexibleSpace();
if (AssetBundleModel.Model.DataSource.IsReadOnly())
{
GUIStyle tbLabel = new GUIStyle(EditorStyles.toolbar);
tbLabel.alignment = TextAnchor.MiddleRight;
GUILayout.Label("Read Only", tbLabel);
}
}
GUILayout.EndHorizontal();
//GUILayout.EndArea();
}
}
}
}