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

suhan0304·2023년 11월 16일
0

유니티 - Suika Game

목록 보기
3/8
post-thumbnail

Review

  • 게임 매니저로 드래그 드랍을 구현했다.
    - 이때 동글이 특정 x 축 범위를 넘어가지 않고, y축 위치가 고정되도록 구현했다.
  • NextDongle에서 GetDongle로 새로운 동글을 만들어와 가져오고 해당 동글을 lastDongle에 넣어 드래그드랍의 영향을 받도록 구현했다.
  • NextDongle이 실행된 후 TouchUp 함수(터치를 그만하면 실행)가 실행될 때까지 대기 후 다시 NextDongle이 실행되도록 WaitNext 코루틴을 실행시켰다.
  • 다시 NextDongle이 실행되면 GetDongle부터 또 다시 실행되면서 동글을 계속해서 생성해준다.
    - 생성 동글의 레벨은 0~1까지 랜덤하게 설정

강의영상 (3) - 동글 합치기


개발

동글 충돌

동글끼리의 충돌을 감지하기 위해 OnCollierStay2D로 로직을 구현했다. 이 때 동글이 3개 이상 충돌할 수도 있기때문에 동글이 합칠 때 다른 동글이 개입하지 않도록 잠금역할 해주는 변수를 추가해서 1대1로만 합쳐지도록 구현했다.

Dongle.cs

void OnCollisionStay2D(Collision2D collision)
{
    if(collision.gameObject.tag == "Dongle")
    {
        //충돌한 동글을 가져온다.
        Dongle other = collision.gameObject.GetComponent<Dongle>();

        //1. 상대와 나의 레벨이 같을 때
        //2. 내가 합치는 중이 아닐때
        //3. 상대가 합치는 중이 아닐때
        //4. level이 7보다 낮을때
        if(level == other.level && !isMerge && !other.isMerge && level < 7)
        {
            //동글 합치기 로직

            //나와 상대편 위치 가져오기
            float meX = transform.position.x;
            float meY = transform.position.y;
            float otherX = other.transform.position.x;
            float otherY = other.transform.position.y;

            //1. 내가 아래에 있을때
            //2. 동일한 높이에 있을때, 내가 오른쪽에 있을때
            if(meY < otherY || (meY == otherY && meX > otherX))
            {
                //상대방은 숨기기
				other.Hide(transform.position); //상대방은 나를 향해 움직이면서 숨긴다.
                //나는 레벨업
            }
        }
    }
}

동글 흡수 (숨김)

위 코드에서 "상대방은 숨기기" Hide 함수 부분을 구현한다.

public void Hide(Vector3 targetPos)
{
    isMerge = true; //잠금장치 걸어두기

    //흡수 이동을 위해 물리효과 모두 비활성화

    rigid.simulated = false; //리지드바디 2D 물리효과 중지
    circle.enabled = false;  //서클 콜라이더 2D 비활성화

    StartCoroutine(HideRoutine(targetPos));
}

IEnumerator HideRoutine(Vector3 targetPos)
{
    int frameCount = 0;

    while(frameCount < 20)
    {
        frameCount++;//20프레임 실행되도록 
        transform.position = Vector3.Lerp(transform.position, targetPos, 0.5f);
        yield return null; //프레임 단위로 대기
    }

    isMerge = false; //합치기 종료
    gameObject.SetActive(false); //숨김이 완료됐으므로 비활성화
}

동글 성장 (레벨업)

void LevelUp()
{
    isMerge = true; //잠금장치 걸어두기

    rigid.velocity = Vector2.zero; // 움직이지 않도록 속도 0으로 설정
    rigid.angularVelocity = 0; // 회전 속도도 0으로 설정

    StartCoroutine(LevelUpRoutine());
}

IEnumerator LevelUpRoutine()
{
    yield return new WaitForSeconds(0.2f);

    anim.SetInteger("Level", level + 1); //레벨 올려서 애니메이션 실행

    yield return new WaitForSeconds(0.3f); //애니메이션 실행 시간 대기

    level++; //실제 레벨도 증가

    isMerge = false; //잠금장치 해제
}

실제 레벨 상승을 늦게 하는 이유는 애니메이션 시간 때문에 일부러 애니메이션 실행이 완료된 후에 실제 레벨업이 진행되도록 구현


동글 충돌

물리 속도가 너무 빨라서 OnCollisionStay2D 함수에 걸리지 않아서 합쳐지지 않는 경우가 발생한다. 이를 살짝 고정해주도록 한다.
Edit > Project Settings > Physics 2D에서 Auto Sync Transforms를 활성화 시킨다.

Auto Sync Transform : 트랜스폼과 물리의 차이를 보정한다.


동글 충돌

이제 동글 생성이 현재 생성되어있는 최대 동글 레벨을 기반으로 랜덤하게 이루어지도록 게임 매니저에 로직을 구현한다.

GameManager.cs

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

Dongle에서 manager를 사욯알 수 있게 this를 이용해 게임매니저를 넘겨준다.

Dongle.cs

manager.maxLevel = Mathf.Max(level, manager.maxLevel); // 더 높은 레벨을 반환시켜 최대 레벨을 유지시킨다.

초기 maxLevel은 인스펙터를 사용해 2로 초기화해준다.


결과물

profile
Be Honest, Be Harder, Be Stronger

0개의 댓글