BITFALL/Assets/GSpawn - Level Designer/Scripts/Prefabs/PrefabLibProfile.cs

399 lines
12 KiB
C#

#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
using System;
using System.Collections.Generic;
namespace GSpawn
{
public class PrefabLibProfile : Profile
{
[SerializeField]
private List<PrefabLib> _libs = new List<PrefabLib>();
[NonSerialized]
private List<string> _stringBuffer = new List<string>();
public int numLibs { get { return _libs.Count; } }
public string getLibDisplayName(PrefabLib lib)
{
return lib.libName;
}
public void onPrefabAssetWillBeDeleted(GameObject prefabAsset)
{
foreach (var lib in _libs)
lib.onPrefabAssetWillBeDeleted(prefabAsset);
}
public PrefabLib findOwnerLibOfPrefab(PluginPrefab prefab)
{
foreach (var lib in _libs)
{
if (lib.containsPrefab(prefab)) return lib;
}
return null;
}
public PrefabLib findOwnerLibOfPrefabAsset(GameObject prefabAsset)
{
foreach (var lib in _libs)
{
if (lib.containsPrefab(prefabAsset)) return lib;
}
return null;
}
public void findOwnerLibsOfPrefabAsset(GameObject prefabAsset, List<PrefabLib> libs)
{
libs.Clear();
foreach (var lib in _libs)
{
if (lib.containsPrefab(prefabAsset)) libs.Add(lib);
}
}
public void findOwnerLibsWithAnyPrefabAsset(List<GameObject> prefabAssets, List<PrefabLib> libs)
{
libs.Clear();
foreach (var lib in _libs)
{
if (lib.containsAnyPrefabAsset(prefabAssets)) libs.Add(lib);
}
}
public void findOwnerLibsOfPrefabs(List<PluginPrefab> pluginPrefabs, List<PrefabLib> libs)
{
libs.Clear();
foreach(var lib in _libs)
{
if (lib.containsAnyPrefab(pluginPrefabs)) libs.Add(lib);
}
}
public void getAllPrefabAssets(List<GameObject> prefabAssets)
{
prefabAssets.Clear();
int libCount = numLibs;
for (int i = 0; i < libCount; ++i)
{
var lib = _libs[i];
lib.getAllPrefabAssets(prefabAssets, true);
}
}
public void getAllPrefabAssets(List<GameObject> prefabAssets, List<PrefabLib> libs)
{
libs.Clear();
prefabAssets.Clear();
int libCount = numLibs;
for (int i = 0; i < libCount; ++i)
{
var lib = _libs[i];
int numPrefabs = lib.numPrefabs;
for (int j = 0; j < numPrefabs; ++j)
{
prefabAssets.Add(lib.getPrefab(j).prefabAsset);
libs.Add(lib);
}
}
}
public PluginPrefab getPrefab(GameObject prefabAsset)
{
foreach (var lib in _libs)
{
PluginPrefab prefab = lib.getPrefab(prefabAsset);
if (prefab != null) return prefab;
}
return null;
}
public PluginPrefab getPrefab(PluginGuid guid)
{
foreach (var lib in _libs)
{
PluginPrefab prefab = lib.getPrefab(guid);
if (prefab != null) return prefab;
}
return null;
}
public void performPrefabAction(Action<PluginPrefab> prefabAction)
{
foreach (var lib in _libs)
lib.performPrefabAction(prefabAction);
}
public PrefabLib createLib(string name)
{
if (string.IsNullOrEmpty(name)) return null;
getLibNames(_stringBuffer, null);
//name = UniqueNameGen.generate(name, _stringBuffer);
UndoEx.saveEnabledState();
UndoEx.enabled = false;
var newLib = UndoEx.createScriptableObject<PrefabLib>();
newLib.libName = name;
newLib.name = name;
AssetDbEx.addObjectToAsset(newLib, this);
UndoEx.record(this);
_libs.Add(newLib);
UndoEx.restoreEnabledState();
return newLib;
}
public PrefabLib cloneLib(PrefabLib prefabLib, PrefabLib.CloneFlags cloneFlags)
{
if (containsLib(prefabLib))
{
UndoEx.saveEnabledState();
UndoEx.enabled = false;
UndoEx.record(this);
PrefabLib clonedLib = createLib(prefabLib.libName);
if ((cloneFlags & PrefabLib.CloneFlags.Parent) != 0) clonedLib.parentLib = prefabLib.parentLib;
int numPrefabs = prefabLib.numPrefabs;
for (int i = 0; i < numPrefabs; ++i)
clonedLib.createPrefab(prefabLib.getPrefab(i).prefabAsset);
UndoEx.restoreEnabledState();
return clonedLib;
}
return null;
}
public void renameLib(PrefabLib lib, string newName)
{
if (!string.IsNullOrEmpty(newName) && containsLib(lib) && lib.libName != newName)
{
getLibNames(_stringBuffer, lib.libName);
UndoEx.record(this);
lib.libName = newName;// UniqueNameGen.generate(newName, _stringBuffer);
lib.name = lib.libName;
}
}
public bool containsLib(PrefabLib lib)
{
if (lib == null) return false;
return _libs.Contains(lib);
}
public int deleteNullPrefabs()
{
int numRemoved = 0;
foreach (var lib in _libs)
numRemoved += lib.deleteNullPrefabs();
return numRemoved;
}
public void deleteAllLibs()
{
if (numLibs != 0)
{
var parentLibs = new List<PrefabLib>();
PrefabLib.getParentLibs(_libs, parentLibs);
var libsToRemove = new List<PrefabLib>();
var children = new List<PrefabLib>();
foreach (var parentLib in parentLibs)
{
if (containsLib(parentLib))
{
libsToRemove.Add(parentLib);
parentLib.allChildrenDFS(children);
foreach (var child in children)
_libs.Remove(child);
}
}
// Note: We need to do this in steps in order to allow Undo/Redo to work correctly.
foreach (var lib in libsToRemove)
{
lib.parentLib = null;
lib.deleteAllPrefabs(); // Note: Remove prefabs here. Not in the lib's OnDestroy callback as it won't work with Undo/Redo.
}
UndoEx.record(this);
foreach (var lib in libsToRemove)
_libs.Remove(lib);
foreach (var lib in libsToRemove)
UndoEx.destroyObjectImmediate(lib);
EditorUtility.SetDirty(this);
}
}
public void deleteEmptyLibHierarchies()
{
for (int i = 0; i < _libs.Count;)
{
int oldNumLibs = numLibs;
if (_libs[i].isHierarchyEmpty()) deleteLib(_libs[i]);
if (oldNumLibs == numLibs) ++i;
}
}
public void deleteEmptyLibHierarchies(List<PrefabLib> rootLibs)
{
for (int i = 0; i < _libs.Count;)
{
int oldNumLibs = numLibs;
foreach(var rootLib in rootLibs)
{
if (_libs[i].isHierarchyEmpty() &&
_libs[i].isChildOf(rootLib))
{
deleteLib(_libs[i]);
break;
}
}
if (oldNumLibs == numLibs) ++i;
}
}
public void deleteLib(PrefabLib lib)
{
if (containsLib(lib))
{
var libsToRemove = new List<PrefabLib>();
libsToRemove.Add(lib);
lib.appendAllChildrenDFS(libsToRemove);
// Note: We need to do this in steps in order to allow Undo/Redo to work correctly.
foreach (var l in libsToRemove)
{
l.parentLib = null;
l.deleteAllPrefabs(); // Note: Remove prefabs here. Not in the lib's OnDestroy callback as it won't work with Undo/Redo.
}
UndoEx.record(this);
foreach (var l in libsToRemove)
_libs.Remove(l);
foreach (var l in libsToRemove)
UndoEx.destroyObjectImmediate(l);
EditorUtility.SetDirty(this);
}
}
public void deleteLibs(List<PrefabLib> libs)
{
if (libs.Count != 0)
{
var parentLibs = new List<PrefabLib>();
PrefabLib.getParentLibs(libs, parentLibs);
var libsToRemove = new List<PrefabLib>();
var children = new List<PrefabLib>();
foreach (var parentLib in parentLibs)
{
if (containsLib(parentLib))
{
libsToRemove.Add(parentLib);
parentLib.allChildrenDFS(children);
foreach (var child in children)
libsToRemove.Add(child);
}
}
// Note: We need to do this in steps in order to allow Undo/Redo to work correctly.
foreach (var lib in libsToRemove)
{
lib.parentLib = null;
lib.deleteAllPrefabs(); // Note: Remove prefabs here. Not in the lib's OnDestroy callback as it won't work with Undo/Redo.
}
UndoEx.record(this);
foreach (var lib in libsToRemove)
_libs.Remove(lib);
foreach (var lib in libsToRemove)
UndoEx.destroyObjectImmediate(lib);
EditorUtility.SetDirty(this);
}
}
public PrefabLib getLib(int index)
{
return _libs[index];
}
public void getRootLibs(List<PrefabLib> libs)
{
libs.Clear();
foreach (var lib in _libs)
if (lib.parentLib == null) libs.Add(lib);
}
public void getLibs(List<PrefabLib> libs)
{
libs.Clear();
libs.AddRange(_libs);
}
public void getLibNames(List<string> libNames, string ignoredName)
{
libNames.Clear();
foreach (var lib in _libs)
{
if (lib.libName != ignoredName)
libNames.Add(lib.libName);
}
}
public void getLibDisplayNames(List<string> libNames)
{
libNames.Clear();
foreach (var lib in _libs)
libNames.Add(getLibDisplayName(lib));
}
public void getSelectedLibs(List<PrefabLib> libs)
{
libs.Clear();
foreach (var lib in _libs)
{
if (lib.uiSelected) libs.Add(lib);
}
}
public void regeneratePrefabPreviews()
{
foreach (var lib in _libs)
{
lib.regeneratePrefabPreviews();
}
}
private void OnEnable()
{
deleteNullPrefabs();
}
private void OnDestroy()
{
deleteAllLibs();
}
}
}
#endif