Files
dungeons/Assets/UltimateXR/Editor/Avatar/UxrAvatarEditorExt.cs
2024-08-06 21:58:35 +02:00

108 lines
4.0 KiB
C#

// --------------------------------------------------------------------------------------------------------------------
// <copyright file="UxrAvatarEditorExt.cs" company="VRMADA">
// Copyright (c) VRMADA, All rights reserved.
// </copyright>
// --------------------------------------------------------------------------------------------------------------------
using System.Collections.Generic;
using UltimateXR.Avatar;
using UnityEditor;
using UnityEngine;
namespace UltimateXR.Editor.Avatar
{
/// <summary>
/// <see cref="UxrAvatar" /> extensions available only for editor scripts.
/// </summary>
public static class UxrAvatarEditorExt
{
#region Public Methods
/// <summary>
/// Gets an <see cref="UxrAvatar" />'s prefab, based on the Guid stored.
/// </summary>
/// <param name="self">Avatar to get the source prefab of</param>
/// <returns>Prefab or null if it could not be found</returns>
public static GameObject GetPrefab(this UxrAvatar self)
{
return AssetDatabase.LoadAssetAtPath<GameObject>(AssetDatabase.GUIDToAssetPath(self.PrefabGuid));
}
/// <summary>
/// Gets an <see cref="UxrAvatar" /> prefab's <see cref="UxrAvatar" /> component, based on the Guid stored.
/// </summary>
/// <param name="self">Avatar to get the source prefab of</param>
/// <returns>Prefab or null if it could not be found</returns>
public static UxrAvatar GetAvatarPrefab(this UxrAvatar self)
{
return GetFromGuid(self.PrefabGuid);
}
/// <summary>
/// Gets a prefab's GUID.
/// </summary>
/// <param name="gameObject">Prefab to get the GUID of</param>
/// <returns>GUID or empty string if it could not be found</returns>
public static string GetGuid(GameObject gameObject)
{
return AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(gameObject));
}
/// <summary>
/// Gets an <see cref="UxrAvatar" /> prefab, based on an asset GUID.
/// </summary>
/// <param name="avatarPrefabGuid">Asset GUID</param>
/// <returns>Prefab or null if it could not be found</returns>
public static UxrAvatar GetFromGuid(string avatarPrefabGuid)
{
GameObject prefab = AssetDatabase.LoadAssetAtPath<GameObject>(AssetDatabase.GUIDToAssetPath(avatarPrefabGuid));
return prefab != null ? prefab.GetComponent<UxrAvatar>() : null;
}
/// <summary>
/// Gets the avatar prefab chain. This is the source prefab followed by all parent prefabs up to the root parent
/// prefab.
/// </summary>
/// <returns>
/// Upwards prefab chain. If the avatar is a prefab itself, it will be the first item in the list.
/// </returns>
public static IEnumerable<UxrAvatar> GetPrefabChain(this UxrAvatar self)
{
UxrAvatar avatarPrefab = self.GetAvatarPrefab();
if (avatarPrefab != null)
{
yield return avatarPrefab;
}
UxrAvatar current = self.ParentAvatarPrefab;
while (current != null)
{
yield return current;
current = current.ParentAvatarPrefab;
}
}
/// <summary>
/// Checks whether the avatar is or comes from the given prefab.
/// </summary>
/// <param name="self">Avatar</param>
/// <param name="prefab">Prefab</param>
/// <returns>Whether the avatar is or comes from the given prefab</returns>
public static bool IsInPrefabChain(this UxrAvatar self, GameObject prefab)
{
foreach (UxrAvatar avatarPrefab in self.GetPrefabChain())
{
if (avatarPrefab != null && avatarPrefab.gameObject == prefab)
{
return true;
}
}
return false;
}
#endregion
}
}