zoukankan      html  css  js  c++  java
  • UGUI之不规则按钮的响应区域

    比如一些不规则按钮最好可以设置它的响应区域。如下图所示,用Polygon Collider2D组件圈出精灵响应事件的区域。

    注意 IsRaycastLocationValid 的判断区域是RectTransform的区域。 如果 polygon Collider编辑出来的区域大于RectTransform , 必须调节RectTransform的区域。

    例子:比如想把按钮的点击区域改成不规则的。

    1.把按钮的image的RaycastTarget关闭勾选

    2.在子节点创建新的gameObject挂上下面UIPolygon脚本。

    3.编辑Polygon的区域即可。

     1 using UnityEngine;
     2 using System.Collections;
     3 using UnityEngine.UI;
     4 #if UNITY_EDITOR
     5 using UnityEditor;
     6 #endif
     7 [RequireComponent(typeof(PolygonCollider2D))]
     8 public class UIPolygon : Image 
     9 {
    10     private PolygonCollider2D _polygon = null;
    11     private PolygonCollider2D polygon 
    12     {
    13         get{
    14             if(_polygon == null )
    15                 _polygon = GetComponent<PolygonCollider2D>();
    16             return _polygon;
    17         }
    18     }
    19     protected UIPolygon()
    20     {
    21         useLegacyMeshGeneration = true;
    22     }
    23     protected override void OnPopulateMesh(VertexHelper vh)
    24     {
    25         vh.Clear();
    26     }
    27     public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
    28     {
    29         return polygon.OverlapPoint( eventCamera.ScreenToWorldPoint(screenPoint));
    30     }
    31  
    32  #if UNITY_EDITOR
    33     protected override void Reset()
    34     {
    35         base.Reset();
    36         transform.localPosition = Vector3.zero; 
    37         float w = (rectTransform.sizeDelta.x *0.5f) + 0.1f;
    38         float h = (rectTransform.sizeDelta.y*0.5f)  + 0.1f;
    39         polygon.points = new Vector2[] 
    40         {
    41             new Vector2(-w,-h),
    42             new Vector2(w,-h),
    43             new Vector2(w,h),
    44             new Vector2(-w,h)
    45           };
    46     }
    47 #endif
    48 }
    49 #if UNITY_EDITOR
    50 [CustomEditor(typeof(UIPolygon), true)]
    51 public class UIPolygonInspector : Editor
    52 {
    53     public override void OnInspectorGUI()
    54     {
    55     }
    56 }
    57 #endif

    原文链接: http://www.xuanyusong.com/archives/3492

  • 相关阅读:
    对象状态序列化到字节流中
    操作EXCEL完毕后,关闭EXCEL进程
    ORACLE多表查询优化(引)
    再谈需要分析一
    动态添加table,动态添加控件
    ref传参时出错
    SqlServer2000下实现行列转换
    调用结构属性、方法或公共字段的区别
    拆箱存在的隐患
    鼠标悬停图片,滑动显示文字
  • 原文地址:https://www.cnblogs.com/AaronBlogs/p/7428951.html
Copyright © 2011-2022 走看看