ユニティ衝突Physics.Overlapのシュウ小さな特徴

序文

ユニティ衝突を2つに分割することが、現在の連絡先を検出しました。

1 OnTrigger、OnCollider

2、 Physics.Overlap

ここでは、アプリケーション・レコードの第二の方法に焦点を当てます。

 

 

Physics.Overlap

関数:その構成では、外側に、放出放射線の長さのサイズを設定。オブジェクトが検出された光線を取得してもよいです。

注意:

取得したオブジェクトは、独自のが含まれています。

B、自身が衝突、剛体必要とされなくてもよいですコード好ましい範囲か衝突の周り検出するように、設定されています。そして、それは剛体持っているコライダーをテストする必要はありません。

次のコードであるため、目視検査エリア衝突完全に使用することです

提案:

衝突検出はに基づいていますが、視覚的な検査範囲を必要とされていないため。提案は、直接3Dオブジェクトの形状に対応したスクリプトをマウント。隠すMeshRenderer、衝突スタート。

以下のコードは、(その位置を検出する)ゲームオブジェクトを変換する前に、スクリプトは正しい位置と、他の物体に取り付けることができます。

 

1、Physics.OverlapCapsule

Collider[] outputCols = Physics.OverlapCapsule(pointTop, pointBottom, radius, LayerMask.GetMask("Ground"));

注意:

A、そのスケールのオブジェクト、衝撃検知の方向に注意。

方向はtransform.upで固定されています。

B、デフォルトの衝突方向に基づいて、この方向:Y軸、センター0

C、 CapsuleColliderスケーリング:

唯一の現在のコード全体のスケーリングオブジェクト親オブジェクトもスケーリングされなければならない積分(Y軸スケーリング動作は、必要に応じて、増加し、その後コードを更新すると予想されます)。

調節可能な衝突半径、高さ、回転可能。

dが、視覚的検出はCapsuleCollider範囲です。

        /// <summary>
        /// 当前实时检测到的带 碰撞器、Vive_InteractableObject 的物体
        /// </summary>
        public List<Transform> skode_detectObjs = new List<Transform>();

        CapsuleCollider capcol = null;


        private void Start()
        {
            capcol = GetComponent<CapsuleCollider>();
        }

        private void Update()
        {
            Detection();
        }

        void Detection()
        {
            float offset = capcol.height * 0.5f;
            float radius = capcol.radius;

            float scale = capcol.transform.localScale.x;
            Transform tempTrans = capcol.transform.parent;
            while (tempTrans != null)
            {
                scale = scale * tempTrans.localScale.x;
                tempTrans = tempTrans.parent;
            }

            Vector3 pointTop = capcol.transform.position + capcol.transform.up * (radius - offset) * scale;
            Vector3 pointBottom = capcol.transform.position + (capcol.transform.up * (capcol.height - offset) - capcol.transform.up * radius) * scale;

            Collider[] outputCols = Physics.OverlapCapsule(pointTop, pointBottom, radius * scale);

            //只检测Ground层物体。
            //outputCols = Physics.OverlapCapsule(pointTop, pointBottom, radius, LayerMask.GetMask("Ground"));

            skode_detectObjs.Clear();

            if (outputCols != null && outputCols.Length > 0)
            {
                foreach (var item in outputCols)
                {
                    if (item.transform != transform && item.GetComponent<Vive_InteractableObject>())
                    {
                        skode_detectObjs.Add(item.transform);
                    }
                }
            }
        }

 

2、Physics.OverlapBox

//模拟的盒子中心点,x、y、z轴长度的一半
Collider[] outputCols = Physics.OverlapBox(boxCol.transform.position, scale / 2,boxCol.transform.rotation);

注意:

(オブジェクトが特定の点から放出される放射線を検出する)自体をスケーリングすることができ、親オブジェクトの割合を回転させることができます。

Bは、キューブの上にハングアップした場合、それはBoxCollider視覚的検出範囲です。

Cは、サイズ1サイズは、以下のコードを更新するために、変更された場合センターの下、0です。

        /// <summary>
        /// 当前实时检测到的带 碰撞器、Vive_InteractableObject 的物体
        /// </summary>
        public List<Transform> skode_detectObjs = new List<Transform>();

        BoxCollider boxCol = null;

        private void Start()
        {
            boxCol = GetComponent<BoxCollider>();
        }

        private void Update()
        {
            DetectionBox();
        }

        void DetectionBox()
        {
            Vector3 scale = boxCol.transform.localScale;
            Transform tempTrans = boxCol.transform.parent;
            while (tempTrans != null)
            {
                scale = Skode_Vec3Mul(scale, tempTrans.localScale);
                tempTrans = tempTrans.parent;
            }

            //模拟的盒子中心点,x、y、z轴长度的一半
            Collider[] outputCols = Physics.OverlapBox(boxCol.transform.position, scale / 2,boxCol.transform.rotation);

            skode_detectObjs.Clear();

            if (outputCols != null && outputCols.Length > 0)
            {
                foreach (var item in outputCols)
                {
                    if (item.transform != transform && item.GetComponent<Vive_InteractableObject>())
                    {
                        skode_detectObjs.Add(item.transform);
                    }
                }
            }
        }

        Vector3 Skode_Vec3Mul(Vector3 value1, Vector3 value2)
        {
            return new Vector3(value1.x * value2.x, value1.y * value2.y, value1.z * value2.z);
        }

 

2、Physics.OverlapSphere

Collider[] outputCols = Physics.OverlapSphere(sphereCol.transform.position, GetComponent<SphereCollider>().radius * scale);

注意:

A、検出対象の規模に及ぼす影響。

C、 CapsuleColliderスケーリング:

現在のコードしかでき、全体のオブジェクトをスケーリング親オブジェクトも全体的にスケーリングする必要があります

調節可能な衝突半径

dが、視覚的検出はCapsuleCollider範囲です。

        /// <summary>
        /// 当前实时检测到的带 碰撞器、Vive_InteractableObject 的物体
        /// </summary>
        public List<Transform> skode_detectObjs = new List<Transform>();

        SphereCollider sphereCol = null;

        private void Start()
        {
            sphereCol = GetComponent<SphereCollider>();
        }

        private void Update()
        {
            DetectionSphere();
        }

        void DetectionSphere()
        {
            float scale = sphereCol.transform.localScale.x;
            Transform tempTrans = sphereCol.transform.parent;
            while (tempTrans != null)
            {
                scale = scale * tempTrans.localScale.x;
                tempTrans = tempTrans.parent;
            }

            Collider[] outputCols = Physics.OverlapSphere(sphereCol.transform.position, GetComponent<SphereCollider>().radius * scale);

            skode_detectObjs.Clear();

            if (outputCols != null && outputCols.Length > 0)
            {
                foreach (var item in outputCols)
                {
                    if (item.transform != transform && item.GetComponent<Vive_InteractableObject>())
                    {
                        skode_detectObjs.Add(item.transform);
                    }
                }
            }
        }

 

公開された320元の記事 ウォン称賛77 ビュー170 000 +

おすすめ

転載: blog.csdn.net/weixin_38239050/article/details/103628133