NGUI不规则形状点击

PolygonCollider2D

我们的地图是这样的不规则形状,最开始简单用Box Collider处理点击,但是点击地图边缘时命中率很差。今天查到Unity有多边形Collider可以支持不规则形状,PolygonCollider2D

给地图【变异的开端】加上PolygonCollider2D,然后根据地图形状编辑Collider多边形,编辑好之后下图这样子。

点击实现

需要注意的是NGUI中检测射线碰撞用的是Physics.RayCast,不支持2D Collider,也就是无法响应touch/click等事件。需要自己用Physics2D.Raycast来检测碰撞。可以参考NGUI的UICamera::Raycast写。

void Update() {
    bool btnDown = Input.GetMouseButtonDown(0);
    bool btnUp = Input.GetMouseButtonUp(0);
    if (btnDown || btnUp) {
        UICamera uicam = UISystem.Instance.uiCamera;
        Camera cam = uicam.camera;
        int mask = cam.cullingMask & (int)uicam.eventReceiverMask;
        float dist = uicam.rangeDistance;
        if (dist < 0.000001f)
            dist = cam.farClipPlane-cam.nearClipPlane;

        Ray ray = cam.ScreenPointToRay(Input.mousePosition);
        RaycastHit2D hit = Physics2D.Raycast(ray.origin, ray.direction, dist, mask);
        if (hit.collider != null) {
            GameObject obj = hit.collider.gameObject;
            UISprite spr = obj.transform.GetComponentInChildren<UISprite>();
            if (btnDown) {
                spr.color = Color.gray;
                DebugLog.Log("click " + obj.name);
            }
            else {
                spr.color = Color.white;
                DebugLog.Log("release " + obj.name);
            }
        }
    }
}

另一种方法

除了使用引擎支持的多边形Collider,还可以根据颜色来处理点击。先根据地图,预生成一个颜色块图,游戏中根据点击点的像素颜色来判断。比如,地图是下面这样的:

生成的颜色块图

转载请注明出处: http://blog.csdn.net/ynnmnm/article/details/45719353 作者: 夜风

时间: 2024-10-15 18:06:40

NGUI不规则形状点击的相关文章

Ngui 五种点击事件实现方式及在3d场景中点透的情况

http://www.unity蛮牛.com/thread-22018-1-1.html ngui作为unity界面插件之一中,无疑是最好用,使用最多的了从自学unity到现在界面一直使用它 由于它的持续更新,我在此不得不说,确实很为开发者作想,为什么这么讲呢?大概在去年吧  当时用的那个版本已经不记得了,反正就是有个需求,要实现“无限循环”拖动,使用过以前ngui的人就知道当时是没有这个功能的,后来被自己弄出来没几天,就发现新版本中就自带了这样的东西,也就是如今ngui列子中的 Endless

NGUI判断是否点击到UI控件

注意:UI应加上Box Collider 1.射线检测 UICamera发一条射线,射线碰到了东西就说明点击到了UI Ray ray=UICamera.mainCamera.ScreenPointToRay(Input.mousePosition);// 向屏幕发射线 RaycastHit hit; if(Physics.Raycast(ray,out hit,200))//射线的碰撞检测 {      print("点击了UI"); } 2.根据UICamera中的变量isOverU

CAD创建不规则形状视口

选择CAD模型空间中多段线,在指定的布局中创建视口,方法如下: 1 /// <summary> 2 /// 创建视口 3 /// </summary> 4 /// <param name="roundLine">模型空间多段线</param> 5 /// <param name="curentLayout">当前布局名称</param> 6 /// <param name="in

css3-radio不规则形状动画

利用质数做随机图形 参考网站 http://2016.uxlondon.com/speakers .list { margin: 10px; display: inline-block; width: 168px; height: 168px; border: 4px solid #00C7E9; border-radius: 87% 91% 98% 100%; -webkit-transition: all .35s; transition: all .35s; overflow: hidde

不规则形状的Mask动画

效果 源码 https://github.com/YouXianMing/Animations // // MaskShapeViewController.m // Animations // // Created by YouXianMing on 16/7/10. // Copyright © 2016年 YouXianMing. All rights reserved. // #import "MaskShapeViewController.h" #import "Ap

任意不规则形状的图片剪裁 .

原理:根据选择的区域(区域的选择需要用到GraphicsPath),根据区域可以得到这部分区域的边境矩形,从而不需要循环整张图片,只需要循环边境矩形,将矩形中的选择区域复制到另一种图片,这样大大提高了效率.根据选择的区域,可以得到复制出位于GraphicsPath中的这部分图片,同时设置这部分图片为透明,同时还要设置另一种图片不在GraphicsPath内的区域为透明,这样看起来的效果就是从图片中扣出来的一样,意思和PhotoShop的套索工具差不多. 说得有点晕了,还是看效果图吧:(左边是剪裁

不规则形状表格合并

在学习表格时我们会遇到一些既跨行又跨列合并的情况,此时可以用下面这种方法来实现. <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>Document</title> </head> <body> <br> <br> <br> <br> <table width=&q

iOS开发 - 事件传递响应链

一.序言 当我们在使用微信等工具,点击扫一扫,就能打开二维码扫描视图.在我们点击屏幕的时候,iphone OS获取到了用户进行了"单击"这一行为,操作系统把包含这些点击事件的信息包装成UITouch和UIEvent形式的实例,然后找到当前运行的程序,逐级寻找能够响应这个事件的对象,直到没有响应者响应.这一寻找的过程,被称作事件的响应链,如下图所示,不用的响应者以链式的方式寻找. 事件响应链: 二.响应者 在iOS中,能够响应事件的对象都是UIResponder的子类对象.UIRespo

自定义button的点击区域

某些情况下我们需要按钮有不规则的形状,在这些形状内点击才有响应,例如下面的图片中: 图片中红线圈出的两处都是用按钮做的,按钮的实际布置是上面第二张图所画的那样,所有按钮都是矩形的,但是中间的按钮和一圈的转盘形状都不可能用矩形,否则点击的时候难免相互影响. 那么如何自定义按钮点击的有效区域呢,其实很简单,只要重写一个函数即可: - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 系统发生触摸事件的时候会从window到父控件到