com.alicizax.unity/Runtime/Helper/GameObjectHelper.cs

206 lines
6.5 KiB
C#
Raw Normal View History

2025-02-07 16:04:12 +08:00
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.SceneManagement;
namespace AlicizaX.Runtime
{
/// <summary>
/// 游戏对象帮助类
/// </summary>
public static class GameObjectHelper
{
/// <summary>
/// 销毁子物体
/// </summary>
/// <param name="go"></param>
[UnityEngine.Scripting.Preserve]
public static void RemoveChildren(GameObject go)
{
for (var i = go.transform.childCount - 1; i >= 0; i--)
{
Destroy(go.transform.GetChild(i).gameObject);
}
}
/// <summary>
/// 销毁游戏物体
/// </summary>
/// <param name="gameObject"></param>
[UnityEngine.Scripting.Preserve]
public static void DestroyObject(this GameObject gameObject)
{
if (!ReferenceEquals(gameObject, null))
{
if (Application.isEditor && !Application.isPlaying)
{
Object.DestroyImmediate(gameObject);
return;
}
Object.Destroy(gameObject);
}
}
/// <summary>
/// 销毁游戏物体
/// </summary>
/// <param name="gameObject"></param>
public static void Destroy(GameObject gameObject)
{
gameObject.DestroyObject();
}
/// <summary>
/// 销毁游戏组件
/// </summary>
/// <param name="component"></param>
[UnityEngine.Scripting.Preserve]
public static void DestroyComponent(UnityEngine.Component component)
{
if (!ReferenceEquals(component, null))
{
if (Application.isEditor && !Application.isPlaying)
{
Object.DestroyImmediate(component);
return;
}
Object.Destroy(component);
}
}
/// <summary>
/// 在指定场景中查找特定名称的节点。
/// </summary>
/// <param name="sceneName">场景名称。</param>
/// <param name="nodeName">节点名称。</param>
/// <returns>找到的节点的GameObject实例如果没有找到返回null。</returns>
public static GameObject FindChildGamObjectByName(string nodeName, string sceneName = null)
{
Scene scene;
if (sceneName.IsNullOrWhiteSpace())
{
scene = SceneManager.GetActiveScene();
}
else
{
scene = SceneManager.GetSceneByName(sceneName);
if (!scene.isLoaded)
{
return null;
}
}
var rootObjects = scene.GetRootGameObjects();
foreach (var rootObject in rootObjects)
{
var result = FindChildGamObjectByName(rootObject, nodeName);
if (result.IsNotNull())
{
return result;
}
}
return null;
}
/// <summary>
/// 根据游戏对象名称查询子对象
/// </summary>
/// <param name="gameObject"></param>
/// <param name="name"></param>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static GameObject FindChildGamObjectByName(GameObject gameObject, string name)
{
var transform = gameObject.transform.FindChildName(name);
if (transform.IsNotNull())
{
return transform.gameObject;
}
return null;
}
/// <summary>
/// 创建游戏对象
/// </summary>
/// <param name="parent"></param>
/// <param name="name"></param>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static GameObject Create(Transform parent, string name)
{
Debug.Assert(!ReferenceEquals(parent, null), nameof(parent) + " == null");
var gameObject = new GameObject(name);
gameObject.transform.SetParent(parent);
return gameObject;
}
/// <summary>
/// 创建游戏对象
/// </summary>
/// <param name="parent"></param>
/// <param name="name"></param>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static GameObject Create(GameObject parent, string name)
{
Debug.Assert(!ReferenceEquals(parent, null), nameof(parent) + " == null");
return Create(parent.transform, name);
}
/// <summary>
/// 重置游戏对象的变换数据
/// </summary>
/// <param name="gameObject"></param>
/// <returns></returns>
[UnityEngine.Scripting.Preserve]
public static void ResetTransform(GameObject gameObject)
{
gameObject.transform.localScale = Vector3.one;
gameObject.transform.localPosition = Vector3.zero;
gameObject.transform.localRotation = Quaternion.identity;
}
/// <summary>
/// 设置对象的显示排序层
/// </summary>
/// <param name="gameObject">游戏对象</param>
/// <param name="sortingLayer">显示层</param>
[UnityEngine.Scripting.Preserve]
public static void SetSortingGroupLayer(GameObject gameObject, string sortingLayer)
{
SortingGroup[] sortingGroups = gameObject.GetComponentsInChildren<SortingGroup>();
foreach (SortingGroup sg in sortingGroups)
{
sg.sortingLayerName = sortingLayer;
}
}
/// <summary>
/// 设置对象的层
/// </summary>
/// <param name="gameObject">游戏对象</param>
/// <param name="layer">层</param>
/// <param name="children">是否设置子物体</param>
[UnityEngine.Scripting.Preserve]
public static void SetLayer(GameObject gameObject, int layer, bool children = true)
{
if (gameObject.layer != layer)
{
gameObject.layer = layer;
}
if (children)
{
Transform[] transforms = gameObject.GetComponentsInChildren<Transform>();
foreach (var sg in transforms)
{
sg.gameObject.layer = layer;
}
}
}
}
}