事件的裁剪
在游戏开发过程中经常会遇到多个游戏对象完全或部分重合的情况,在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碰撞器