Unity

[Unity] 코드: 안티데시스 보스전 리빌드하기 / 3주차

시카Dev 2025. 5. 29. 20:48

 

2025. 5. 25 

하루종일 포폴이랑 자소서 다듬고 인턴십 지원 제출했다. 하얗게 불태웠다

 

보스전에 사용될 기계팔 잡몹을 추가하고 있다

 

잡몹과 보스 애니메이션을 모두 블렌드 트리로 바꾸었다

 

원래 게임에서 보스전은 이렇게 진행되었다.

 

1. 시작과 동시에 보스에게 방어막이 생기고 데미지가 들어가지 않는다.

2. 동시에 잡몹이 3마리 소환되며 이 또한 데미지가 들어가지 않는다.

2. NPC에게 다가가서 방어막 해킹을 도와달라 요청하고, 이 때부터 잡몹을 공격할 수 있다. 일정한 시간이 지난 후 보스의 방어막이 풀린다.

3. 보스 체력이 떨어질수록 소환되는 잡몹이 많아지며 벽에 플레이어를 쏘는 포탑이 추가된다.

4. 보스의 방어막이 풀릴 때마다 플레이어를 쫓아가며, 일정 시간이 지나면 플레이어 동료의 지원사격이 추가된다.

5. 플레이어의 체력이 1 남았다면 NPC에게 말 걸시 자동으로 회복된다.

 

보스의 패턴은 어떻게 하면 좋을까? 잡몹은 어떻게 관리하면 좋을까?

최대한 함수를 Update문 안에 쓰는 걸 지양하면 좋아 보인다

 


 

2025. 5. 26 <덜덜거리는 보스를 고쳐보자>

평소에는 자율주행을 하다가 방어막이 꺼지면 플레이어를 쫓아가는 것을 구현하고 있는데...

만약 오른쪽-아래 방향키를 동시에 누르거나, 혹은 왼쪽-위 방향키를 동시에 눌러 대각선 이동하면 보스몹 스프라이트가 빠르게 변하는 일이 있었다

 

그 이유는 보스 오브젝트의 방향 x와 y를 비교하는데 있어서 문제가 있었는데..

플레이어가 대각선으로 이동한다면 x와 y 값이 비슷해지고, 프레임마다 이것이 엎치락뒤치락하며 스프라이트가 빠르게 오가기 때문이었다

 

가령 플레이어가 11시 방향 혹은 1시 방향으로 대각선 이동을 한다면, 보스몹은 위를 보며 쫓아가야 한다.

그 외 7시 방향 혹은 5시 방향으로 대각선 이동을 한다면, 아래를 쳐다보며 쫓아가야 한다.

 

따라서 플레이어의 방향 벡터로 각도를 구해 구간을 나누어 주었다.

 

스프라이트가 빠르게 오가는 문제는 해결할 수 있었으나 보스몹이 플레이어를 추격할 때 덜덜 떨며 잔상이 남는 문제가 존재했다.

아이러니한건 캡쳐나 영상으로 보면 이 오류가 보이지 않는다. 사람의 눈이 더 정확함을 매번 느낀다..ㅋㅋ

 

아마 소수점 진동으로 인해서 생기는 현상이 아닐까 한다

 

참고로 플레이어의 카메라는 LateUpdate()에서 실행되고 있다.

그리고 보스몹이 플레이어를 따라올 때 변하는 위치는 Update()로 실행되고 있다.

transform.position += 이것이 부드러운 이동이 되지 못해서 그런 것일까? 프레임에 따라 호출 횟수가 들쑥날쑥해서?

 

그래서 우리 인공지능 스승님들과 같이 고쳐보았다

리지드바디를 받아 FixedUpdate() 내부에서 MovePosition()으로 위치를 변화시키로 한다

 

이렇게 하면... 위치가 일정하게 변하겠지,,

 

확실히 부드럽게 잘 움직인다!

 

유니티의 생명주기와 각 기능을 달달 외우곤 하지만, 실전에서 오류를 고칠 때 삽질을 하는 것을 경험하고 있다. 역시 백문이 불여일견이다

 


 

2025. 5. 27 <보스의 체력바를 만들어보자>

빠르게 구현하는 방법으로는 무엇이 있을까?

내 경험상 이전 코드를 목적에 맞게끔 재활용하는 것이었다

 

보스의 체력바 코드 또한 옵저버 패턴을 활용해 만들었던 플레이어의 체력바를 재활용할 것이다

 

비슷하게 BossHealth, BossHealthUI 스크립트를 만든다.

플레이어와 비슷한듯 다르게 BossHealthChange와 BossHealthPhase 이벤트를 만든다.

 

BossHealthChange는 이름대로 플레이어의 공격을 받았을 때 체력이 변하면 사용되는 이벤트고, BossHealthPhase는 체력이 닳을 때마다 페이즈를 변경하기 위해 사용될 이벤트이다.

 

유니티의 슬라이더 값은 Max Value, Min Value를 참고해서 Value를 지정할 수 있다. 

 

다만 테스트 하던 도중 슬라이더 값이 최댓값이 되지 않아 3분간 삽질했는데, 슬라이더 값을 초기화하는 코드를 OnEnable말고 Start에 넣어주니 해결되었다. 이 또한 유니티의 생명주기 공부를 더욱 뼈저리 느끼리...

 

이런식으로 대강 보스의 체력바를 구현할 수 있다. 스페이스바를 누르면 데미지가 들어가게 했는데, 앞으로의 관건은 플레이어의 공격 판정에 따라 들어가게 해야한다

 

그래픽적으로 보강하면 좀 더 있어빌리티 해보일 것 같다!

 


 

2025. 5. 28 <데미지가 들어가게 해보자>

체력바를 만들었으면 이제 무기로 데미지 처리를 해줘야 한다

 

근접무기의 경우, 이렇게 무기 끝에 콜라이더를 추가하고 OnTrigger에 체크한다.

 

근접무기를 담당하는 클래스에 콜라이더가 진입 시 해당 태그가 보스몹이면 뎀지가 깎이게 할 것이다.

 

는 혹시나가 역시나 내가 원하는데로 데미지가 들어가지 않았다.

콘솔상 에러는 나지 않았지만 이것이 무엇이당까...

여러 디버그 콘솔 테스트 후 저 온트리거엔터 함수가 아예 작동도 하지 않음을 깨달았다

 

왜 그럴까? 근접무기가 너무 빨리 생겼다 없어져서?

실제로 무기는 공격키에만 생기고 빠르게 휘둘러진 후 없어진다.

그래서 무기가 천천히 없어지게 했으나 해결되지 않았다

 

무기의 콜라이더 설정이 잘못되었나?

아니다. 무기 콜라이더엔 OnTrigger가 제대로 체크되어 있고 보스몹에도 콜라이더 달려있다. 보스몹에는 OnTrigger가 설정되어있지 않다. 또한 공격하면 무기와 보스의 콜라이더가 겹친다

 

리지드바디가 제대로 연결되었나?

보스 오브젝트에만 연결해놨는데 한번 무기에도 추가해볼까?

 

확실히 진전이 있었다

이제 저 컴포넌트가 올바르게 연결되도록 수정하면 되겠다

무기의 콜라이더가 닿는 오브젝트가 BossHealth 스크립트가 없어서 그런듯 하다.

 

하지만 보스몹에는 BossHealth 스크립트 컴포넌트로 없는 걸..? 왜냐하면 BossHealthManger 오브젝트에서 관리하고 있었으니까...?

그렇다면 공개적으로 BossHealth 스크립트를 불러와야한다.

 

이런 식으로 간단하게 바꾸고...

 

 

무기 데미지가 정상적으로 들어감을 확인했다.

방어막이 켜져있을 때는 데미지가 들어가지 않고, 방어막이 꺼지면 들어가게끔 제약 조건도 추가했다

 


 

2025. 5. 29

NPC 스크립트에 처음부터 좌측을 보게 하고, 원본 게임에서 그랬던 것처럼 플레이어가 말을 걸면 잡몹과 보스 실드가 무력화 되는 것을 구현하고 있다

 

1) 플레이어가 말을 건다

2) NPC가 '한번 제가 방어막을 꺼볼게요! 잠시 시간을 벌어주세요!'

3) 위에 15~20초 정도 타이머가 생성된다

4) 타이머가 끝나면 보스 쉴드가 없어진다

 

NPC는 보스전에서 이 역할을 한다

 

 

이런 식으로 말을 걸고 하면 쉴드나 기능이 false 되도록 해야한다