Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개임 게발

[Unity] [풍선을 지켜라] 풍선과 장애물 만들기, 타이머 만들기 본문

강의 정리

[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도 잘 흐르는 것을 볼 수 있다.