Создание объектов вне поля зрения камеры - PullRequest
0 голосов
/ 28 мая 2020

Я работаю над небольшой 2D-игрой и не могу понять эту. В основном я хочу, чтобы объекты появлялись, но только вне поля зрения камеры. Камера неподвижна, и я мог бы использовать жестко запрограммированные значения, но предпочитаю этого не делать.

Я пробовал использовать ширину и высоту экрана из Camera.main.orthographicSize и Camera.main.ViewportToWorldPoint, но мне удалось создать объекты везде, в том числе и внутри камеры.

Текущий код (комментарии - это случайные методы, которые я пробую)


public class Spawner : MonoBehaviour
{
    public GameObject asteroidPrefab;
    public Vector2 secondsBetweenSpawnsMinMax;
    public Vector2 asteroidSizeMinMax;


    private float nextSpawnTime = 0;
    private Vector2 screenHalfSizeWorldUnits;
    private float asteroidSpawnAngleMax;
    private float screenHeight;
    private float screenWidth;

    void Start()
    {
        screenHalfSizeWorldUnits = new Vector2(Camera.main.aspect * Camera.main.orthographicSize, Camera.main.orthographicSize);

    }

    void Update()
    {
     if(Time.time > nextSpawnTime)
        {
            screenHeight = Camera.main.orthographicSize + 1;
            screenWidth = Camera.main.orthographicSize * Camera.main.aspect + 1;

            float secondsBetweenSpawns = Random.Range(secondsBetweenSpawnsMinMax.x, secondsBetweenSpawnsMinMax.y);
            nextSpawnTime = Time.time + secondsBetweenSpawns;
            float asteroidSize = Random.Range(asteroidSizeMinMax.x, asteroidSizeMinMax.y);
            float asteroidSpawnAngle = Random.Range(-asteroidSpawnAngleMax, asteroidSpawnAngleMax);

            Vector3[] arrayOfZones = new Vector3[3];
            List<Vector3> listOfZones = new List<Vector3>();

            Vector3 leftSpawnZone = Camera.main.ViewportToWorldPoint(Vector3.left);
            Vector3 rightSpawnZone = Camera.main.ViewportToWorldPoint(Vector3.right);

            Vector3 topSpawnZone = Camera.main.ViewportToWorldPoint(Vector3.up);
            Vector3 downSpawnZone = Camera.main.ViewportToWorldPoint(Vector3.down);


            Vector3 spawnPosition = Camera.main.ViewportToWorldPoint(new Vector3(1.1f, 0.5f, 0f));
            //Vector2 spawnPosition = new Vector2(screenWidth + Random.Range(-90,30), screenHeight + Random.Range(-60,30));
            //Vector2 spawnPosition = new Vector2(Random.Range(-screenWidth, screenWidth), Random.Range(screenHeight, -screenHeight) + asteroidSize);
            GameObject newAsteroid = (GameObject)Instantiate(asteroidPrefab, spawnPosition, Quaternion.Euler(Vector3.forward * asteroidSpawnAngle));
            newAsteroid.transform.localScale = Vector2.one * asteroidSize;
                    }   
    }
    /*

}

Ответы [ 2 ]

0 голосов
/ 28 мая 2020

Удалось вроде как это сделать. Не так, как я предполагал, но это работает с некоторыми дополнительными шагами.

Сначала я создал список для всех направлений:

List<Vector3> listOfZones = new List<Vector3>();
listOfZones.Add(Camera.main.ViewportToWorldPoint(Vector3.left));
listOfZones.Add(Camera.main.ViewportToWorldPoint(Vector3.right));
listOfZones.Add(Camera.main.ViewportToWorldPoint(Vector3.up));
listOfZones.Add(Camera.main.ViewportToWorldPoint(Vector3.down));

Затем порождение:

Vector3 spawnPosition = Camera.main.ViewportToWorldPoint(Vector3.left);
GameObject newAsteroid = Instantiate(asteroidPrefab, listOfZones[Random.Range(0, listOfZones.Count)], Quaternion.Euler(Vector3.forward * asteroidSpawnAngle));
newAsteroid.transform.localScale = Vector2.one * asteroidSize;
0 голосов
/ 28 мая 2020

Поместите объекты (места появления) вне поля зрения камеры и настройте их как точки появления ..

Пример:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...