2015-11-03 41 views
1

我想檢測球體上的水龍頭。我在谷歌搜索和許多方法像ontriggerenter()和使用射線等被發現。統一檢測球體上的水龍頭

但我想獲得一些價值,也就是用戶觸及球的地方。

就像球的中心是x = 0,y = 0一樣。那麼當用戶觸摸球體的右上角時,我應該得到正的x和y。

沒有必要確切地得到這個值,值可以是任何東西,但通過這些值我應該能夠知道用戶已經在這8個部分的球中的一個。近圓心

  1. 右上

  2. 下圓的右邊靠近中心

  3. 左上附近圓心

  4. 左下附近圓心

  5. 右上角附近右上角

  6. 右下圓的近角

  7. 圈的左上近角

  8. 下圓的左側近角

回答

1

您可以使用您發現的方法,用光線投射你將得到水龍頭的確切位置。然後,您必須將球體的中心點和水龍頭位置轉換爲屏幕空間座標。然後你可以得到這些向量之間的差異,以獲得從中心的方向和距離。

PS:圈子有角落嗎?

你需要有一個遊戲對象,其中有一個碰撞對象被設置爲「是觸發器」。幷包含以下代碼的腳本。

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%"); 
    } 

結合兩者授予您評估與最大距離相比,球體中任意點與中心的角度和距離的能力。

如果你只是想強制點擊點,你只需要一個ridgit身體和raycasting。這oficial Unity tutorial將解釋它。

也許你必須結合這兩個答案,但我認爲Unity教程足以滿足你的需求。PS:請提問你想達到的最終目標,而不僅僅是你認爲完成工作所需的一步。

+0

代碼會對我很有幫助,因爲我對團結不太好,所以它會幫助我快速學習 – Yawar

+0

@Yawar添加代碼。如果您需要更多解釋,請告訴我。 – AntiHeadshot

+0

@Yawar我添加了一個官方統一教程鏈接,你可能會覺得有用。 – AntiHeadshot

0

您不需要選擇光線投射,您可以使用"OnMouseDown"
此處的文檔:http://docs.unity3d.com/ScriptReference/MonoBehaviour.OnMouseDown.html 注意:爲了使其工作,您的對象需要碰撞器。

+0

如何獲取用戶點擊的點?文檔只是說,它會在用戶點擊時運行。沒有檢測到用戶點擊的位置 – Yawar

+0

嗯,我不知道你是否可以檢索球體已被觸及的空間點。我的消化,1尋找它,2你可以創建「幽靈」立方體,表明該球體的「角落」,然後使球體的孩子,並減少不透明度。然後添加你的感人詩句給他們。 不知道這是否適合你的問題,也許你想點擊,也許擠出一個頂點。這似乎是一個更復雜的功能,祝你好運。 –

+0

我不是很善於團結,我認爲這是一個基本的功能。我只是想檢測球體上的點,並據此對球體施加力量。 – Yawar