Unity 共享函数整理【一】

1.眨眼效果

    /// <summary>
    /// 眨眼效果
    /// </summary>
    /// <param name="eyeMaskRenserer">眼遮罩</param>
    /// <param name="blinkTime">眨眼时间</param>
    /// <param name="callback">眨眼后回调</param>
    /// <returns></returns>
    public static IEnumerator IEBlinkEye(SpriteRenderer eyeMaskRenserer, float blinkTime, Action callback)
    {
        SetTrs(eyeMaskRenserer.transform, true);
        var startColor = Color.clear;
        var targetColor = Color.black;
        var startTime = Time.time;
        var needTime = 1f;
        eyeMaskRenserer.color = startColor;
        while (eyeMaskRenserer.color.a < 0.99f)
        {
            eyeMaskRenserer.color = Color.Lerp(startColor, targetColor, (Time.time - startTime) * needTime);
            yield return null;
        }
        eyeMaskRenserer.color = targetColor;

        if (blinkTime > 2f)
        {
            yield return new WaitForSeconds(blinkTime - 2f);
            callback?.Invoke();
        }



        startColor = Color.black;
        targetColor = Color.clear;
        startTime = Time.time;
        eyeMaskRenserer.color = startColor;
        while (eyeMaskRenserer.color.a > 0.01f)
        {
            eyeMaskRenserer.color = Color.Lerp(startColor, targetColor, (Time.time - startTime) * needTime);
            yield return null;
        }
        eyeMaskRenserer.color = targetColor;
        SetTrs(eyeMaskRenserer.transform, false);
    }
     /// <summary>
    /// 变化眼睛颜色
    /// </summary>
    public void ChangEyeColor2(Color startColor, Color endColor, float changeTime, Action ChangeCall = null)
    {
        eyeImg.color = startColor;
        eyeImg.DOColor(endColor, changeTime).OnComplete(() =>
        {
            if (ChangeCall != null)
            {
                ChangeCall.Invoke();
            }
        });
    }

2.计算两点的距离

    /// <summary>
    /// 计算两点的距离
    /// </summary>
    /// <param name="point1"></param>
    /// <param name="point2"></param>
    /// <returns></returns>
    public static float CalculateTwoPointDistance(Vector3 point1, Vector3 point2)
    {
        //根据勾股定理(a²+b²=c²)求出支撑杆长度,开c的平方根得到弦的长度
        float c = Vector3.Distance(point2, point1);
        float a = Mathf.Abs(point2.y - point1.y);
        return Mathf.Sqrt(Mathf.Pow(c, 2) - Mathf.Pow(a, 2));
    }

3.Texture 相关函数


    #region  Texture2D
    /// <summary>
    /// 将Base64String转换成Texture
    /// </summary>
    /// <param name="base64Str"></param>
    /// <returns></returns>
    public static Texture2D Base64StringToTexture2D(string base64Str)
    {
        try
        {
            //将base64头部信息替换
            base64Str = base64Str.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "")
                .Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", "");
            byte[] bytes = Convert.FromBase64String(base64Str);
            Texture2D texture = new Texture2D(784, 800);
            texture.LoadImage(bytes);
            return texture;
        }
        catch (Exception ex)
        {
            Debug.LogError("转换异常" + ex);
            return null;
        }
    }

    /// <summary>
    /// 编辑器模式下Texture转换成Texture2D
    /// </summary>
    /// <param name="texture"></param>
    /// <returns></returns>
    public static Texture2D TextureToTexture2D_Editor(Texture texture)
    {
        Texture2D texture2d = texture as Texture2D;
#if UNITY_EDITOR
        UnityEditor.TextureImporter ti = (UnityEditor.TextureImporter)UnityEditor.TextureImporter.GetAtPath(UnityEditor.AssetDatabase.GetAssetPath(texture2d));
        //图片Read/Write Enable的开关
        ti.isReadable = true;

        UnityEditor.AssetDatabase.ImportAsset(UnityEditor.AssetDatabase.GetAssetPath(texture2d));
#endif
        return texture2d;
    }

    /// <summary>
    /// 运行模式下Texture转换成Texture2D
    /// </summary>
    /// <param name="texture"></param>
    /// <returns></returns>
    public static Texture2D TextureToTexture2D(Texture texture, int width = 0, int height = 0)
    {
        if (width.Equals(0)) width = texture.width;
        if (height.Equals(0)) height = texture.height;

        Texture2D texture2D = new Texture2D(width, height, TextureFormat.RGBA32, false);
        RenderTexture currentRT = RenderTexture.active;

        RenderTexture renderTexture = RenderTexture.GetTemporary(width, height, 32);
        Graphics.Blit(texture, renderTexture);
        RenderTexture.active = renderTexture;
        texture2D.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0);
        texture2D.Apply();

        RenderTexture.active = currentRT;
        RenderTexture.ReleaseTemporary(renderTexture);
        return texture2D;
    }
    #endregion

4.设置物体的材质球

        /// <summary>
        /// 设置物体上所有材质球[简单粗暴版]
        /// </summary>
        /// <param name="trs"></param>
        /// <param name="isActive"></param>
        public static void SetMaterials(Transform trs, Material material)
        {
            Material[] materials = trs.GetComponent<MeshRenderer>().materials;
            for (int i = 0; i < materials.Length; i++)
            {
                materials[i] = material;
            }
            trs.GetComponent<MeshRenderer>().materials = materials;
        }

        /// <summary>
        /// 设置物体上所有材质球[升级版]
        /// </summary>
        /// <param name="trs"></param>
        /// <param name="isActive"></param>
        public void SetMaterials(Transform trs, params Material[] p_mat)
        {
            Material[] materials = trs.GetComponent<MeshRenderer>().materials;
            int length = p_mat.Length > materials.Length ? p_mat.Length : materials.Length;
            Material[] mats = new Material[length];
            for (int i = 0; i < length; i++)
            {
                if (i >= p_mat.Length)
                {
                    mats[i] = materials[i];
                    continue;
                }
                mats[i] = p_mat[i];
            }
            //materials = mats;
            trs.GetComponent<MeshRenderer>().materials = mats;
        }

5.设置物体高亮

    /// <summary>
    /// 物体高亮
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="flag"></param>
    /// <param name="endColor"></param>
    /// <param name="startColor"></param>
    public static void HightLightController(GameObject obj, bool flag, Color endColor = new Color(), Color startColor = new Color())
    {
        if (obj != null)
        {
            FlashingController flashing = obj.gameObject.GetComponent<FlashingController>();
            if (flag)
            {
                if (!flashing)
                    flashing = obj.gameObject.AddComponent<FlashingController>();
                flashing.flashingStartColor = startColor;
                flashing.flashingEndColor = endColor;
                flashing.flashingDelay = 0f;
                flashing.flashingFrequency = 1f;
                flashing.enabled = true;
            }
            else
            {
                if (flashing)
                {
                    UnityEngine.Object.Destroy(flashing);
                    Highlighter high = obj.GetComponent<Highlighter>();
                    if (high)
                        UnityEngine.Object.Destroy(high);
                }
            }
        }
    }
  /// <summary>
  /// 设置高亮
  /// </summary>
  /// <param name="obj"></param>
  /// <param name="active"></param>
  public static void OutlineController(Transform obj, bool active)
  {
      if (active)
      {
          if (obj.GetComponent<Outline>() == null)
          {
              var controller = obj.gameObject.AddComponent<Outline>();
              controller.OutlineColor = Color.red;
              controller.OutlineWidth = 3f;
              controller.Flashfrequency = 4f;
              controller.PrecomputeOutline = true;
              controller.Needflash = true;
              controller.enabled = true;
          }
          else
          {
              obj.GetComponent<Outline>().enabled = true;
          }
      }
      else
      {
          if (obj.GetComponent<Outline>() != null)
          {
              obj.GetComponent<Outline>().enabled = false;
          }
      }
  }

6.延时方法

    /// <summary>
    /// 协程延时
    /// </summary>
    /// <param name="time"></param>
    /// <param name="action"></param>
    /// <returns></returns>
    public static IEnumerator _WaitTime(float wait,Action _func)
    {
        yield return new WaitForSeconds(wait);
        if (null != _func)
            _func();
    }
        /// <summary>
        /// 延迟一段时间执行回调
        /// </summary>
        /// <param name="delay"></param>
        /// <param name="action"></param>
        /// <returns></returns>
        public static void DelayByDOTween(float delay, Action action)
        {
            var timer = 0f;
            DOTween.To(() => timer, x => timer = x, 1f, delay).OnComplete(() => { action.Invoke(); });
        }

7.通过名称查找子物体

     /// <summary>
    /// 通过名称查找未知层级子物体
    /// </summary>
    /// <param name="parentTF"></param>
    /// <param name="childName"></param>
    /// <returns></returns>
    public static Transform GetChild(Transform parentTF, string childName)
    {
        //在子物体中查找名为childName 的子物体,如果有就返回,如果没有就开始递归
        Transform childTF = parentTF.Find(childName);
        if (childTF != null) return childTF;
        //将问题交由子物体
        int count = parentTF.childCount;
        for (int i = 0; i < count; i++)
        {
            childTF = GetChild(parentTF.GetChild(i), childName);
            if (childTF != null)
            {
                return childTF;
            }
        }
        return null;
    }

8.动态创建Tag

    /// <summary>
    /// 检查tag列表中是否有tag,没有该tag添加此tag
    /// </summary>
    /// <param name="tag">所要设设置的tag</param>
    public static void SetGameObjectTag(GameObject gameObject, string tag)
    {
#if UNITY_EDITOR
        if (!UnityEditorInternal.InternalEditorUtility.tags.Equals(tag)) //如果tag列表中没有这个tag
        {
            UnityEditorInternal.InternalEditorUtility.AddTag(tag); //在tag列表中添加这个tag
        }
#endif
        gameObject.tag = tag;
    }

9.对子物体进行排序


    private void Sort(Transform root)
    {
        foreach (Transform item in GetTransforms(root))
        {
            item.SetAsLastSibling();//从小到大排序
            //item.SetAsFirstSibling();//从大到小排序
        }
    }

    /// <summary>
    /// 返回 children transforms, 根据名称排列 .
    /// </summary>
    public Transform[] GetTransforms(Transform parentGameObject)
    {
        if (parentGameObject != null)
        {
            List<Component> components = new List<Component>(parentGameObject.GetComponentsInChildren(typeof(Transform)));
            List<Transform> transforms = components.ConvertAll(c => (Transform)c);

            transforms.Remove(parentGameObject.transform);
            transforms.Sort(delegate (Transform a, Transform b)
            {
                return a.name.CompareTo(b.name);
            });

            return transforms.ToArray();
        }

        return null;
    }

10.设置材质球的自发光_EMISSION属性

 /// <summary>
 /// 设置材质球的自发光_EMISSION属性
 /// </summary>
 /// <param name="trs"></param>
 /// <param name="isActive"></param>
 public static void SetMaterialsEmission(Transform trs, bool isActive)
 {
     Renderer[] rds = trs.GetComponentsInChildren<Renderer>();
     //逐一遍历他的子物体中的Renderer
     foreach (Renderer render in rds)
     {
         Material[] materials = render.GetComponent<MeshRenderer>().materials;
         for (int i = 0; i < materials.Length; i++)
         {
             if (isActive)
                 materials[i].EnableKeyword("_EMISSION");
             else
                 materials[i].DisableKeyword("_EMISSION");
         }
     }
 }

11、颜色作为参数传参


        /// <summary>
        /// 默认设置
        /// </summary>
        /// <param name="trs"></param>
        /// <param name="isActive"></param>
        public static void SetTrsOutline(Transform trs, bool isActive)
        {
            SetTrsOutline(trs, isActive, Color.green);
        }

        /// <summary>
        /// 更改颜色设置
        /// </summary>
        /// <param name="trs"></param>
        /// <param name="isActive"></param>
        /// <param name="color"></param>
        public static void SetTrsOutline(Transform trs, bool isActive, Color color)
        {
            if (isActive)
            {
                if (trs.GetComponent<Outline>() == null)
                {
                    var controller = trs.gameObject.AddComponent<Outline>();
                    controller.OutlineColor = color;
                    controller.OutlineWidth = 5f;
                    controller.Flashfrequency = 5f;
                    controller.PrecomputeOutline = true;
                    controller.Needflash = true;
                    controller.enabled = true;
                }
                else
                {
                    trs.GetComponent<Outline>().enabled = true;
                }
            }
            else
            {
                if (trs.GetComponent<Outline>() != null)
                {
                    trs.GetComponent<Outline>().enabled = false;
                }
            }
        }

12、设置物体碰撞体

   /// <summary>
   /// 开启或添加碰撞
   /// </summary>
   /// <param name="obj"></param>
   private void OnEnableCollider(GameObject obj)
   {
       List<Collider> allColliders = new List<Collider>();  //物体所有的碰撞体
       List<Collider> objColliders = new List<Collider>();  //当前物体要执行的碰撞体
       allColliders.AddRange(obj.GetComponentsInChildren<Collider>());
       //如果当前物体(包含子物体)没有碰撞  查找到第一个子物体的网格添加碰撞
       if (allColliders.Count == 0 || allColliders == null)
       {
           var mesh = obj.GetComponentInChildren<MeshRenderer>().gameObject;
           var bc = mesh.AddComponent<BoxCollider>();
           objColliders.Add(bc);
       }
       else  //若存在碰撞 查找到第一个碰撞所在位置 获取该物体(仅自身)上的所有碰撞
       {
           GameObject collider_OBJ = allColliders[0].gameObject;
           objColliders.AddRange(collider_OBJ.GetComponentsInChildren<Collider>());
       }
       foreach (var collider in objColliders)
       {
           collider.enabled = true;
           collider.isTrigger = true;
       }
   }

   /// <summary>
   /// 关闭碰撞
   /// </summary>
   /// <param name="obj"></param>
   private void OnDisableCollider(GameObject obj)
   {
       List<Collider> colliders = new List<Collider>();  //物体所有的碰撞体
       colliders.AddRange(obj.GetComponentsInChildren<Collider>());
       foreach (var collider in colliders)
       {
           collider.enabled = false;
           collider.isTrigger = false;
       }
   }

13、获取一个父级节点下子节点的索引

在 Unity 中,要获取一个父级节点下子节点的索引,可以使用 Transform.GetChild() 方法结合循环来遍历子节点,并找到目标子节点在父级节点中的索引位置。下面是一个示例代码,演示如何获取一个父级节点下特定子节点的索引:

using UnityEngine;

public class GetChildIndex : MonoBehaviour
{
    public Transform parentObject; // 引用到父级节点
    public Transform targetChild; // 引用到目标子节点

    void Start()
    {
        int targetIndex = GetChildIndexInParent(parentObject, targetChild);
        Debug.Log("Target Child Index: " + targetIndex);
    }

    int GetChildIndexInParent(Transform parent, Transform target)
    {
        for (int i = 0; i < parent.childCount; i++)
        {
            if (parent.GetChild(i) == target)
            {
                return i;
            }
        }
        return -1; // 如果未找到目标子节点,返回-1
    }
}

14、 对子节点按照名称排序

在 Unity 中,你可以使用 Transform 中的 GetComponentsInChildren 方法来快速获取父级节点下的所有子节点,并使用 LINQ(Language Integrated Query)语法来对子节点进行排序。以下是一个快速对子节点按照字母顺序排序的示例代码:

 /// <summary>
 ///  对子节点进行名称排序
 /// </summary>
 /// <param name="parent"></param>
 private void OrderChild(Transform parent)
 {
     // 获取父级节点下所有子节点
     Transform[] children = parent.GetComponentsInChildren<Transform>(true)
         .Where(t => t.parent == parent && t != parent) // 筛选出直接子节点
         .OrderBy(t => t.name) // 按照子节点名称排序
         .ToArray();

     // 重新设置排序后的子节点的顺序
     for (int i = 0; i < children.Length; i++)
     {
         children[i].SetSiblingIndex(i);
     }
 }

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值