강의 정리
[Unity] [풍선을 지켜라] 풍선과 장애물 만들기, 타이머 만들기
lhgenol
2025. 2. 2. 07:54
[풍선을 지켜라] 게임 기본 씬 구성하기(2-1)
기본 세팅
- 새로운 게임 만들기 [풍선을 지켜라] (Rise Up!과 유사)
- 게임 제작을 위한 기본 세팅을 하자.
- 새 유니티(MyShield)를 만들어 Scene을 MainScene으로 변경, Background는 'Hierarchy' -> 2D Object -> Sptites -> Square로 생성
- Balloon과 Shield도 동일하게 2D Object -> Sptites -> Circle로 생성
- 점수도 UI -> Legacy -> Text로 생성한 다음 인스펙터에서 리셋 한번 진행
풍선의 애니메이션화
- 이제 추가 기능들(풍선의 깜빡거리는 애니메이션과 쉴드의 움직임)을 구현해 보자.
- Assets 폴더에 Animations 폴더 하나 만들고 Balloon_Idle 애니메이션 클립 추가
- Balloon_Idle을 Balloon 오브젝트에 드래그 드롭 -> 그럼 Balloon의 Animator까지 생성 완료
- Balloon_Idle 더블 클릭 -> Balloon 선택 -> 녹화 버튼 -> 타임라인 20으로 이동해 RGB값 200, 200, 255 세팅 -> 40은 다시 원래대로 255, 255, 255 세팅 -> 녹화 버튼을 다시 한 번 누르면 Animation 저장이 된다.
- 플레이 해보면 깜빡깜빡거리는 애니메이션이 완성된 것을 볼 수 있다.
쉴드의 움직임 구현
- 이제 Shield의 움직임을 구현해 보자.
- Shield는 마우스의 위치와 함께 돌아다니게 됨. 그러니 화면 스크린에 떠돌아다니는 마우스의 위치를 메인 카메라가 찍고 있는 게임 월드(Shield 게임 오브젝트)의 위치로 바꿔 줘야함
- 이 역할을 해주는 스크립트를 만들어 보자.
- Shield 스크립트를 만들고, Shield 게임 오브젝트의 인스펙터 컴포넌트에 넣어주자.
- 일단 카메라에 접근해 보자.
void Update()
{
Camera.main.ScreenToWorldPoint();
}
- ScreenToWorldPoint: 스크린의 위치를 게임 월드상의 위치로 바꿔주는 함수
- 소괄호에는 위치를 넣어준다. 우리가 바꿔줘야 될 위치 = 마우스의 위치
- 입력 장치들의 값은 Input이라는 키워드를 통해 접근
void Update()
{
Camera.main.ScreenToWorldPoint(Input.mousePosition);
}
- '스크린 상의 마우스 좌표를 카메라가 찍고 있는 좌표로 바꿔준다' 작성 완료
- 이 변환된 값을 잠시 변수에 넣어주자.
void Update()
{
Vector2 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
transform.position = mousePos;
}
- 플레이 해보면, 마우스의 위치와 Shield의 위치가 똑같은 걸 볼 수 있다.
장애물 만들기 - 중력과 위치(2-2)
오브젝트들의 충돌 구현
- 떨어지는 장애물을 구현해 보자.
- Square 게임 오브젝트 만들고, Rigidbody 2D 컴포넌트 추가
- 플레이 해보면 잘 떨어진다. 충돌을 위해 Collider 2D도 추가하자.
- Square는 Box Collider 2D, Shield는 Circle Collider 2D
- 플레이 해보면 박스와 쉴드가 잘 충돌힌다.
- 풍선과 부딪히면 게임오버가 되게 만들어야 하니 풍선에도 Circle Collider 2D 추가
- 이번에는 장애물이 랜덤한 위치에서 생성될 수 있도록 구현해보자.
- 장애물의 범위는 X -3에서 3, Y 3에서 5로 잡아주자.
- Square 스크립트 생성 -> Square 게임 오브젝트에 추가
void Start()
{
Random.Range(-3.0f, 3.0f);
}
- 랜덤한 값을 추출할 수 있게 Random.Range를 사용해 주었다.
- f면 뭘 써야 돼?
void Start()
{
float x = Random.Range(-3.0f, 3.0f);
}
- float에 담아야지요
- float x라고 하는 변수에다가 담아 주었다. 변수는 박스 변수는 박스
void Start()
{
float x = Random.Range(-3.0f, 3.0f);
float y = Random.Range(3.0f, 5.0f);
}
- Y도 이어서 작성해 주었다.
- 그리고 Square라고 하는 Transform 안의 Position 값에 넣는다고 했다.
- Transform에 접근하려면?
void Start()
{
float x = Random.Range(-3.0f, 3.0f);
float y = Random.Range(3.0f, 5.0f);
transform.position = new Vector2(x, y);
}
- transform.position 이지요
- new Vector2라는 키워드를 통해서 아까 랜덤으로 도출한 값을 넣어주자.
- Vector2에는 첫 번째에 x, 두 번째에 y값이 들어감
- 플레이 해보면 랜덤한 위치에서 잘 생성된다.
- 이제는 랜덤한 위치뿐 아니라 랜덤한 사이즈로 나오게 구현하자.
- Square의 Scale에 랜덤한 값을 넣어주면 되겠다.
- size 변수에다가 0.5부터 1.5 사이의 값을 넣어보자.
void Start()
{
float x = Random.Range(-3.0f, 3.0f);
float y = Random.Range(3.0f, 5.0f);
transform.position = new Vector2(x, y);
float size = Random.Range(0.5f, 1.5f);
transform.localScale = new Vector2(size, size);
}
- transform.size라고 하면 나오지 않는다. transform.localScale이라고 해야 함
- 플레이 해보면 사이즈도 랜덤하게 잘 나온다.
- 이제 이게 한 번씩만 나오니까 반복적으로 생성될 수 있게 만들어 주면 되겠다.
장애물의 반복 생성 구현
- 반복적으로 생성하는 건 게임 매니저에서 작업한다. GameManager 오브젝트와 스크립트를 만들어 주자. 역시 오브젝트에 스크립트 컴포넌트 추가
- 이제 Square를 반복적으로 만들어주기 위해 Square를 Prefab화 하자.
- Assets에 Prefabs 폴더 만들고 Square 오브젝트를 Prefabs 폴더 안으로 넣어 Prefabs화. Square 오브젝트는 지워주자.
- 이제 GameManager에서 반복 생성 코드를 작성하자.
- 반복적으로 무언가를 실행시키는 함수는?
void Start()
{
InvokeRepeating();
}
- InvokeRepeating 이지요
- 여기에 메소드의 이름을 String 값으로, 문자열 값으로 넣어주면 된다.
- 일단 함수를 먼저 만들자.
void Start()
{
InvokeRepeating("MakeSquare", 0f, 1f);
}
void Update()
{
}
void MakeSquare()
{
Debug.Log("생성한다!");
}
- 일단 디버그 로그를 적었다.
- InvokeRepeating 소괄호 안에도 MakeSquare를 넣어주고, 바로 실행시킬 거니까 0f라고 적는다. 얼만큼 자주 실행시키게 할 건지는 일단 1초로 설정하자(1f).
- 플레이 해보면 디버그 로그가 반복적으로 찍히고 있는 것을 볼 수 있다.
- 그럼 이제 이 디버그 로그 대신에 Square Prefab을 생성해주는 코드를 넣어주면 되겠다.
- Prefab을 반복적으로 생성해줘야 되니까 Prefab을 변수에 넣어야 한다.
public class GameManager : MonoBehaviour
{
public GameObject square;
- public에 넣어줬다.
- 그리고 Prefab을 생성시킬 때 쓰는 코드가 또 있었는데?
void MakeSquare()
{
Instantiate(square);
}
- Instantiate 지요
- 소괄호 안에 square를 적어주면 박스 안에 있는 Prefab을 가져올 수 있게 된다.
- 실행 시키기 전, 게임 매니저에 Prefab을 넣어주자.
- 플레이 해보면, 랜덤한 위치에서 랜덤한 사이즈의 박스가 반복적으로 생성되는 걸 볼 수 있다.
시간 구현하기(2-3)
Time 변수로 시간초 구현
- 이제 0초에 멈춰 있는 시간을 올려주는 기능을 만들어 보자.
- 역시 GameManager로 가자.
- 저번에 시간이 흐르는 기능을 Time.deltaTime 코드를 사용해 만들었다.
이번에도 이걸 쓰자. 시간을 담아줄 수 있는 변수 time
public class GameManager : MonoBehaviour
{
float time = 0.0f;
- 일단 시간은 float으로 받아주자. 초기 값은 0초
- 이 time 변수에다가 Time.deltaTime을 더해주자.
float time = 0.0f;
void Update()
{
time += Time.deltaTime;
Debug.Log(time);
}
- 이제 시간이 0초에서 계속해서 더해지는지 확인할 필요가 있겠다. 그래서 디버그 로그도 넣어줬다.
- 플레이 해보면 로그에 시간이 제대로 보인다.
- 이제 이 값을 Text에다가 넣어주자. 그러기 위해서는 아까 Prefab을 넣어줬던 것처럼 변수를 하나 만들어 Text를 넣어주자.
- timeTxt 컴포넌트의 인스펙터 안 Text에 접근을 해야 함. 그걸 위해 변수를 만들자.
public class GameManager : MonoBehaviour
{
public GameObject square;
public Text timeTxt;
- square Prefab을 넣어줬던 것처럼 Text를 넣어줬다.
- 이 TimeTxt라고 하는 컴포넌트 안에 또 text가 따로 있으니까, Update에다가 time 변수, time 값을 넣어주도록 하자.
void Update()
{
time += Time.deltaTime;
timeTxt.text = time.ToString("N2");
}
- 이 text는 String 값이라 했었다. 근데 time은 float이다. 자료형이 다름
- 그래서 이 float라고 하는 자료형을 text에 넣을 수 있게 String이라고 하는 자료형으로 바꿔야 한다. (= ToString 메소드 추가)
- 그리고 소수점 두 번째 자리까지 나오게 할 거니까 N2 사용
- 유니티로 돌아와서, 게임 매니저 인스펙터에 timeTxt를 넣어주고 플레이 해보면 Time도 잘 흐르는 것을 볼 수 있다.