티스토리 뷰

반응형

 

기 : 

언리얼을 처음 배우면 보통 블루프린트로 시작하면 이제 저와 같은 포트폴리오를 준비하시는 분들은 블루프린트에서 c++로 전환해야되는걸 처음듣거나 아는데 그만두는 분들이 태반이실겁니다. 하지만 저도 처음에는 머리를 꽁꽁싸매고 계속 찾아보고 해도 언리얼의 기능이 어려운 만큼 진짜 눈에 찾아보기도 엄청 힘드실겁니다. 그래서 저는 전부 모두와 같이 공유 하고자 하는 마음에 이렇게 시작해봅니다. (언리얼설치나 블루프린트 이용방법은 다 아는 분들이 보는거기 때문에 바로 그냥 코드에 대해서 넘어가겠습니다.)

 

 


승 :

먼저 3인칭 캐릭터를 만들어서 확인해보겠습니다.

먼저 콘텐츠와 c++클래스를 보면 캐릭터c++와 캐릭터_BP가 있으실겁니다. 먼저 캐릭터_BP에 들어가 블루프린트 기능의 코드를 사용하기위해 기능을 구현해보겠습니다.

 

1번째 사진 : Tick노드로 LineTrace노드에 연결 해주어 위치를 계속 틱마다 플레이어의 위치가 바뀌더라도 받게 링크를 이어줍니다.  LineTrace노드에서의 Start핀과 End핀으로 플레이어의 위치와 플레이어의 전방 위치, 출력을 받습니다.

PrintString : BlockForwardHit

 

2번쨰 사진 : LineTrace에 Hit가 일어날경우 충돌체의 월드 로케이션과 충돌체의 실제 접촉면의 위치를 변수로 선언후 가져와 줍니다. 그다음 공식으로는 충돌체의 월드로케이션의 히트노멀의표면의 X의 로테이션의 각도를 가져와 -10을 곱하값을 Start핀에 Z+100.f핀을 연결해주고 End핀에는 Start에 들어간 공식을 Z-100.f을 연산한 값을 End핀에 연결 해준다.

LineTrace 노드를 실행하여 충돌체의 출력을 받습니다.

PrintString : BlockOnHit

 

(공식의 이해가 안된다면 아래의 그림과 링크를 봐주시길 바랍니다.)

https://docs.unrealengine.com/4.26/en-US/BlueprintAPI/Collision/BreakHitResult/

블루프린트 노드를 값으로 실행을 해보면 이런결과가 나온다.

이런식으로 정상작동하여 LineTrace의 위치값과 출력값이 나오는것을 확인할수 있다.

 


하지만 여기서 이제 이기능들이 c++로의 전환시점에서 어떻게 해야되는지 모르는분들을 위하여 다음에는 편안한 기능들을 보여드리겠습니다.

 


전 :

먼저 캐릭터의 c++ 파일은 여러가지 기능으로 게임을 하다보면 캐릭터들이 줍거나 달리기나 여러가지 기능을 넣기위한 클래스로 이기능을 하기위해서는 캐릭터의 c++ 파일로 들어가줍니다.

그다음 이기능을 사용하기 위해서 헤더파일을 include시켜주셔야 합니다.

(보통 헤더파일보드는 cpp파일에 include시킵니다. @@예외도 있음@@)

#include "Kismet/KismetSystemLibrary.h"
#include "Kismet/KismetMathLibrary.h"

위에 헤더는 블루프린트에서의 LineTrace와 같은 기능들을 포함하고 있는 헤더파일이며,

두번쨰 헤더는 블루프린트에서의 계산노드와 같은 기능을 편하게 쓰기위해 정의해놓은 헤더파일입니다.

 

ThirdPerson시점으로 처음 파일을 만들었기 떄문에 먼저 만든 블루프린트를 구현하기 위해서는 Tick함수를 헤더파일에 선언해줍니다.

//캐릭터 c++헤더파일//

// Called every frame
	virtual void Tick(float DeltaTime) override;

이제 블루프린트에서와 같은 코드를 먼저 보여드린다음 설명을 해드리겠습니다.

//캐릭터 c++파일//
void AdummyCharacter::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);

	FHitResult OutHit;
	FVector Start = GetActorLocation();
	FVector End = Start + (GetActorForwardVector() * 80.f);
	FCollisionQueryParams CollisionParams;
	TArray<AActor*> IgnoreActors;

	//정면 라인트레이스//
	bool isHit = UKismetSystemLibrary::LineTraceSingle(GetWorld(), Start, End, ETraceTypeQuery::TraceTypeQuery1, false, IgnoreActors, EDrawDebugTrace::ForOneFrame, OutHit, true);
	///////////////////////
	if (isHit)
	{
		GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, FString::Printf(TEXT("Forward_Hit!!!!!")));
		//벽넘기 라인트레이스//
		FVector HitLocation = OutHit.Location;
		FVector HitNormal = OutHit.Normal;

		FVector VaultStart = HitLocation + UKismetMathLibrary::GetForwardVector(UKismetMathLibrary::MakeRotFromX(HitNormal)) * -10.f + FVector(0.f, 0.f, 100);
		FVector VaultEnd = VaultStart - FVector(0.f, 0.f, 100);

		//처음 벽넘기라인트레이스//
		isHit = UKismetSystemLibrary::LineTraceSingle(GetWorld(), VaultStart, VaultEnd, ETraceTypeQuery::TraceTypeQuery1, false, IgnoreActors, EDrawDebugTrace::ForOneFrame, OutHit, true);
		//////////////////////////
		if (isHit)
		{
			GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, FString::Printf(TEXT("On_Hit!!!!!")));
		}
	}
}

위에 코드를 보시면 이제 기존에는 못보던 코드가 있으실 겁니다.

먼저 UKismetSystemLibrary같은 경우에는 LineTrace와 같은 함수들을 담고 있는 함수이며

아래의 공식에 있는 UKismetMathLibrary같은 경우에는 MakeRotFromX와 같은 연산공식들이 들어있습니다.

UKismetSystemLibrary::LineTraceSingle()
UKismetMathLibrary::GetForwardVector()
UKismetMathLibrary::MakeRotFromX()

이렇게 헤더파일을 추가하여 이함수들의 변수들을 맞게 넣어주면 아주 편하게 코딩을 할수 있습니다.

다 코딩하면 이제 컴파일을 해야하는데 c++형식의 컴파일은 2가지 방법의 컴파일이 있습니다.

첫번째는 비주얼 스튜디오에서 Ctrl + B를 눌러 빌드를 해서 빌드에 성공하면 엔진에서 자동적으로 소리가 나며 컴파일이되며,

두번째 컴파일은

빨간표시를 누르면 컴파일이 됩니다.

 

컴파일이 완료되고 실행을 해보면 이제 정상 작동하는것을 볼수 있다.

 


결 :

이제 이렇게 기본적으로 처음으로 터득한 블루프린트에서 c++로 전환하는 법에 대해 설명하게 되었습니다!!!

처음으로 이렇게 기능이나 설명하는게 떨리기도 하는데 위에있는 코드는 제가 파쿠르기능의 기본적이 기능으로 진짜 많이 쓰이는 기본적인 기능입니다. 만약 기회가 되면 나중에 한번 기능을 게시해보겠습니다.

나중에 가서는 이제 캐릭터기능만 아니라 기존함수의 기능에서 다른기능을 빙의시킬수도 있습니다.

 

TMI로 블루프린트와는 다르게 c++은 위젯이나 네비게이션 비헤이비어트리를 쓰기위해서는 모듈을 추가해야합니다. 이거에 대한 내용은 다른 기능추가를 할떄 그때에 게시하겠습니다.

 

지금까지 이해가 되셨길 바랍니다! 만약 좀 이해가 어렵거나 이상한부분이 있으면 댓글을 적어주시면 부탁드리겠습니다.하지만 너무 어렵거나 이해가 안가는 댓글은 완벽한 답이 안될수도 있습니다. (저도 취준생이기에...)

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2025/05   »
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
글 보관함