UGUI之事件隔离(事件裁剪)

本文探讨了在Unity游戏开发中如何解决事件隔离的问题,即当多个游戏对象重叠时,如何避免点击重叠部分导致多个对象响应事件。通过介绍一种称为事件裁剪的解决方案,作者详细说明了如何通过在扑克牌对象上绑定特定脚本和Collider碰撞器来防止类似黑桃6和方块5重合时的误触发事件问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    事件的裁剪

    在游戏开发过程中经常会遇到多个游戏对象完全或部分重合的情况,在cocos2dx中通过的层的Swallow可以实现事件的隔离,避免因为游戏对象的重合而造成点击游戏对象重合部分时多个游戏对象同时触发相应事件的情况,但Unity好像没有这个功能,最近做项目的时候遇到这个问题,我们不妨称为事件裁剪问题,如下图所示:

 

    黑桃6和方块5有部分重合,当我想选择方块5出时,如果点击A点,则黑桃6和方块5将同时被打出,这不是想要的结果,我是通过如下方法解决的:

using UnityEngine;

using System.Collections;


public class Up2Down : MonoBehaviour {
    //扑克打出标志
    bool UP;
    void Start () {
        UP = false;
    }
    void Update()
    {
         if (Input.GetMouseButtonDown(0))
         {
             Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
             Vector2 origin  = new Vector2(ray.origin.x, ray.origin.y);
             Vector2 direction  = new Vector2(ray.direction.x, ray.direction.y);
 
             //获取射线碰撞对象组
             RaycastHit2D[] hits = Physics2D.RaycastAll(origin, direction);
             if (hits.Length > 0)
             {
                 int mindex = hits.Length;
                 int selected = 0;
                 float xpos = 10000;
                  //甄选最外层游戏对象相应触摸操作
                 for (int i = 0; i < mindex; i++)
                 {
                     float pos  = Input.mousePosition.x-hits[i].transform.position.x+hits[i].collider.bounds.extents.x;
                     //碰撞轮廓比较
                     if( pos  < xpos){
                         selected = i;
                         xpos = pos;
                     }
                 }
                 if (hits[selected].transform == gameObject.transform)
                 {
                     //选择
                     if (!UP)
                     {
                         gameObject.transform.localPosition += new Vector3(0, 3, 0);
                         UP = true;
                     }
                        //放回
                     else
                     {
                         gameObject.transform.localPosition += new Vector3(0, -3,0);
                         UP = false;
                     }
                 }
             }
         }      
 
}

    将该脚本绑定在扑克牌上即可实现事件裁剪,注意:扑克牌事先应绑定有Collider碰撞器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值