2016-08-05 297 views
0

我試圖檢測鼠標在3D場景上的2D精靈上單擊。Physics2D.OverlapPoint()返回總是爲空

我的所有Sprite都有一個Box Collider 2D(放置良好)和一個腳本,但是一直是null。我也嘗試將Update()函數放在GameEngine GameObject上的腳本上,但我得到了相同的結果。

 void Update() { 
    if (Input.GetMouseButtonDown(0)) { 
     Vector2 mouse_position = Camera.main.ScreenToWorldPoint (Input.mousePosition); 
     Collider2D hit = Physics2D.OverlapPoint (mouse_position); 

     if (hit) { 
      Debug.Log ("Hit" + hit.transform.name); 
     } else { 
      Debug.Log (hit); 
     } 
    } 
} 

void OnMouseDown() { 
    Debug.Log ("Hit " + this.name); 
} 

enter image description here

+1

我建議是使用UnityEngine.EventSystems和實施以下這些接口 IPointerClickHandler IPointerDownHandler IPointerEnterHandler IPointerExitHandler IPointerUpHandler 或在它的最基本的層面EventTriggers https://unity3d.com/學習/教程/主題/用戶界面 - 用戶界面 - 用戶界面 - 用戶界面 - 事件 - 觸發器 – Rob

+0

亞瑟 - 你在做什麼**是完全錯誤的**,嘿:)它更容易。除了其他任何東西,**一定要閱讀這個**:http://stackoverflow.com/a/38311402/294884 – Fattie

+0

確實羅布已經完全解釋它給你很好 – Fattie

回答

2

不需要做你在做什麼。新的Canvas UI系統內置了一個複雜的事件系統。

如果你看看你的「Image」組件,它有一個「Raycast Target」基本打開或關閉該組件的事件系統處理程序。

您可以使用UnityEngine.EventSystems命名空間來偵聽畫布元素上的點擊/拖動和其他事件。

下面是一個例子給你:

using UnityEngine; 
using UnityEngine.EventSystems; 
class BuildingUI : Monobehaviour, IPointerDownHandler, IPointerUpHandler { 

    void OnPointerDown(PointerEventData eventData) 
    { 
     Debug.Log("Pointer Down " + eventData.selectedObject.name); 
    } 

    void OnPointerUp(PointerEventData eventData) 
    { 
     Debug.Log("Pointer Up " + eventData.selectedObject.name); 
    } 
} 

有,你可以實現接口的負載,我建議你籤的手冊。

+1

非常正確。 (PS羅布,你只是有一個錯字「內置」。) – Fattie

+2

OP,如果你想要做拖放。這是一個***瘋狂有用的***複製和粘貼腳本。 http://stackoverflow.com/a/37473953/294884就在幾年前,製片公司可能會收取20,000美元來實現拖放。現在你只需粘貼該腳本呃。羅布如果你還沒有看到它是非常方便的 – Fattie

+0

看起來像一個體面的資源。我已經實現了幾次指針和拖動界面。與Web的PointerEvents API非常相似。 – Rob

0

我敢肯定,你的問題的根本原因是你的「大廈」的對象是UI對象,是一個帆布下。這可能會導致很多事情,但是我認爲導致您的問題的是世界和屏幕空間的問題。

當您的「建築」對象位於未使用世界空間作爲位置的畫布下時,您正在將鼠標位置從屏幕點轉換爲世界空間。爲了證實這一點,我建議你爲原始鼠標位置,轉換後的鼠標位置以及「建築」對象的實際位置做一個Debug.Log。如果您發現未轉換的鼠標位置與您的物體位置更逼真,我建議您除去轉換。

您可能需要做額外的工作(即對鼠標或對象位置進行一些數學計算和/或更改對象的錨點)以使其完美運行,但這應該允許您的鼠標位置和對象成爲在職位上與同一單位合作。

+0

下使用它的工作正常,如果我把'輸入。 mousePosition'作爲「Physics2D.OverlapPoint」的屬性。如果我使用屏幕鼠標位置可以嗎?或者,如果我做了一些處理世界上的事情,這會更好嗎? (以及如何?) – Arthur

+1

你會改變它的方式將改變你的畫布從屏幕空間到世界空間或類似的東西。儘管如此,我不會推薦。如果你希望你的按鈕保持在同一個空間,無論你的相機在遊戲中移動的位置如何,你都需要它們進入屏幕空間,而不是在世界空間。另外,UI通常基於屏幕空間並且獨立於世界空間,所以在設計方面優選使用屏幕座標來處理UI。 – Brien