检测统一点击球体

时间:2015-11-03 04:18:08

标签: unity3d touch

我想检测球体上的点按。我在google上搜索了很多方法,比如ontriggerenter()和使用光线投射等。

但我想得到一些价值,也就是用户触及球的地方。

如果球体的中心是x = 0,则y = 0。当用户触摸球体的右上角时,我应该得到正x和y。

没有必要得到这个值,Value可以是任何东西,但除了这些值,我应该能够知道用户已经点击了这8个球部分中的一个。

  1. 靠近圆心的右上角

  2. 靠近圆心的右下方

  3. 靠近圆心的左上角

  4. 靠近圆心的左下方

  5. 圈子右上角

  6. 圈子右下角

  7. 圈子的左上角

  8. 圆圈左下角

2 个答案:

答案 0 :(得分:1)

您可以使用找到的方法,通过光线投射,您将获得水龙头的确切位置。然后,您必须将球体的中心点和点击位置转换为屏幕空间坐标。然后你可以得到这些矢量之间的差异,以获得距离中心的方向和距离。

PS:圈子有角落吗?

你需要有一个带有碰撞器的GameObject,它被设置为" Is Trigger"。以及包含以下代码的脚本。

void OnMouseDown()
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    RaycastHit hit;
    //hits for sure, because we are in the click event
    Physics.Raycast(ray, out hit);

    Vector3 hitOnScreen = Camera.main.WorldToScreenPoint(hit.point);
    Vector3 centerOnScreen = Camera.main.WorldToScreenPoint(transform.position);

    Vector3 offset = hitOnScreen - centerOnScreen;

    if(offset.x > 0 && offset.y > 0)
    {
        Debug.Log("upper right");
    }else if(offset.x < 0 && offset.y > 0)
    {
        Debug.Log("upper left");
    }else if(offset.x > 0 && offset.y < 0)
    {
        Debug.Log("lower right");
    } else //if(offset.x < 0 && offset.y < 0)
    {
        Debug.Log("lower left");
    }
}

距离中心的距离越来越复杂。 我们必须得到一个垂直于相机到中心的矢量,然后将其缩放到适当的尺寸。如果我们将其添加到中心并将其转换为屏幕空间,我们将得到球体表面上可以达到的最大幅度。

    Vector3 perpendicular = Vector3.Cross(transform.position - Camera.main.transform.position, Vector3.one);
    Vector3 maxDistToCenter = transform.position + (perpendicular.normalized * (transform.lossyScale.x * 0.5f));

    Vector3 maxDistToCenterOnScreen = Camera.main.WorldToScreenPoint(maxDistToCenter);

    float maxDist = (maxDistToCenterOnScreen - centerOnScreen).magnitude;
    float dist = offset.magnitude;

    if (dist < maxDist * 0.5f) // 50% of the way not the area
    {
        Debug.Log("inner 50%");
    }
    else
    {
        Debug.Log("outer 50%");
    }

两者结合使您能够评估球体上角度和距离中心距离与最大距离相比的任何点。

如果您只想对点击的点施加力,您只需要一个体格和光线投射。这oficial Unity tutorial将解释它。

也许您必须将两个答案结合起来,但我认为Unity教程足以满足您的需求。

PS:请向你想要达到的最终目标询问任务,而不仅仅是你认为完成工作所需的步骤。

答案 1 :(得分:0)

您不需要进行光线投射,您可以使用"OnMouseDown" 这里的文档:http://docs.unity3d.com/ScriptReference/MonoBehaviour.OnMouseDown.html 注意:您的对象需要一个对撞机才能使其正常工作。