[Unity][2D-Game] Suika-Game (2)

suhan0304·2023년 11월 15일
0

유니티 - Suika Game

목록 보기
2/8
post-thumbnail

Review

  • 백그라운드를 구현했다.
  • 바닥과 벽을 구현한 후 고정을 위해 리지드바디 2D를 스태틱으로 설정했다.
  • 동글을 생성한 후 리지드바디 2D와 써클 콜라이더 2D를 추가했다.
  • 동글이 떨어지지 않도록 물리 시뮬레이터와 상호작용하지 않도록 simulated를 비활성화 해주었다.
  • 동글이 위치를 조정하는 로직을 추가했다.
  • 버튼을 이용해서 드래그&드랍을 구현했다.

강의영상 (2) - 동글 생성하기


개발

게임 매니저

GameManager 스크립트 생성하고 Game Manager라는 이름으로 게임매니저를 만든 후에 컴포넌트로 추가해준다.

GameManager.cs

public class GameManager : MonoBehaviour
{
    public Dongle lastDongle;

    public void TouchDown()
    {
        lastDongle.Drag();
    }

    public void TouchUp()
    {
        lastDongle.Drop();
    }
}

기존 터치패드의 버튼 Event Trigger를 게임 매니저의 TouchDown, TouchUp 함수로 변경해준다.


동글 생성

Dongle Group이라는 오브젝트를 만들고 위치를 0, 8, 0으로 수정해서 해당 위치에서 동글이만들어지도록 구현한다.

프리팹의 트랜스폼은 0, 0, 0으로 초기화해야한다.

GameManager.cs

Dongle GetDongle()
{
    //동글 프리팹 복사해서 가져옴, 이 때 부모는 동글 그룹으로 설정
    GameObject instant = Instantiate(donglePrefab, dongleGroup);
    Dongle instantDongle = instant.GetComponent<Dongle>();
    return instantDongle;
}

Instantiate의 반환은 GameObject형이다. Dongle 형태로 얻고 싶으면 instant라는 게임 오브젝트에 넣어놓고 해당 오브젝트에서 GetComponent로 동글을 가져와야 한다.

public class GameManager : MonoBehaviour
{
    public Dongle lastDongle;
    public GameObject donglePrefab; //동글 프리팹
    public Transform dongleGroup;   //동글이 생성될 위치

    private void Start()
    {
        NextDongle();
    }

    Dongle GetDongle()
    {
        //동글 프리팹 복사해서 가져옴, 이 때 부모는 동글 그룹으로 설정
        GameObject instant = Instantiate(donglePrefab, dongleGroup);
        Dongle instantDongle = instant.GetComponent<Dongle>();
        return instantDongle;
    }

    void NextDongle()
    {
        //생성된 동글을 가져와 new Dongle로 지정
        Dongle newDongle = GetDongle();
        lastDongle = newDongle;

        StartCoroutine(WaitNext()); //대기후 NextDongle을 실행하는 코루틴 시작
    }

    IEnumerator WaitNext()
    {
        while(lastDongle != null)
        {
            yield return null; //한 프레임을 대기한다.
        }

        yield return new WaitForSeconds(2.5f); //2.5초를 대기한다

        NextDongle();
    }

    public void TouchDown()
    {
        if (lastDongle == null) //lastDongle이 없으면 실행하지 않음
            return;

        lastDongle.Drag();
    }

    public void TouchUp()
    {
        if (lastDongle == null) //lastDongle이 없으면 실행하지 않음
            return;
        lastDongle.Drop();
        lastDongle = null; //드랍하면서 보관용도로 저장해둔 변수는 null로 비운다.
    }
}

위처럼 로직을 구현하면 실행하는 순서가 다음과 같다.

  1. start의 Next Dongle이 호출됨
  2. NextDongle이 GetDongle을 호출함
  3. GetDongle에서 프리팹을 하나 복사해서 Dongle Group 자식으로 만든 후 해당 오브젝트의 동글을 반환시킴
  4. 반환된 동글 컴포넌트를 lastDongle에 저장시킴
  5. 이제 더 이상 lastDongle이 null이 아니기 때문에 Drag, Drop이 작동함
  6. Drop을 해버리면 이제 더 이상 내가 추가적인 드래그드랍을 못하도록 보관용도인 lastDongle을 null로 비움

이제 동글을 복사해야하기 때문에 코루틴으로 lastDongle이 null이 될때까지 대기하도록 구현한다.

void NextDongle()
{
    //생성된 동글을 가져와 new Dongle로 지정
    Dongle newDongle = GetDongle();
    lastDongle = newDongle;

    StartCoroutine(WaitNext()); //대기후 NextDongle을 실행하는 코루틴 시작
}

IEnumerator WaitNext()
{
    while(lastDongle != null)
    {
        yield return null; //한 프레임을 대기한다.
    }

    yield return new WaitForSeconds(2.5f); //2.5초를 대기한다

    NextDongle();
}

이렇게 수정하면 위 6번 과정 이후에 7번 과정이 추가된다.

  1. lastDongle이 null로 바뀌었으므로 코루틴이 루프를 빠져나와서 2.5초 대기 후 NextDongle 실행

yield 없이 무한루프를 돌리면 유니티가 멈춰버린다. 무한 루프로 대기시키고 싶으면 루프안에 반드시 yeild를 넣어주어야 한다.


다양한 레벨

다양한 레벨로 동직 스프라이터를 바꿔주기위해 동글 프리팹에 animator 프리팹을 추가 후에 AcDongle 컨트롤러를 연결한다.

애니메이터 창을 살펴보면 레벨 파라미터에 따라 해당하는 레벨로 애니메이션이 실행되도록 구현이 되어있다.

Level 0, Level 1 애니메이션이 없으므로 새로 생성해보자. 애니메이션 폴더에 Level 0 Animation을 생성한다. 이제 애니메이터 창에서 Level 0을 선택한후 모션에 우리가 방금 생성한 Level 0을 추가한다.

이제 하이어라키 창의 Dongle을 산텍헤 동글을 컨트롤하도록 애니메이션을 작성해보자.

  • 0.00 : Scale = 0, 0, 0
  • 0.00 : Sprite = Level 0 스프라이트로 설정
  • 0.20 : Scale = 1, 1, 1

레벨 1도 동일하게 새로 애니메이션 생성 후 애니메이터 창에서 Level 1을 눌러 Motion에 새로 생성한 level1로 설정해준다.

  • 0.00 : Scale = 0, 0, 0
  • 0.00 : Sprite = Level 1 스프라이트로 설정
  • 0.20 : Scale = 1.5, 1.5, 1.5

이제 Dongle 스크립트를 수정해 애니메이터 컴포넌트를 받아오고 동글이 활성화 될때마다 레벨에 맞는 애니메이션이 실행되도록 설정해준다.

  • 동글 프리팹의 scale을 0으로 설정해준다.

Dongle.cs

Animator anim; //애니메이션

void Awake()
{
    rigid = GetComponent<Rigidbody2D>();
    anim = GetComponent<Animator>();
}

void OnEnable()
{
    anim.SetInteger("Level", level);
}

좀 랜덤하게 동글이 생성되도록 게임 매니저에서 level을 랜덤하게 설정하도록 구현한다.

  • 프리팹을 미리 비활성화 시킨다.

GameManager.cs

void NextDongle()
{
    //생성된 동글을 가져와 new Dongle로 지정
    Dongle newDongle = GetDongle();
    lastDongle = newDongle;
    lastDongle.level = Random.Range(0, 3); //레벨 0, 1, 2 에서 랜덤하게 생성되도록 구현
    lastDongle.gameObject.SetActive(true); //레벨 설정 후 활성화
    StartCoroutine(WaitNext()); //대기후 NextDongle을 실행하는 코루틴 시작
}


프레임 설정과 물리보정

게임 프레임이 너무 비정상적으로 높아 실제로 인게임에서는 버벅거리는 느낌이 발생한다. 게임 매니저에서 프레임을 잡아주도록 수정한다.

GameManager.cs

private void Awake()
{
    Application.targetFrameRate = 60; //프레임을 60으로 고정
}

이후에 동글 프리팹의 리지드바디 2D의 interpolate 속성을 interpolate로 설정해준다.

interpolate : 이전 프레임을 비교하여 움직임을 부드럽게 보정해준다.


결과물

profile
Be Honest, Be Harder, Be Stronger

0개의 댓글