Skip to content

Commit

Permalink
fix: extract Meshes from GameObjects because Unity doesn't directly s…
Browse files Browse the repository at this point in the history
…ave mesh data
  • Loading branch information
MSchmoecker committed Apr 11, 2024
1 parent 2ba53aa commit c79cd28
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 54 deletions.
56 changes: 2 additions & 54 deletions JotunnLib/Managers/MockSystem/MockManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ public static Object GetRealPrefabFromMock(Object unityObject, Type mockObjectTy

if (!prefab)
{
throw new MockResolveException($"Object with name '{assetName}' was not found.", assetName, mockObjectType);
throw new MockResolveException($"GameObject with name '{assetName}' was not found.", assetName, mockObjectType);
}

if (childNames.Count > 0)
Expand All @@ -183,7 +183,7 @@ public static Object GetRealPrefabFromMock(Object unityObject, Type mockObjectTy
prefab = child.gameObject;
}

if (TryFindAssetInSelfOrChildComponents(prefab, mockObjectType, out asset))
if (PrefabManager.TryFindAssetInSelfOrChildComponents(prefab, mockObjectType, out asset))
{
return asset;
}
Expand Down Expand Up @@ -549,57 +549,5 @@ private static bool FixShader(Material material)

return true;
}

private static bool TryFindAssetOfComponent(Component unityObject, Type objectType, out Object asset)
{
var type = unityObject.GetType();
ClassMember classMember = ClassMember.GetClassMember(type);

foreach (var member in classMember.Members)
{
if (member.MemberType == objectType && member.HasGetMethod)
{
asset = (Object)member.GetValue(unityObject);
if (asset != null)
{
return asset;
}
}
}

asset = null;
return false;
}

private static bool TryFindAssetInSelfOrChildComponents(GameObject unityObject, Type objectType, out Object asset)
{
if (unityObject == null)
{
asset = null;
return false;
}

foreach (var component in unityObject.GetComponents<Component>())
{
if (!(component is Transform))
{
if (TryFindAssetOfComponent(component, objectType, out asset))
{
return (bool)asset;
}
}
}

foreach (Transform tf in unityObject.transform)
{
if (TryFindAssetInSelfOrChildComponents(tf.gameObject, objectType, out asset))
{
return (bool)asset;
}
}

asset = null;
return false;
}
}
}
58 changes: 58 additions & 0 deletions JotunnLib/Managers/PrefabManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -445,6 +445,12 @@ public static Object GetPrefab(Type type, string name)
{
// load an never release reference to keep it loaded
asset.Load();

if (asset.Asset.GetType() != type && asset.Asset is GameObject gameObject && TryFindAssetInSelfOrChildComponents(gameObject, type, out Object childAsset))
{
return childAsset;
}

return asset.Asset;
}
}
Expand Down Expand Up @@ -590,5 +596,57 @@ public static void Clear<T>() where T : Object
dictionaryCache.Remove(typeof(T));
}
}

private static bool TryFindAssetOfComponent(Component unityObject, Type objectType, out Object asset)
{
var type = unityObject.GetType();
ClassMember classMember = ClassMember.GetClassMember(type);

foreach (var member in classMember.Members)
{
if (member.MemberType == objectType && member.HasGetMethod)
{
asset = (Object)member.GetValue(unityObject);
if (asset != null)
{
return asset;
}
}
}

asset = null;
return false;
}

internal static bool TryFindAssetInSelfOrChildComponents(GameObject unityObject, Type objectType, out Object asset)
{
if (!unityObject)
{
asset = null;
return false;
}

foreach (var component in unityObject.GetComponents<Component>())
{
if (!(component is Transform))
{
if (TryFindAssetOfComponent(component, objectType, out asset))
{
return (bool)asset;
}
}
}

foreach (Transform tf in unityObject.transform)
{
if (TryFindAssetInSelfOrChildComponents(tf.gameObject, objectType, out asset))
{
return (bool)asset;
}
}

asset = null;
return false;
}
}
}

0 comments on commit c79cd28

Please sign in to comment.