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);
}
}
}
}
}
}
}