本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
需求是点击圆盘UI转动。最开始的想法是用UI的EventSystem系统,但是发现UI的默认外框都是方形的,无法准确的点击。
思路
既然用不了UI的事件系统,那就使用collider2D来实现多边形效果。首先给UI添加Collider2D组件,然后把collider编辑成UI的形状,最后是编辑代码部分。
代码
我这里是实现的是鼠标按住后会一直执行方法,抬起后停止。
void Update()
{
if (!isGameOver && Input.GetMouseButtonDown(0))
{
//核心代码 接收鼠标点的2Dcollider,其余实现代码可以选择性忽略
RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
if (hit.collider != null)
{
//判断点击的物体名字
if(hit.collider.name == small.name|| hit.collider.name == middle.name|| hit.collider.name == big.name)
{
go = hit.collider.gameObject;
go.GetComponent<Turntable>().isDown = true;
}
}
}
if (Input.GetMouseButtonUp(0))
{
if(go != null)
go.GetComponent<Turntable>().isDown = false;
}
}
在这里备注一下layerMask参数的用法。它的作用是指定检测某个层的碰撞器。比如1<<16,前面的1代表bool,可以填1或0,1为true,0为false。后面的数字对应unity中的layer层。
比如:
LayerMask mask = 1 << 2; 表示开启索引为2的层。
LayerMask mask = 0 << 5表示关闭索引为5的层。
LayerMask mask = ~(1 << 16) 打开除了索引为16的层之外的层。
LayerMask mask = ~(1 << 0) 打开所有的层。
(1 << 16) | (1 << 8) 打开索引为10和索引为8的层。等价于LayerMask.GetMask(("Game", "Processing");