91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Unity中地面檢測方案的示例分析

發布時間:2022-01-05 14:13:24 來源:億速云 閱讀:272 作者:小新 欄目:大數據

這篇文章主要介紹Unity中地面檢測方案的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

1.普通射線

在角色坐標(一般是腳底),發射一根向下的射線,長度大約為0.2,

只適用于簡單地形,實際使用中常常遇到以下問題

  1. 用的collider去碰撞地面時,某些時候會有一定的穿插,于是角色的最低點就可能穿透地面,你發射射線的點可能就到了地面以下,射線一直檢測不到真正的地面,于是角色就一直懸空。

  2. 角色是走斜坡的時候,角色中點可能會離開地面一小段距離,這一小段距離往往就足夠讓判斷機制誤以為角色已經離地了。如果你增加射線的長度,那么一定程度上能緩解斜坡問題,但是會降低跳躍判斷的精度:角色每次跳起,會有一小段距離,其實已經離地了,但是仍然返回了isGround = true;

using System.Collections;using System.Collections.Generic;using UnityEngine; public class RaycastTest : MonoBehaviour {        private bool isGround = false;    private Rigidbody2D myRigidbody2D;    void Awake () {        myAnimator = GetComponent<Animator>();        myRigidbody2D = GetComponent<Rigidbody2D>();    }    void FixedUpdate () {        Debug.DrawRay(transform.position, Vector2.down * 0.11f, Color.red);        RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, 0.15f, 1 << 8);        if (hit.collider != null)            isGround = true;        else            isGround = false;}

2.Unity官方的Character Controller

直接給角色加入Character Controller組件,在腳本中Get到Character Controller,調用.isGrounded就可以用。

但是.isGrounded時當角色移動的時候才會檢測是否著地,也就是說他只能在調用simplemove(和move等移動函數)時,判斷isGrounded(是否著地)

這時播放一些動畫會導致判斷在true和false狀態來回切換,并且Skinwidth也會導致這種問題,再加上一些角色控制器的限制,邏輯上不是那么自由,例如需要自己實現物理模擬,比如重力

using System.Collections;using System.Collections.Generic;using UnityEngine;
public class OnGroundSensor : MonoBehaviour{    public CapsuleCollider capcol;    public float offset = 0.1f;
   private Vector3 point1;    private Vector3 point2;    private float radius;
   void Awake()    {        radius = capcol.radius - 0.05f;    }
   void FixedUpdate()    {        point1 = transform.position + transform.up * (radius - offset);        point2 = transform.position + transform.up * (capcol.height - offset) - transform.up * radius;        Collider[] outputCols = Physics.OverlapCapsule(point1, point2, radius, LayerMask.GetMask("Ground"));        if (outputCols.Length != 0)        {            //foreach (var col in outputCols)            //    print("collision:" + col.name);            SendMessageUpwards("IsGround");        }        else            SendMessageUpwards("IsNotGround");    }}

3.三射線

寫法和簡單射線沒有什么不同,區別在于給角色加上三條射線:左腳,右腳,襠,三條射線有一條返回true則isGround為true。

回到頂部

4.OverlapCapsule 投射膠囊碰撞體

Unity中地面檢測方案的示例分析

API: public static Collider[] OverlapCapsule(Vector3 point0, Vector3 point1, float radius, int layerMask = AllLayers,QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

point0,point1,radius 分別為膠囊體起點球心,膠囊體終點球心,膠囊體半徑

我們這里只要用到這一重載方法 Physics.OverlapCapsule(pointBottom, pointTop, radius, LayerMask);

    private CapsuleCollider capsuleCollider;    private Vector3 pointBottom, pointTop;    private float radius;      void Awake () {               capsuleCollider = GetComponent<CapsuleCollider>();        radius = capsuleCollider.radius;      }

LayerMask設置方法

假設ground層為10,指定碰撞第10層Layer

寫法為:Layermask mask=1<<10

但是。投射的膠囊體也會檢測自己本身,如果你希望游戲中基本上任何能碰撞物體都能夠用來站腳,那么應設置為:碰撞除了角色所在的Layer以外的所有層(假設Player層為8

寫法為:~(1<<8)

bool OnGround() {         pointBottom = transform.position + transform.up * radius-transform.up*overLapCapsuleOffset;        pointTop = transform.position + transform.up * capsuleCollider.height - transform.up * radius;        LayerMask ignoreMask = ~(1 << 8);         colliders = Physics.OverlapCapsule(pointBottom, pointTop, radius, ignoreMask);        Debug.DrawLine(pointBottom, pointTop,Color.green);        if (colliders.Length!=0)        {            isOnGround = true;            return true;        }        else        {             isOnGround = false;            return false;        }}

以上是“Unity中地面檢測方案的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

梅州市| 京山县| 仪陇县| 久治县| 资兴市| 榕江县| 尖扎县| 江达县| 会宁县| 宣武区| 平泉县| 万山特区| 云梦县| 浙江省| 深泽县| 香港| 梁河县| 北票市| 澄江县| 清水河县| 弋阳县| 新平| 霍林郭勒市| 五常市| 邹平县| 惠东县| 澄迈县| 新和县| 塘沽区| 溧阳市| 慈溪市| 固安县| 寻甸| 岗巴县| 西乡县| 贵港市| 湟源县| 聂荣县| 西林县| 曲沃县| 彭山县|