[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(3) 플레이어 제한
2023. 8. 24. 16:09ㆍUnity
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
반응형
'Unity' 카테고리의 다른 글
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(4) 미사일 발사 (0) | 2023.08.28 |
---|---|
[Unity] Tag와 Layer (0) | 2023.08.24 |
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(2) 배경 설정 (0) | 2023.08.24 |
[C#] Static 변수 / Static 함수 / Static 변수의 자기참조 (0) | 2023.08.24 |
[Unity Project] <ShootOut2D> 2D 슈팅 게임 만들기(1) 플레이어 설정 (0) | 2023.08.23 |