티스토리 뷰

https://youtu.be/4XoDGDFadY0

 4월 20일까지 완성된 FPS 게임 만들어보기 프로젝트 영상.

 

애니메이션 몽타주 

어제는 애니메이션 몽타주 기능을 사용해봤다. 애니메이션 몽타주는 정새진 순서에 따라 실행되는 애니메이션 사이에서 조건에 맞게 애니메이션 재생을 조절하는 기능이라고 함.

연속으로 재생해야 하는 여러 애니메이션중 일부를 반복, 길게재생, 애니메이션 생략, 조기 종료등의 처리를 쉽게 해준다고 함.

공격1, 공격2, 공격3 을 한번에 배치해서 콤보공격 애니메이션 1개로 만드는걸 가능하게 하는 기능같다.

 

나는 그렇게 애니메이션을 이어붙이는 기능을 사용하진 않았고 StartFire 라는 새로운 애니메이션 섹션을 만들었다. 

그리고 비주얼 스튜디오 상에서 공격 함수 안에 

	// 몽타주를 가지고 애니메이션을 만듦.
	UAnimInstance* AnimInstance = GetMesh()->GetAnimInstance();
	if (AnimInstance && HipFireMontage)
	{
		AnimInstance->Montage_Play(HipFireMontage);
		AnimInstance->Montage_JumpToSection(FName("StartFire"));
	}

라는 몽타주가 있을 시 몽타주 안에 존재하는 StartFire 애니메이션 섹션으로 가게하는 함수를 지정했다.

StartFire 애니메이션은 총을 쏘면서 반동으로 인해 캐릭터가 주춤 하는 애니메이션이다. 몽타주를 통해 총을 쏘면 특정 애니메이션을 출력하도록 했으나, 이 모습은 움직이면서 총을 쏘게되면 아주아주 이상해진다.

그래서 뼈대를 이용해서 본 별로 애니메이션을 다르게 블랜딩하도록 블루프린트에서 설정해줬다.

뛰는 모션과 총쏘기 모션을 캐시시켜 둔 다음 캐시된 데이터를 가지고 와서 블랜딩을 시켜주는 과정.

 

DrawDebug

드로우 디버그는 특정 점이나 선, 오브젝트에 대해 디버그 오브젝트를 보여준다. 결과물부터 보여주자면 다음과 같다.

보이는 빨간 선과 점이 드로우 디버그를 사용한 예시이다.

 

저번에 총구에 소켓을 달아주었다. 총알 궤적의 계산은 다음과 같다.

총구 위치 + 총구의 x축 (앞으로 뻗어나가는 방향) * 사거리

위를 언리얼에서 표현한 코드이다.

		const FVector Start(SocketTransform.GetLocation());
		const FQuat Rotation(SocketTransform.GetRotation()); // 쿼터니엄
		const FVector RotationAxis(Rotation.GetAxisX());
		const FVector End(Start + RotationAxis * 50'000.f);

총구에 달린 소켓의 위치가 Start, 총구의 회전정보에 대한 값이 Rotation (언리얼은 짐벌락을 방지하기위해 무조건 쿼터니언을 쓴다!) (짐벌락이란 어느 한 축이 회전으로 인해 다른 축과 겹쳐져 하나의 성분을 잃고 차원이 낮아지는 것을 의미함. 이는 다른 축에 영향을 준다.) , RotationAxis가 총알이 뻗어나가는 벡터좌표가 된다.

그래서 총구 위치 + 총구의 x축 (앞으로 뻗어나가는 방향) * 사거리(50,000) 는 

Start + RotationAxis * 50'000.f 가 된다.

 

이렇게 총알의 진행방향 벡터를 알수 있으면 LineTraceSingleByChannel 함수를 이용해서 피격 결과를 알 수 있다. FHitResult 클래스의 객체를 함수의 인자로 넣어주면 오브젝트가 피격되었는지, 오브젝트와 충돌이 일어난 위치는 어디인지 등에서도 알 수 있다.

 

Particle System

피격위치가 어디인지 안다면 총알이 벽에 맞는 파티클을 달아줄 수 있다. FHitResult 객체에서 위치를 받아오고 그 위치에 SpawnEmitterAtLocation 함수를 이용하여 파티클을 띄워주기만 하면 된다.

 

반대로 총알의 궤적을 보여주는 파티클도 존재할 것인데 이는 위에서 계산한 End값을 사용하면 된다. 하지만 신경써야하는 부분이 있는데 총알의 궤적은 물체를 통과해서는 안되는 것이다.

따라서 FHitResult  객체를 통해 사물 피격여부를 확인한 뒤 총알과 오브젝트가 충돌 되었다고 판정이 나면 총알 궤적의 위치를 고정시켜주면 된다.

'Unreal > Shooter Project (完)' 카테고리의 다른 글

[UE5] FPS 프로젝트 - 6  (0) 2023.05.15
[UE5] FPS 프로젝트 - 5  (0) 2023.05.12
[UE5] FPS 프로젝트 - 4  (0) 2023.05.09
[UE5] FPS 프로젝트 - 3  (0) 2023.04.26
[UE5] FPS 프로젝트 - 1  (0) 2023.04.20
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함