Shu pequeña cuenta en la Unidad Colisionador Physics.Overlap

prefacio

Unidad Colisionador detecta los contactos actuales que se divide en dos:

1, OnTrigger, OnCollider

2, Physics.Overlap

Aquí nos centramos en el segundo método de registro de aplicación.

 

 

Physics.Overlap

Función: En su configuración, hacia el exterior, el tamaño de la longitud de la radiación de emisión configurado. Objeto puede ser adquirida rayos detectados.

nota:

un objeto adquirido contiene su propio.

b, en sí puede no ser necesario Colisionador, cuerpo rígido . Código intervalo preferente se establece, para detectar si o alrededor colisionador. Y lo que no necesita ser probado colisionador Tienes cuerpo rígido.

El siguiente código es utilizar por completo debido a colisionador zona de inspección visual .

sugerencias:

Debido a la detección de colisiones no se basa en, pero requiere rango inspección visual. Propuesta montan directamente en el guión correspondiente a la forma del objeto 3D. Ocultar MeshRenderer, cuando Colisionador de inicio.

El script también se puede montar en otros objetos, con la posición correcta antes de que el código de abajo transformar GameObject (detectando su posición).

 

1, Physics.OverlapCapsule

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

nota:

a, atención a su objeto Escala, la dirección de la detección del impacto.

Dirección se ha solucionado con transform.up.

b, esta dirección basándose en la dirección Colisionador defecto: Y-Axis, Centro 0

c, cuando se escala la CapsuleCollider:

Sólo código actual generales objetos de escala , el objeto principal también se debe integral escalada (se espera una operación de escala del eje Y para aumentar, si es necesario, y luego actualizar el código).

Ajustable Colisionador de radio, altura, giratorio.

d, la detección visual es gama 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);

nota:

a, se puede escalar en sí (la detección de objeto radiación emitida desde un cierto punto), la proporción del objeto padre puede ser girada.

b, si cuelga en el cubo, es BoxCollider rango de detección visual.

C, por debajo del centro es 0, si se cambia Tamaño 1 Tamaño, para actualizar el código de abajo.

        /// <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);

nota:

una, su influencia en la escala del objeto de detección.

c, cuando se escala la CapsuleCollider:

El código actual puede sólo los objetos generales de escala , objetos padre debe también ser escalado global

Ajustable Colisionador de Radio

d, la detección visual es gama 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);
                    }
                }
            }
        }

 

Publicados 320 artículos originales · ganado elogios 77 · vistas 170 000 +

Supongo que te gusta

Origin blog.csdn.net/weixin_38239050/article/details/103628133
Recomendado
Clasificación