Я работаю над небольшой 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;
}
}
/*
}