글

내일배움캠프 147일차 - 최종프로젝트 37일차:

내일배움캠프 146일차 - 최종프로젝트 36일차: 스킬 사용 시 AOE형 파티클을 추가해보자

이미지
스킬 사용 시 파티클을 추가해보자 스킬의 효과에는 여러가지 종류가 있다. 자신만 적용되는 스킬이라던가, 타인에게 적용되는 스킬 등이 있을텐데, 여러가지 차이를 가지고 있더라도 스킬들의 대부분의 공통점은 시각 이펙트가 발생 한다는 것이다. 그중에서도 고유한 영역을 가지고 범위 내 대상에게 효과 를 주기도 하는데, 이를 AOE(Area Of Effect) 라고 한다. AOE의 특징은 이펙트가 존재하는 영역 내에 있으면 효과를 받는다. 이 문서에서 AOE의 영향범위 만큼 이펙트를 적용하는 방법 을 알아보도록 한다.

내일배움캠프 145일차 - 최종프로젝트 35일차: 애님몽타주의 슬롯을 이용한 상·하반신 애니메이션 분리 재생

이미지
애님몽타주의 슬롯을 이용한 상·하반신 애니메이션 분리 재생 일반적으로 연속되는 애니메이션을 재생할 때는 State Machine 을 사용하지만, 단발성 애니메이션을 재생할 때에는 애님 몽타주 를 사용하게 된다. 애님 몽타주 는 스켈레탈 메시 내에 저장된 애님 슬롯 을 통해 재생하는데, ABP(애니메이션 블루프린트) 에서 애님 슬롯을 노드로 할당하여 재생할 수 있다. 예를 들어, 기존 State Machine 을 통해 애니메이션을 출력하는데, 중간에 DefaultSlot을 노드로 할당할 경우, 몽타주 재생 시 DefaultSlot에 할당되었던 애님 몽타주 가 State Machine 으로 출력된 애니메이션을 오버라이드한다는 것이다. State Machine의 애니메이션 포즈를 애님 몽타주 슬롯으로 덮어 씌울 수 있다. 나는 여기서 상반신만 몽타주를 재생할 예정이기 때문에 애님 몽타주 슬롯의 이름을 UpperBody로 고쳐 쓰도록 한다. (상반신만 움직일 몽타주 슬롯이라는 의미) Layered blend per bone 노드를 활용한 상/하반신 애니메이션 별도재생 최종 애니메이션을 출력하기 전에 하반신 전용 애니메이션을 생성하도록 한다. Layered blend per bone 을 사용하면 지정한 본 부터 애니메이션을 추가로 담을 수 있게 된다. 해당 노드에 대한 자세한 사용법은 다음과 같다. 분기 필터로 지정된 본 (녹색), 해당 분기의 영향을 받는 본 (하얀색) Layered blend per bone 선택 시 디테일 창에서 분기 필터를 지정할 수 있게 되는데, 스켈레탈 메시의 원하는 본을 지정하면 해당 본부터 노드의 영향을 받게 된다. 지정 본이 1단계 본, 자식 본으로 내려갈 수록 단계가 올라 갈 때 ,  뎁스 블렌드 에 따라 받는 영향은 다음과 같다. 뎁스 블렌드 [0]: 기본값. 지정 본을 포함한 모든 하위 본에게 가중치 1 적용. (애니메이션을 완전히 따라감) 뎁스 블렌드 [양수 n]: (1단계 본)지정 본 가중치 1/n 부터 ...

내일배움캠프 143일차 - 최종프로젝트 33일차: 버프효과 적용 완료 및 버프 적용시 오류 수정

이미지
버프효과 적용 완료 및 버프 적용시 오류 수정 커맨더 유닛이 스킬을 사용할 때, 피아를 식별해 조건에 맞는 유닛/건물 중 대상자를 골라 버프를 적용시키는 로직 적용. 1.  특정 액터 에게 버프를 추가한 직후 버프 시작 함수를 실행 2.  UBuffComponent 에서 시간 만료를 체크 2-A. 시간이 남아있다면 버프 중 함수 실행 2-B.  시간 만료 시 버프 종료 실행 버프 적용시 버프시작/버프종료/버프중 세 가지 람다함수를 실행 하며, 함수의 실행시점은 주로 버프 컴포넌트에서 제어 한다. 버프 컴포넌트에서는 float기반 타이머를 매 프레임마다 DeltaTime만큼 차감하며, 주어진 시간(Time) 이나 간격(Interval) 의 남은 정도에 따라 버프 종료 를 실행하거나, 버프 중 함수를 실행한다. 버프의 효과를 적용할 때마다 컴포넌트의 Tick에서 모든 버프의 총합 수치를 합산 하여, 최종 값을 실제 능력치 적용값으로 반영 한다. 버프 적용 시 Tick의 호출빈도 제어 버프의 적용수치를 제어하는 Tick의 리소스 빈도를 최소화. 기본적으로 버프가 존재할때에만 Tick을 호출 하며, 버프의 최종 적용값만 변수에 실시간으로 저장 하면서, 실제 적용은 버프수치가 변동되는 타이밍 인 버프시작 , 버프종료 시점에만 적용 하는 방식을 통해 변동없는 수치를 매 틱마다 적용하는 무의미한 호출을 줄였다.

내일배움캠프 141일차 - 최종프로젝트 31일차: 상태효과를 실제 적용해보자

이미지
상태효과(Buff, Debuff)의 실제 적용 이전 TIL 에서 상태효과에 대해 정의했을 때, 버프를 관리하는 액터 컴포넌트를 만들어 목록을 관리했었다. 그렇다면 버프 스탯의 실제 적용은 어떻게 구현하는지, 상태효과를 실제 적용하면서 코드가 어떻게 변경되었는지도 알아보도록 하자. FTimerHandle방식은 버프를 관리하기 어렵다. 이전에 상태효과를 정의했을 때는 타이머/틱 핸들을 사용해서 시간이 만료되는 대로 Delegate를 실행하는 방식을 사용했었다. 하지만 이 방식은 버프의 종합 스탯을 정리하는 과정에서 문제가 발생하는데, 타이머 함수가 "언제 실행되는가"를 알 수 없었기 때문이다. 내가 사용하는 버프의 적용방식은 매 틱마다 스탯의 초기값을 저장해두고, 한 프레임 내에 적용되는 버프 수치를 종합해서 구한 최종 수치를 캐릭터에게 적용하는 방식이다. 하지만 핸들방식을 사용하면 틱 마다 적용될 타이머 함수가 언제 실행 될 지 알 수 없어 위 사진의 순서대로 "현재 수치를 쌓아 올려서 최종적용"하는 방식에 어울리지 못한다. 때문에 FTimerHandle을 사용하는 대신 float 시간값을 직접 제어하는 일반적인 방법을 사용하기로 한다. 직접 시간 값을 만들어 제어

내일배움캠프 140일차 - 최종프로젝트 30일차: 인간세력 지휘관의 애니메이션 작업 완료

이미지
에테리안(인간) 세력 지휘관 애니메이팅 완료 며칠에 걸친 애니메이션 작업이 완료되었다. 이전 TIL에서 언급된 것처럼 본의 제약(Constraint)를 사용한 지팡이 공중부양을 활용하였고, 또한 스킬 사용 시 지팡이가 부유하면서 회전하는 효과는 기존 쿼터니언 회전에서 오일러 회전으로 변경해 720도 가량 회전시켰다. 텍스처 얼룩을 제거하기 전(좌) 텍스처 얼룩을 제거한 후(우) 또한 애니메이션 작업을 끝마치고 언리얼 프로젝트에 추가하는 과정에서 AI로 생성한 모델링의 텍스처 얼룩을 제거하였다. 덕분에 이전보다 깔끔해진 모습을 보여준다.