본문 바로가기
제출용/TIL

내일배움캠프 24일차 TIL + 화면 밖에서 랜덤 좌표 생성하기

by 유린테 2024. 5. 20.

해야하는 것!

화면 밖 랜덤 위치에서 총알이 만들어져서 플레이어한테 날아와야함
총알생성은 오브젝트풀링에서 가져와야해서 좀 걸릴것같고
화면 밖 랜덤한 좌표를 세팅하는 작업까지는 할 수 있지 않을까
게임매니저에 업데이트 함수에서 화면 밖에 랜덤한 좌표를 생성하는 코드를 만들어보자,,
화면 밖 랜덤한 좌표를 디버그.로그 로 출력할 수 있게!

 

using UnityEngine;

public class RandomPositionGenerator : MonoBehaviour
{
    private float screenWidth = 1920f; // 화면 너비
    private float screenHeight = 1080f; // 화면 높이
    private float spawnInterval = 1f; // 생성 간격 (초)
    private float timeSinceLastSpawn; // 마지막 생성 이후 경과 시간

    void Update()
    {
        timeSinceLastSpawn += Time.deltaTime; // 경과 시간 업데이트

        // 일정 시간 간격으로 실행
        if (timeSinceLastSpawn >= spawnInterval)
        {
            // 화면 밖 랜덤 위치 생성
            Vector2 randomPosition = GenerateRandomPositionOutsideScreen();
            // 생성된 위치를 콘솔에 출력
            Debug.Log("Random Position Outside Screen: " + randomPosition);
            // 마지막 생성 이후 경과 시간 초기화
            timeSinceLastSpawn = 0f;
        }
    }

    Vector2 GenerateRandomPositionOutsideScreen()
    {
        float screenLeft = 0f; // 화면 왼쪽 경계
        float screenRight = screenWidth; // 화면 오른쪽 경계
        float screenTop = screenHeight; // 화면 상단 경계
        float screenBottom = 0f; // 화면 하단 경계

        Vector2 randomPosition = Vector2.zero; // 초기화된 랜덤 위치
        // 화면 밖의 랜덤 위치를 생성하기 위한 랜덤한 경계 선택
        int edge = Random.Range(0, 4);

        // 선택된 경계에 따라 랜덤 위치 설정
        switch (edge)
        {
            case 0: // 왼쪽
                randomPosition = new Vector2(screenLeft - Random.Range(50f, 200f), Random.Range(screenBottom, screenTop));
                break;
            case 1: // 오른쪽
                randomPosition = new Vector2(screenRight + Random.Range(50f, 200f), Random.Range(screenBottom, screenTop));
                break;
            case 2: // 위
                randomPosition = new Vector2(Random.Range(screenLeft, screenRight), screenTop + Random.Range(50f, 200f));
                break;
            case 3: // 아래
                randomPosition = new Vector2(Random.Range(screenLeft, screenRight), screenBottom - Random.Range(50f, 200f));
                break;
        }

        return randomPosition; // 생성된 랜덤 위치 반환
    }
}

 

screenWidth, screenHeight 변수

화면의 가로와 세로 크기를 픽셀 단위로 정의

여기서 Full HD 해상도 (1920x1080) 기준으로 제작했는데, 이게 UI 기준이고 실제 화면이랑 다르다고 하셔서

팀원분께서 수정해주셨다.

 

spawnInterval 변수

생성 간격을 설정!

일정 시간이 경과한 후에 다음 랜덤 위치를 생성

>> 1f 으로 지정해줬음

 

timeSinceLastSpawn 변수

마지막 생성 이후의 경과 시간을 추적하는 변수

Update 메서드에서 경과 시간을 누적하여 spawnInterval 이상이 되면 새로운 랜덤 위치를 생성

 

Update 메서드

매 프레임마다 호출되는 Unity 특수 메서드

여기서 경과 시간을 증가시키고, 일정 시간 간격으로 랜덤 위치를 생성

>> Start는 처음 한번 호출, Update는 계속해서 호출이라 Update 사용!! 

 

GenerateRandomPositionOutsideScreen 메서드

화면 밖의 랜덤 위치를 생성하는 메서드

화면의 네 경계 중 하나를 선택하고, 해당 경계 외부의 랜덤 위치를 생성했음

 

랜덤 위치 생성

Random.Range 함수를 사용

Random.Range를 사용하여 화면 밖으로 벗어날 거리를 설정

선택된 경계에 따라 랜덤한 x나 y 좌표를 생성하고, 화면 경계와 생성된 랜덤 좌표 사이의 거리를 설정

 

+ 그리고 이게 적 공격 날아오는 좌표인데, 원래 앞에서만 와야하지 않나? 싶어서 앞에서만 오는걸로도 만들었다.

 

Vector2 GenerateRandomPositionOutsideScreen()
{
    float screenLeft = 0f; // 화면 왼쪽 경계
    float screenRight = screenWidth; // 화면 오른쪽 경계
    float screenTop = screenHeight; // 화면 상단 경계

    // 위쪽 경계 선택
    float screenBottom = screenTop; 

    Vector2 randomPosition = Vector2.zero; // 초기화된 랜덤 위치

    // 선택된 경계에 따라 랜덤 위치 설정
    randomPosition = new Vector2(Random.Range(screenLeft, screenRight), screenTop + Random.Range(50f, 200f));

    return randomPosition; // 생성된 랜덤 위치 반환
}

 

 

중간중간 이렇게 수정해주면 된다.

 

근데 결국 사방에서 날아와야 할 것 같다고 하셔서 다시 위의 코드로 사용하였음!