3DTD/Assets/Scripts/Extensions/GameObjectExtensions.cs

120 lines
6.1 KiB
C#

using UnityEngine;
using System.Linq;
namespace UnityUtils {
public static class GameObjectExtensions {
/// <summary>
/// This method is used to hide the GameObject in the Hierarchy view.
/// </summary>
/// <param name="gameObject"></param>
public static void HideInHierarchy(this GameObject gameObject) {
gameObject.hideFlags = HideFlags.HideInHierarchy;
}
/// <summary>
/// Gets a component of the given type attached to the GameObject. If that type of component does not exist, it adds one.
/// </summary>
/// <remarks>
/// This method is useful when you don't know if a GameObject has a specific type of component,
/// but you want to work with that component regardless. Instead of checking and adding the component manually,
/// you can use this method to do both operations in one line.
/// </remarks>
/// <typeparam name="T">The type of the component to get or add.</typeparam>
/// <param name="gameObject">The GameObject to get the component from or add the component to.</param>
/// <returns>The existing component of the given type, or a new one if no such component exists.</returns>
public static T GetOrAdd<T>(this GameObject gameObject) where T : Component {
T component = gameObject.GetComponent<T>();
if (!component) component = gameObject.AddComponent<T>();
return component;
}
/// <summary>
/// Returns the object itself if it exists, null otherwise.
/// </summary>
/// <remarks>
/// This method helps differentiate between a null reference and a destroyed Unity object. Unity's "== null" check
/// can incorrectly return true for destroyed objects, leading to misleading behaviour. The OrNull method use
/// Unity's "null check", and if the object has been marked for destruction, it ensures an actual null reference is returned,
/// aiding in correctly chaining operations and preventing NullReferenceExceptions.
/// </remarks>
/// <typeparam name="T">The type of the object.</typeparam>
/// <param name="obj">The object being checked.</param>
/// <returns>The object itself if it exists and not destroyed, null otherwise.</returns>
public static T OrNull<T>(this T obj) where T : Object => obj ? obj : null;
/// <summary>
/// Destroys all children of the game object
/// </summary>
/// <param name="gameObject">GameObject whose children are to be destroyed.</param>
public static void DestroyChildren(this GameObject gameObject) {
gameObject.transform.DestroyChildren();
}
/// <summary>
/// Immediately destroys all children of the given GameObject.
/// </summary>
/// <param name="gameObject">GameObject whose children are to be destroyed.</param>
public static void DestroyChildrenImmediate(this GameObject gameObject) {
gameObject.transform.DestroyChildrenImmediate();
}
/// <summary>
/// Enables all child GameObjects associated with the given GameObject.
/// </summary>
/// <param name="gameObject">GameObject whose child GameObjects are to be enabled.</param>
public static void EnableChildren(this GameObject gameObject) {
gameObject.transform.EnableChildren();
}
/// <summary>
/// Disables all child GameObjects associated with the given GameObject.
/// </summary>
/// <param name="gameObject">GameObject whose child GameObjects are to be disabled.</param>
public static void DisableChildren(this GameObject gameObject) {
gameObject.transform.DisableChildren();
}
/// <summary>
/// Resets the GameObject's transform's position, rotation, and scale to their default values.
/// </summary>
/// <param name="gameObject">GameObject whose transformation is to be reset.</param>
public static void ResetTransformation(this GameObject gameObject) {
gameObject.transform.Reset();
}
/// <summary>
/// Returns the hierarchical path in the Unity scene hierarchy for this GameObject.
/// </summary>
/// <param name="gameObject">The GameObject to get the path for.</param>
/// <returns>A string representing the full hierarchical path of this GameObject in the Unity scene.
/// This is a '/'-separated string where each part is the name of a parent, starting from the root parent and ending
/// with the name of the specified GameObjects parent.</returns>
public static string Path(this GameObject gameObject) {
return "/" + string.Join("/",
gameObject.GetComponentsInParent<Transform>().Select(t => t.name).Reverse().ToArray());
}
/// <summary>
/// Returns the full hierarchical path in the Unity scene hierarchy for this GameObject.
/// </summary>
/// <param name="gameObject">The GameObject to get the path for.</param>
/// <returns>A string representing the full hierarchical path of this GameObject in the Unity scene.
/// This is a '/'-separated string where each part is the name of a parent, starting from the root parent and ending
/// with the name of the specified GameObject itself.</returns>
public static string PathFull(this GameObject gameObject) {
return gameObject.Path() + "/" + gameObject.name;
}
/// <summary>
/// Recursively sets the provided layer for this GameObject and all of its descendants in the Unity scene hierarchy.
/// </summary>
/// <param name="gameObject">The GameObject to set layers for.</param>
/// <param name="layer">The layer number to set for GameObject and all of its descendants.</param>
public static void SetLayersRecursively(this GameObject gameObject, int layer) {
gameObject.layer = layer;
gameObject.transform.ForEveryChild(child => child.gameObject.SetLayersRecursively(layer));
}
}
}