[Unity]一个简单便捷的UI高亮动画编辑器

9 篇文章 0 订阅

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using DG.Tweening;

namespace Hs
{
  public enum HighLightingMode
  {
    Color,
    Sprite,
  }
  [System.Serializable]
  public struct HighLightingData
  {
    public bool swich;
    public Color color;
    public Sprite sprite;
    public Image targetImage;
    public HighLightingMode highLightingMode;
    //临时数据
    public Color lastColor;
    public Sprite lastSprite;
  }
  [System.Serializable]
  public struct ScaleData
  {
    public bool swich;
    public Vector3 scaleValue;
    public float scaleDealy;
    public Ease ease;
    //临时数据
    public Vector3 lastScaleValue;
  }
  [System.Serializable]
  public struct ClikData
  {
    public bool swich;
   
    public Image targetImage;
  }
  public enum HighlightingStyleType
  {
    HighLighting,
    Scale,
  }
  public class HighlightingStyle : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler
  {
    public HighLightingData highLightingData;
    public ScaleData scaleData;
    public ClikData clikData;
    public HighlightingStyle[] buttonGroups;

    private void Awake()
    {
      __init_();
    }
    private void __init_()
    {
      if (highLightingData.swich)
      {
        highLightingData.targetImage.gameObject.SetActive(false);
        highLightingData.lastColor = highLightingData.targetImage.color;
        highLightingData.lastSprite = highLightingData.targetImage.sprite;
      }
      if (scaleData.swich)
      {
        scaleData.lastScaleValue = transform.localScale;
      }
    }
    public void OnPointerClick(PointerEventData eventData)
    {
      if (clikData.swich)
              CheckClikDataData();
    }

    public void OnPointerEnter(PointerEventData eventData)
    {
      if(highLightingData.swich)
             CheckHighLightingData(1);

      if (scaleData.swich)
             CheckScaleData(1);
    }

    public void OnPointerExit(PointerEventData eventData)
    {
      if (highLightingData.swich)
          CheckHighLightingData(-1);

      if (scaleData.swich)
          CheckScaleData(-1);
    }

    private void CheckHighLightingData(int code)//0=clik,1=enter,-1=exit
    {
      switch (code)
      {
        case 1:
          switch (highLightingData.highLightingMode)
          {
            case HighLightingMode.Color:
              highLightingData.targetImage.color = highLightingData.color;
              break;
            case HighLightingMode.Sprite:
              highLightingData.targetImage.sprite = highLightingData.sprite;
              break;
          }
          break;
        case -1:
          switch (highLightingData.highLightingMode)
          {
            case HighLightingMode.Color:
              highLightingData.targetImage.color = highLightingData.lastColor;
              break;
            case HighLightingMode.Sprite:
              highLightingData.targetImage.sprite = highLightingData.lastSprite;
              break;
          }
          break;
      }
      highLightingData.targetImage.gameObject.SetActive(code==1);
    }
    private void CheckScaleData(int code)
    {
      switch (code)
      {
        case 1:
          transform.DOScale(scaleData.scaleValue,scaleData.scaleDealy).SetEase(scaleData.ease);
          break;
        case -1:
          transform.DOScale(scaleData.lastScaleValue, scaleData.scaleDealy).SetEase(scaleData.ease);
          break;
      }
    }
    private void CheckClikDataData()
    {
      foreach (HighlightingStyle item in buttonGroups)
      {
        item.SetClikBG(false);
      }
      this.SetClikBG(true);
    }
    private void SetClikBG(bool isShow)
    {
      transform.Find(clikData.targetImage.name).gameObject.SetActive(isShow);
    }
  }
}


using DG.Tweening;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
namespace Hs
{
  [CustomEditor(typeof(HighlightingStyle))]
  public class HighlightingStyleEditor : Editor
  {
    HighlightingStyle Hs;
    SerializedProperty _assetLstProperty;
    //序列化对象
    SerializedObject _serializedObject;
    private Vector2 scrollPos;
    private bool propWarning;
    private string errorMsg;
    private string rootGroupStyle = "GroupBox";
    private bool poolOption;
    private string foldStyle = "Foldout";
    private string enumStyle = "MiniPopup";
    private string toggleStyle = "BoldToggle";
    private string subGroupStyle = "ObjectFieldThumb";
    private string arrayElementStyle = "flow overlay box";
    private HighlightingStyleType selectedHighlightingStyleType;

    public override void OnInspectorGUI()
    {
      Hs = (HighlightingStyle)target;
      GUILayout.Space(8);
      //高亮
      if (Hs.highLightingData.swich)
      {
        GUI.backgroundColor = Color.green;
      }
      else
      {
        GUI.backgroundColor = Color.white;
      }
      if (GUILayout.Button("高亮配置", GUILayout.ExpandWidth(true), GUILayout.Height(30)))
      {
        if (Hs.highLightingData.swich)
        {
          Hs.highLightingData.swich = false;
        }
        else
        {
          Hs.highLightingData.swich = true;
        }
      }

      if (Hs.highLightingData.swich)
      {
        GUI.backgroundColor = Color.white;
        Hs.highLightingData.highLightingMode = (HighLightingMode)EditorGUILayout.EnumPopup("高亮模式:", Hs.highLightingData.highLightingMode);
        switch (Hs.highLightingData.highLightingMode)
        {
          case HighLightingMode.Color:
            Hs.highLightingData.color = EditorGUILayout.ColorField("高亮背景色:", Hs.highLightingData.color);

            break;
          case HighLightingMode.Sprite:
            Hs.highLightingData.sprite = (Sprite)EditorGUILayout.ObjectField("高亮背景图:", Hs.highLightingData.sprite, typeof(Sprite), true);
            if (Hs.highLightingData.sprite != null)
            {
              if (GUILayout.Button("生成高亮图", GUILayout.ExpandWidth(true), GUILayout.Height(20)))
              {
                GameObject ts1 = Selection.activeObject as GameObject;
                if (ts1.transform.Find("HIGHLIGHTING"))
                {
                  DestroyImmediate(ts1.transform.Find("HIGHLIGHTING").gameObject);
                }
                GameObject temp = new GameObject("HIGHLIGHTING",typeof(Image));
                temp.transform.SetParent(ts1.transform);
                Image image = temp.GetComponent<Image>();
                image.sprite = Hs.highLightingData.sprite;
                temp.transform.GetComponent<RectTransform>().anchoredPosition = Vector3.zero;
                temp.transform.GetComponent<RectTransform>().localScale = Vector3.one;
                image.SetNativeSize();
                temp.transform.SetAsFirstSibling();
                Hs.highLightingData.targetImage = image;
              }
            }
            if (Hs.highLightingData.targetImage != null)
            {
              if (GUILayout.Button("默认", GUILayout.ExpandWidth(true), GUILayout.Height(20)))
              {
                Hs.highLightingData.targetImage.gameObject.SetActive(false);
              }
            }
            break;
        }
        //当前高亮的Image
        Hs.highLightingData.targetImage = (UnityEngine.UI.Image)EditorGUILayout.ObjectField("高亮目标图:", Hs.highLightingData.targetImage, typeof(UnityEngine.UI.Image), true);
      }



      if (Hs.scaleData.swich)
      {
        GUI.backgroundColor = Color.green;
      }
      else
      {
        GUI.backgroundColor = Color.white;
      }
      if (GUILayout.Button("缩放配置", GUILayout.ExpandWidth(true), GUILayout.Height(30)))
      {
        if (Hs.scaleData.swich)
        {
          Hs.scaleData.swich = false;
        }
        else
        {
          Hs.scaleData.swich = true;
        }
      }

      //缩放
      if (Hs.scaleData.swich)
      {
        GUI.backgroundColor = Color.white;
        Hs.scaleData.scaleValue = EditorGUILayout.Vector3Field("目标大小:", Hs.scaleData.scaleValue);
        Hs.scaleData.scaleDealy = EditorGUILayout.FloatField("时间:", Hs.scaleData.scaleDealy);
        Hs.scaleData.ease = (Ease)EditorGUILayout.EnumPopup("动画类型:", Hs.scaleData.ease);
        if (GUILayout.Button("默认", GUILayout.ExpandWidth(true), GUILayout.Height(20)))
        {
          Hs.scaleData.scaleValue = new Vector3(1.1f, 1.1f, 1.1f);
          Hs.scaleData.scaleDealy = 0.2f;
          Hs.scaleData.ease = Ease.InOutBack;
        }
      }



      if (Hs.clikData.swich)
      {
        GUI.backgroundColor = Color.green;
      }
      else
      {
        GUI.backgroundColor = Color.white;
      }
      if (GUILayout.Button("点击配置", GUILayout.ExpandWidth(true), GUILayout.Height(30)))
      {
        if (Hs.clikData.swich)
        {
          Hs.clikData.swich = false;
        }
        else
        {
          Hs.clikData.swich = true;
        }
      }

      //点击
      if (Hs.clikData.swich)
      {
        GUI.backgroundColor = Color.white;
        //当前高亮的Image
        Hs.clikData.targetImage = (UnityEngine.UI.Image)EditorGUILayout.ObjectField("目标选择图:", Hs.clikData.targetImage, typeof(UnityEngine.UI.Image), true);
        //使用当前类初始化
        _serializedObject = new SerializedObject(Hs);
        //获取当前类中可序列话的属性
        _assetLstProperty = _serializedObject.FindProperty("buttonGroups");
        _serializedObject.Update();

        //开始检查是否有修改
        EditorGUI.BeginChangeCheck();

        //显示属性
        //第二个参数必须为true,否则无法显示子节点即List内容
        EditorGUILayout.PropertyField(_assetLstProperty, true);

        //结束检查是否有修改
        if (EditorGUI.EndChangeCheck())
        {//提交修改
          _serializedObject.ApplyModifiedProperties();
        }
        if (Hs.clikData.targetImage!=null&&Hs.buttonGroups.Length>1)
        {
          if (GUILayout.Button("默认", GUILayout.ExpandWidth(true), GUILayout.Height(20)))
          {
            for (int i = 0; i < Hs.buttonGroups.Length; i++)
            {
              Hs.buttonGroups[i].transform.Find(Hs.clikData.targetImage.name).gameObject.SetActive(false);
            }
          }
        }
      }
    }
  }
}


在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_阿松先生

感谢您的支持~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值