在游戲中,角色跳躍是普通且常見(jiàn)的能力。但就這么看似簡(jiǎn)單的功能,在實(shí)現(xiàn)過(guò)程中也會(huì)遇到很多問(wèn)題。
在本篇文章,我將分享地面檢測(cè)的三種方式。
項(xiàng)目地址
GitHub
B站視頻
為什么要地面檢測(cè)?
在游戲中。用戶對(duì)在空中的角色和地面的角色可操作方式是不同的。
比如,空中和地面不同的攻擊方式、地面上可以下蹲、空中二段跳、觸地失敗等等。
所以,要實(shí)現(xiàn)這種差異,我們首先要知道角色當(dāng)前的空間位置,所以地面檢測(cè)就是必須的。
射線檢測(cè)
核心思路:
在角色底部向下發(fā)出一條射線,當(dāng)觸碰到地面時(shí),則認(rèn)為角色在地面上。
代碼如下:
void Update()
{
// TODO 避免檢測(cè)太頻繁影響性能,可以增大檢測(cè)間隔時(shí)間
var raycastAll = Physics2D.RaycastAll(transform.position, Vector2.down, 0.1f, layerMask);
if (raycastAll.Length > 0)
{
// 在地面
isGrounded = true;
}
else
{
// 離地
isGrounded = false;
}
}
但是,這種現(xiàn)實(shí)會(huì)有問(wèn)題。
當(dāng)角色在地面邊緣或者斜坡時(shí),單條射線會(huì)檢測(cè)不到地面從而導(dǎo)致判斷錯(cuò)誤。
要解決這個(gè)問(wèn)題也很簡(jiǎn)單,我們可以增加多幾條射線,既可以了。
但是這樣實(shí)現(xiàn)起來(lái)有點(diǎn)繁瑣,有沒(méi)有更方便的方法呢?
碰撞體
核心思路:
利用 Unity 引擎提供的碰撞體,我們可以監(jiān)聽(tīng)碰撞函數(shù)來(lái)完成地面檢測(cè)邏輯。
代碼如下:
void OnTriggerStay2D(Collider2D other)
{
if (other.CompareTag("Ground"))
{
// 在地面
isGrounded = true;
}
}
void OnTriggerExit2D(Collider2D other)
{
// 離地
isGrounded = false;
}
通過(guò)調(diào)整碰撞器的大小,已經(jīng)可以滿足我們?nèi)粘i_(kāi)發(fā)需求了。
如果你不想添加多個(gè)碰撞器,那可以試試下面的射線盒子。
射線盒子
核心思路:
也是利用射線檢測(cè),只是從多條射線換成射線盒子。由線變成面。
代碼如下:
void Update()
{
var raycastAll = Physics2D.OverlapBoxAll(transform.position, new Vector2(0.4f,0.4f), 0,layerMask);
if (raycastAll.Length > 0)
{
// 在地面
isGrounded = true;
}
else
{
// 離地
isGrounded = false;
}
}
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-405005.html
以上就是本篇的內(nèi)容。如果你覺(jué)得還不錯(cuò),可以點(diǎn)個(gè)贊和關(guān)注噢~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-405005.html
到了這里,關(guān)于【Unity300個(gè)技巧】檢測(cè)物體在地面的三種方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!