Unity3D之處理角色控制器實現(xiàn)上坡爬坡減速_第1頁
Unity3D之處理角色控制器實現(xiàn)上坡爬坡減速_第2頁
Unity3D之處理角色控制器實現(xiàn)上坡爬坡減速_第3頁
Unity3D之處理角色控制器實現(xiàn)上坡爬坡減速_第4頁
Unity3D之處理角色控制器實現(xiàn)上坡爬坡減速_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、按照正常情況游戲中角色在上坡爬坡的時候速度應該減慢,可是角色控 制器組件沒有幫我們做這個判斷,剛好最近工作中需要做這個功能,我就用勾 股定理的法則來解決這個問題。如下圖所示,當角色在爬坡的時候,角色控制 器默認行走的距離就是“C'。但是如果行走的距離是 “C”你會發(fā)現(xiàn)上坡的速度太快了。這里我們需要計算” b”,讓角色在上坡時候一次移動的距離是” b”這 樣移動就很正常了。按照勾股定理的法則,c二次方 =a 二次方 + b 二次方。已知c 和a我們求的b的距離即可。第一步:主角目前所在地形的3D坐標,以及主角面朝方向行走 一段距離”后 的3D坐標。 一段距離”我這里使用他的行走速度也就是

2、 1秒行走的長度。第二步:把部分代碼添加入角色控制器組件。默認角色控制器行走是走路,簡單改一下讓他跑步。找到UpdateSmoothedMovementDirection ()方法,加入 “ |isMoving這個判斷條件。文章出處 狗刨學習網(wǎng)if (Input.GetKey (KeyCode.LeftShift) | Input.GetKey (KeyCode.RightShift) | isMoving)然后找到Update() 方法,(C#和js都可以編譯通過下面這段代碼)/ Apply jumpi ng logicApplyJump ing ();/- 開始插入代碼/當主角處于移動狀態(tài)

3、時開始計算主角目前坐標以及 1秒后坐標if(lsMovi ng()/得到主角行走1秒后所在位置地形的坐標var n ewPos = tran sform.positio n + (tra nsform.rotatio n *Vector3.forward * moveSpeed);n ewPos.y = Terrai n.activeTerrai n.SampleHeight( newPos);/得到主角當前位置所在地形的坐標var heropos = tran sform.positi on;heropos.y =Terrai n.activeTerrai n.SampleHeight(tr

4、a nsform.positio n);/繪制一條Debug的線段,在編輯器中看的更清楚。Debug.DrawLi ne(heropos ,n ewPos,Color.red);/斜邊的長度var c = moveSpeed;/短直角邊的長度var b = n ewPos.y - heropos.y;/b >0 標示主角在爬坡b < 0 表示主角在下坡if(b > 0)/根據(jù)公式計算a =根號下c二次方-b二次方var a = Mathf.Sqrt(Mathf.Pow(c,2) - Mathf.Pow(b,2);moveSpeed = a;/- 結束插入代碼 / Calcul

5、ate actual moti onVector3 moveme nt = moveDirecti on * moveSpeed + new Vector3 (0, verticalSpeed, 0) + in AirVelocity;moveme nt *= Time.deltaTime;直接運行游戲,你會發(fā)現(xiàn)當你在爬坡的時候主角的移動速度會減少,下 坡與平地的時候移動速度正常。另外還有一個地方需要注意下。使用角色控制器時如果你的坡度角度過于大,你會發(fā)現(xiàn)你的主角無法繼續(xù)爬坡。如下圖所示,默認坡度角度為45。如果你需要爬坡更高的角度,直接修改Slope Limit數(shù)值即可。當然代碼中我們也可以

6、控制角色是否可以繼續(xù)爬坡, 根據(jù)上述代碼兩點丫 坐標的插值也可以判斷。文章出處狗刨學習網(wǎng)float xx = n ewPos.y - heropos.y;接著,如果你的項目中沒有使用地形元素, 而是用美術建模形成的地形話, 那么就需要通過射線來取得地形”上的兩個點。如下圖所示白色射線:得到主角面朝方向一步以后的地形坐標藍色線段:主角移動的起點和終點的線段。紅色射線:處理攝像機(與本章無關)在地形之上,我們使用下面這個方法得到地形的高度。Terra in. activeTerra in .SampleHeight()如果項目中的地形是美術做的話,需要用射線的方式來計算。代碼比較簡 單我就不用注釋

7、了, 就是上圖中的那個白色射線,從天上射向地面。參數(shù)是模 型面前下一步的將要行走的坐標,然后通過射線換算成實際 丫軸高度。public static float SampleHeight(Vector3 poi nt) var sample = point;sample.y += 20;Ray ray = new Ray(sample, Vector3.dow n); RaycastHit hit;if (Physics.Raycast(ray, out hit)if(hit.collider.gameObject.tag != "Terrain")Debug.DrawL in e(sample,hit.po in t);retur n hi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論