2023. 7. 29. 23:42ㆍGAME/Unity
안녕하세요.
어제 좀 일이 있어서 글을 쓰지 못했네요. ㅠㅠ
자 그러면 적이 무언가와 충돌을 했을때 자신이 데미지를 입고
Player와 충돌했다면 플레이어의 Hp를 감소시키는 코드를 작성했습니다.

근데 이러면 적이 계속 겹치는 부분이 굉장히 신경쓰입니다.
그냥 플레이어와 충돌했을때 적을 파괴했으면 좋겠어요.
간단하죠.

이런식으로 합니다.
그리고 생각을 해 보니 적과 내가 부딪힌다면 그냥 파괴하고
적과 총알이 부딪힌다면 데미지를 입고 점수를 얻었으면 좋겠습니다.
또 같은 내용이 나왔죠? 그렇다면 Bullet에다가 tag를 넣고 비교를 해 보죠!
태그를 넣는것은 생략하고요

이번에는 CompareTag 메서드를 사용해보았습니다. Compare는 뭐죠? 비교하다죠.
참이면 데미지를 입습니다.
이제 적을 처치하면 일정한 점수가 올라가면 좋겠습니다.
점수 처리를 위해 ScoreManager라는 클래스를 만듭니다.
여기서 점수처리는 Singleton 을 사용해서 제작하겠습니다.
Singleton이란 간단하게 하나만 사용한다고 생각하시면 됩니다.
지금까지는 Instence를 여러개 생성해서 했지만 점수 관리는 여러개 생성하고싶지 않고 굳이 할 필요도 없습니다.

ScoreManager에서 ScoreManager를 instance로 받습니다.
this는 자기 자신이라고 했죠. instance는 자기 자신이 됩니다.
여기서 static이라는 새로운 키워드가 나왔는데 뜻과 똑같습니다. '고정된' 이라는 뜻입니다.
그림으로 설명하자면,

어떠한 클래스로 만들어진 instence가 3개 있다고 해 봅시다.
각각에서 b를 3으로,5로,6으로 변경합니다.
서로 변경해도 결국 독립적이기 때문에 영향을 주지 않습니다.
하지만 이 static으로 선언한 변수는 다릅니다.

첫번째에서 a = 3이라고 하면 두번째 세번째 모두 3이 됩니다.
그리고 여기서 새롭게 인스턴스를 생성한다면, 이 인스턴스도 a = 3이 됩니다.

이런식으로 인스턴스를 수정하는것과 클래스를 수정하는 차이,,
static은 여려 인스턴스를 만들어도 결국 하나로 고정되게 한다! 로 기억하시면 되겠습니다.
이러한것을 이용한다면 ScoreManager를 만들기 참 적합하겠죠?

Score까지 추가하시고
이제 Enemy가 죽는 타이밍에 점수를 증가시키면 되겠죠..
자 그러면, ScoreManager의 Score를 증가시켜야되니까
Enemy에 ScoreManager를 받을까요?

NONO..
우리가 싱글톤으로 한 이유가 있죠.
클래스에서 바로 instance에 접근할수 있습니다.

그 이유는? 어느 인스턴스든 신경쓰지 않고 한가지만 바라보고있으니 바로 접근이 가능한거죠. (고정되니까)
자 그러면 클래스에서 static 변수인 instance의 Score를 1 증가시켰습니다.
마지막으로 Log를 찍어서 확인 해 봅시다.

OK. Player가 총알로 적을 때리면 점수가 오르고 그냥 몸뚱이만 부딪힌다면 점수가 오르지 않습니다.
하지만 문제점은 플레이를 할때 점수를 보고싶은거죠.
그런것을 보통 UI라고 하죠.. UI를 제작할 필요가 있습니다.

씬에 Create를 해서 UI를 선택합니다.
간단하게 Text를 띄우니까 Text - TextMeshPro 라는것을 써보죠.
저는 레거시 방식만 써봐서;; 잘 모르는데 GPT 한테 물어보니까 고품질 렌더링 텍스트 라고 하네요.

Import를 하고.. (패키지 입니다.)
그러면 텍스트 박스가 하나 생깁니다.

클릭을 하고 Inspector 창을 보면
이런 네모난 박스가 있습니다. 이것은 앵커라고 하는데요. 대충 말하자면 고정점?입니다

이 작은 박스와 큰 박스 두개(각각) 화면이라고 가정하고
(스마트폰과 태블릿이 각각 하나씩 있다고 생각하심 됩니다.)
파란색원이 항상 좌측 상단에 있었으면 좋겠습니다.
하지만 디스플레이의 크기가 다르니까 그것을 좌표로 설정하기에는 난감하죠.
(스마트폰은 상단의 위치가 0,1000이라고 하면
태블릿은 0,2000일수도 있습니다.)
그니까 좌표를 하지 말고 스크린을 기준으로 고정점을 딱 찝어놓고 거기를 기준으로 이 파란색 원의 위치를 정하는겁니다..
alt를 누르고 left와 top이 만나는 지점을 클릭하구요.

Width와 Height를 이렇게, 밑으로 내리시면 font size는 60으로 설정하고요.

기본값은 이렇게 주면...

잘 뜨네요.
이제 이 Text의 Value가 ScoreManager의 Score가 되면 되죠.
자 그럼 시나리오를 써 본다면..
ScoreManager에서 Score가 증가할때 Text의 Value가 Score가 되면 좋겠습니다.
이유는 Update에서 해버리면 성능 낭비니까....
그럼 ScoreManager에서 Text를 알고 있어야 합니다.
먼저, using TMPro를 해 줍시다.

using은...음.... 그냥 다른곳에 있는 놈을 쓰고싶어! 라고 생각하시면 됩니다.
지금은 TMPro의 패키지의 코드들을 쓰고싶어! 라고 한것이라고 생각하시면 됩니다.

이렇게 받아주시고...
결국에는 Score가 변경될때 ScoreText의 값이 변경되고 싶으니까...
함수, Property로 바꾸어야겠네요..

이렇게요..

시작할때 스코어를 0으로 만들고요..(99999999면 안되니까)
프로퍼티로 바꾸면서 오류가 난 Enemy 스크립트는


프로퍼티로 바꾸면 되겠죠?
마지막으로 ScoreManager에 Text를 연결해준다면..

완성입니다!
(font size가 작은것같아서 100으로 변경했습니다)
자 이제 실행을 해 보면..
좋습니다.
아... 날이갈수록 분량이 많아지는것은 기분탓일까요 ㅠㅠ 시작하면 멈출수가 없네..
수고하셨습니다 유령씨! 다음에 봅시다.
'GAME > Unity' 카테고리의 다른 글
유니티 애니메이션 아바타 문제 해결 (0) | 2023.08.09 |
---|---|
의식의 흐름대로 게임 만들기 12. 플레이어 체력 (0) | 2023.07.26 |
의식의 흐름대로 게임 만들기 11. 적 이동 (0) | 2023.07.25 |