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.

Ayuda de Unity 2D – Generación aleatoria de asteroides sin que aparezcan en la vista de la cámara.

Actualmente estoy creando un juego espacial en 2D de “exploración libre” desde una vista en perspectiva cenital.

Estoy tratando de generar asteroides de forma aleatoria alrededor de la escena para poder colisionar con naves, aunque no quiero que estos asteroides aparezcan dentro del campo de visión de la cámara, ya que no quiero que parezca que un asteroide surgió de la nada.

¿Alguien puede explicarme cómo puedo lograr esto?

No creo que sea necesario mostrar mi código, ya que lo único que realmente tengo es un script de movimiento simple y un script de seguimiento de cámara.

¡Gracias de antemano!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para generar aleatoriamente asteroides fuera de la vista de la cámara en tu juego espacial 2D, puedes seguir los siguientes pasos:

    1. Define las dimensiones de la vista de la cámara utilizando las propiedades Screen.width y Screen.height.
    2. Crea una posición aleatoria para el asteroide fuera de la vista de la cámara. Puedes utilizar la función Random.Range para generar una posición x y y aleatoria que esté fuera de los límites de la vista de la cámara.

    3. Verifica si la posición está realmente fuera de la vista de la cámara. Puedes hacer esto calculando la distancia entre la posición del asteroide y la posición de la cámara. Si la distancia es menor que la suma del radio del asteroide y el tamaño del frustum de la cámara, entonces el asteroide está dentro de la vista de la cámara y necesitas generar una nueva posición aleatoria.

    4. Una vez que tengas una posición válida, instancía el prefabricado u objeto del asteroide en esa posición.

    Aquí tienes un fragmento de código de ejemplo que puedes modificar y utilizar:

    public class AsteroidSpawner : MonoBehaviour {
        public GameObject asteroidPrefab;
        public float asteroidRadius = 1f;
    
        private Camera mainCamera;
        private float maxDistanceFromCamera;
    
        void Start() {
            mainCamera = Camera.main;
    
            // Calcula la distancia máxima para la generación de asteroides
            maxDistanceFromCamera = Mathf.Max(Screen.width, Screen.height) + asteroidRadius;
        }
    
        void SpawnAsteroid() {
            Vector3 asteroidPos;
    
            // Crea una posición aleatoria fuera de la vista de la cámara
            do {
                float x = Random.Range(-maxDistanceFromCamera, maxDistanceFromCamera);
                float y = Random.Range(-maxDistanceFromCamera, maxDistanceFromCamera);
                asteroidPos = new Vector3(x, y, 0f);
            } while (IsInsideCameraView(asteroidPos));
    
            // Instancia el prefabricado del asteroide en una posición aleatoria
            Instantiate(asteroidPrefab, asteroidPos, Quaternion.identity);
        }
    
        bool IsInsideCameraView(Vector3 asteroidPos) {
            // Calcula la distancia entre la cámara y el asteroide
            float distance = Vector3.Distance(mainCamera.transform.position, asteroidPos);
    
            // Calcula el tamaño del frustum basado en la distancia del asteroide
            float frustumHeight = 2f * distance * Mathf.Tan(mainCamera.fieldOfView * 0.5f * Mathf.Deg2Rad);
            float frustumWidth = frustumHeight * mainCamera.aspect;
    
            // Calcula los límites de la cámara
            float camLeft = mainCamera.transform.position.x - frustumWidth / 2f;
            float camRight = mainCamera.transform.position.x + frustumWidth / 2f;
            float camBottom = mainCamera.transform.position.y - frustumHeight / 2f;
            float camTop = mainCamera.transform.position.y + frustumHeight / 2f;
    
            // Verifica si la posición del asteroide está fuera de los límites de la cámara
            return asteroidPos.x > camLeft - asteroidRadius && asteroidPos.x < camRight + asteroidRadius
                && asteroidPos.y > camBottom - asteroidRadius && asteroidPos.y < camTop + asteroidRadius;
        }
    }
    

    En este fragmento de código de ejemplo, la función SpawnAsteroid puede ser llamada siempre que desees generar un nuevo asteroide aleatorio en la escena. La variable asteroidRadius se utiliza para calcular el tamaño del frustum de la cámara, y puedes ajustarla para que coincida con el tamaño de tus asteroides.

Comments are closed.