[TIL]강의 - 2주차, 3주차
풍선을 지켜라 게임

떨어지는 물체들로부터 풍선을 지켜주는 간단한 게임이다.
계속해서 떨어지는 사각형 물체들은 랜덤한 위치에서 무한 생성되며, 화면에서 벗어날 시 스스로를 파괴한다.
//Square.cs
void Start()
{ //랜덤한 위치에서 생성
transform.position =
new Vector3(Random.Range(-3.0f, 3.0f), Random.Range(3.0f, 5.0f), 0);
float size = Random.Range(0.5f, 1.5f);
transform.localScale = new Vector2(size, size); //사이즈 랜덤 조정
}
void Update()
{
if (transform.position.y <= -5.5f || Math.Abs(transform.position.x) >= 3.5f)
{
//y좌표가 -5.5보다 작거나 x좌표의 절대값이 3.5보다 큰 경우
//화면에서 벗어난 것으로 판정
Destroy(gameObject);
}
}
//GameManager.cs
void Start()
{
Time.timeScale = 1.0f;
//1초 마다 사각형 물체 생성
InvokeRepeating("MakeSquare", 0f, 1.0f);
}
void MakeSquare()
{
Instantiate(squarePrefab);
}
강의 내용은 위와 같이 게임 매니저에서 사각형 오브젝트를 계속해서 새롭게 찍어내는 식으로 구현하였다.
물론 문제 없지만, 게임 도중에 똑같은 물체를 계속 만들고, 파괴하는 행위는 뭔가 비효율적으로 보인다.
그래서 매번 새로운 오브젝트를 생성하는 것이 아닌, 미리 만들어서 배열에 담아놓고 활성화/비활성화를 반복하며 재활용하는 방식으로 바꿔보았다.
먼저, Square.cs 의 Start() 메서드를 OnEnable()로 바꿔준다.
//Square.cs
void OnEnable()
{ //랜덤한 위치에서 생성
transform.position =
new Vector3(Random.Range(-3.0f, 3.0f), Random.Range(3.0f, 5.0f), 0);
transform.rotation = Quaternion.Euler(0, 0, 0);
float size = Random.Range(0.5f, 1.5f);
transform.localScale = new Vector2(size, size); //사이즈 랜덤 조정
}
Start() 메서드와 OnEnable() 메서드 둘 다 게임 시작시 먼저 한번만 실행된다는 공통점이 있지만, OnEnable() 메서드는 오브젝트가 활성화 될 때마다 호출되는 특징이 있다. 따라서 재활용 가능성이 있는 오브젝트는 Start() 대신 OnEnable() 메서드를 사용하는 것이 좋다.
이제 게임매니저 스크립트에서 배열을 통해 사각형들을 미리 생성하여 관리한다.
//GameManager.cs
void Start()
{
Time.timeScale = 1.0f;
for (int i = 0; i < squares.Length; i++)
{
squares[i] = Instantiate(squarePrefab);
squares[i].SetActive(false);
}
InvokeRepeating("MakeSquare", 0f, 1.0f);
}
void MakeSquare()
{
squares[currentIdx++].SetActive(true);
if (currentIdx >= squares.Length)
{
currentIdx = 0;
}
}
Square.cs의 스스로를 파괴하는 부분도 다음과 같이 바꿔준다.
void Update()
{
if (transform.position.y <= -5.5f || Math.Abs(transform.position.x) >= 3.5f)
{
//y좌표가 -5.5보다 작거나 x좌표의 절대값이 3.5보다 큰 경우
//화면에서 벗어난 것으로 판정
gameObject.SetActive(false); //오브젝트 비활성화
}
}

같은 오브젝트가 활성화/비활성화 되면서 재활용되는 모습을 볼 수 있다.
고양이 밥주기 게임

배고픈 고양이들로부터 가게를 지키는 탄막 슈팅 게임이다.
탄막과 고양이의 충돌 이벤트를 OnCollision 대신 OnTrigger를 사용하여 구현하였는데, 평소에 게임 개발을 할때 충돌 이벤트를 둘 중 어떤 것을 사용해야 할지 햇갈릴 때가 많았다. 정리해보면 다음과 같다.
OnCollision vs OnTrigger
| 구분 | OnCollisionEnter / Stay / Exit | OnTriggerEnter / Stay / Exit |
|---|---|---|
| 충돌 방식 | 실제 물리적 충돌이 발생해야 함 | 콜라이더가 겹치기만 해도 발생 |
| 콜라이더 설정 | 두 개의 콜라이더 모두 isTrigger = false |
하나 이상의 콜라이더가 isTrigger = true |
| 리지드바디 필요 여부 | 최소한 한 개의 오브젝트에 Rigidbody 필요 |
최소한 한 개의 오브젝트에 Rigidbody 필요 |
| 물리적 반응 여부 | 충돌 시 물리 엔진이 반응하여 힘이 적용됨 | 물리적 반응 없음 (겹쳐도 통과 가능) |
| 주요 사용 사례 | 충돌 감지, 피격 판정, 이동 차단 등 | 영역 감지, 트리거 이벤트, 존(Zone) 설정 등 |
댓글남기기