Programming/Unreal Engine 5

[UE5] Obstacle Assault (Udemy)

와들S 2023. 7. 16. 05:59

- 해당 내용은 Udemy 강의를 참고하여 작성하였습니다.

 

1. Outputs

귀찮아서 마지막에 레벨 디자인 하라는거 안함 ㅈㅅ

 

2. Reviews

1) Live Coding and Compile

- 언리얼 엔진 C++ 스크립팅의 한 가지 좆같지만 신기한 점은 VS에서 코드 작성을 완료 후 컴파일할 때 항상 UE5 에디터를 종료해야 한다는 점이다. 하지만 이 문제를 해결하기 위해 UE5는 Live Coding이란 걸 지원하는데, 이는 UE5를 종료하지 않고도 컴파일을 해주는 기능이다. 

- 캡쳐본을 보면 우측 하단 파생 데이터 옆 쪽에 테트리스같은 아이콘이 있는데, 이를 누르면 된다. 물론 누르기 전에 VS 파일을 저장해야 한다. 

- 사용할 때 오류가 생길 수도 있다고 한다. 예를 들어 C++로 생성된 변수를 에디터에서 값을 변경하고, 에디터를 종료한 후 다시 켰을 때 그 변경한 변수가 에디터에서 사라지는 버그가 있다. 이 경우 다시 라이브 코딩을 하면 변수가 돌아오는데 돌아온다고 해도 그 변수의 변경된 값이 남아있진 않다. 이를 해결하기 위해선, 일단 VS로 돌아가 빌드를 한 후, 다시 에디터를 열면 값이 남아있다고 한다. 

- 만약 이 live Coding이 실패했다고 뜨면, 그 오류 목록을 복사한 후에 체크하면 된다. 그 전에 오타나 오류가 있는지 살피고 누르는게 편하다. 

- 인강에서는 VSCode를 써서 나랑 좀 다르게 뜨는 거 같은데 내 VS에는 저 빨간줄이 뜸. 근데 빌드나 라이브 코딩 때엔 아무 문제가 없다. 

 

2) UPROPERTY

- 언리얼 C++ 코딩의 특징 중 하나인 UPROPERTY이다. 괄호에 해당 변수의 수정가능 등 조건을 명시할 수 있으며 ; (semicolon)은 쓰지 않는다. 

여기엔 여러 옵션이 있다.

변수 표시 옵션 옵션 효과
EditAnywhere 어디서든 수정 가능
EditInstanceOnly 월드에 배치한 인스턴스에서만 수정 가능
EditDefaultsOnly 블루프린트 설정 창에서만 수정 가능
VisibleAnywehre 어디서든 보기 가능
VisibleInstanceOnly 월드에 배치한 인스턴스에서만 보기 가능
VisibleDefaultsOnly 블루프린트 설정 창에서만 보기 가능

- Category도 지정할 수 있다. 에디터 디테일 창에서 보일 카테고리를 지정한다.

 

3) Functions

- .cpp 에 있는 BeginPlay()은 게임이 시작하자마자 수행되는 함수이다. 
(여전히 빨간 줄이 뜨지만 아무 문제 없이 잘만 실행된다. 더 열받음)

- Tick() 함수는 매 프레임마다 재실행되는 함수이다. 이를 이용해 움직이는 Platform 액터를 제작하였다.

- SetActorLocation() 함수는 해당 액터를 선언한 위치로 옮겨주는 함수이다. 안에는 FVector가 들어갈 수 있다. 저렇게 할 필욘 없고 바로 FVector 자료형을 가진 MyVector를 넣어주면 편하다.

- GetActorLocation()은 현재 액터의 위치를 반환하는 함수이다.

- FVector 클래스 안의 Dist(A, B)는 현재 두 벡터의 거리를 반환한다.

 

4) Scope of Variables

갑자기 빨간 줄 오류가 해결되었다 띠용

- 헤더파일을 첨부하진 않았지만, MyVector 변수는 헤더 파일에서 선언된 변수이고, LocalVector는 cpp에서 선언된 변수이다. 두 변수를 Tick에 넣고 += 로 1씩 증가하는 코드를 적었을 때, FVector는 매 프레임마다 1씩 증가하지만 LocalVector는 오로지 딱 한 번만 증가한다. 그 이유는 이 변수가 Tick 내에서 선언되었으므로 매 프레임마다 새롭게 선언되기 때문에 값을 저장하지 못해 계속 100으로 유지되기 때문이다. 의외로 이런 오류를 범하기 쉬우므로 주의할 필요가 있다.

 

5) DeltaTime

- 컴퓨터의 성능에 따라 다른 속도로 보이는 걸 방지하기 위해 DeltaTime을 이용해 속도를 일정하게 만든다. 여기서 DeltaTime은 프레임 사이의 경과된 시간을 말한다. 

 

6) Platform Moving Distance Checking Algorithm

- if문으로 검사하는데, 아래 StartLocation = CurrentLocation을 왜 더해야 하는지 이해를 못했다. 굳이 저 코드가 없어도 잘 움직이기 때문이다. 하지만 이렇게 했을 때 시작점이 갱신이 안되어 플랫폼이 양옆으로 다른 길이로 움직인다. 문제는 StartLocation이 다시 0이 되었을 때인데, 거리가 양 옆으로 -100 ~ 0 ~100로 계산되기 때문이다. 즉 총 200이나 움직인다. 따라서 StartLocation을 갱신해줌으로써 우리가 정한 100 길이만 움직이게 만든다.

- 그러나 위의 코드만으로도 부족하다. 내가 원하는건 정확히 내가 정한 거리로만 이동하는 플랫폼이다. 따라서 아래의 코드를 작성한다.

- PlatformVelocity에 .으로 연결된 GetSafeNormal은 벡터를 딱 크기가 1로 노말화하는 함수이다. StartLocation에 노말화한 MoveDirection과 거리인 MoveDistance를 곱해 위치를 다시 정한다. 그리고 액터의 위치를 재설정한 후 위치를 반대로 변경한다.

- 최종적인 코드는 이렇다.

- 아마 강의에선 멤버 변수 연습시킨다고 따로 분리시킨 거 같긴 한데 알고리즘 자체는 좋다.

 

 

7) Blueprint Setting

- 다 만들었다면 해당 C++ 파일 우클릭해서 이 기반 BP 클래스를 생성한다. 그 안에선 내가 여태까지 다 만든 변수와 함수 등의 정보가 기록되어 있고 BP 내에서 액터로 움직일 Static mesh 등을 설정할 수 있다.

- 이렇게 드래그 해 넣어, 위치 등을 설정한다. 다 만든 BP를 게임 내에 넣으려면 그 해당 BP를 드래그 해 화면 안에 넣는다. 

 

8) Collision BP Setting

-  플레이어가 물체와 만날 때 완전히 겹치지 않고 조금씩 움직이게 하는 BP 노드가 있다. 게임에 사용한 3인칭 플레이어 BP에서

- 캐릭터 무브먼트에 따라 타깃의 무브먼트 컴포넌트를 조금씩 1씩 왔다갔다 움직이게 해 Collision끼리 부딪혔을 때 overwrap 되지 않게 한다. 또한 Get Actor Rotation 노드를 연결해 플레이어가 회전할 수 있도록 한다. 만약 저걸 연결하지 않는다면 플레이어는 절대 좌우를 바라보지 않고 앞뒤로만 움직인다. 

 

9) GameMode

- 게임 모드는 게임의 플레이어, HUD 등의 설정을 저장한다. 

- 언리얼 엔진의 저 ㄷ자 아이콘을 클릭해 해당 게임모드 편집 - 생성 - GameModeBase를 눌러 새 게임모드를 만든다. GameModeBase는 가장 기본적이고 최소한의 설정이 되어 있는 게임모드이다.

난 내가 만든 BP_ThridPersonCharacter를 넣었다

들어가 디폴트 폰 클래스에 새로 만든 플레이어 폰 클래스를 넣는다. 이후 옆 서랍에서 플레이어 스타트를 꺼내 플레이하고 싶은 위치에 배치한다.

그러면 에디터 화면에 플레이어를 따로 넣지 않아도 자동적으로 그 플레이어 폰으로 플레이할 수 있을 뿐더러 해당 화면에서 우클릭 해 바로 플레이할 수도 있다. 

 

10) UE Log + FString

- UE_Log란 함수를 사용해 현재 상태 및 경고 등을 출력해 디버깅할 수 있다. 가장 첫번째는 출력 로그가 어디 종류인지, 두 번째는 경고 메세지 자체의 종류, 세번째는 출력될 메세지이다. Display 외에도 Warning, Fatal, Error, Log 등이 있다. 이 종류에 따라 메세지의 색이 달라질 수 있다. 예를 들어 Display가 아닌 Error일 경우 중요한 메세지로 간주, 빨간색으로 뜬다. 주의인 Warning의 경우 노란색으로 뜬다. 

- 출력될 때는 출력 로그에 뜬다. 4번 뜬 이유는 현재 언리얼 에디터 화면에 이 액터가 총 4개 있기 때문에 4번 출력되었다.

- 그 외에도 C언어 문법인 %f 등을 이용하여 출력할 수도 있다.

- 역시나 이런식으로 값이 출력된다. 

- FString 으로 만든 문자열도 출력할 수 있는데, 이럴 경우 해당 FString 변수 앞에 *를 붙여줘야 한다. 왜냐하면 FString은 구조체로 우리는 FString 구조체 변수를 만든 것이다. 이 구조체는 포인터처럼 가져오는데, 그냥 해당 변수만 쓸 경우 그 변수의 주소만 가져온다. 따라서 해당 값의 접근하기 위해 앞에 *를 붙여줘야 한다.

 

11) Member Function

- 직접 짠 코드를 클래스 멤버함수화 시키는 건 C++ 내용이니 넘어가고 언리얼 멤버 함수 특징만 적어보겠다.

- 멤버 변수와 다르게 멤버 함수는 UFUNCTION이란 키워드를 써야 한다. 괄호 안에는 BlueprintCallable과 BlueprintPure가 들어갈 수 있다. BlueprintCallable은 블루프린트 노드 형식으로 나오며 타겟등을 지정할 수 있다. 반대로 BlueprintPure는똑같이 노드화하되 값을 읽어올수만 있는 노드로 바뀐다.

- 위는 BlueprintCallable 함수고 아래는 BlueprintPure 함수이다.

- 또한 값을 변경하지 않는 함수일 경우에 멤버 변수에 const를 붙여 사용할 수 있다. 안에서 값을 변경할 수 없으며 안에 사용하는 함수 또한 값을 변경하는 함수가 아니어야만 한다.

.cpp
.h

 

 

12) FRotator

- 빙글빙글 돌아가는 플랫폼을 만들기 위한 코드이다. 

.h
.cpp

- 위의 주석친 코드를 쓸 필요 없이 AddActorLocalRotation을 사용하면 된다. 이동시에는 FVector를 사용했으나 이건 회전에 관련된 코드이므로 FRotator를 사용해야한다.

'Programming > Unreal Engine 5' 카테고리의 다른 글

[UE5] VFX Niagara 3 (20~26)  (0) 2023.08.24
[UE5] VFX Niagara 2 (12~19)  (0) 2023.08.22
[UE5] VFX Niagara 1 (1~11)  (0) 2023.08.08
[UE5] Procedural Buildings  (0) 2023.07.30
[UE5] UE5 C++ Compile Error (MSB3073)  (0) 2023.07.09