[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(3) 플레이어 제한

2023. 8. 24. 16:09Unity

728x90
반응형

플레이어가 게임 화면 밖으로 나가지 않게 제한을 걸어야 한다. 여기서 플레이어의 콜라이더를 이용하여 좌표 값이 게임 화면 이상으로 나가지 않게 스크립트를 추가할 것이다.

 

 


 

 

If 문 사용

public float spd = 10;
private SpriteRenderer spr;
private Sprite[] player1Sprites;
private Sprite[] player2Sprites;
private Sprite[] player3Sprites;
Vector3 min, max;
Vector2 colsize, chrsize;

void Start()
{
    spr = gameObject.GetComponent<SpriteRenderer>();
    player1Sprites = Resources.LoadAll<Sprite>("Sprites/player/player1");
    player2Sprites = Resources.LoadAll<Sprite>("Sprites/player/player2");
    player3Sprites = Resources.LoadAll<Sprite>("Sprites/player/player3");

    min = Camera.main.ViewportToWorldPoint(new Vector3(0, 0, 0));
    max = Camera.main.ViewportToWorldPoint(new Vector3(1, 1, 0));

    colsize = GetComponent<BoxCollider2D>().size;
    chrsize = new Vector2(colsize.x / 2, colsize.y / 2);
}

게임 화면 좌표를 얻기 위해 Vector3인 min, max 변수를 선언하고 Camera.main.ViewportToWorldPoint로 좌표값을 알 수 있다. (0, 0, 0)은 왼쪽 최하단의 값을, (1, 1, 0)은 오른쪽 최상단의 값을 가져온다.

콜라이더는 Vector2를 가지므로 콜라이더 사이즈와 그 2분의 1인 캐릭터 사이즈 변수를 선언하고, Start 함수 안에서 값을 대입한다.

 

 

void Update()
{
    float x = Input.GetAxisRaw("Horizontal");
    float y = Input.GetAxisRaw("Vertical");


    Vector3 dir = new Vector3(x, y, 0).normalized;


    transform.Translate(dir * Time.deltaTime * spd);

    if(Input.GetKey(KeyCode.UpArrow))
    {
        spr.sprite = player3Sprites[0];
    }
    else if (Input.GetKey(KeyCode.DownArrow))
    {
        spr.sprite = player2Sprites[0];
    }
    else
    {
        spr.sprite = player1Sprites[0];
    }

    float nowX = transform.position.x;
    float nowY = transform.position.y;

    if (nowX < min.x + chrsize.x)
    {
        nowX = min.x + chrsize.x;
    }
    if (nowX > max.x - chrsize.x)
    {
        nowX = max.x - chrsize.x;
    }
    if (nowY < min.y + chrsize.y)
    {
        nowY = min.y + chrsize.y;
    }
    if (nowY > max.y - chrsize.y)
    {
        nowY = max.y - chrsize.y;
    }

    transform.position = new Vector3(nowX, nowY, transform.position.z);
}

Update 부분이다. if 조건문을 추가하여 캐릭터의 x 값이 게임 화면의 최소 x 값에 캐릭터 콜라이더 반절을 더한 값보다 작아지면 더 이상 작아지지 못하게 등호로 만들었다. 다른 부분들도 마찬가지로 조건문을 부여하였다.

 

 


 

 

Mathf.Clamp 사용

void Start()
{
    spr = gameObject.GetComponent<SpriteRenderer>();
    player1Sprites = Resources.LoadAll<Sprite>("Sprites/player/player1");
    player2Sprites = Resources.LoadAll<Sprite>("Sprites/player/player2");
    player3Sprites = Resources.LoadAll<Sprite>("Sprites/player/player3");

    min = new Vector3(-8, -4.5f, 0);
    max = new Vector3(8, 4.5f, 0);

    colsize = GetComponent<BoxCollider2D>().size;
    chrsize = new Vector2(colsize.x / 2, colsize.y / 2);
}

Start 함수에서 min과 max 값을 직접 좌표로 입력한다.

void Update()
{
    float x = Input.GetAxisRaw("Horizontal");
    float y = Input.GetAxisRaw("Vertical");


    Vector3 dir = new Vector3(x, y, 0).normalized;


    transform.Translate(dir * Time.deltaTime * spd);

    if(Input.GetKey(KeyCode.UpArrow))
    {
        spr.sprite = player3Sprites[0];
    }
    else if (Input.GetKey(KeyCode.DownArrow))
    {
        spr.sprite = player2Sprites[0];
    }
    else
    {
        spr.sprite = player1Sprites[0];
    }

    float nowX = transform.position.x;
    float nowY = transform.position.y;

    nowX = Mathf.Clamp(nowX, min.x + chrsize.x, max.x - chrsize.x);
    nowY = Mathf.Clamp(nowY, min.y + chrsize.y, max.y - chrsize.y);

    transform.position = new Vector3(nowX, nowY, transform.position.z);
}

Mathf.Clamp(현재 값, 최솟값, 최댓값); 함수를 사용하여 긴 if 조건문들을 쓰지 않아도 된다.

 

 

잘 작동한다. 굿

728x90
반응형