详解Unity中的角色控制器
前言
如何讓玩家所操縱的角色動起來,這在Unity中很容易實現,但是如何確保玩家所操作的角色不會產生一些非常違反物理常識的情況?而這就需要進行大量的檢測,已確保玩家所操縱的角色正常。所幸Unity為我們提供了這樣的一個組件——角色控制器(Character Controller)。下面將介紹該組件的基本參數以及使用方法。
目錄
- 前言
- 一、Character Controller組件參數介紹
- 關于Skin Width
- 二、Character Controller API
- 1.isGrounded
- 2.SimpleMove
- 3.Move
- 4.SimpleMove和Move的區別
- 三、總結和參考資料
- 1.總結
- 2.參考資料
前排提醒:本文僅代表個人觀點,以供交流學習,若有不同意見請評論留言,筆者一定好好學習,天天向上。
Unity版本[2019.4.10f1] 夢小天幼 & 禁止轉載
視頻講解:
詳解Unity的角色控制器 | Character Controller_BiLiBiLi
一、Character Controller組件參數介紹
該組件繼承自Collider,不受物理系統的影響,但可以發生碰撞。
| Slope Limit | 可直接沿著向上移動的最大坡度 |
| Step Offset | 可直接跨越的最大障礙高度 |
| Skin Width | 皮膚厚度,值較大可減少抖動,較小可能導致角色卡住,一般設置為半徑的10% |
| Min Move Distance | 當角色的單次移動距離小于該值時,則被忽略,不生效。可用于減少抖動 |
| Radius & Height | 所控制角色的半徑和高度 |
關于Skin Width
這個參數官方給的建議是設置為半徑的10%,理由是防止角色卡住,但是這樣會導致角色挨不著地面,所以這時候可以調整Center的Y軸值,即可使角色接觸地面。
二、Character Controller API
有關角色控制器的API 詳見下表:
| isGrounded | 角色控制器是否接觸地面 |
| slopeLimit | 坡度度數限制 |
| stepOffset | 可跨越臺階高度,單位米 |
| detectCollisions | 其他剛體和角色控制器是否能與本角色控制器相撞,默認為真 |
| SimpleMove() | 以一定速度來移動,移動時自動計算重力因素影響 |
| Move() | 更復雜的移動,不計算重力影響 |
1.isGrounded
判斷角色控制器是否接觸地面
void Update() {if (controller.isGrounded){print("正在地面上...");} }2.SimpleMove
以一定速度來移動,Y軸速度被忽略,因為Y軸是被系統自動施加重力的,速度單位是米/秒。這就意味著,無需乘以Time.deltaTime。返回值為bool,當角色接觸地面返回True,反之為False。只要你不做跳躍功能,我們就是好朋友。
private void Update(){float v = Input.GetAxis("Vertical");float h = Input.GetAxis("Horizontal");Vector3 dir = Vector3.right * h + Vector3.forward * v;characterController.SimpleMove(speed * dir);}3.Move
更復雜的移動方式,對一個角色擁有絕對的控制權,不會自動施加重力,需要自己寫重力代碼,如果需要做跳躍功能,必選這個,因為自由。
public CharacterController characterController;//移動速度public float speed = 8.0f;//重力const float GRAVITY = 9.8f;//速度向量public Vector3 velocity = Vector3.zero;//跳躍高度public float jumpHeight = 1.2f;private void Update(){//移動更新函數Move_Update();//高度更新函數Height_Update();//Move方法characterController.Move(velocity * Time.deltaTime);}public void Move_Update(){float h = Input.GetAxis("Horizontal");float v = Input.GetAxis("Vertical");Vector3 dir = Vector3.right * h + Vector3.forward * v;velocity.x = dir.x * speed;velocity.z = dir.z * speed;}public void Height_Update(){if (characterController.isGrounded){if (Input.GetButtonDown("Jump")){ //v平方 = 2ghvelocity.y = Mathf.Sqrt(2 * GRAVITY * jumpHeight);} // 如果角色接觸地面,則高度置零,這里設置-1而不是0,是因為有時候0無法起跳。if (velocity.y < -1)velocity.y = -1;}else{// 如果角色不在地面,則不斷減去高度。//v=gt 自由落體運動velocity.y -= GRAVITY * Time.deltaTime;}}4.SimpleMove和Move的區別
- SimpleMove
* 不受Y軸速度影響,自帶重力效果,無法實現跳躍功能
* 返回值為Bool,當角色接觸地面返回True,反之為False。 - Move
* 無重力效果,自行實現重力,可做跳躍功能
* 返回值(CollisionFlags對象),返回角色與物體碰撞的信息
三、總結和參考資料
1.總結
內容較少,不給予總結。hhh
2.參考資料
[1].Unity官方.Unity 官方手冊 角色控制器
[2].百度.百度百科 自由落體相關詞條
總結
以上是生活随笔為你收集整理的详解Unity中的角色控制器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C4(1) 三字棋代码实现
- 下一篇: 【Go语言入门100题】051 打折 (