U3d 射線Ray

現在想要實現這樣一個需求:當鼠標放到物體上的時候,讓物體的大小發生改變,并且不停的旋轉,當鼠標點擊進行拖動的時候,讓物體隨著鼠標進行拖動。

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):這個只是畫一條線,方便進行觀察,實際開發中并不需要,這是畫一條從射線發射點到碰撞點的紅色線段。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 在我們的游戲開發過程中,有一個很重要的工作就是進行碰撞檢測。例如在射擊游戲中子彈是否擊中敵人,在RPG游戲中是否撿...
    壹米玖坤閱讀 24,619評論 0 17
  • 知識點:1、可以通過 Physics.RaycastAll獲取全部,然后通過tag或者name或者layer遍歷再...
    羅斯基閱讀 393評論 0 0
  • 本文來源于兩年前我的一篇CSDN博客。CSDN博客本來就沒寫多少,現在也基本是到簡書上混了。所以各位大大請自覺繞過...
    曉夢蟬君閱讀 42,691評論 5 12
  • Unity3D塔防開發流程 配置環境及場景搭建 編程語言:C#,略懂些許設計模式,如果不了解設計模式,BUG Mo...
    Grape_葡萄閱讀 3,005評論 1 3
  • 之所以稱我家公公為"太上皇",是因為他是位傳統的封建家長,在家里有著絕對的權威,是位"老子說了算"的老人。當...
    開顏_ca57閱讀 510評論 2 4