現在想要實現這樣一個需求:當鼠標放到物體上的時候,讓物體的大小發生改變,并且不停的旋轉,當鼠標點擊進行拖動的時候,讓物體隨著鼠標進行拖動。
1.首先呢,大小和旋轉其實很好做,只不過是改變縮放度大小,還有讓它隨著時間改變rotation而已。
OnMouseEnter():當鼠標進入的時候,當鼠標進入顯示物體邊緣的一瞬間,只執行一次。
OnMouseExit():當鼠標退出的時候,當鼠標退出顯示物體邊緣的一瞬間執行,只執行一次。
OnMouseOver():當鼠標覆蓋在物體上的時候,只要鼠標還覆蓋在物體上,就會不停的執行,多次執行。
如此就能實現旋轉和縮放。
2.旋轉和縮放完成了,那么接下來就該讓物體隨著拖動鼠標進行移動了。
在這里,使用射線可以實現。從攝像機直接發射出一條射線,打到屏幕內物體上,就能檢測到對應鼠標的點應該在3d世界中具體在哪個位置。
OnMouseDrag():當鼠標拖動的時候執行,單機鼠標左鍵,拖動物體的時候觸發,會一直執行,多次執行。
Input.mousePosition:鼠標所在位置,鼠標在屏幕上的位置。
Ray ray = camera.ScreenPointToRay(Input.mousePosition);從照相機射出來的射線
if (Physics.Raycast(ray, out hit, 1000f, 1<<8))當成功發出射線,一些碰撞信息都會保存在hit中,在這里射線的長度是1000,檢測和射線碰撞的層是第八層。
LayerMask.NameToLayer("Terrain")我這里自定義第八層layer為Terrain,所以打印出來的信息也是8,之前想要將這個放到Physics.Raycast最后一個參數,發現并不好使。試驗后才發現最后一個參數是通過位移得來的。
當發生射線和地面碰撞的時候,就把改變物體的位置,這樣就能夠讓物體隨著鼠標進行拖動了。
Debug.DrawLine(ray.origin, hit.point, Color.red):這個只是畫一條線,方便進行觀察,實際開發中并不需要,這是畫一條從射線發射點到碰撞點的紅色線段。