es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema de colisión con Polygon Collider al usar Raycast e instanciar objetos (Unity)

Estoy tratando de verificar la colisión con el colisionador de polígonos usando Raycast en mi campo en mi juego de Unity. Y luego crear un recorte en la posición del rayo si las condiciones se cumplen al hacer clic en el botón. A pesar de que verifica la colisión perfectamente, tengo algunos problemas que simplemente no puedo resolver cómo arreglar. Como:

  • mi objeto de juego de disparador se teletransporta en la escena al azar, pero el ray casting siempre es correcto O_o.
  • El recorte instanciado desaparece en el momento de la siguiente instanciación…

¿Alguien puede ayudarme a solucionarlo? Aquí está el código:

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Problema con la Teletransportación del Objeto de Juego Shooter y la Desaparición del Cultivo

    Descripción del Problema

    Un experto en TI especializado en c#, Unity3d, colisiones, instanciación y raycasting está tratando de verificar colisiones con un colisionador de polígonos usando Raycast en su campo en un juego de Unity. Quieren crear un cultivo en la posición del Raycast si se cumplen ciertas condiciones al hacer clic en un botón. Aunque verifica las colisiones perfectamente, tienen algunos problemas que no pueden resolver. El objeto de juego Shooter se teletransporta en la escena de manera aleatoria, pero el raycasting siempre es correcto. Los cultivos instanciados desaparecen en el momento de la próxima instancia.

    Solución Propuesta

    Se puede implementar el siguiente código para resolver los problemas:

    public class PlayerRay : MonoBehaviour
    {
        float borderLeft = -4.34f;
        float borderRight = 3.85f;
        float borderUp = 1.61f;
        float borderDown = -2.32f;
    
        public GameObject field;
        public GameObject shooter;
        public Transform shooterPos;
        PolygonCollider2D fieldCollider;
        public GameObject repka;
        private GameObject instantiatedCrop;
    
        void Start()
        {
            fieldCollider = field.GetComponent<polygoncollider2d>();
        }
    
        void Update()
        {
            // Verificar si el cultivo instanciado todavía es visible
            if (instantiatedCrop != null && !fieldCollider.OverlapPoint(instantiatedCrop.transform.position))
            {
                Destroy(instantiatedCrop);
            }
        }
    
        public void Sow()
        {
            Vector3 rayCastPos = new Vector3(Random.Range(borderLeft, borderRight), Random.Range(borderDown, borderUp), 0);
            shooter.transform.position = rayCastPos;
    
            Debug.DrawRay(shooterPos.position, shooterPos.forward * 10, Color.yellow);
            RaycastHit2D hit = Physics2D.Raycast(shooterPos.position, shooterPos.forward);
    
            if (hit != null && hit.collider == fieldCollider)
            {
                Debug.Log("Colisionamos con el colisionador");
                instantiatedCrop = Instantiate(repka, shooterPos.position, Quaternion.identity);
            }
            else
            {
                Debug.Log("No hay colisionador en: " + rayCastPos);
            }
        }
    }
    

    Los cambios incluyen la adición de una nueva variable instantiatedCrop para hacer un seguimiento de los cultivos instanciados, y un método Update para destruir cualquier cultivo que ya no sea visible. El método Sow también ha sido modificado para solucionar el problema de la teletransportación e instanciar el cultivo en la posición correcta. Por último, se ha modificado la verificación de la colisión para asegurarse de que el resultado no sea nulo antes de verificar el colisionador.

Comments are closed.