日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Unity自定义角色控制器(一):碰撞检测

發布時間:2024/8/26 编程问答 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Unity自定义角色控制器(一):碰撞检测 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我實在很喜歡用Unity。它在處理很多底層問題的同時有給了開發者很多自由。而且它還有著非常活躍的社區,起到了很大的幫助。

不幸的是,之前也說了,Unity也帶著世界上最糟糕的角色控制器。在與Unity對比之前,這里我闡明一下廣義上的角色控制器是什么。其實角色控制器無非就是處理角色與游戲世界碰撞的一堆代碼。它不像箱子、柵欄之類的可以有物理引擎統一處理,角色行為上的特殊性需要代碼特殊處理。由于我們需要做碰撞檢測,我們還是需要選擇一個幾何形體去表示我們的角色。大多數3D游戲都會選擇膠囊體。
?


膠囊體的廣泛使用有著很多原因,具體原因我們有機會再討論。現在,為了讓問題簡單,我們先看看二維情況下的角色控制器。
?


你會看到我已經把坐標標記為z軸和y軸,而不是x軸和y軸。這是因為我將會從頂視圖來觀察這個三維世界。由于頂視圖的緣故,那個藍色圓形是膠囊體。綠色矩形是一堵墻。理想的狀況是,角色無法穿過墻壁。因此當角色與墻體交叉時,我希望能夠檢測出碰撞的發生,然后正確地進行處理。之所以我們自己處理碰撞檢測,也就是看看圓形是否與矩形發生了交叉,有兩個原因。一個是Unity有相當多的資源(我們后面會講)來處理這個問題,第二個就是這是一個講解碰撞檢測的好例子。我們將會讓碰撞體計算出正確的位置從而得到合理的行為。
?


上面展示了我們的角色嘗試去朝著墻面運動。為了處理這個問題,我們從角色位移的起點與位移的終點之間進行一次掃略體測試。這次測試的結果是有一面墻在我們的前方,并且返回到墻面的距離。那么我們就可以直接拿到這個距離,將角色按照方向移動所得碰撞距離,從而移動到墻體之前。(PS:Unity有著很多內建的功能可以做到這點,包括Rigidbody.SweepTest,Physics.SphereCast,Physics.CapsuleCast)。

但是,這并不完全是我們想要的效果。如果我們用了這種方法,角色在與物體稍稍碰撞之后,就再也沒有進行任何移動了。問題在于它缺少了現實中的反彈與側滑。
?


這個效果就更加合理一些。最初的掃略測試是在移動方向上進行的。當掃略測試接觸到墻體之后,角色就直接移動過去,就像剛才那樣。但是這次我們更進一步,讓角色向上滑動來補足丟失的移動,這樣使得可以沿著表面滑動。這是一個理想中的角色控制器該有的行為,但這不是實現它的最佳方法。首先,這么做效率不是很高:手機靚號拍賣每次你想移動角色,你就需要執行這個函數。如果每幀只執行一次還好,但是假如因為某些原因這個函數要執行多次,那就消耗很大。其次,碰撞處理是依賴于角色移動的方向和距離。如果角色因為某種神奇的原因進入了墻體內部,角色是不會被推出的。實際上,我發現這個問題很讓人頭疼。


這是一個糟糕的情況。我們可以看到我們的英雄現在已經在墻體內部了。這種情況下,我們不應該再考慮怎么像之前一樣處理碰撞,而是當做一種獨立的情況來處理。我們不再關心玩家朝哪個方向移動或者移動了多遠。而是我們應該考慮的是,這一刻他應該在哪個位置,這個位置是否存在問題。在上圖中,我們可以看到玩家正在與墻體交叉(在墻體內部了),因此他當前位置存在問題,并且需要修正。自從我們不再將處理碰撞檢測作為運動的反饋,我們是不知道之前的位置在哪或者移動了多遠。而我們所知道的是,他目前卡在墻內,而我們需要將他從墻體內挪出來。但是應該挪到哪里呢?就像之前的例子一樣,我們應該在剛接觸墻面的時候就將其推出。這里我們有不少候選位置。
?


每個半透明黃色圓圈都指示了一個潛在的滿足推出的位置。但是我們應該選擇哪個呢?很簡單,只要選擇距離角色最近的墻面的最近點即可。
?


這里我們計算得出距離角色最近點位于右邊。接著我們就可以將角色移動到該點,加上角色的半徑(紅色部分)。

到這里就結束了我們深入神秘的角色控制器的第一部分。下次,我將會開始談談如何在Unity中實現,以及一些角色控制器會用到的更加復雜的函數。

致謝與引用:

這里的大多數知識都來源于兩個信息源:Unity論壇上的用戶techmage以及逆向分析Unity角色控制器包的用戶fholm。兩個名字都不知道怎么發音。不管怎樣,在RPGController目錄下。這是一個很不錯的項目,代碼寫得很好。很顯然,他時做Unity顧問的,如果有誰需要這個服務的話。最后,如果誰有關于這個話題的很好的資源,不妨與我分享一下。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Unity自定义角色控制器(一):碰撞检测的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。