2015-01-11 24 views
1

我正在處理項目上的用戶界面問題。它涉及「節點」並將它們連接在一起。我將兩個節點連接在一起,連接到按下初始節點上的按鈕,然後單擊其他節點以連接到它。後半部分是通過檢查何時Event.current.type == EventType.MouseDown然後將最初節點加入您最後一次懸停的節點來實現的。在Unity 3D中「使用」的調試事件

也能正常工作的大部分時間,但是我注意到,有時當你點擊另一個節點上它不會加入他們在一起的瞬間,但直到點擊關閉的節點。在做了Debug.Log(Event.current.type)之後,它表明有時事件在我點擊時會變成「used」,而不是「mouseDown」,因此在我點擊其他地方之前不會執行連接代碼。它似乎只發生在一些節點上。

下面是與控制檯輸出的兩種行爲的GIF:

Short demo

Longer demo

問題代碼:

private bool detectEscape() 
{ 
    Debug.Log(Event.current.type); 
    return (Event.current.type == EventType.MouseDown); 
} 

此函數返回假有時由於鼠標點擊到有時被「使用」的事件。它在GUI中被調用。

任何理由是什麼原因導致當前事件知道要使用嗎?我在我的代碼中的許多地方做了上面的比較。那可能是導致當前事件被使用的原因嗎?我如何避免它?

我是正確使用事件系統?

知道有一種更好的方式來捕捉鼠標點擊?使用Input.GetMouseButtonDown(0)不幸的是它不是一個選項,因爲它只在遊戲運行時才起作用,並且這個程序是爲了編輯器的擴展。

否則,知道在Unity 3D的源代碼中放置一個斷點的方法,這樣我可以將其中一個放入函數Event.Use()中,並確定消耗鼠標事件的是什麼?

+1

添加源代碼是很好的東西。但是,在這裏添加相關的代碼作爲簡短的代碼也非常感謝。不是每個人都想要/有時間挖掘你的所有源代碼。 –

+0

加上外部鏈接可以中斷,並且在github未來的變化情況下可能會導致它在這個特定問題的上下文中無法使用,因此將相關代碼放入問題本身的規則 – LearnCocos2D

+0

謝謝。好點。編輯更好? – mcdonalda1993

回答

1

想必你是從OnGUI呼籲detectEscape地方,對吧?當前事件僅在OnGUI期間有效。另外,OnGUI可以每幀調用多次,具有不同的當前事件。有時事件類型可能是重畫,有時可能是MouseDown,有時它可能是別的。所以如果事件類型不是MouseDown,你不想假設鼠標沒有關閉;鼠標可能仍然停機,但可能會發生不同的事件。

+0

您的回答幫助我解決了這個問題。你沒有假設鼠標可能沒有關閉。我想也許問題可能是事件系統正在更新當前事件中重繪/渲染,並因此會覆蓋掉鼠標事件。 我最終解決這個問題的方式是在繪圖函數開始時捕獲'Event.current.type',然後將其全局應用於所有節點等。 – mcdonalda1993