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