149 lines
3.9 KiB
C#
149 lines
3.9 KiB
C#
using System.Collections.Generic;
|
|
#if UNITY_EDITOR
|
|
using UnityEditor;
|
|
#endif
|
|
using UnityEngine;
|
|
|
|
namespace Unity.HLODSystem
|
|
{
|
|
[ExecuteInEditMode]
|
|
public class HLODPrefab : MonoBehaviour
|
|
{
|
|
#if UNITY_EDITOR
|
|
[SerializeField]
|
|
private GameObject m_prefab;
|
|
[SerializeField]
|
|
private bool m_isEdit = false;
|
|
|
|
private GameObject m_instantiatePrefab;
|
|
private bool m_needUpdate = false;
|
|
|
|
|
|
public GameObject Prefab
|
|
{
|
|
set
|
|
{
|
|
if (m_prefab != value)
|
|
{
|
|
m_prefab = value;
|
|
UpdatePrefab();
|
|
}
|
|
}
|
|
get { return m_prefab; }
|
|
}
|
|
|
|
public bool IsEdit
|
|
{
|
|
set
|
|
{
|
|
m_isEdit = value;
|
|
UpdatePrefab();
|
|
}
|
|
get { return m_isEdit; }
|
|
}
|
|
|
|
void Start()
|
|
{
|
|
List<GameObject> childList = new List<GameObject>();
|
|
foreach (Transform child in transform)
|
|
{
|
|
if (child.gameObject != m_instantiatePrefab)
|
|
childList.Add(child.gameObject);
|
|
}
|
|
|
|
for (int i = 0; i < childList.Count; ++i)
|
|
{
|
|
DestroyImmediate(childList[i]);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
void OnEnable()
|
|
{
|
|
//for the avoid editor crash.
|
|
//if the update prefab in here, editor will be crash. I don't know why.
|
|
m_needUpdate = true;
|
|
}
|
|
void OnDisable()
|
|
{
|
|
DestroyPrefab();
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
if (m_needUpdate)
|
|
{
|
|
UpdatePrefab();
|
|
m_needUpdate = false;
|
|
}
|
|
}
|
|
|
|
void UpdatePrefab()
|
|
{
|
|
if (m_prefab == null)
|
|
return;
|
|
|
|
if ( m_instantiatePrefab != null )
|
|
DestroyPrefab();
|
|
|
|
m_instantiatePrefab = PrefabUtility.InstantiatePrefab(m_prefab) as GameObject;
|
|
if (m_instantiatePrefab == null)
|
|
return;
|
|
|
|
if (m_isEdit == true)
|
|
{
|
|
m_instantiatePrefab.hideFlags = HideFlags.DontSave;
|
|
}
|
|
else
|
|
{
|
|
PrefabUtility.UnpackPrefabInstance(m_instantiatePrefab, PrefabUnpackMode.OutermostRoot, InteractionMode.AutomatedAction);
|
|
m_instantiatePrefab.hideFlags = HideFlags.HideAndDontSave;
|
|
|
|
int layer = LayerMask.NameToLayer(HLOD.HLODLayerStr);
|
|
if ( layer >= 0 && layer <= 31)
|
|
ChangeLayersRecursively(m_instantiatePrefab.transform, layer);
|
|
|
|
foreach (var hlod in FindHLODinPrefab(m_instantiatePrefab))
|
|
{
|
|
// HLODManager.Instance.RegisterHLOD(hlod);
|
|
// hlod.StartUseInEditor();
|
|
}
|
|
}
|
|
|
|
|
|
m_instantiatePrefab.transform.SetParent(transform, false);
|
|
}
|
|
|
|
void DestroyPrefab()
|
|
{
|
|
if (m_instantiatePrefab == null)
|
|
return;
|
|
|
|
foreach (var hlod in FindHLODinPrefab(m_instantiatePrefab))
|
|
{
|
|
//HLODManager.Instance.UnregisterHLOD(hlod);
|
|
//hlod.StopUseInEditor();
|
|
}
|
|
m_instantiatePrefab.SetActive(false);
|
|
DestroyImmediate(m_instantiatePrefab);
|
|
|
|
}
|
|
|
|
static HLOD[] FindHLODinPrefab(GameObject prefab)
|
|
{
|
|
List<HLOD> prefabHlods = new List<HLOD>();
|
|
return prefab.GetComponentsInChildren<HLOD>();
|
|
}
|
|
|
|
static void ChangeLayersRecursively(Transform trans, int layer)
|
|
{
|
|
trans.gameObject.layer = layer;
|
|
foreach (Transform child in trans)
|
|
{
|
|
ChangeLayersRecursively(child, layer);
|
|
}
|
|
}
|
|
#endif
|
|
}
|
|
} |