using UnityEditor;
|
using UnityEditor.IMGUI.Controls;
|
using System.Collections.Generic;
|
using System.IO;
|
using System.Runtime.Serialization.Formatters.Binary;
|
|
namespace UnityEngine.AssetBundles
|
{
|
[System.Serializable]
|
public class AssetBundleInspectTab
|
{
|
Rect m_Position;
|
[SerializeField]
|
private Vector2 m_ScrollPosition;
|
|
[SerializeField]
|
private InspectTabData m_Data;
|
|
|
private List<string> m_BundleList = new List<string>();
|
private InspectBundleTree m_BundleTreeView;
|
[SerializeField]
|
private TreeViewState m_BundleTreeState;
|
|
public Editor m_Editor = null;
|
|
//[SerializeField]
|
private List<AssetBundle> m_LoadedBundles;
|
|
private SingleBundleInspector m_SingleInspector;
|
|
|
public AssetBundleInspectTab()
|
{
|
m_LoadedBundles = new List<AssetBundle>();
|
m_SingleInspector = new SingleBundleInspector();
|
}
|
|
public void SaveBundle(AssetBundle b)
|
{
|
m_LoadedBundles.Add(b);
|
}
|
|
public void OnEnable(Rect pos, EditorWindow parent)
|
{
|
m_Position = pos;
|
if (m_Data == null)
|
m_Data = new InspectTabData();
|
|
//LoadData...
|
var dataPath = System.IO.Path.GetFullPath(".");
|
dataPath = dataPath.Replace("\\", "/");
|
dataPath += "/Library/AssetBundleBrowserInspect.dat";
|
|
if (File.Exists(dataPath))
|
{
|
BinaryFormatter bf = new BinaryFormatter();
|
FileStream file = File.Open(dataPath, FileMode.Open);
|
var data = bf.Deserialize(file) as InspectTabData;
|
if (data != null)
|
m_Data = data;
|
file.Close();
|
}
|
|
|
if (m_BundleList == null)
|
m_BundleList = new List<string>();
|
|
if (m_BundleTreeState == null)
|
m_BundleTreeState = new TreeViewState();
|
m_BundleTreeView = new InspectBundleTree(m_BundleTreeState, this);
|
m_BundleTreeView.Reload();
|
|
|
RefreshBundles();
|
|
}
|
|
public void OnDisable()
|
{
|
ClearData();
|
|
var dataPath = System.IO.Path.GetFullPath(".");
|
dataPath = dataPath.Replace("\\", "/");
|
dataPath += "/Library/AssetBundleBrowserInspect.dat";
|
|
BinaryFormatter bf = new BinaryFormatter();
|
FileStream file = File.Create(dataPath);
|
|
bf.Serialize(file, m_Data);
|
file.Close();
|
}
|
|
public void OnGUI(Rect pos)
|
{
|
m_Position = pos;
|
|
if (Application.isPlaying)
|
{
|
var style = GUI.skin.label;
|
style.alignment = TextAnchor.MiddleCenter;
|
style.wordWrap = true;
|
GUI.Label(
|
new Rect(m_Position.x + 1f, m_Position.y + 1f, m_Position.width - 2f, m_Position.height - 2f),
|
new GUIContent("Inspector unavailable while in PLAY mode"),
|
style);
|
}
|
else
|
{
|
OnGUIEditor();
|
}
|
}
|
|
private void OnGUIEditor()
|
{
|
//////input path
|
EditorGUILayout.Space();
|
GUILayout.BeginHorizontal();
|
var originalPath = m_Data.m_BundlePath;
|
m_Data.m_BundlePath = EditorGUILayout.TextField("Bundle Path", m_Data.m_BundlePath);
|
|
if (GUILayout.Button("Browse", GUILayout.MaxWidth(75f)))
|
BrowseForFolder();
|
GUILayout.EndHorizontal();
|
EditorGUILayout.Space();
|
|
if (originalPath != m_Data.m_BundlePath)
|
{
|
RefreshBundles();
|
}
|
|
if (m_BundleList.Count > 0)
|
{
|
m_BundleTreeView.OnGUI(new Rect(m_Position.x, m_Position.y + 30, m_Position.width / 2.0f, m_Position.height - 30));
|
m_SingleInspector.OnGUI(new Rect(m_Position.x + m_Position.width / 2.0f, m_Position.y + 30, m_Position.width / 2.0f, m_Position.height - 30));
|
}
|
}
|
|
//TODO - this is largely copied from BuildTab, should maybe be shared code.
|
private void BrowseForFolder()
|
{
|
var newPath = EditorUtility.OpenFolderPanel("Bundle Folder", m_Data.m_BundlePath, string.Empty);
|
if (!string.IsNullOrEmpty(newPath))
|
{
|
var gamePath = System.IO.Path.GetFullPath(".");//TODO - FileUtil.GetProjectRelativePath??
|
gamePath = gamePath.Replace("\\", "/");
|
if (newPath.StartsWith(gamePath))
|
newPath = newPath.Remove(0, gamePath.Length + 1);
|
m_Data.m_BundlePath = newPath;
|
}
|
}
|
public void RefreshBundles()
|
{
|
ClearData();
|
|
//DesignDebug.Log("Did someone say refresh?");
|
//do some loading
|
LoadBundles();
|
}
|
private void ClearData()
|
{
|
m_SingleInspector.SetBundle(null);
|
|
foreach (var bundle in m_LoadedBundles)
|
{
|
if (bundle != null) //get into this situation on a rare restart weirdness.
|
bundle.Unload(true);
|
}
|
m_LoadedBundles.Clear();
|
}
|
private void AddFilePathToList(string path)
|
{
|
//////////////////////////////////////
|
/// code to handle appended hash things
|
//var files = Directory.GetFiles(path);
|
//Array.Sort(files);
|
//int size = files.Length;
|
//for (int i = 0; i < size; i++)
|
//{
|
// ... do something...
|
//}
|
//////////////////////////////////////
|
|
|
foreach (var file in Directory.GetFiles(path))
|
{
|
if (Path.GetExtension(file) == ".manifest")
|
{
|
var f = file.Substring(0, file.LastIndexOf('.')).Replace('\\', '/');
|
if (File.Exists(f))
|
m_BundleList.Add(f);
|
else
|
DebugEx.Log("Expected bundle not found: " + f + ". Note: Browser does not yet support inspecting bundles with hash appended.");
|
}
|
}
|
|
foreach (var dir in Directory.GetDirectories(path))
|
{
|
AddFilePathToList(dir);
|
}
|
}
|
private void LoadBundles()
|
{
|
if (m_Data.m_BundlePath == string.Empty)
|
return;
|
|
//find assets
|
if (m_BundleList == null)
|
m_BundleList = new List<string>();
|
|
m_BundleList.Clear();
|
if (Directory.Exists(m_Data.m_BundlePath))
|
{
|
AddFilePathToList(m_Data.m_BundlePath);
|
}
|
m_BundleTreeView.Reload();
|
}
|
|
public List<string> BundleList
|
{ get { return m_BundleList; } }
|
|
|
public void SetBundleItem(InspectTreeItem selected)
|
{
|
if (selected == null)
|
m_SingleInspector.SetBundle(null);
|
else
|
m_SingleInspector.SetBundle(selected.bundle, selected.bundlePath);
|
}
|
|
[System.Serializable]
|
public class InspectTabData
|
{
|
public string m_BundlePath = string.Empty;
|
}
|
}
|
}
|