본문 바로가기
Unity/프로젝트&작업물

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

by 테크앤아트 2023. 8. 24.
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
반응형