이번에는 R스킬에 도착하는위치와 범위를 보여주는 인디케이터 작업을 해보도록 하겠다

현재R스킬이다 그저 앞 방향으로 날라가는 기능밖에없다

추가할 내용은
R키를 누르고있을떄 AOE범위가 시작적으로 나타나고 마우스를 움직이면 인디케이터범위가 AOE범위 내에서 움직이고 인디케이터 원 위치로 날라가게 변경할 예정이다
컨셉은 일반모드는 범위가 적고 각성모드는 범위가 크게 바꿀생각이다
인디케이터원부터 만들어보자
인디케이터 원은 데칼을 사용해서 제작해보겠다

누끼작업이 완료된 이미지를 가져오고

메테리얼 생성

Material domain -> DeferredDecal
Bldend Mode - > Translucent 변경

이미지 넣어주고

(*중요)
샘플러 소스를 shared: Clamp로 변경해준다!

회전을 위해 Rotator 노드를 넣어주고 해당과같이 연결해준다

constant를 1로 설정하고 이미시브에 연결

이제 월드에 배치시 넣은 데칼이 잘 보이는걸 확인할수있다
그런데 여기서 큰 문제가있다

벽같은 큰 물체를 만나면 데칼이 벽쪽에서 이상하게 보이는 현상이 일어난다
나의 두번째프로젝트때도 겪은문제였던것이기에 지금 수정해보도록 하자

SceneTexture노드를 추가후 씬 텍스쳐 ID를 WorldNormal로 변경해준다

마스크노드를 추가하고 blue채널만 사용

constant에있던걸 노드를 연결해제하고 이미시브컬러에 연결해준다

노드를 수정한다

작업후의 데칼의모습이다
데칼이 벽으로 가도 이상하게 렌더링되는걸 방지할수있다
여기서 범위일때는 파란색 범위바깥일때는 빨간색으로 표현할예정이기때문에
한번에 색을 관리해줘야하는상황이다

잠깐 상수값을 다시 빼주고

메테리얼 파라미터 컬렉션을 만들어준다

벡터파라미터에서 값을 Color으로 변경하고 디폴트값을 준다

스킬색상과 동일하게 값을 주고

아까 데칼메테리얼에서 파라미터컬렉션을 넣어주고 이름을 Color으로 변경 그리고 이미시브컬러에 넣어준다

그럼 material parameter collection값에 따라 색상이 변경된다
그럼 이제 r을 누르고있을떄 이 데칼이 스폰되도록 해보자
이 데칼은 자주 쓸 예정이고 색상도 크기도 변경되어야하니 따로 c++클래스로 만들어준다
만들어줄때는 DecalActor로 만들어준다


이렇게 만들어주었다

만들어둔 C++클래스를 블루프린트로 만들고 데칼메테리얼을 끼워준다
내가만든 c++추가해주고

TSubclassOf와 스폰시킬 함수를 만들어준다

첨부해주고

location과 rotation
참고로 rotation은 zerorotator으로 한다
하고 spawnActor으로 스폰시킨다
그리고 r키를 눌렀다 땟을때 없어지게하는

함수도 만들고

저장할 spawnDecal도 선언후에

스폰하는방식을 전역변수로 바꿔주고
이제 상시로 마우스의 위치를 알려주는 함수를 만든다
플레이어컨트롤러에서


마우스위치를 가져오는 함수를 만들고
플레이어에서 내가만든 플레이어 컨트롤러를 전역변수로 쓸때
플레이어에서 #include 내가만든 컨트롤러 를 하면 순환참조 에러가 일어나서
에러가 난다
그러므로 전방선언을 해준다

class 전방선언을 해준뒤

전역변수로 선언
그다음 beginplay에서 캐스팅

그리고 원래 있던 코드의 지역변수를 전역변수로 다 바꿔줬다
그리고 tick에다가 플레이어 컨트롤러에서 마우스 위치를 가져오는 코드를 추가했다

이러면 상시로 마우스 위치를 받아온다

그다음 위치를 hit에서 skillMouseCursorhit으로 변경해주면 위치를 받아올수있는데 r키를 누르고있을때
상시로 내 마우스 위치로 이동해야하니
플레이어 컨트롤러에서

내가 지금 r키를 홀딩하고있는지에 대한 bool변수를 생성

pressed일떄 true released할떄 false로 만들고
플레이어 컨트롤러 틱에서

이렇게 누르고있을때 spawnSkillIndicatorDecal함수를 실행시키게해줬다

스폰시키는 함수, 스폰시켰던 인스턴스를 삭제하는 함수이다
한번만 스폰하고 destroy할때 nullptr을 해줌으로서 재사용이 가능하게 해준다
그리고 플레이어의 tick코드에서 스폰시켯던 spawnDecal즉 스폰한 데칼을
setactorlocation함수로 계속 받아오고있는 spawnLoc위치로 움직이게하는 코드를 넣어준다

수정된 플레이어 컨트롤러의 일부 데칼 코드이다


r키를 누르면 데칼이 스폰이되고 홀딩하고있는도중에는 보이고 홀딩이 끝나면 사라지고 애니메이션이 나온다
이제 r키를 눌렀을때 데칼의위치로 점프하는로직으로 변경해보자

지금 점프하는 로직이다
그냥 forwardVector방향으로 1500 + z축 300만큼으로만 점프하는건데 이걸 위치를 바꿔보도록하겠다

변경된 코드이다
처음부터 살펴보자

컨트롤러에서 지금 TICK에서 돌아가고있는 마우스커서위치 업데이트를 하고있는 HitResult값을 들고온다

목표위치벡터이다 목표벡터를 rTargetLoc에 저장한다

플레이어의 위치를 가져오고
목표거리 - 캐릭터 위치거리 해서 목표거리를 구하는데 우리는 순수한 방향만 구할것이고 크기를 1로 정규화 시키기위해서 .GetSafeNormal을 해준다 그래서 단위벡터로 바뀜

목표지점까지의 거리(크기)를 계산해야하니 .size로 값을 넣어준다

언리얼엔진 기본 중력 디폴트값이 980이니 중력값을 구해주고
원하는 지점에 원하는 크기만큼 이동을 해야하니
등가속도 법칙을 사용했다
완벽하게 공식을 외우고있는게 아니라서 (도와줘 구글!!)

이렇다고 한다
우리는 거리, 속도, 가속도, 시간 관계를 나타내는 등가속도 법칙을 찾아야하니
D2공식을 사용하자
x가 이동거리 즉 launchForce를 뜻함
v0가 처음속도 우리는 처음 정지상태에서 애니메이션이 나오니 0임
a는 가속도 여기서는 gravity
t는 걸리는 시간이다 여기서는 timeToTarget이다

중력값이 적용된 값을 다시 구해주고

중력보정을 위한 z축 계산도 넣어주면 끝!

다시한번 보여주는 전체코드
그리고 launcharacter로 캐릭터를 발사시키고
앞을 봐야하니 캐릭터를 launchDirec방향 즉 발사방향으로 setactorrotation해서 앞을 바라보게 해줬다

r을 누른상태에서 r을 떼면 마우스의 위치로 잘 날라가는걸 확인할수있다
또문제가 있다
r이 벽위로까지 사용이 가능하단것이였다
(파도파도 나오는 수정할내용)

문제의 예외처리 높이 예외처리를 안해주니 위까지 껑충 올라가버린다
tick에서 내 마우스가 위에있는지 밑에있는지 확인하는방법이다

z축이 100이상일떄 이하일떄를 판별하는 조건을 추가하고

해당 변수값에 따라 리턴해버리면된다

수정후 z축이 100이상일때는 사용이안되고 100이하일때만 사용이가능하다
(와 처리해줘야할 예외처리가 상당히많다..)
'Unreal5 프로젝트 다이어리' 카테고리의 다른 글
Unreal UI - 프로그래스바 모양 변경하기 (1) | 2025.04.05 |
---|---|
Unreal 캐릭터 - AOE 스킬범위 (0) | 2025.04.04 |
Unreal 캐릭터 - 비네트효과 (0) | 2025.04.04 |
Unreal 캐릭터 - 줌인/줌아웃, 타임딜레이션, 번개 나이아가라 (1) | 2025.04.04 |
Unreal 캐릭터 - 애님노티파이, 카메라쉐이크, 트레일, 다이나믹메테리얼 (0) | 2025.04.04 |