- 해당 내용은 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는 가장 기본적이고 최소한의 설정이 되어 있는 게임모드이다.
들어가 디폴트 폰 클래스에 새로 만든 플레이어 폰 클래스를 넣는다. 이후 옆 서랍에서 플레이어 스타트를 꺼내 플레이하고 싶은 위치에 배치한다.
그러면 에디터 화면에 플레이어를 따로 넣지 않아도 자동적으로 그 플레이어 폰으로 플레이할 수 있을 뿐더러 해당 화면에서 우클릭 해 바로 플레이할 수도 있다.
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를 붙여 사용할 수 있다. 안에서 값을 변경할 수 없으며 안에 사용하는 함수 또한 값을 변경하는 함수가 아니어야만 한다.
12) FRotator
- 빙글빙글 돌아가는 플랫폼을 만들기 위한 코드이다.
- 위의 주석친 코드를 쓸 필요 없이 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 |