254 lines
7.1 KiB
C#
254 lines
7.1 KiB
C#
#if UNITY_EDITOR
|
|
using UnityEngine;
|
|
using System.Collections.Generic;
|
|
using UnityEditor;
|
|
using System;
|
|
|
|
namespace GSpawn
|
|
{
|
|
public class TileRuleProfile : Profile
|
|
{
|
|
[SerializeField]
|
|
private List<TileRule> _tileRules = new List<TileRule>();
|
|
|
|
[NonSerialized]
|
|
private List<TileRulePrefab> _tileRulePrefabBuffer = new List<TileRulePrefab>();
|
|
[NonSerialized]
|
|
private List<TileRule> _tileRuleBuffer = new List<TileRule>();
|
|
|
|
public int numTileRules { get { return _tileRules.Count;} }
|
|
|
|
public void onPrefabAssetWillBeDeleted(GameObject prefabAsset)
|
|
{
|
|
foreach (var rule in _tileRules)
|
|
rule.onPrefabAssetWillBeDeleted(prefabAsset);
|
|
}
|
|
|
|
public int calcTotalNumberOfPrefabs()
|
|
{
|
|
int numPrefabs = 0;
|
|
foreach (var rule in _tileRules)
|
|
numPrefabs += rule.numPrefabs;
|
|
|
|
return numPrefabs;
|
|
}
|
|
|
|
public void resetPrefabPreviews()
|
|
{
|
|
PluginProgressDialog.begin("Refreshing Prefab Previews");
|
|
for (int ruleIndex = 0; ruleIndex < numTileRules; ++ruleIndex)
|
|
{
|
|
var tileRule = _tileRules[ruleIndex];
|
|
PluginProgressDialog.updateItemProgress("Tile rule: " + ruleIndex,
|
|
(ruleIndex + 1) / (float)numTileRules);
|
|
|
|
tileRule.resetPrefabPreviews();
|
|
}
|
|
PluginProgressDialog.end();
|
|
}
|
|
|
|
public void regeneratePrefabPreviews()
|
|
{
|
|
PluginProgressDialog.begin("Regenerating Prefab Previews");
|
|
for (int ruleIndex = 0; ruleIndex < numTileRules; ++ruleIndex)
|
|
{
|
|
var tileRule = _tileRules[ruleIndex];
|
|
PluginProgressDialog.updateItemProgress("Tile rule: " + ruleIndex,
|
|
(ruleIndex + 1) / (float)numTileRules);
|
|
|
|
tileRule.regeneratePrefabPreviews();
|
|
}
|
|
PluginProgressDialog.end();
|
|
}
|
|
|
|
public TileRule createTileRule()
|
|
{
|
|
UndoEx.saveEnabledState();
|
|
UndoEx.enabled = false;
|
|
|
|
var tileRule = UndoEx.createScriptableObject<TileRule>();
|
|
tileRule.name = "TileRule";
|
|
|
|
AssetDbEx.addObjectToAsset(tileRule, this);
|
|
_tileRules.Add(tileRule);
|
|
|
|
EditorUtility.SetDirty(this);
|
|
UndoEx.restoreEnabledState();
|
|
|
|
return tileRule;
|
|
}
|
|
|
|
public void deleteTileRule(TileRule tileRule)
|
|
{
|
|
if (tileRule != null)
|
|
{
|
|
if (containsTileRule(tileRule))
|
|
{
|
|
UndoEx.record(this);
|
|
|
|
_tileRules.Remove(tileRule);
|
|
|
|
UndoEx.destroyObjectImmediate(tileRule);
|
|
EditorUtility.SetDirty(this);
|
|
}
|
|
}
|
|
}
|
|
|
|
public void deleteAllTileRules()
|
|
{
|
|
UndoEx.record(this);
|
|
_tileRuleBuffer.Clear();
|
|
|
|
if (_tileRules.Count != 0)
|
|
{
|
|
_tileRuleBuffer.AddRange(_tileRules);
|
|
_tileRules.Clear();
|
|
}
|
|
|
|
foreach (var tileRule in _tileRuleBuffer)
|
|
UndoEx.destroyObjectImmediate(tileRule);
|
|
|
|
EditorUtility.SetDirty(this);
|
|
}
|
|
|
|
public bool containsTileRule(TileRule tileRule)
|
|
{
|
|
return _tileRules.Contains(tileRule);
|
|
}
|
|
|
|
public TileRule getTileRule(int index)
|
|
{
|
|
return _tileRules[index];
|
|
}
|
|
|
|
public int deleteNullPrefabs()
|
|
{
|
|
int numDeleted = 0;
|
|
foreach (var rule in _tileRules)
|
|
numDeleted += rule.deleteNullPrefabs();
|
|
|
|
return numDeleted;
|
|
}
|
|
|
|
public void deletePrefabs(List<PluginPrefab> pluginPrefabs)
|
|
{
|
|
foreach(var rule in _tileRules)
|
|
{
|
|
rule.getPrefabs(pluginPrefabs, _tileRulePrefabBuffer);
|
|
rule.deletePrefabs(_tileRulePrefabBuffer);
|
|
}
|
|
}
|
|
|
|
public void deletePrefabs(List<TileRulePrefab> tileRulePrefabs)
|
|
{
|
|
foreach (var rule in _tileRules)
|
|
rule.deletePrefabs(tileRulePrefabs);
|
|
}
|
|
|
|
public bool containsPrefab(GameObject prefabAsset)
|
|
{
|
|
foreach(var rule in _tileRules)
|
|
{
|
|
if (rule.containsPrefab(prefabAsset)) return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public void moveRuleUp(TileRule tileRule)
|
|
{
|
|
if (numTileRules <= 1) return;
|
|
|
|
int ruleIndex = _tileRules.IndexOf(tileRule);
|
|
if (ruleIndex <= 0) return;
|
|
|
|
UndoEx.record(this);
|
|
TileRule temp = _tileRules[ruleIndex - 1];
|
|
_tileRules[ruleIndex - 1] = tileRule;
|
|
_tileRules[ruleIndex] = temp;
|
|
}
|
|
|
|
public void moveRuleToTop(TileRule tileRule)
|
|
{
|
|
if (numTileRules <= 1) return;
|
|
|
|
int ruleIndex = _tileRules.IndexOf(tileRule);
|
|
if (ruleIndex <= 0) return;
|
|
|
|
UndoEx.record(this);
|
|
int above = ruleIndex - 1;
|
|
while (above >= 0)
|
|
{
|
|
int below = above + 1;
|
|
_tileRules[below] = _tileRules[above];
|
|
--above;
|
|
}
|
|
|
|
_tileRules[0] = tileRule;
|
|
}
|
|
|
|
public void moveRuleToBottom(TileRule tileRule)
|
|
{
|
|
if (numTileRules <= 1) return;
|
|
|
|
int ruleIndex = _tileRules.IndexOf(tileRule);
|
|
if (ruleIndex < 0 || ruleIndex == (numTileRules - 1)) return;
|
|
|
|
UndoEx.record(this);
|
|
int below = ruleIndex + 1;
|
|
while (below < numTileRules)
|
|
{
|
|
int above = below - 1;
|
|
_tileRules[above] = _tileRules[below];
|
|
++below;
|
|
}
|
|
|
|
_tileRules[numTileRules - 1] = tileRule;
|
|
}
|
|
|
|
public void moveRuleDown(TileRule tileRule)
|
|
{
|
|
if (numTileRules <= 1) return;
|
|
|
|
int ruleIndex = _tileRules.IndexOf(tileRule);
|
|
if (ruleIndex < 0 || ruleIndex == (numTileRules - 1)) return;
|
|
|
|
UndoEx.record(this);
|
|
TileRule temp = _tileRules[ruleIndex + 1];
|
|
_tileRules[ruleIndex + 1] = tileRule;
|
|
_tileRules[ruleIndex] = temp;
|
|
}
|
|
|
|
public bool containsRule(TileRuleType ruleType)
|
|
{
|
|
foreach(var rule in _tileRules)
|
|
{
|
|
if (rule.ruleType == ruleType) return true;
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public void getTileRules(List<TileRule> tileRules)
|
|
{
|
|
tileRules.Clear();
|
|
tileRules.AddRange(_tileRules);
|
|
}
|
|
|
|
public void getTileRules(TileRuleType ruleType, List<TileRule> tileRules)
|
|
{
|
|
tileRules.Clear();
|
|
foreach(var rule in _tileRules)
|
|
{
|
|
if (rule.ruleType == ruleType)
|
|
tileRules.Add(rule);
|
|
}
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
deleteAllTileRules();
|
|
}
|
|
}
|
|
}
|
|
#endif |