码迷,mamicode.com
首页 > 编程语言 > 详细

Unity 不规则按钮实现

时间:2021-06-28 20:15:51      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:cat   一个   脚本   原来   text   正交   system   event   不规则   

  1.先重写Image类,实现对Image图形范围的重写;

  2.对不规则按钮添加Polygon Collider2D组件,调整大小圈中要点击的范围;

  3.将重写的Image类添加到不规则按钮上时,需要移除不规则按钮上原来的Image组件,因为这个是继承Image,一个物体上不能同时有两个Image组件,并取消注释下面不绘制图片的代码;

或者在不规则按钮下新建个空物体添加脚本,此时需要注意取消勾选父物体的Image组件的Raycast Target属性,并且不规则按钮下的Image、Text等都需要取消勾选该属性。

技术图片

 

 

 

 

 

   4.注意 IsRaycastLocationValid(判断点击是否生效的范围) 的判断区域是RectTransform的区域。 如果 polygon Collider编辑出来的区域大于RectTransform , 必须调节RectTransform的区域。

 

 

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;

[RequireComponent(typeof(PolygonCollider2D))]
public class MyUIPolygon : Image
{
    // Polygon -- 多边形
    private PolygonCollider2D polygon = null;
    public PolygonCollider2D Polygon {
        get {
            if (polygon == null)
                polygon = transform.GetComponent<PolygonCollider2D>();
            return polygon;
        }
    }

    #region 不绘制图片
    //protected MyUIPolygon()
    //{
    //    useLegacyMeshGeneration = true;
    //}

    ////UI元素需要生成顶点时的回调函数
    ////由 Text、Image 和 RawImage 使用,例如用于生成特定于其用例的顶点
    ////VertexHelper:可辅助为 UI 生成网格的 Utility 类。
    //protected override void OnPopulateMesh(VertexHelper vh)
    //{
    //    vh.Clear();
    //}
    #endregion



    //检测点击到的图片位置是否生效
    //相机必须为正交视角。具体不知道
    //IsRaycastLocationValid 给定一个点和一个摄像机,判断射线投射是否有效。
    //重载该方法 该方法会在父类中调用
    //重新该方法还可以阻断子物体接收射线检测
    public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
    {
        //point 世界空间中的点。
        bool isResult = Polygon.OverlapPoint(eventCamera.ScreenToWorldPoint(screenPoint));
        print(isResult);
        return isResult;
    }

#if UNITY_EDITOR 
    //重置PolygonCollider2D大小和图片位置
    protected override void Reset()
    {
        base.Reset();
        transform.localPosition = Vector3.zero;
        var w = rectTransform.sizeDelta.x * 0.5f + 0.1f;
        var h = rectTransform.sizeDelta.y * 0.5f + 0.1f;
        Polygon.points = new[]
        {
            new Vector2(-w, -h),
            new Vector2(w, -h),
            new Vector2(w, h),
            new Vector2(-w, h)
        };
    }
    [CustomEditor(typeof(MyUIPolygon), true)]
    public class MyUIPolygonInspector : Editor
    {
        public override void OnInspectorGUI()
        {

        }
    }
#endif

}

 

 

 

详细的可以看雨松大大的文章 https://www.xuanyusong.com/archives/3492

 

Unity 不规则按钮实现

标签:cat   一个   脚本   原来   text   正交   system   event   不规则   

原文地址:https://www.cnblogs.com/PanPan21/p/14928517.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!