2025. 5. 16 <생일 축하해 나자신>
지난 날 동안 생일 겸 알바가 겹쳤다
생일 축하한다 나자신!
게임 시작 시 나오는 안내 문구를 추가하고 있다.
2025. 5. 17 <시작 시 문구 추가>
알만툴에서 사용했던 효과음을 가져와서 import했다. (+무기를 휘두를 때도 효과음을 추가했다)
글자가 나오는 코드, 마지막 문구까지 출력된 후 클릭을 기다리는 것 모두 코루틴으로 구현했다.
글자가 출력될 때 너무 따각따각 효과음이 나왔었는데 두 글자마다 한번씩 재생하여 해결하였다
문뜩 사소한 함수라도(ex. 클릭 기다리기) 이걸 코루틴으로 구현하면 손해가 아닐까..? yield return null;을 해야하므로..?
이를 간단하게 Update로 구분할 수 있는 것이 더 좋지 않을까 궁금해진다.
가령 Update로 마우스 입력을 제어할 경우 대사창이 떠 있을 때 별도로 예외처리를 해서 입력 받으면 된다.
코루틴의 경우 특정 이벤트에서 기다리는 로직을 구현할 수 있다.
https://discussions.unity.com/t/coroutines-vs-update/428844/4
사실 잘 몰라서 유니티 포럼을 읽어보았다
매 프레임마다 확인해야 한다면 Update, 일시 정지나 부드럽게 처리해야 하는 작업의 경우 코루틴이 더 적합하다고 한다.
후자의 경우 내가 쓴 예시로 페이드 인/아웃이나 진압봉이 휘둘러지는 애니메이션(?)이 있겠다. 무엇보다 코루틴으로 작성한 구문이 좀 더 깔끔해 보이기도 하니까..!(주관적인 의견이다)
다음은 옵저버 패턴으로 플레이어의 체력바를 구현해보자~
2025. 5. 18 <옵저버 패턴을 적용해 플레이어 체력바를 구현하자>
https://velog.io/@mingyo0125/C-Unity-%EC%98%B5%EC%A0%80%EB%B2%84-%ED%8C%A8%ED%84%B4-Observer-pattern
[C#, Unity] 옵저버 패턴 (Observer pattern)
옵저버 패턴이 무엇인가
velog.io
옵저버 패턴이란 어떤 상태가 바뀌었을 때 그것을 연결된 친구들에게 자동으로 알려주는 기법이다
가령 플레이어의 체력이 바뀌면(주체자 = Subject) 이것을 듣고있던 객체에게(가령 플레이어 체력 UI, 체력 간당할때 빨갛게 나오는 화면 = Observer) 자동으로 알려주는 구조라고 할 수 있다.
따라서 정말 다양한 상황에 사용될 수 있다.
가령 플레이어의 업적 달성, 몬스터 처치시 킬수 증가 등 동시에 여러 시스템이 반응해야 하는 상황에서 유용하다
오늘은 옵저버 패턴을 활용해 플레이어의 체력을 구현해보려고 한다!
PlayerHealth에서는 체력이 변할때(HealthChange)와 체력 경고(HealthWarning)가 일어나는 이벤트를 선언한다.
데미지를 입을 때마다 하트가 한 칸씩 깎이며, 변한 체력의 정수값을 전달하는 HeathChange 이벤트가 호출된다.
또한 하트가 1칸 남았다면 체력 경고 HealthWarning 이벤트가 호출된다.
PlayerHealthUI에서 받은 HealthChange 이벤트를 UpdateHealth에 현재 체력값과 함께 전달하여, 체력에 따른 하트 이미지를 표기한다.
마지막으로 PlayerHealthWarning에서 HealthWarning 이벤트를 전달받는다.
ShowWarning 함수를 통해 빨간 경고창을 보여주고, 코루틴을 통해 깜빡거리게 한다.
중요한 점은 OnEnable()에서 이벤트를 할당받고 OnDisable()에서 이벤트 구독을 해지해야 한다.
왜 굳이 일반적인 void() 함수를 사용하지 않을까?
이는 OnEnable(), OnDisable()가 활성화 될 때, 그리고 비활성화 될 때마다 호출되는 함수이기 때문이다.
+=로 이벤트 구독을 아무데서나 하면 중복 실행돼서 오류가 발생할 확률이 높다.
void Start()
{
someEvent += DoSomething;
}
만약 이렇게 선언했다면 해당 오브젝트가 키거나 꺼질때마다 여러번 할당될 것이다.
요로코롬 붉은 이미지를 넣어주고 효과음도 넣어주고
스페이스바로 인위적으로 체력을 깎아보았다.
원하는 대로 결과물이 나오니 뿌듯하다
2025. 5. 20 <UI를 다뤄보자>
오늘은 면접을 보고 왔다. 집에 와서 긴장이 풀리니 엄청난 피곤함이 나를 덮쳤다
씻고 다시 노트북 앞에 앉으려 했지만 어째선가 내 몸은 침대에 누워 있었다.
긴장 풀리니 덮쳐온 면접의 피곤함과 알바의 피곤함은 환장의 콜라보임을 알게 되었다
대충 집에오면 뻗게 된다는 뜻이다. 하지만 그럼에도 불구하고 제작진도는 나가야 한다
우선은 다루기가 비교적 쉬운 UI를 계속해서 작업하기로 한다.
원본 게임에서는 플레이어의 공격키와 대시키가 Z와 X키로 주어지고, 그것의 딜레이를 체력바 옆에 표시했었다
그 이유는 플레이어가 공격할 때 그것이 정상적으로 들어가는지, 혹은 키가 씹히는지의 유무를 시각적으로 보여주기 위함이었다. 특유의 알만툴 잔렉도 한몫했었다.
유니티의 성능은 알만툴보다 월등하기에 키가 씹히진 않겠지만, 인위적으로 딜레이를 넣어볼 생각이다.
(ex. 공격과 대시는 0.3초마다 가능)
2025. 5. 21 <UI를 다뤄보자2>
우선적으로 공격/대시 이미지를 껐다켰다할 게임 오브젝트를 선언한다.
그리고 공격/대시가 가능한지 여부, 딜레이, 대시의 지속 시간과 더할 스피드 및 현재 대시중인지를 선언한다. 왜 굳이 현재 대시중인지 선언을 했는지는 추후 서술하겠다
무기 입출력에서는 현재 무기를 딜레이할 코루틴을 만들었다.
지금은 진압봉 이미지만 껐다키기로 했는데 무기가 추가되면 기능을 확장해야겠다
무기 입력과 대시 입력 모두 해당 키와 현재 그것을 할 수 있는지의 여부로 판단한다.
알만툴 때처럼 대시 할 때는 현재 이동속도에서 대시 스피드를 +=로 더했다. 그리고 내가 왜 isDashing을 사용했냐면...
기본적으로 캐릭터가 걸어다닐때, 혹은 날 때 속도가 고정되기 때문이다.
이것 때문에 처음에는 대시키를 눌러도 속도가 변하지 않았다..ㅋㅋ
따라서 !isDashing을 넣어 줌으로서, 대시키를 누르지 '않을때만' 속도를 고정하고, 누를때는 대시 코루틴대로 가속이 붙게끔 했다.
원하는 대로 잘 작동되어 기분이가 좋다.
우측 플레이어 컴포넌트에서 변하는 속도를 볼 수 있다!
2025. 5. 22 <체력을 힐 해보자>
게임 중반에 주인공의 체력이 1밖에 되지 않으면 NPC가 이를 힐 해주는 장면이 있다.
따라서 PlayerHealth 코드에 체력이 힐이 되는 경우를 추가했다.
또한 경고창 코드에도 HealthChange 이벤트를 구독했다
Mathf.Max와 Min은 처음 사용하는 함수인데 괄호 안 값중 최댓값 혹은 최소값을 반환한다
체력 두칸이 되면 자연스레 경고창이 없어지게끔 했다
2025. 5. 23 <블렌더 트리를 사용해보자>
꽤나 복잡해 보이는 플레이어의 애니메이션을...
블렌더 트리로 다듬었다. 만들기도 어렵지 않고 방향만 잘 잡으면 되는 점이 편리했다
기본의 진압봉 무기 코드에서 보는 방향을 int에서 float으로 바꾸느라 변환하는 과정을 추가했다.
잘 작동하는 것을 확인할 수 있다
'Unity' 카테고리의 다른 글
[Unity] 코드: 안티데시스 보스전 리빌드하기 / 4주차 (0) | 2025.06.13 |
---|---|
[Unity] 코드: 안티데시스 보스전 리빌드하기 / 3주차 (0) | 2025.05.29 |
[Unity] 코드: 안티데시스 보스전 리빌드하기 / 1주차 (0) | 2025.05.15 |
[Unity] 버전 컨트롤 좌석수 줄이는 법 (1) | 2024.02.10 |
[Unity] 버전 컨트롤 구독 취소하는 법 (2) | 2024.01.18 |