Short Cake
8PM - Animal Crossing Wild World

사생활 보호 설정

https://gamjia.tistory.com

Mini Rooms

  • 내 미니룸
  • 미니미설정
  • 미니룸설정
  • 답글수 [0]

What Friends Say

한마디로 표현해봐~

1촌평 관리

Unity 6 Challenge - 6

GamJia 2024. 12. 28. 22:19

Unity 6 Kimchi Run - 6


private void OnTriggerEnter2D(Collider2D other)
{
    if (other.TryGetComponent(out Enemy enemy))
    {
        if(!isInvincible)
        {
            Hit();
        }            
    }
    else if (other.TryGetComponent(out Food food))
    {
        switch (food.type)
        {
            case Food.Type.Normal:
                Heal();
                break;
            case Food.Type.Gold:
                StartInvincible();
                break;
        }
    }
    else
    {
        Debug.Log("Collided with an unidentified object");
    }
}

 
전에 내용에 이어서.. 저는 tag 대신
Script로 구분하기로 했으니 이 부분만
내용을 다르게 해주겠습니다
 


 
Player 사망 처리와 관련된 Sprite를
만들어주고 Animation, Animator를
연결해주었습니다
 


 
Loop를 해제해주고
얘도 다른 Animation들처럼
Trigger로 관리해주겠습니다
 


 
Script 저장 후 실행해보니
3대 맞고 알아서 잘 죽은...
캐릭터의 모습이 보입니다


void Hit()
{
    lives = Mathf.Max(0, lives - 1); 
    if(lives.Equals(0))
    {
        Kill();
    }

    else
    {
        SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>();
        if (spriteRenderer != null)
        {
            spriteRenderer.color = new Color32(0xFF, 0x00, 0x00, 0xFF); // FF0000 색상
        }

        Invoke("ResetColor",0.1f);
    }
}

IEnumerator InvincibleCoroutine()
{
    isInvincible = true;

    SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>();
    if (spriteRenderer != null)
    {
        float timer = 0f;

        while (timer < 5f) 
        {
            spriteRenderer.color = (timer % 0.4f < 0.2f) ? new Color32(0xFF, 0xAE, 0x00, 0xFF) : Color.white; 

            timer += 0.2f; // 0.2초마다 timer 증가
            yield return new WaitForSeconds(0.2f); // 0.2초 대기
        }

        // 5초가 지나면 StopInvincible 호출
        StopInvincible();
    }
}

void ResetColor()
{
    SpriteRenderer spriteRenderer = GetComponent<SpriteRenderer>();
    if (spriteRenderer != null)
    {
        spriteRenderer.color = Color.white; // 원래 색상 복구
    }
}

 
그리고 뭔가 맞을 때, 골드 아이템을
먹었을 때 Sprite의 색을 변경해서
Player의 상태를 더 잘 보여주고 싶었어요
 


 
맞았을 때는 Invoke를 이용해 0.2초 이후에 리셋
황금 배추를 먹었을 때는 5초동안 coroutine을
돌면서 0.2초동안 색을 바꾸고 리셋해주었습니다
 


다른 버전과 Unity 6의 GameManager

GameManager를 하나 만들어주겠습니다
Script 연결하고 안건데 GameManager
아이콘이 다른 버전과 다릅니다..!(왜!!)


 

GameManager Script 작성이 완료 됐다면

Title LogoStart Button을 만들어주겠습니다

일단 Sprite Mode를 Single로 변경해주세요

 


 

 

Logo와 Button은 UI 객체니까 Canvas에 넣어주고

이미지 비율이 이상할 때는 Set Native Size를

클릭해서 원래 이미지 비율로 설정해줍니다

 


 

저는 타이틀이랑 오디오 작업할 때

그렇게 좋더라구요 뭔가 게임다움이

훨씬 증가 되는 기분

 


 

다시 GameManager로 돌아와서

Script를 마저 작성해주고

관련 객체를 연결해주겠습니다

 


 

저장 후 실행해보니 Spawner 배열에

들어간 Spawner 객체들이 비활성화 돼서

적, 음식이 안 나오는 모습입니다

 


public void UpdateState(GameState state)
{
    this.state=state;
    switch(state)
    {
        case GameState.Intro:
            introUI.SetActive(true);
            gameoverUI.SetActive(false);
            UpdateSpawner(false);
            break;

        case GameState.InGame:
            introUI.SetActive(false);
            UpdateSpawner(true);
            break;

        case GameState.Dead:
            gameoverUI.SetActive(true);
            UpdateSpawner(false);
            break;

    }
}

 

lives 관련 내용을 GameManager가 가져가게 했는데

lives는 player가 갖고 있는게 맞다고 생각해서

저는 반대로 GameManager의 코드를 바꿔줬습니다

 


void Kill()
{
    playerAnimator.SetTrigger("isDead");
    GameManager.Instance.UpdateState(GameManager.Instance.GameState.Dead);
}

 

Player가 죽을 때 GameManager의

state만 변경해주는 쪽으로 바꿔줬습니다

사실 이게 더 편해서..ㅋㅋ

 


 

저장 후 실행해보니 죽었을 때

Dead State로 Update 되면서

Spawner를 비활성화 시키는 모습입니다

 


 

근데 코드를 잘 보면 SceneManager에서

다시 현재 scene을 불러오는 모습이 있는데요

이렇게 되면 기존 객체들이 다 destroy 될 수 있습니다

 


 

그래서 저는 Player를 Prefab으로 바꿔주고

사망 Animation 이후 알아서 Destroy 되게 했습니다

그리고 GameManager가 Intro 상태일때 Instantiate 해주었습니다

 


private void OnDisable()
{
    CancelInvoke();
    foreach (Transform child in transform)
    {
        Destroy(child.gameObject);
    }
}

 

마지막으로 Spawner의 OnDisable때

자식들을 Destroy해서 기존의

자식들을 정리해주었습니다

 


 

이렇게 SceneManager를 쓰지 않고

직접 객체들을 Reset 시켜주었는데요

게임 재시작까지 잘 되는 모습입니다

'Game Develop' 카테고리의 다른 글

Unity 6 Challenge - 8  (0) 2024.12.30
Unity 6 Challenge - 7  (0) 2024.12.29
Unity 6 Challenge - 5  (0) 2024.12.24
Unity 6 Challenge - 4  (2) 2024.12.22
Cocos Creator ver 3.8.4  (2) 2024.12.21