| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- /*
- ------------------- 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<PointerEventData> 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<RectTransform>().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<RectTransform>().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<RectTransform>().anchoredPosition;
- posEnter = transform.GetComponent<RectTransform>().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<bool> testPassthroughFunc) {
- return InterceptAction("ClickFunc", testPassthroughFunc);
- }
- public InterceptActionHandler InterceptAction(string fieldName, Func<bool> testPassthroughFunc) {
- return InterceptAction(GetType().GetField(fieldName), testPassthroughFunc);
- }
- public InterceptActionHandler InterceptAction(System.Reflection.FieldInfo fieldInfo, Func<bool> 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;
- }
- }
- }
|