Advertisement
Guest User

ButtonHitZone

a guest
Jun 19th, 2020
310
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.29 KB | None | 0 0
  1. using UnityEngine;
  2. using UnityEngine.UI;
  3. using UnityEngine.EventSystems;
  4.  
  5. //based on a script by: booferei
  6. //https://answers.unity.com/questions/844524/ugui-how-to-increase-hitzone-click-area-button-rec.html?page=1&pageSize=5&sort=votes
  7. public class ButtonHitZone : MonoBehaviour
  8. {
  9.     [Header("Size")]
  10.     [SerializeField]
  11.     private float m_Width;
  12.     [SerializeField]
  13.     private float m_Height;
  14.  
  15.     [Header("Gizmo")]
  16.     [SerializeField]
  17.     private Color m_GizmoColor = Color.white;
  18.     [SerializeField]
  19.     private float m_GizmoFillOpacity = 0.5f;
  20.  
  21.     public class EmptyGraphic : Graphic
  22.     {
  23.         protected override void OnPopulateMesh(VertexHelper vh)
  24.         {
  25.             vh.Clear();
  26.         }
  27.     }
  28.  
  29.     void OnValidate()
  30.     {
  31.         RectTransform rectTransform = GetComponent<RectTransform>();
  32.  
  33.         if (rectTransform != null)
  34.         {
  35.             m_Width = Mathf.Max(m_Width, rectTransform.sizeDelta.x);
  36.             m_Height = Mathf.Max(m_Height, rectTransform.sizeDelta.y);
  37.         }
  38.     }
  39.  
  40.     void OnDrawGizmosSelected()
  41.     {
  42.         RectTransform rectTransform = GetComponent<RectTransform>();
  43.  
  44.         if (rectTransform != null)
  45.         {
  46.             float gizmoWidth = m_Width * rectTransform.lossyScale.x;
  47.             float gizmoHeight = m_Height * rectTransform.lossyScale.y;
  48.  
  49.             Gizmos.color = m_GizmoColor;
  50.             Gizmos.DrawWireCube(rectTransform.position, new Vector3(gizmoWidth, gizmoHeight, 0.0001f));
  51.  
  52.             if (m_GizmoFillOpacity > 0)
  53.             {
  54.                 Gizmos.color = new Color(m_GizmoColor.r, m_GizmoColor.g, m_GizmoColor.b, m_GizmoFillOpacity);
  55.                 Gizmos.DrawCube(rectTransform.position, new Vector3(gizmoWidth, gizmoHeight, 0.0001f));
  56.             }
  57.         }
  58.     }
  59.  
  60.     void Awake()
  61.     {
  62.         CreateHitZone();
  63.     }
  64.  
  65.     void CreateHitZone()
  66.     {
  67.         // create child object
  68.         GameObject gobj = new GameObject("Button Hit Zone");
  69.  
  70.         RectTransform hitzoneRectTransform = gobj.AddComponent<RectTransform>();
  71.         {
  72.             hitzoneRectTransform.SetParent(transform);
  73.             hitzoneRectTransform.localPosition = Vector3.zero;
  74.             hitzoneRectTransform.localScale = Vector3.one;
  75.             hitzoneRectTransform.sizeDelta = new Vector2(m_Width, m_Height);
  76.         }
  77.  
  78.         // create transparent graphic
  79.         // Image image = gobj.AddComponent<Image>();
  80.         // image.color = new Color(0, 0, 0, 0);
  81.         gobj.AddComponent<EmptyGraphic>();
  82.  
  83.         // delegate events
  84.         EventTrigger eventTrigger = gobj.AddComponent<EventTrigger>();
  85.         // pointer up
  86.         AddEventTriggerListener(eventTrigger, EventTriggerType.PointerDown,
  87.             (BaseEventData data) =>
  88.             {
  89.                 ExecuteEvents.Execute(gameObject, data,
  90.                    ExecuteEvents.pointerDownHandler);
  91.             });
  92.         // pointer down
  93.         AddEventTriggerListener(eventTrigger, EventTriggerType.PointerUp,
  94.             (BaseEventData data) =>
  95.             {
  96.                 ExecuteEvents.Execute(gameObject, data,
  97.                    ExecuteEvents.pointerUpHandler);
  98.             });
  99.         // pointer click
  100.         AddEventTriggerListener(eventTrigger, EventTriggerType.PointerClick,
  101.             (BaseEventData data) =>
  102.             {
  103.                 ExecuteEvents.Execute(gameObject, data,
  104.                    ExecuteEvents.pointerClickHandler);
  105.             });
  106.     }
  107.  
  108.     static void AddEventTriggerListener(EventTrigger trigger, EventTriggerType eventType, System.Action<BaseEventData> method)
  109.     {
  110.         EventTrigger.Entry entry = new EventTrigger.Entry();
  111.         {
  112.             entry.eventID = eventType;
  113.             entry.callback = new EventTrigger.TriggerEvent();
  114.             entry.callback.AddListener(new UnityEngine.Events.UnityAction<BaseEventData>(method));
  115.         }
  116.  
  117.         trigger.triggers.Add(entry);
  118.     }
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement