2d unity 多物体 射线_[蛮牛驿馆] Unity2D:用射线检测物体的点击
原標題:[蠻牛驛館] Unity2D:用射線檢測物體的點擊
通常,在Unity里會經常使用OnMouseDown檢測GameObjects上的點擊。效果很好,但需要在Gameobject上掛一個腳本,而且當存在很多可點擊的物體時還必須要同步。
1
另一種方法,也就是這邊文章要講到的,就是用一個腳本來管理整個游戲中的點擊。一大堆的理由可以說明這是非常有用的,但主要是提供一個集中的位置來管理所有的輸入以及整合整個游戲過程中的點擊。舉個例子,在角色的視野范圍內時,在菜單關閉時,或者沒有游戲內的對話框彈出時,可能只有一個Box可以被點擊。在這種情況下,將點擊的邏輯放在Box的腳本里,需要box有知識來訪問角色、菜單和對話框系統,這樣就會導致混亂的代碼。在GameObjects里掛上點擊事件還會導致一個問題,假如要支持多種輸入,比如點擊和觸摸,你會發現有太多的GameObject的腳本都掛上了點擊事件,而且還沒達到本身的目的。
就因為上邊提到的兩個原因,我更偏向于用一個單一的輸入腳本來管理這些點擊事件以及代理被點擊的物體。這樣一來,當點擊/觸摸事件發生時,只需要簡單地通知與交互相關的GameObject即可,而不用關心輸入的是什么,只是有輸入就行。為了實現這個設想,創建一個空GameObject,命名為Click Manger,掛上一個腳本。腳本就叫ClickManger。
2
監聽點擊事件
在ClickManger腳本里,用Update函數檢測鼠標是否已經點擊:
我們用的是Input.GetMouseButtonDown來檢測是否鼠標左鍵(0代表左鍵)在當前幀被按下。也就是說,當你點擊時,即使一直按著鼠標左鍵不放,在Update函數的循環中也僅僅返回一次true,直到釋放鼠標并再次點擊。對于鼠標右鍵用1代表,鼠標中間則是用2代表。
3
什么被點擊了呢?
既然知道了點擊已經發生,但是我們怎么知道具體什么被點擊到了呢?因為這個腳本并不屬于游戲中是實際物體(僅僅是一個空物體)我們需要用Raycast來檢測到底用戶點擊了什么。
Raycast的實質就是在游戲場景中的兩點之間“畫”了一條線,檢測這條線上碰撞到的任何物理物體。你就可以用碰撞獲得的信息來確定碰撞到的物體并做相應處理。另一個Raycast比較有用的樣例?
有一件事情值得注意:點擊的位置指的是屏幕坐標,而不是世界坐標。屏幕坐標代表像素,(0,0)點是指屏幕左下角。我們需要將屏幕坐標轉換成世界坐標以正確地與場景中的GameObjects做匹配。另外一個小問題是,點擊的位置包含了Z軸的坐標,在2D游戲中是不相干的,但還是會干涉到Raycast的檢測,因為Z軸在2D游戲中依然是存在的,所以,我們需要忽略Z軸。
首先,在if語句中,將點擊坐標轉換成世界坐標:
用ScreenToWorldPoint將Input.mousePosition轉換成世界坐標,這樣就可以用來與GameObject相比較了。
接下來,我們用Physics2D.Raycast生成射線,提供一個Vector2類型的mousePos忽略Z軸作為起始點。還要提供一個Vector2.zero作為Raycast的方向以保證只有在點擊方向的位置上的物體才可以被檢測到:
現在可以用Raycast2D來確定是否有物體被點擊了:
Hit.collider返回一個Collider2D,從這個Collider2D中可以訪問到點擊到物體的Rigibody和GameObject屬性。現在我們就可以直接操作被點擊到的物體!在接下來的例子中,我們只是簡單地打印被點擊到的物體的名字,給rigibody施加一個作用力:
按照游戲交互設計,因為你已經知道哪個物體已經被點擊到了并且怎樣獲取該物體,你可以對被點擊的物體做任何處理。愉快地點吧!
4
全部腳本
責任編輯:
總結
以上是生活随笔為你收集整理的2d unity 多物体 射线_[蛮牛驿馆] Unity2D:用射线检测物体的点击的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python生成yaml文件_Pytho
- 下一篇: Jersey框架:深入研究的终极大招-J