ArabDesert/Assets/Bakery/BakeryLightmappedPrefab.cs

134 lines
4.8 KiB
C#

#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine;
// Disable 'obsolete' warnings
#pragma warning disable 0618
[DisallowMultipleComponent]
public class BakeryLightmappedPrefab : MonoBehaviour
{
#if UNITY_EDITOR
public bool enableBaking = true;
public bool ignoreWarnings = false;
public string errorMessage;
public bool IsValid()
{
errorMessage = "";
if (!enableBaking)
{
return false;
}
if (ignoreWarnings) return true;
bool isPartOfPrefab = PrefabUtility.GetPrefabType(gameObject) == PrefabType.PrefabInstance;
if (!isPartOfPrefab)
{
errorMessage = "this GameObject is not a prefab";
return false;
}
bool prefabIsRoot = PrefabUtility.FindPrefabRoot(gameObject) == gameObject;
if (!prefabIsRoot)
{
errorMessage = "this GameObject is not a root prefab object";
return false;
}
var transforms = GetComponentsInChildren<Transform>();
for(int i=0; i<transforms.Length; i++)
{
if (PrefabUtility.FindPrefabRoot(transforms[i].gameObject) != gameObject)
{
errorMessage = "prefab contains unapplied object (" + transforms[i].name + ")";
return false;
}
}
var prefabRootObj = PrefabUtility.GetPrefabObject(gameObject);
//var prefabRootObj2 = PrefabUtility.FindPrefabRoot(gameObject);
var mods = PrefabUtility.GetPropertyModifications(gameObject);
if (mods != null)
{
for(int i=0; i<mods.Length; i++)
{
if (mods[i] == null) continue;
#if UNITY_2018_3_OR_NEWER
if (PrefabUtility.IsDefaultOverride(mods[i])) continue;
#endif
if (mods[i].propertyPath == "m_RootOrder") continue;
if (mods[i].propertyPath == "errorMessage") continue;
if (mods[i].propertyPath == "enableBaking") continue;
if (mods[i].propertyPath.IndexOf("idremap") >= 0) continue;
if (mods[i].target != null && mods[i].target.name == gameObject.name)
{
if (mods[i].propertyPath.Contains("m_LocalPosition")) continue;
if (mods[i].propertyPath.Contains("m_LocalRotation")) continue;
if (mods[i].propertyPath.Contains("m_LocalScale")) continue;
}
errorMessage = "prefab contains unapplied data (" + mods[i].target+"."+mods[i].propertyPath + ")";
return false;
}
}
var comps = gameObject.GetComponents<Component>();
var comps2 = gameObject.GetComponentsInChildren<Component>();
for(int t=0; t<2; t++)
{
var comps3 = t == 0 ? comps : comps2;
for(int c=0; c<comps3.Length; c++)
{
var prefabObj = PrefabUtility.GetPrefabObject(comps3[c]);
if (prefabObj != prefabRootObj)
{
errorMessage = "prefab contains unapplied component (" + comps3[c] + ")";
return false;
}
/*bool isRoot = comps3[c].gameObject == gameObject;
var mods = PrefabUtility.GetPropertyModifications(comps3[c]);
if (mods == null) continue;
for(int i=0; i<mods.Length; i++)
{
if (mods[i].propertyPath == "m_RootOrder") continue;
if (isRoot)
{
if (mods[i].propertyPath == "errorMessage") continue;
if (mods[i].propertyPath == "enableBaking") continue;
if (mods[i].propertyPath.Contains("m_LocalPosition")) continue;
if (mods[i].propertyPath.Contains("m_LocalRotation")) continue;
if (mods[i].propertyPath.Contains("m_LocalScale")) continue;
}
else
{
if (mods[i].propertyPath.Contains("m_LocalPosition"))
{
var dist = (comps3[c].transform.position - (PrefabUtility.GetPrefabParent(comps3[c].gameObject) as GameObject).transform.position).sqrMagnitude;
Debug.LogError(dist);
if (dist < 0.001f) continue;
}
else if (mods[i].propertyPath.Contains("m_LocalRotation"))
{
continue;
}
}
errorMessage = "Error: prefab contains unapplied data (" + mods[i].target+"."+mods[i].propertyPath + ")";
return false;
}*/
}
}
return true;
}
#endif
}