10 - GameMode, Level, Debug, PlayerController

Overcle·2023년 2월 10일
0

학원

목록 보기
2/29
post-thumbnail

요약
1. 소멸자는 언리얼자체적으로 해놓은게 있어서 c++에서는 소멸자를 건들지 말것.
2. 개발자를 할거면 블루프린트도 충분히 잘 해야한다. 등한시 하지말것.
3. 언리얼은 CDO클래스를 무조건 가지고 있다. UCLASS()
4. 뒤에 CLASS가 붙어 있는 클래스는 타입을 전달해줘야한다.
5. 축매핑은 안누르고있을때도 호출하기때문에 주의할것.
6. 키보드 설정은 왠만하면 3개 만 하는걸 권장. 맨브레인 키보드는 동시입력이 3개이며, 모든사람이 기계식 키보드를 갖고있지않다.

용어 설명
1. Sweep :
충돌 관련 , 다른 물체와 충돌 시 HitResult를 호출해서 위치값을 넘겨 결과값을 반환한다.
2. Overlap : 물체끼리 통과는 하지만. 충돌 이벤트는 발생한다.
3. 클래스 이름 앞에 A는 Actor, U : 컨포넌트 or 일반 언리얼 클래스
F : 구조체, E : 열거형 을 뜻한다.

Tip
1. 하다가 해당 Actor, 등 어떤 함수를 지원하는지 궁금하다면 블루프린트로 파생시켜 확인해보기. 해당 클래스가 입력받는 정보를 알 수 있다.

1. Level 저장하기


최측 상단에 '파일' or File을 클릭하면 새 레벨 저장하기, 현재 레벨 저장하기 버튼이 있다.
저장하지 않은 레벨이라면. 경로를 설정하라는 화면과 함께 저장화면이 뜨고.
저장된 레벨이라면 바로 아무화면 없이 저장이 진행된다.

프로젝트 세팅으로 Defualt Map & Mod를 지정할 수 있다.

2. 플레이어 컨트롤러 할당하기.


2가지의 방식이 있다.
1. 오브젝트 스폰해서 거기에 할당하기.
2. 생성과 동시에 할당하기

추 후 공부 많이 진행하면. 1번 방법에 대해 알아봐야할듯(?)

2번 방법은 플레이어스타트 오브젝트를 에디터에 배치하고.
GameMode를 통해 Defualt Pawn Class, Player Controll Class를 설정하여. 진행하면 된다.

3. 게임모드


대충 마우스를 갖다대면 관련 정보가 출력이 되며.
간단하게 세션은 네트워크,
게임 스테이트는 서버에 저장될 데이터.
HUD클래스는 엣날에는 UI관련으로 사용했지만 요즘에는 UMG로 대체되었다.

4. 클래스


언리얼 클래스 중 이름 끝에 CLASS 이름이 있다면 그 클래스에는 타입정보를 전달해줘야한다.
타입::StaticClass 함수로 전달해주면 된다

예시

DefaultPawnClass = AKnightCharacter::StaticClass();

5. 카메라 설정


기본적으로 해당 Pawn에 Spring Arm을 배치하고 그 Child로 Camera를 배치하여 진행하는게 보편적이며.
주의할점은 Unreal5 부터 Camera를 검색하면 무조건 시네마틱 카메라만 나오기에 스크롤바를 내려서 적용해야한다 (현시점5.1버전 이며 아직까지 안고쳐짐)

6. 엔진-입력


입력 방식에는 축매핑과 엑션매핑이 있으며.

축매핑은 누르고있을때, 안누르고 있을때를 감지하며 주의할점은 안누르고있을때도 계속 함수가 호출되니 예외처리를 필수로 해야한다.

액션매핑은 눌럿을때 1번, 땟을때 한번 감지한다.

7. 디버깅


언리얼에서 제공하는 디버깅은 크게 2가지가 있다.

뷰포트에 메세지를 출력하는 방식과
출력로그에 출력하는 방식이 있다.

간단간단하게 들어오는지 체크만 할용도라면 뷰포트가 괜찮고.
진득하게 볼거면 출력로그에 찍는게 좋다.

수업에서는 GameInfo라는 클래스를 만들어 전체적으로 통제하는 오브젝트안에서 코딩한다.

FUNCTION 함수 이름을 가져온다
LINE 해당파일에서의 줄 수를 정수로 가져온다
FString::FomInt(__LINE__) : 정수로 받아온 줄 수를 문자열로 만들어준다
UE_LOG : 언리얼에서 로그 출력을 위해 사용한다
... 을 해놓은 것은 가변인자를 사용하기 위함.
가변인자는 인자의 개수를 원하는대로 추가해줄 수 있는 기능이다.
FString 앞에 * 을 붙혀서 역참조를 하면 FString 이 가지고있는 문자열 포인터를 얻어온다.
__VA_ARGS__ 가변인자를 얻어온다.

DECLARE_LOG_CATEGORY_EXTERN(UE11, Log, ALL);   //; 오타아님




#define LOG_CALLINFO FString(__FUNCTION__ + TEXT("[") + FString::FromInt(__LINE__) + TEXT("]"))


#define LOG(Format, ...)	UE_LOG(UE11, Warning, TEXT("%s : %s"), *LOG_CALLINFO, *FString::Printf(Format, ##__VA_ARGS__))

#define LOGSTRING(Str)		UE_LOG(UE11, Warning, TEXT("%s : %s"), *LOG_CALLINFO, *Str)

뷰포트에서 보이게 하기 위해서는
헤더파일에

void PrintViewport(float Time, const FColor& Color, const FString& Text);

cpp파일에

void PrintViewport(float Time, const FColor& Color, const FString& Text)
{
	GEngine->AddOnScreenDebugMessage(-1, Time, Color, Text);
}

구현하면 된다.

수업자료 중 움직일때마다 출력하는 뷰포트 로그 메세지

void APlayerCharacter::MoveFront(float Scale)
{
	PrintViewport(1.f, FColor::Blue, FString::Printf(TEXT("MoveFront : %.2f"), Scale));
}

8. 캐릭터 이동하기


위에 엔진-입력 에서 설정한 MoveFront값을 이용하여 구현한다.

캐릭터 클래스에서 캐릭터 무브먼트 컴포넌트를 이용하여 이동하는 기능을 만들어 놓은 함수이다.
GetActorForwardVector : 해당 엑터의 전방 방향 엑터를 얻어온다.
BindAxis :

함수이름으로 설정한 MoveFront는 이름을 마음대로 선언해도 되지만.
APlayerCharacter>(TEXT("MoveFront") 부분에서는 엔진에서 설정한 값을 입력해줘야한다.


void APlayerCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	PlayerInputComponent->BindAxis<APlayerCharacter>(TEXT("MoveFront"),this,&APlayerCharacter::MoveFront);
    PlayerInputComponent->BindAxis<APlayerCharacter>(TEXT("MoveSide"),this,&APlayerCharacter::MoveSide);

}


void APlayerCharacter::MoveFront(float Scale)
{
	if (Scale == 0.f)
		return;
        
AddMovementInput(GetActorForwardVector(),Scale);
}

void APlayerCharacter::MoveSide(float Scale)
{
	if (Scale == 0.f)
		return;
        
AddMovementInput(GetActorRightVector(),Scale);
profile
게임 프로그래머 지망생의 발자취

0개의 댓글