using UnityEngine;

/// <summary>
/// Transform组件助手类
/// </summary>
public static class TransformHelper
{
    /// <summary>
    /// 面向目标方向
    /// </summary>
    /// <param name="targetDirection">目标方向</param>
    /// <param name="transform">需要转向的对象</param>
    /// <param name="rotationSpeed">转向速度</param>
    public static void LookAtTarget(Vector3 targetDirection, Transform transform, float rotationSpeed)
    {
        if (targetDirection != Vector3.zero)
        {
            var targetRotation = Quaternion.LookRotation(targetDirection, Vector3.up);
            transform.rotation = Quaternion.Lerp(transform.rotation, targetRotation, rotationSpeed);
        }
    }

    /// <summary>
    /// 查找子物体(递归查找)
    /// </summary>
    /// <param name="trans">父物体</param>
    /// <param name="goName">子物体的名称</param>
    /// <returns>找到的相应子物体</returns>
    public static Transform FindChild(Transform trans, string goName)
    {
        if (goName == trans.name)
            return trans;
        Transform child = trans.Find(goName);
        if (child != null)
            return child;

        Transform go = null;
        for (int i = 0; i < trans.childCount; i++)
        {
            child = trans.GetChild(i);
            go = FindChild(child, goName);
            if (go != null)
                return go;
        }
        return null;
    }
    /// <summary>获取所有的孩子</summary>
    /// <param name="parent">父物体位置</param>
    /// <returns>所有子物体数组</returns>
    public static Transform[] GetChilds(Transform parent)
    {
        Transform[] childs = new Transform[parent.childCount];
        for (int i = 0; i < childs.Length; i++)
            childs[i] = parent.GetChild(i);

        return childs;
    }
    /// <summary>
    /// 删除所有孩子
    /// </summary>
    /// <param name="parent">父物体位置</param>
    public static void DelChilds(Transform parent)
    {
        for (int i = 0; i < parent.childCount; i++)
            Object.Destroy(parent.GetChild(i).gameObject);
    }
    /// <summary>
    /// 设置所有孩子Active
    /// </summary>
    /// <param name="parent">父物体位置</param>
    public static void SetActiveChilds(Transform parent, bool isActive)
    {
        for (int i = 0; i < parent.childCount; i++)
            parent.GetChild(i).gameObject.SetActive(isActive);
    }
    /// <summary>
    /// 查找父对象
    /// </summary>
    /// <param name="trans">子物体位置</param>
    ///  /// <param name="goName">父物体名称</param>
    public static Transform FindParentByName(Transform trans, string goName)
    {
        Transform pTrans = null;
        if (trans.parent)
        {
            Transform pobj = trans.parent;
            if (pobj.name == goName)
            {
                pTrans = pobj;
            }
            else
            {
                pTrans = FindParentByName(pobj, goName);
            }
        }
        return pTrans;
    }
    /// <summary>
    /// 查找父对象
    /// </summary>
    /// <param name="trans">子物体位置</param>
    ///  /// <param name="goName">父物体名称</param>
    public static Transform FindParentByTag(Transform trans, string tagName)
    {
        Transform pTrans = null;
        if (trans.parent)
        {
            Transform pobj = trans.parent;
            if (pobj.tag == tagName)
            {
                pTrans = pobj;
            }
            else
            {
                pTrans = FindParentByTag(pobj, tagName);
            }
        }
        return pTrans;
    }
    /// <summary>
    /// 设置对象包含子对象的Layer
    /// </summary>
    /// <param name="obj">对象</param>
    /// <param name="newLayer">新的Layer</param>
    public static void SetLayerRecursively(GameObject obj, int newLayer)
    {
        obj.layer = newLayer;
        foreach (Transform child in obj.transform)
        {
            SetLayerRecursively(child.gameObject, newLayer);
        }
    }
    public static void SetRenderer(GameObject obj, bool enable)
    {
        var renderer = obj.GetComponent<Renderer>();
        if (renderer)
        {
            renderer.enabled = enable;
        }
        foreach (Transform child in obj.transform)
        {
            SetRenderer(child.gameObject, enable);
        }
    }
}