/* ------------------- Code Monkey ------------------- Thank you for downloading the Code Monkey Utilities I hope you find them useful in your projects If you have any questions use the contact form Cheers! unitycodemonkey.com -------------------------------------------------- */ //#define SOUND_MANAGER // Has Sound_Manager in project //#define CURSOR_MANAGER // Has Cursor_Manager in project using System; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; namespace CodeMonkey.Utils { /* * Button in the UI * */ public class Button_UI : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler { public Action ClickFunc = null; public Action MouseRightClickFunc = null; public Action MouseMiddleClickFunc = null; public Action MouseDownOnceFunc = null; public Action MouseUpFunc = null; public Action MouseOverOnceTooltipFunc = null; public Action MouseOutOnceTooltipFunc = null; public Action MouseOverOnceFunc = null; public Action MouseOutOnceFunc = null; public Action MouseOverFunc = null; public Action MouseOverPerSecFunc = null; //Triggers every sec if mouseOver public Action MouseUpdate = null; public Action OnPointerClickFunc; public enum HoverBehaviour { Custom, Change_Color, Change_Color_Auto, Change_Image, Change_SetActive, } public HoverBehaviour hoverBehaviourType = HoverBehaviour.Custom; private Action hoverBehaviourFunc_Enter, hoverBehaviourFunc_Exit; public Color hoverBehaviour_Color_Enter, hoverBehaviour_Color_Exit; public Image hoverBehaviour_Image; public Sprite hoverBehaviour_Sprite_Exit, hoverBehaviour_Sprite_Enter; public bool hoverBehaviour_Move = false; public Vector2 hoverBehaviour_Move_Amount = Vector2.zero; private Vector2 posExit, posEnter; public bool triggerMouseOutFuncOnClick = false; private bool mouseOver; private float mouseOverPerSecFuncTimer; private Action internalOnPointerEnterFunc = null, internalOnPointerExitFunc = null, internalOnPointerClickFunc = null; #if SOUND_MANAGER public Sound_Manager.Sound mouseOverSound, mouseClickSound; #endif #if CURSOR_MANAGER public CursorManager.CursorType cursorMouseOver, cursorMouseOut; #endif public virtual void OnPointerEnter(PointerEventData eventData) { if (internalOnPointerEnterFunc != null) internalOnPointerEnterFunc(); if (hoverBehaviour_Move) transform.GetComponent().anchoredPosition = posEnter; if (hoverBehaviourFunc_Enter != null) hoverBehaviourFunc_Enter(); if (MouseOverOnceFunc != null) MouseOverOnceFunc(); if (MouseOverOnceTooltipFunc != null) MouseOverOnceTooltipFunc(); mouseOver = true; mouseOverPerSecFuncTimer = 0f; } public virtual void OnPointerExit(PointerEventData eventData) { if (internalOnPointerExitFunc != null) internalOnPointerExitFunc(); if (hoverBehaviour_Move) transform.GetComponent().anchoredPosition = posExit; if (hoverBehaviourFunc_Exit != null) hoverBehaviourFunc_Exit(); if (MouseOutOnceFunc != null) MouseOutOnceFunc(); if (MouseOutOnceTooltipFunc != null) MouseOutOnceTooltipFunc(); mouseOver = false; } public virtual void OnPointerClick(PointerEventData eventData) { if (internalOnPointerClickFunc != null) internalOnPointerClickFunc(); if (OnPointerClickFunc != null) OnPointerClickFunc(eventData); if (eventData.button == PointerEventData.InputButton.Left) { if (triggerMouseOutFuncOnClick) { OnPointerExit(eventData); } if (ClickFunc != null) ClickFunc(); } if (eventData.button == PointerEventData.InputButton.Right) if (MouseRightClickFunc != null) MouseRightClickFunc(); if (eventData.button == PointerEventData.InputButton.Middle) if (MouseMiddleClickFunc != null) MouseMiddleClickFunc(); } public void Manual_OnPointerExit() { OnPointerExit(null); } public bool IsMouseOver() { return mouseOver; } public void OnPointerDown(PointerEventData eventData) { if (MouseDownOnceFunc != null) MouseDownOnceFunc(); } public void OnPointerUp(PointerEventData eventData) { if (MouseUpFunc != null) MouseUpFunc(); } private void Update() { if (mouseOver) { if (MouseOverFunc != null) MouseOverFunc(); mouseOverPerSecFuncTimer -= Time.unscaledDeltaTime; if (mouseOverPerSecFuncTimer <= 0) { mouseOverPerSecFuncTimer += 1f; if (MouseOverPerSecFunc != null) MouseOverPerSecFunc(); } } if (MouseUpdate != null) MouseUpdate(); } private void Awake() { posExit = transform.GetComponent().anchoredPosition; posEnter = transform.GetComponent().anchoredPosition + hoverBehaviour_Move_Amount; SetHoverBehaviourType(hoverBehaviourType); #if SOUND_MANAGER // Sound Manager internalOnPointerEnterFunc += () => { if (mouseOverSound != Sound_Manager.Sound.None) Sound_Manager.PlaySound(mouseOverSound); }; internalOnPointerClickFunc += () => { if (mouseClickSound != Sound_Manager.Sound.None) Sound_Manager.PlaySound(mouseClickSound); }; #endif #if CURSOR_MANAGER // Cursor Manager internalOnPointerEnterFunc += () => { if (cursorMouseOver != CursorManager.CursorType.None) CursorManager.SetCursor(cursorMouseOver); }; internalOnPointerExitFunc += () => { if (cursorMouseOut != CursorManager.CursorType.None) CursorManager.SetCursor(cursorMouseOut); }; #endif } public void SetHoverBehaviourType(HoverBehaviour hoverBehaviourType) { this.hoverBehaviourType = hoverBehaviourType; switch (hoverBehaviourType) { case HoverBehaviour.Change_Color: hoverBehaviourFunc_Enter = delegate () { hoverBehaviour_Image.color = hoverBehaviour_Color_Enter; }; hoverBehaviourFunc_Exit = delegate () { hoverBehaviour_Image.color = hoverBehaviour_Color_Exit; }; break; case HoverBehaviour.Change_Image: hoverBehaviourFunc_Enter = delegate () { hoverBehaviour_Image.sprite = hoverBehaviour_Sprite_Enter; }; hoverBehaviourFunc_Exit = delegate () { hoverBehaviour_Image.sprite = hoverBehaviour_Sprite_Exit; }; break; case HoverBehaviour.Change_SetActive: hoverBehaviourFunc_Enter = delegate () { hoverBehaviour_Image.gameObject.SetActive(true); }; hoverBehaviourFunc_Exit = delegate () { hoverBehaviour_Image.gameObject.SetActive(false); }; break; case HoverBehaviour.Change_Color_Auto: Color color = hoverBehaviour_Image.color; if (color.r >= 1f) color.r = .9f; if (color.g >= 1f) color.g = .9f; if (color.b >= 1f) color.b = .9f; Color colorOver = color * 1.3f; // Over color lighter hoverBehaviourFunc_Enter = delegate () { hoverBehaviour_Image.color = colorOver; }; hoverBehaviourFunc_Exit = delegate () { hoverBehaviour_Image.color = color; }; break; } } public void RefreshHoverBehaviourType() { SetHoverBehaviourType(hoverBehaviourType); } /* * Class for temporarily intercepting a button action * Useful for Tutorial disabling specific buttons * */ public class InterceptActionHandler { private Action removeInterceptFunc; public InterceptActionHandler(Action removeInterceptFunc) { this.removeInterceptFunc = removeInterceptFunc; } public void RemoveIntercept() { removeInterceptFunc(); } } public InterceptActionHandler InterceptActionClick(Func testPassthroughFunc) { return InterceptAction("ClickFunc", testPassthroughFunc); } public InterceptActionHandler InterceptAction(string fieldName, Func testPassthroughFunc) { return InterceptAction(GetType().GetField(fieldName), testPassthroughFunc); } public InterceptActionHandler InterceptAction(System.Reflection.FieldInfo fieldInfo, Func testPassthroughFunc) { Action backFunc = fieldInfo.GetValue(this) as Action; InterceptActionHandler interceptActionHandler = new InterceptActionHandler(() => fieldInfo.SetValue(this, backFunc)); fieldInfo.SetValue(this, (Action)delegate () { if (testPassthroughFunc()) { // Passthrough interceptActionHandler.RemoveIntercept(); backFunc(); } }); return interceptActionHandler; } } }