사생활 보호 설정
https://gamjia.tistory.com
Updated News
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 Logo랑 Start 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 시켜주었는데요
게임 재시작까지 잘 되는 모습입니다