检测GUI纹理上的触摸

时间:2013-03-18 07:02:50

标签: user-interface mouse unity3d

我有2个gui纹理。

根据屏幕宽度和高度,我保留在gui。

一个用于操纵杆,另一个用于射手。

现在触及射手操纵杆移动到该特定部分。

我使用了rect.Contains。

void Start () {
xx = Screen.width - Screen.width/12;
yy = Screen.height - Screen.height/8; 
lb = Screen.width/10;
rect = new Rect(-xx/2, -yy/2, lb, lb);
shooter.pixelInset  = rect;       
shooter.enabled = false;      
}

void OnGUI(){
if(characterScript.playbool){
   shooter.enabled = true;
} 
if (rect.Contains(Event.current.mousePosition)){
shootBool = true;
print("shoot");
alert.text="shoot";
}   
}

对我不适合。认为空间坐标与gui坐标不同。如何解决这个问题。任何人都可以建议任何其他好的方法

2 个答案:

答案 0 :(得分:1)

您可以尝试HitTest

function Update()
{
    for (var touch : Touch in Input.touches)
    {
        if (rect.Contains(touch.position))
        {
            // we are now in the guitexture 'rect'
            Debug.Log("rect touched");
            exit;
        }
    }
}

如您在问题中所述,上面的代码与触摸一起使用。但是,由于您标记了mouse,我不确定您是使用鼠标还是触摸。

因此,如果您使用鼠标单击对象,则可以使用:

if (rect.Contains(Input.mousePosition) && Input.GetMouseButtonDown(0))
{
    Debug.Log("rect clicked");
    exit;
}

答案 1 :(得分:0)

对代码进行一些调试会带来一些问题。

假设屏幕分辨率为800x600px:

xx = 800 - 800 / 12
   = 733.3333333333333
yy = 600 - 600 / 8
   = 525
lb = 800 / 10
   = 80
rect = (-366.665, -262.5, 80, 80)

为什么lb由屏幕宽度除以10确定?

现在问题的核心是Event.mousePosition从屏幕的左上方开始,而GUITexture.pixelInset位于屏幕的中心。

您必须调整Event.mousePosition以使用屏幕中心作为原点,否则您必须调整rect变量以从屏幕的左上角开始。