반응형

먼저 AIController 블루프린트에서 주인공 캐릭터를 발견했을 때를 이벤트 디스패처로 처리한다.

 

그리고 주인공 캐릭터 BP에서 처리한 이벤트를 호출하여 디텍트 이벤트로 바인드 한다.

 

이렇게 처리하면 AI가 주인공을 발견했을때만 이벤트가 일어난다.

이것을 이용해 몬스터가 주인공에게 뛰어 올때 자동으로 무기를 장착하도록 처리했다.

반응형
반응형

IDE 프로그램(라이더 같은..)에서 프로젝트를 실행하고, 메뉴에서 Editor / Game 을 골라서 디버그 및 실행이 가능해 진다.

말그대로 Editor 로 선택 시 언리얼엔진과 에디터에서 실행되게 되고, Game을 선택시 최종 패키징 된 빌드가 실행되게 된다.

타깃과 구성 별로 고를 수 있으며, 최대한 많은 문제를 잡아 내기 위해서는 Debug 모드로 실행하는게 좋은데, 여러가지 문제를 뒤지느라 프레임이 많이 떨어지게 된다.

반대로 Shipping 모드로 할 경우 디버그가 아예 안되게 막혀있고, 프레임이 가장 잘 나오게 된다.

반응형
반응형

이 에러가 날 힘들게 하고 있다...;;

UObject 의 수가 한도치를 넘어서서 에러가 발생했다는 건데.. 내 씬이 이렇게가지 무겁게 셋팅이 안되어있는데, 도무지 영문을 모르겠다..;.;

열심히 문제를 찾아봐야겠네.. 어딘가에서 오브젝트가 무한 증식하고 있는 듯 하다.

  • 문제를 찾았다! 위 문제에 대한 Debug 방법 정리.
    • Editor Preferences -> Genera - Performance 에서 Show Frame Rate and Memory를 체크하면 UObect를 디스플레이 해준다.



    • 현재 UObject가 무한 증식 되고 있는 것을 확인할 수 있다.
      • 그다음 여러 프로파일링을 돌려서 확인하는게 좋은데, 나는 일단 가장 의심되는 오브젝트들을 하나씩 지우면서 확인해서 찾아냈다.
      • AI 로직쪽에서 부하를 일으킨다고 느꼈는데, 역시나 AI 관련 Actor들을 지우고나니 UObject의 증가가 멈췄다... 이제부터 요놈을 뜯어 고쳐야 한다.
      • 일단 RunBehavior 트리를 연결만 하면 무조건 증가하는 UObject를 발견했다.

 

* 해당 문제해결

- 첫째로는 GC를 자주 발동시켜 문제를 완화 - 하지만 게임내 렉을 일으킬수 있어 좋은 방법 아님.

- 완전 해결된 이유 - 주인공 애니메이션을 정리하면서 자동 해결.

referencing 잘못된 애니나 오브젝트들이 UObject를 증가시키게 되므로 잘못 연결된것들을 고치면 자동으로해결.

반응형
반응형

게임 시작할 때의 위치나 퀘스트 완료후의 위치를 Location Volume 을 활용해서 위치를 지정했다..

그런데 얘가 뒤통수를 쳤다.

에디터상에서는 위치값을 매우 잘 잡아 주지만 패키징 빌드후에는 전혀 엉뚱한 곳으로 캐릭터를 워프시킨다..  젠장.

전부 Actor 로 다시해서 문제를 해결했다.. 황당.

반응형
반응형

엔진 코드 중에  UniquePtr.h  라는 포인터 처리 코드가 있습니다.

코드에서 포인터를 사용할 경우 해당 헤더파일을 반드시 참조하게 되어 디버그에러시 해당 파일과 잘못연결되어 에러를 뱉는 경우가 허다합니다.

메모리에 올렸다 해제했다를 잘해야 하는데, 그러지 못한 경우 해당 코드에서 문제를 일으키는 것입니다.

포인터의 개념을 잘 숙지하여 해당 코드와 문제가 일으나지 않도록 관리하는 것이 필요합니다.

자, 이제 포인터에 대해서 자세히 알아봅시다..

 

포인터란 무엇일까?

포인터는 **"다른 변수의 메모리 주소를 가리키는 변수"**라고 생각하면 됩니다. 조금 더 쉽게 말하면, 포인터는 다른 데이터가 저장된 위치를 기억하는 변수예요.

비유로 이해하기

포인터를 주소로, 그리고 변수를 이라고 생각해볼게요.

  • 변수는 데이터가 저장된 "집"이에요.
  • 포인터는 그 집이 어디 있는지 알려주는 "주소"입니다.

예를 들어, 집(변수) 안에 사람이 살고 있다고 하면, 포인터는 그 사람이 살고 있는 집의 위치를 알려주는 주소를 기억하고 있는 거예요.

포인터 사용해 보기

기본 변수와 포인터의 차이

  • 보통의 변수는 데이터를 직접 저장합니다.
  • 포인터는 데이터를 저장하는 것이 아니라, **그 데이터가 어디에 있는지(메모리 주소)**를 저장합니다.
cpp
코드 복사
int number = 10; // 그냥 변수, 10이라는 숫자를 저장함 int* pointer = &number; // 포인터, number의 메모리 주소를 저장함

여기서:

  • int number는 숫자 10을 저장하는 일반 변수입니다.
  • int* pointer는 number 변수의 메모리 주소를 저장하는 포인터입니다.
  • &number는 number의 메모리 주소를 의미해요.

포인터의 기호

  • * : 포인터를 선언할 때 사용합니다. 예를 들어, int*는 "정수형을 가리키는 포인터"라는 의미입니다.
  • & : 변수의 메모리 주소를 얻기 위해 사용합니다.
  • * (역참조) : 포인터가 가리키는 주소에 있는 값을 가져오기 위해 사용합니다.
cpp
코드 복사
#include <iostream> using namespace std; int main() { int number = 10; // 일반 변수 int* pointer = &number; // 포인터 변수, number의 주소를 저장 cout << "number의 값: " << number << endl; // number의 값 출력 (10) cout << "pointer가 가리키는 값: " << *pointer << endl; // 포인터가 가리키는 값 출력 (10) cout << "number의 주소: " << &number << endl; // number의 메모리 주소 출력 cout << "pointer의 값: " << pointer << endl; // pointer에 저장된 주소 출력 (number의 주소와 같음) return 0; }

왜 포인터를 사용할까?

포인터가 중요한 이유는 메모리의 직접적인 접근효율적인 데이터 처리를 가능하게 하기 때문이에요.

  1. 동적 메모리 할당: 프로그램이 실행될 때 필요한 만큼 메모리를 요청하고 사용할 수 있어요.
    • 예를 들어, 프로그램이 실행될 때 사용자가 원하는 만큼의 데이터를 저장하려면, 포인터를 사용해 메모리를 동적으로 할당할 수 있습니다.
    cpp
    코드 복사
    int* p = new int; // 정수형 메모리 공간을 동적으로 할당받고, 그 주소를 p에 저장 *p = 20; // 할당된 메모리 공간에 20을 저장 delete p; // 사용한 메모리를 해제
  2. 데이터 공유: 함수에서 변수를 복사하지 않고, 원래 데이터를 직접 변경할 수 있어요.
    • 예를 들어, 함수에 변수의 포인터를 전달하면 함수 내부에서 그 값을 직접 변경할 수 있습니다.
    cpp
    코드 복사
    void changeValue(int* p) { *p = 100; // 포인터가 가리키는 변수의 값을 변경 } int main() { int number = 10; changeValue(&number); // number의 주소를 함수에 전달 cout << "number의 값: " << number << endl; // 출력 결과: 100 return 0; }
  3. 배열 처리: 포인터는 배열과 밀접하게 연관되어 있어요. 배열의 첫 번째 요소의 주소를 통해 전체 배열을 처리할 수 있습니다.
  4. cpp
    코드 복사
    int arr[3] = {1, 2, 3}; int* p = arr; // 배열의 첫 번째 요소의 주소를 저장 cout << *p << endl; // 첫 번째 요소 출력 (1) cout << *(p + 1) << endl; // 두 번째 요소 출력 (2)

주의할 점

  • 잘못된 포인터 접근: 초기화되지 않은 포인터를 사용하면 프로그램이 충돌할 수 있습니다. 항상 포인터를 사용할 때는 초기화하고 유효성을 확인하는 것이 중요합니다.
    cpp
    코드 복사
    int* p = nullptr; // 포인터를 초기화하지 않으면 위험!
  • 동적 메모리 해제: 동적으로 할당한 메모리를 해제하지 않으면 메모리 누수가 발생합니다. delete를 사용해 메모리를 꼭 해제해야 합니다.

정리

  • 포인터메모리 주소를 저장하는 변수입니다.
  • *와 & 같은 기호를 사용해 메모리 주소를 얻거나 값을 참조합니다.
  • 포인터는 효율적인 데이터 처리메모리 관리를 가능하게 해줍니다.
반응형
반응형

엔진을 실행할 때 SM6를 사용할 경우 AutogenShaderHeaders.ush 파일이 Game\Intermediate\ShaderAutogen\PCD3D_SM6\

폴더에 생성되게 됩니다.

쿠킹 테스트 중 C:\Users\User\AppData\Local\Temp\UnrealShaderWorkingDir 폴더에 생성된 파일과 충돌이 발생하길래 삭제한 적이 있습니다。

그 이후 엔진 실행 중 셰이더 컴파일이 안되서 따로 백업해 둔 프로젝트가 있어서 간신히 위기를 넘어 간 적이 있습니다. 

위 파일을 단순히 덮어씌운다고 해결되지도 않기 때문에 지우는 순간 프로젝트를 영영 잃게 될 수 있기 때문에 신중함이 필요합니다.
셰이더 쿠킹 문제가 터졌을 땐 캐싱 파일들을 바로 지우지 않고, 엔진과 게임 폴더내에 있는 Intermediate / DerivedDataCache / Saved 폴더를 제거후 엔진을 다시 실행하는 방식으로 접근하는 것이 가장 좋은 방법입니다.

반응형
반응형

각각의 폴더를 잘 파악해야 패키지 빌드를 잘 성공 시킬 수 있다.

1. 엔진폴더와 게임 폴더의 구분을 잘 파악하자.

* 1번은 엔진을 실행하는데 필수로 필요한 파일들이 있으며, 빌드 성공시에 해당 폴더의  \Engine\Binaries\Win64 폴더로 이동하여 UnrealEditor.exe 파일을 실행하면 엔진이 실행하게 된다.

* UE5.sln 파일을 실행한 후 IDE 프로그램에서 디버그나 빌드를 눌러도 실행된다.

* 아래는 Engine 폴더 내부인데, 빨간 줄을 친 부분은 엔진을 실행하는 데 필수 요소 들은 아니며 엔진을 실행하거나 하는등의 바이너리화 작업중에 발생하는 파일들이다. 따라서 엔진을 다른 컴퓨터나 폴더로 옮길수 해당 폴더들은 제외하고 옮겨도 실행하는데 문제가 없다.

* 2번은 엔진 실행후 해당 엔진을 통해 만들어진 게임 폴더들이다. 아래 폴더 구조를 통해 상세히 알아 보자. 먼저 여기서도 엔진과 마찬가지로 아래의 빨간색으로 표시된 폴더들은 구동시 반드시 필요한 폴더가 아니다.

1. Content 폴더 : 게임실행시 블루프린트와 아트어셋 데이터들이 생성되는 장소이다. 엔진코드나 플러그인을 딱히 건드리지 않았을 경우 해당 폴더만 옮겨도 게임내부의 어셋들을 다른 프로젝트에서 확인이 가능하다. 하지만, 안되는 경우도 꾀 있으니 해당 폴더만으로 모든작업된 내용이 똑같이 발동 될거라 섣불리 생각하지는 말자. 예를들어  tag나 Default.ini 등에서 바뀌어진 정보는 해당 폴더에 있지 않다.

2. Plugins 폴더 :  게임실행 후 설치한 플러그인나 외부적으로 제작한 플러그인들이 생성되는 장소이다. 해당 폴더에 설치된 내용이 있고, game.uproject 파일에서 true / false 설정을 할 수 있다. 다만 언리얼에서 기본 제공하는 플러그인들은 uproject 파일에서 true 했을 경우에 거의 잘 되긴 하지만 외부에서 가져온 플러그인들은 Source에서 제어해줘야만 정상 작동하는 PlugIns들도 있다는 것을 주의하자.

3. Source 폴더 : 소스코드 빌드된 엔진에서 가장 중요한 부분이라 생각하면 될거 같다. 요 부분에서 엔진 코드 / 게임 코드 / 플러그인 코드 등을 C++ 로 제어하게 된다. IDE 프로그램에서 처리되는 모든 소스코드가 이곳을 통해 이루어진다고 보면 된다. 그만큼 민감하게 예민한 곳이라 적절하게 코드작업이 이루어지지 않을 경우 빌드에러가 발생하여 게임 / 엔진 모두가 망가질수 있음을 주의하자.  Unreal C++ 코딩 카테고리에서 참고사항을 잘 확인하며 신중하게 작업을 진행해야 한다.

반응형
반응형
  • IDE 프로그램에서 폴더구조를 변경한다 해도, Build.cs 파일에 에디터상에서 보여질 폴더를 표시해줘야 폴더가 에디터상에서 출력된다.
    • Build.cs 파일은 엔진에 종속된 코드라 변경 후에는 반드시 솔루션 빌드를 해줘야 정상 반영됨.
PublicIncludePaths.AddRange(new string[] {
    "MyProject/NewFolder"
});
  • 그리고 코드상에서 줄기차게 사용하는 플러그인들도 build.cs 파일에 등록해 줘야 한다.
		PrivateDependencyModuleNames.AddRange(collection: new string[]
		{
			"MoviePlayer",
			"ProceduralMeshComponent",
			"Slate",
			"AnimGraphRuntime",
			"TraceLog",
			"MotionWarping",
			"MovieScene",
			"DeveloperSettings",
			"SQLiteCore",
			"SignificanceManager",
			"AnimationLocomotionLibraryRuntime",
			"MovieSceneTracks",
			"PhysicsControl",
			"SignalProcessing",
			"PoseSearch",
			"PhysicsCore"
		});
반응형
반응형

마지막 패키징에 실패할 때 치명적인 오류가 없었지만, 플러그인 관련  warning 만으로도 패키징을 실패할 수 있음을 알았습니다.

에러 로그 리포트에서 플러그인 관련된 내용들을 잘 서치하여 코드에서 사용되고 있지만 빠져있는 플러그인들을 .uproject 에 잘 로드해 줘야 한다.

  • 예시 : UATHelper: Packaging (Windows): Warning: C:\UnrealEngine\GyGame\GyGame.uproject does not list plugin 'ModularGameplay' as a dependency, but module 'GyGame' depends on 'ModularGameplay'.
  • 아래 코드를 .uprject 파일에 추가한다.
    {
        "Name": "ModularGameplay",
        "Enabled": true
    },

 

설치된 플러그인도 아닌데 엔진에 기본 깔려 있어서 로드하다가 실패하는 경우도 있다.. 이건 뭐..

  • Plastic SCM 플러그인 오류.
  • 예시 - Warning LogStreaming Failed to read file '../../../Engine/Plugins/Developer/PlasticSourceControl/Resources/Icon128.png' error.
  • 이 경고는 언리얼 엔진이 특정 파일(../../../Engine/Plugins/Developer/PlasticSourceControl/Resources/Icon128.png)을 읽으려고 시도했지만, 파일이 존재하지 않거나 손상되었기 때문에 실패했다는 메시지입니다. 이 경고는 주로 Plastic SCM Source Control 플러그인과 관련이 있습니다. 플러그인 자체가 동작하는 데 필요한 리소스가 없을 때 발생합니다.
  • 이럴 경우 아래 구문을  .uproject 파일에 추가하여 아예 로드되지 않도록 처리한다.
"Plugins": [
    {
        "Name": "PlasticSourceControl",
        "Enabled": false
    }
]

 

GameFeatureData 의 정보를 코드에서 쓰고 있는데 게임에디터상의 정보에 누락되어 빌드 패키징에서 실패하는 경우가 있다.

  • 해결방법
  • . Asset Manager 설정 변경
    1. 언리얼 에디터 열기:
      • Edit > Project Settings로 이동합니다.
    2. Asset Manager 검색:
      • 왼쪽 검색창에 Asset Manager를 입력하여 해당 섹션으로 이동합니다.
    3. Primary Asset Types to Scan 추가:
      • Primary Asset Types to Scan 섹션을 찾습니다.
      • + 버튼을 눌러 새 항목을 추가합니다:
        • Name: GameFeatureData
        • Asset Base Class: GameFeatureData
        • Directories: GameFeatureData가 위치한 디렉터리를 지정 (필요 시 All로 설정 가능).
        • Specific Assets: 특정 에셋을 지정하려면 여기에 추가.

 

반응형
반응형

외부에서 제작된 코드를 옮기거나 할때에 아래 그림처럼 사전 정의된 매크로를 사용하는 경우가 종종 있을 수 있다.

하지만, 문제는 해당 Class는 어디서 찾았는지 알길이 없다는 것이다..;;

그 이유는 프로젝트 이름을 참조하여 자동으로 생성되는 매크로이기 때문이다.

위치는

개인프로젝트폴더\Intermediate\Build\Win64\x64\UnrealEditor\Development\ 개인프로젝트폴더\

의 Definitions. 개인프로젝트폴더 .h 파일안에 아래처럼 숨겨져 있다.

반응형
반응형

비주얼 스튜디오로 작업하다 보면 매우 엄격하게 컴파일 감시를 하다보니 코드 한줄 잘 못 써도 바로 프로젝트가 터지는 일을 빈번히 겪게되어 아무 작업도 못하는 지경에 이르게 된다..;;  라이더를 사용하여 좀더 릴렉스하게 코드 작업을 진행해 보자.

다운 링크 : Rider: The Cross-Platform .NET IDE from JetBrains

 

Rider: The Cross-Platform .NET IDE from JetBrains

Develop .NET, ASP.NET, .NET Core, Xamarin or Unity applications on Windows, Mac, Linux

www.jetbrains.com

언리얼 프로젝트에서 Source Code 작업을 Rider UProject로 선택해 준다.

라이더의 좋은점.

  • 헤더파일등의 추가가 용이하고, 잘못된 컴파일 에러로 프로젝트 자체가 수시로 고장나 버리는 비주얼 스튜디오보다 훨씬 더 고장율이 떨어지면서 작업하는게 용이해 진다. 마치 유니티 C#작업하는 느낌과 거의 흡사해 짐.
    • 비주얼 스튜디오에서는 헤더파일만 만들고 cpp 파일을 안만들면 컴파일 에러와 빌드 에러를 일으키지만 라이더는 유연하게 대처 해준다.
  • 라이더에서 작업하던 중간에 비주얼 스튜디오로 넘어가는것은 삼가하자..;; 프로젝트가 99프로 확률로 고장나면서 멘탈 공격 심하게 들어온다.
    • 그래도 너무 릴렉스하게는 하지 말고 중간중간 빌드를 해주면서 고장 난 부분이 없는지 수시로 체크하는 것도 필요하긴 하다..;;
반응형
반응형

언리얼 코드 작성은 유니티에서 작업하던거와는 신중함의 무게가 다르다.. 아래 사항들을 유의하며 코드 작성을 해야 한다.

  • 오류가 많은 채로 빌드를 하면 빌드 실패는 당연한거고 UnrealEditor.exe 파일이 날라간다.
    • 반드시 한줄 한줄 오류가 없는지 점검하며 빌드를 해야 한다.
  • 한줄만 잘못 써도 위와 같은 상황이 발생하게 되므로, 아래의 여러가지 코드 작성 방법을 유의하며 코딩 작업을 해야 한다.

    언리얼 엔진에서 C++ 코드를 작성할 때, 빌드 시간이 길고 한 줄만 잘못 써도 다시 빌드해야 하는 것은 개발자들이 자주 겪는 문제입니다. 다행히 이를 완화할 수 있는 몇 가지 방법이 있습니다:1. Hot Reload 활용하기
    • 언리얼 엔진은 코드를 변경한 후 엔진을 재시작하지 않고도 변경 사항을 반영할 수 있는 Hot Reload 기능을 제공합니다.
    • 하지만 Hot Reload는 코드 구조를 크게 변경하지 않은 경우에만 효과적입니다. 예를 들어, 새 클래스를 추가하거나 매크로를 변경한 경우에는 제한적일 수 있습니다.
    2. Live Coding 사용
    • 언리얼 엔진은 Live Coding 기능을 제공하여, 게임을 종료하지 않고도 변경된 코드 부분을 빠르게 컴파일하고 적용할 수 있습니다.
    • 설정 방법:
      1. Editor Preferences  General  Miscellaneous  Enable Live Coding 활성화.
      2. 변경 후 Ctrl + Alt + F11을 눌러 Live Coding 빌드를 실행.
    • 주의점: Live Coding은 큰 코드 수정에는 적합하지 않으며, 가벼운 수정에 유용합니다.
    3. PCH(Precompiled Header) 최적화
    • 프로젝트의 Precompiled Header를 잘 관리하면 빌드 시간을 크게 줄일 수 있습니다.
    • 모든 헤더 파일을 .cpp 파일에서 직접 포함하지 말고, 공통적으로 사용되는 헤더 파일은 PCH에 포함하세요.
    • 예를 들어, MyProject.h에 공통 헤더들을 넣고 필요할 때마다 이를 사용하도록 구성합니다.
    4. 코드 모듈화
    • 코드를 작은 모듈로 나누면, 변경된 모듈만 다시 컴파일하면 되므로 빌드 시간을 단축할 수 있습니다.
    • 각 기능을 별도의 모듈로 분리하면 의존성을 줄이고 더 빠르게 작업할 수 있습니다.
    5. Blueprint와 C++의 적절한 조화
    • 빈번히 변경해야 하는 코드나 실험적인 작업은 Blueprint로 구현하고, 성능이 중요한 부분만 C++로 작성하는 것도 좋은 방법입니다.
    • 이 접근법은 빌드 시간을 줄이는 데 매우 효과적입니다.
    6. Unity Build 비활성화
    • 언리얼 프로젝트는 기본적으로 Unity Build를 활성화하여 여러 .cpp 파일을 한 번에 컴파일합니다.
    • 하지만 일부 상황에서는 Unity Build를 끄면 특정 파일만 다시 컴파일하게 되어 더 빠를 수 있습니다.
      • BuildConfiguration.xml에서 bUseUnityBuild를 false로 설정하세요.
    7. 코드 변경 전 유효성 검사
    • 에디터에서 미리 코드 스타일이나 오류를 체크할 수 있는 도구(예: Rider, Visual Studio, CLion)를 사용하면 빌드 전 많은 문제를 방지할 수 있습니다.
    8. SSD와 RAM 업그레이드
    • 하드웨어 업그레이드도 빌드 시간을 줄이는 데 큰 도움이 됩니다.
    • 특히 NVMe SSD와 충분한 **RAM(32GB 이상)**을 사용하면 빌드 속도가 크게 향상됩니다.

 

  • IDE 프로그램에서 폴더구조를 변경한다 해도, Build.cs 파일에 에디터상에서 보여질 폴더를 표시해줘야 폴더가 에디터상에서 출력된다.
    • Build.cs 파일은 엔진에 종속된 코드라 변경 후에는 반드시 솔루션 빌드를 해줘야 정상 반영됨.
PublicIncludePaths.AddRange(new string[] {
    "MyProject/NewFolder"
});
  • 폴더 변경후 비주얼 스튜디오에서도 제대로 반영되지 않으므로 Generate Visualstudio Project를 실행해야 정상 반영된다.
  • (GENERATED_BODY() 또는 GENERATED_UCLASS_BODY() 등)를 사용하려면, 반드시 .generated.h 파일이 헤더의 맨 마지막 #include 구문 뒤에 위치해야 한다는 규칙을 지키지 않았을 때 에러가 발생합니다.
  •  빌드 에러가 떴을 때 비주얼 스튜디오나 IDE 프로그램을 그냥 종료하지 않고, 오류부분들을 수정하고 솔루션 빌드를 완료한 후 종료해야 한다. 그러지 않으면 프로젝트를 새로 받아야 할 수도 있음.
반응형
반응형

계속해서 빌드에 실패할 경우 비주얼 스튜디오에 불필요한 데이터가 많이 쌓여서 일 경우 가 많이 있다. 그럴 때는 비주얼 스튜디오를 깨끗하게 제거한후 클린 버전으로 다시 설치하는 것을 추천한다.

 

1. Visual Studio 설치 관리자를 통해 제거

  1. Visual Studio 설치 관리자 실행
    • 시작 메뉴에서 "Visual Studio 설치 관리자"를 검색하고 실행합니다.
    • 설치된 Visual Studio 목록이 표시됩니다.
  2. Visual Studio 제거
    • 제거하려는 버전을 선택한 뒤 제거 버튼을 클릭합니다.
    • 표시되는 모든 단계를 따라 Visual Studio를 제거합니다.

2. Visual Studio 설치 파일 및 캐시 삭제

Visual Studio가 제거된 후에도 관련 파일과 캐시가 남아있을 수 있습니다. 이를 제거하려면:

  1. Visual Studio 설치 경로 확인
    • 일반적으로 Visual Studio는 다음 경로에 설치됩니다:
      • C:\Program Files (x86)\Microsoft Visual Studio
    • 해당 경로로 이동해 남아있는 파일이 있다면 삭제합니다.
  2. 설치 관리자의 다운로드 캐시 제거
    • Visual Studio 설치 관리자가 사용하는 파일은 다음 경로에 저장됩니다:
      • %ProgramData%\Microsoft\VisualStudio\Packages
    • 위 경로로 이동하여 폴더를 삭제합니다.

3. Visual Studio 관련 레지스트리 항목 제거

주의: 레지스트리를 잘못 수정하면 시스템에 문제가 생길 수 있습니다. 레지스트리를 수정하기 전에 반드시 백업하세요.

  1. 레지스트리 편집기 실행
    • Windows + R를 눌러 실행창을 열고 regedit를 입력한 뒤 실행합니다.
  2. Visual Studio 관련 항목 삭제
    • 다음 경로를 찾아 삭제합니다:
      • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio
      • HKEY_CURRENT_USER\SOFTWARE\Microsoft\VisualStudio
    • 해당 항목이 있으면 삭제합니다.

4. Visual Studio Installer 제거

Visual Studio 설치 관리자도 제거하려면:

  1. 설치 프로그램 제거
    • 시작 > 설정 > 앱 > 앱 및 기능으로 이동합니다.
    • "Visual Studio Installer"를 검색하여 선택 후 제거를 클릭합니다.

5. 추가적인 남은 파일 검색 및 삭제

  1. %AppData% 및 %LocalAppData% 경로 확인
    • C:\Users\사용자명\AppData\Roaming\Microsoft\VisualStudio
    • C:\Users\사용자명\AppData\Local\Microsoft\VisualStudio
    • 위 경로에 남아있는 파일이 있다면 삭제합니다.
  2. 디스크 정리 도구 사용
    • Windows의 디스크 정리 도구를 실행하여 불필요한 파일을 삭제합니다.

6. 재부팅 후 확인

컴퓨터를 재부팅한 뒤 Visual Studio와 관련된 파일이 완전히 삭제되었는지 확인합니다.

이 과정을 통해 Visual Studio를 완전히 제거할 수 있습니다.

 

재 설치 후 5.4.4에 타겟에 맞는 구성으로 비주얼 스튜디오를 다시 까는 방법.

  1. 언리얼 런처를 실행하고 5.4.4 엔진을 실행후   C++  프로젝트를 새로 만든다.
    1. 이 때 visual Studio 2022 를 깔아야 한다고 안내가 나오고,  자동으로  visual studio installer 를 설치하게 된다.
    2. 인스톨러 설치 후 아래에서 두가지만 선택하여 비주얼 스튜디오를 설치한다.

이후에 샘플 프로젝트를  c++ 로 만들어 패키징까지 해보고 이상이 없는 지 체크한다. 

이후에 패키징이 정상적으로 되고, 실행도 온전히 된다면 기본적인 구성은 어느정도 완료됐다고 보면 된다.

 

이제 기존 소스코드 받은 5.4.4 의  Setup.bat / GenerateProjectFiles 를 실행한뒤 다시 ue5.sln 파일을 실행한다.
* 이 때 새 프로젝트가 비주얼스튜디오가 열릴 때 신뢰할 수 없는 소스들을 열면 불안하게 프로젝트가 열려 빌드가 되지않을 수 있어 열지 않는것이 좋다.

* 추가 설치가 필요하다고 뜰 때는 추가 설치를 진행해 준다.

 

반응형
반응형

언리얼 소스코드 빌드는 왜 필요한가?

1. 엔진 커스터마이징

  • Unreal Engine의 소스 코드를 수정해야 하는 경우:
    • 엔진의 기본 기능을 확장하거나 수정해야 할 때 소스 코드를 직접 변경해야 합니다.
    • 예: 물리 엔진(Px), 렌더링 파이프라인, 네트워크 모듈 등을 맞춤화.
  • Epic Games Launcher로 설치한 엔진은 소스 코드 접근이 불가능하므로, GitHub에서 제공되는 소스 코드를 빌드해야 수정이 가능합니다.

2. 특정 플랫폼 지원

  • Unreal Engine이 기본적으로 지원하지 않는 플랫폼에서 게임을 실행하려는 경우:
    • 커스텀 하드웨어, OS, 또는 특수 플랫폼(예: 리눅스 변형, 특정 임베디드 시스템).
    • 일부 플랫폼에서는 빌드 시 추가 의존성을 포함하거나 커스텀 설정이 필요합니다.

3. 최신 버전 또는 특정 브랜치 사용

  • Epic Games Launcher를 통해 제공되는 Unreal Engine 버전은 공식 릴리스에 한정됩니다.
    • 만약 최신 개발 브랜치(예: Main 브랜치)나 특정 버전이 필요한 경우, GitHub에서 해당 소스를 내려받아 빌드해야 합니다.
    • 실험적 기능이나 버그 수정 사항을 즉시 사용하고 싶을 때 유용합니다.

4. 디버깅 및 문제 해결

  • 엔진 내부에서 발생하는 문제를 디버깅해야 할 때:
    • 엔진의 작동 방식이나 특정 API 호출 흐름을 파악하기 위해 소스 코드 접근이 필요할 수 있습니다.
    • Visual Studio(또는 다른 IDE)에서 엔진 코드 전체를 디버깅할 수 있습니다.

5. 플러그인 개발

  • 고급 플러그인이나 모듈 개발 시 엔진의 소스 코드와 깊게 연동되는 경우:
    • 일부 고급 기능을 추가하거나 시스템 수준의 동작을 수정해야 할 때.
    • 소스 코드 빌드된 엔진에서 테스트해야 플러그인과의 호환성을 보장할 수 있습니다.

6. 라이센싱 또는 코드 분석

  • 기업이나 특정 프로젝트에서 엔진의 동작을 세부적으로 검토하거나 맞춤화해야 하는 경우.
  • 엔진을 수정하지 않더라도 소스 코드 빌드를 통해 엔진의 모든 부분에 접근할 수 있습니다.

7. 전문적인 작업 환경 구축

  • 대규모 팀이나 전문 개발 환경에서 커스텀 엔진 빌드를 사용하는 경우:
    • 엔진 빌드를 공유하여 팀 전체가 동일한 엔진 상태로 작업.
    • 각종 커스텀 빌드 설정(특정 디버그 플래그, 빌드 최적화 등)을 포함.

등등의 이유로 필요하지만, 간단한 1인 게임을 만들기 위해서는 굳이 필요하지 않다고 여겨지고, 최소한 오픈 월드 RPG 이상의 환경 구축이 필요한 게임에서만 하는게 좋지 않을까 싶습니다.

왜냐? 너무 어렵고 진입 장벽이 높음.. 하다가 지쳐버림.

 

좌충우돌 소스코드 빌드 성공기.

1. Git이랑 연동해서 하는법

  • 먼저 언리얼에서 개발자 계정을 만들고,Git과 연계하는 작업을 진행한다.
    • 근데 불친절한 언리얼과 Git의 만남이라 그런가.. 정말 복잡하고 어렵고 느리다.
    • 엔지니어 위주의 설명이다보니 진짜 디자이너 출신들의 진입 장벽이 너무 높게 느껴진다..
    • 이래서 1인개발은 멀고도 험하다..ㅠ

Unreal Engine on GitHub

요 페이지와 아래 페이지를 통해 GitHub 의 계정을 언리얼과 연동하는 작업을 먼저 진행한다.

언리얼 엔진 소스 코드 다운로드하기 | 언리얼 엔진 5.5 문서 | Epic Developer Community | Epic Developer Community

위 페이지에서 가장 눈여겨 보아야 할 부분. - 아래의 충족여건이 안되면 링크를 타고 가도 404 Page Error 어쩌구 뜨면서 연결이 안된다.

언리얼 개인 계정 페이지에서 아래와 같이  Git Hub 와 연동이 되어야 한다.

잘 모를 땐 GitHub 내 언리얼 엔진 - Unreal Engine  페이지에서 아래의 FAQ를 잘 확인하며 하나씩 잘 따라가는 것도 좋다.

 

 

위의 계정연결을 성공하고 나서 소스 코드 브랜치 중 EpicGames/UnrealEngine 으로 들어가 원하는 버전을 선택한다. 나는 5.4.4를 선택했다.

 

여기서 이제 두가지 방법으로 소스코드 빌드를 할 수 있게 되는데, Git 브렌치를 이용하여 Repository를 복사하여 내 Repsitory를 이용하는 방법 그리고 그냥 Zip 파일을 받아서 내 하드에 풀고 Setup.bat 파일로 하는 방법

첫 째, GitHub 데스크탑을 이용하여 내 Repository를 이용하는 방법

GitHib Desktop 앱을 이용하면 좀더 손쉽게 Repository를 이용할 수 있다.

 

위 까지 성공하고 Clone Reprository를 실행하면 아래 화면이 뜨면서 언리얼 엔진을 내 Repository에 가져오기 시작한다.

위의 처리가 완료되고 폴더가기를 누르면 내 로컬 컴퓨터에 Engine 브랜치가 다운 받아진것을 확인할 수 있습니다.

 

 

 

두 번째, 그냥 Zip 파일을 받아 압축을 풀고 Setup.bat 파일을 실행한다. 전 그냥 이방식을 추천합니다.

EpicGames/UnrealEngine: Unreal Engine source code 페이지에서 Zip 파일을 받아 압축을 푼다.

어디 드라이브가 됐든 최상위에 압축을 풀고 1. Setup.bat / 2. GenerateProjectFiles 를실행한다. 최상위 폴더에 풀지 않으면 경로에러로 압축이 안풀릴수 있다.

 Setup은 30분~1시간, GenerateProjectFiles는 10초면 된다.

언리얼 빌드를 시작하기 전에 VisualStudio 2022를 받고, 아래 해당 되는 것들을 설치합니다.

주소 - Visual Studio 2022 IDE - 소프트웨어 개발자를 위한 프로그래밍 도구

가장 중요한 부분은 C++ 을 사용한 데스크톱 개발 목록이 가장 중요함. 언5 소스코드 빌드 성공한 목록 구성입니다. 몇번의 삽질이 있었음..;;

그런 후 UE5.Sln 파일을 실행하고 솔루션 'UE5'에 마우스 오른쪽 버튼을 누르고 솔루션 빌드를 시작합니다.

 

위 작업은 최종 작업으로서 최소2시간에서 컴퓨터 사양따라 반나절 이상 소모되는 경우도 있으니 주무시기전에 하거나 다른 일을 하고 오시는 것을 추천드립니다.

여기까지 진행후 빌드 성공이 뜨면 나만의 커스텀 엔진을 생성하는데 성공하게 되고, Engine/Binaries/Win64 폴더에서 UnrealEditor를 실행하면 커스텀 엔진이 실행되게 되고, 거기서 프로젝트를 새로 만들면 나만의 엔진에서 나만의 게임을 만들수 있게 됩니다.

추가설치가 뜰땐 시키는데로 하는게 좋습니다.

 

문제점 - 소스코드 완료 후 오류가 많을 경우 버전들을 픽스하여 다시 설치한다.

 

비주얼 스튜디오 추가 구성과 도움이 필요할 땐 아래사이트를 참고하면 도움이 됩니다.

언리얼 엔진용 Visual Studio Code 구성 | 언리얼 엔진 5.5 문서 | Epic Developer Community | Epic Developer Community

반응형
반응형

ALC(Advanced Locomotion Component)의 오리지날은 Unarmed 에서만 3인칭 뷰를 지원하고, Weapon을 들면 1인칭뷰로 강제 전환되다보니 RPG 게임에 활용하는데에 있어 다소 아쉬움이 있습니다.

해당 페이지에서는 오리지날에서 제공하는 방식의 무기 교체 방식이 아닌 3rd 뷰에서 무기 교체가 되도록 설계된 것을 소개하여 RPG게임에 참고할 수 있도록 가이드 하도록 하겠습니다.

작동 방식 개요

  1. Equip 버튼을 누르면 무기를 꺼내면서 Battile Idle 자세를 취하며 배틀모드로 진입한다.
  2. 동일 버튼을 누르면 다시 무기를 집어넣으며 Idle 자세로 돌아가고 평화모드로 진입한다.
  3. 배틀모드에서 특정 이벤트가 없이 5초가 지나면 자동으로 Idle 자세로 돌아가고 평화모드로 진입한다.
  4. 이 설계상에서 세부적으로 컨트롤해야 할 부분이 무기를 든상태로 이동할 때 어떻게 처리하느냐 이다.
    1. 이동 중 배틀모드로 진입할 때 역시 블렌드 마스크 기능을 이용해 상체 모션만 나오도록 한다.
    2. 배틀모드에서 이동시 블렌드 마스크 기능을 십분 활용하여 무기든 손의 애니메이션에 제한값을 넣어준다.

 

 

반응형

반응형

어드벤스드 로코모션 컴포넌트에서 가장 중요한 플러그인인 'Animation Locomotion Library' 의 기능을 적극적으로 활용해서 Start 모션과 Stop 모션을 구현하고 있습니다.

위 기능을 사용하는 스테이트를 자세히 확인하기 위해서는 아래 포스팅의 'Start 스테이트' 와 'Stop 스테이트' 부분을 보면 더 자세히 확인할 수 있다.

https://tartist.tistory.com/177

 

Advanced Locomotion Component (UE5) 가이드 - 4 ( Unarmed / Anim Blueprint )

기본적으로 Ct_Cmpt_Locomotion 에서 보내주는 이벤트 정보를 바인딩하여 Data Table에서 가장 적절한 모션을 찾아 뿌려주는 기능에 초점이 맞춰져 있습니다.이벤트 내용은 이전 페이지를 참고하여 Ct_Cm

tartist.tistory.com

 

  • 아래는 Start 스테이트의 Update Start Anim Layer의 위 플러그인을 사용하여 캐릭터의 이동을 처리하는 부분이다.
    • Distance Curve 네임을 이용하여 캐릭터의 모션과 이동에 대한 싱크를 맞춰주게 됩니다.
    • 원본 애니메이션 에셋은 반드리 Root 모션으로 제작해야 하며, 옵션에서 Root모션 사용은 제거하고, 모션 에셋에 있는 Root 정보를 이용해 커브를 생성해 내게 된다.

  • 아래는 Process Turn Yaw Curve에서 Turn Yaw Curve Value를 구하는 부분입니다.
    • 애님 시퀀스 상에 있는 TurnYawWeight 와 RemainingTurnYaw 커브값을 이용하여 Turn Yaw Curve Value를 구하고 구해진 Turn Yaw Curve Value를 이용해 Root Yaw Offset 값을 구하고 그 값이 캐릭터를 회전시키는데 직접적으로 활용되게 됩니다.

 

그래서 결론적으로 캐릭터의 각방향의 Start 모션은 아래의 다섯개이며(뛰기만, 걷기포함하면 10개) 에서 각 모션별로 필요한 커브는 Distance  / RemainingTurnYaw / TurnYawWeight  세가지이다.(정면Start는 회전하지 않으므로  Distance 만)

  • Distance : 모션에 따른 이동 수치 (Root 모션으로 제작해야 얻어올 수 있다.)
  • RemainingTurnYaw : 회전 할 때 남은 회전 수치 (Root 모션으로 제작해야 얻어 올 수 있다.)
  • TurnYawWeight : 현재 회전하고 있는 수치 ( Root 모션으로 제작해야 얻어 올 수 있다. )

 

각각의 커브가 없을경우에 어떻게 작동하게 되는지 확인해 봅시다.

  • Distance 커브가 없을 때 - 이동과 모션에 따른 싱크를 맞추지 못하게 되면서 재생속도가 잘못출력된다.

  • RemainingTurnYaw 가 없을 때 - 남은 턴양이 계산되지 않아 잘못된 결과를 출력합니다.

  • TurnYawWeight 가 없을 때 - 현재의 턴양이 계산되지 않아 어색한 결과가 출력됩니다.

 

  • 세 커브가 모두 온전히 있을 때 아래처럼 온전한 결과를 얻을 수 있습니다.

 

  • 커브 추가 하는 방법
    • 모디파이어 추가->DistanceCurveModifier를실행해 주면distance커브가추가된다
    • 모디파이어 추가->TurnYawAnimModifier를실행해 주면 RemainingTurnYaw와 TurnYawWeight 커브가추가된다.

 

 

  • TurnYawAnimModifier 블루프린트 확인
    • ALC의 이 블루프린트가 RemainingTurnYaw 커브값과 TurnYawWeight 커브값을 얻도록 도와주는 모디파이어 블루프린트이다.

  • Populate Curve Keys 함수

반응형
반응형

기본적으로 Ct_Cmpt_Locomotion 에서 보내주는 이벤트 정보를 바인딩하여 Data Table에서 가장 적절한 모션을 찾아 뿌려주는 기능에 초점이 맞춰져 있습니다.

이벤트 내용은 이전 페이지를 참고하여 Ct_Cmpt_Locomotion 에서 보내주는 이벤트 디스패처 내용을 참고하여 반복적인 내용은 줄이도록 하겠습니다.

 

이벤트 그래프 처리 내역


  •  
    • Begin Play / Initialize Animation - Ct_Cmpt_Locomotion 에서 보내주는 이벤트 바인딩 및 변수 등록.
 

Advanced Locomotion Component (UE5) 가이드 - 3 ( Unarmed / CT_Cmpt_Locomotion )

CT_Cmpt_Locomotion 에서 하는일은?ALC(Advanced Locomotion Component) 에서 가장 중요한 기능을 하는 부분이 액터컴포넌트 블루프린트인 CT_Cmpt_Locomotion  입니다. 이 블루프린트에서 RPC( Remote Procedure Call(원격

tartist.tistory.com

 

Event Blueprint Update Animation 

  • BlueprintThreadSafeUpdateAnimation 에서 처리된 변수들을 이용하여 참/거짓을 체크하고 그에 따라 Ground인지 아닌지등을 판단한다. BlueprintThreadSafeUpdateAnimation 내용은 아래에서 자세히 다룰 예정.
  • Set Ground Distance - IsFalling 값을 얻어와 Ground Distance Float 값 지정.
  • IsRunningIntoWall 값을 얻어와 벽에 닿은 상황인지 체크.

 

EventLocomotionGraph

  • 워낙 많은 Ct_Cmpt_Locomotion의 이벤트 정보를 처리하는 곳이라 Unarmed에 필요한 정보들만 파란색으로 표시함과 동시에 스샷과 함께 자세히 설명하고 그 외에 정보들은 빨간색으로 설명 스킵함.
  • Event_OnSprintChanged : 스프린트인지 Ct_Cmpt_Locomotion 에서 보내주는 이벤트 값을 등록. Unarmed에 필요함.

  • Event_OnSetOverrideName : Unarmed 전용 모드에서는 필요없음
  • Event_OnSetMovementType : Walk / Run 등의 정보와 Crouch 정보등을 Ct_Cmpt_Locomotion  이벤트에서 얻어오게 됨. 기능을 확장하여 State Changed Bool 값까지 만들어 사용하게 되고 Crouch 모션을 참조하는데 사용됨.

  • Event_OnSetAnimset : 애님셋의 이름을 얻어와서 애님셋 데이터 테이블과 연결시켜주는 역할을 함. 애님셋 이름은 Unarmed로 고정시켜 사용해도 됨. 다만 기능 확장을 언젠가 할 수도 있기에 고정값으로 사용하는것은 비추. 여기서 사용하는 Animset Changed 변수역시 무기 변경등의 이슈를 체크하므로 현재 모드에서 사용되진 않음.

  • Event_OnSetRotationMode : UnArmed 모드 자체가 Forward-facing 모드만 사용하므로 실질적으로 필요가 없다.

  • Event_OnAccelerationChanged : 캐릭터의 움직임과 움직이는 방향을 체크하는 UnArmed 모드에서는 가장 중요한 이벤트 정보라 할 수 있다.

  • Event_OnSetMount : Unaramed에서 사용되지 않는 이벤트.. 

  • Event_OnRootYawOffsetStatus / Event_OnSetGlobalExtendedPose / Event_OnSetSkeletonType : 1인칭 시점에 필요한 이벤트.

  • Event_OnMovementModeChanged : Air / Ground 를 확인하는 이벤트.

  • Event_OnResetRootYawOffset : RootYawOffset을 리셋해줘야 새 RootYawSet을 얻기 위해 리셋해주는 이벤트.

 

애니메이션 그래프

Locomotion 

  • 실제적으로 UnArmed의 최종 모션 처리를 하는 가장 중요한 부분. 

ExtendedPose는 무기를 들었을 때나 TurnInPlace등에서 사용되는 모션에 사용되는 추가 포즈 처리라 UnArmed 에서는 사용되지 않아서 없애도 문제가 발생하지 않음.

  • LocomotionSM 스테이트 - IdleSource의 그라운드 처리 부분과 JumpSource의 Air 처리 부분으로 나뉜다.

  • 그라운드 영역 처리 확인
    • 크게 IdleSource / JogSource / PivotSources(Unarmed에서는 필요없음)  세 가지로 처리됨.

  • 처리 순서
    • Idle(Stop) 스테이트 -> IdleSource() 스테이트 에일리어스 -> Start 스테이트 -> Cycle 스테이트 -> JogSource 스테이트 에일리어스 -> Stop 스테이트 -> Idle 스테이트 순으로 처리하며 이동이 될 때와 멈출 때에 대한 분기로 각 스테이트별로 처리되게 된다.
    • IdleSource(스테이트 에일리어스) : Idle/Stop 스테이트에서 이동이 시작될 때 에일리어스를 거쳐 분기를 타고 이동 스테이트로 넘어가게 됩니다.
    • JogSource(스테이트 에일리어스) : 이동을 시작하거나 루프 될때에 캐릭터가 멈추게 될 때 해당 에일리어스를 거쳐 분기를 타고 스탑 혹은 Idle 스테이트로 가게 됩니다.

 

 

Idle 스테이트 분석 - 아래를 펼쳐 확인

더보기

 

  • Unarmed에 필요한 부분만 분석하고 나머지는 추후에 분석하도록 하겠습니다. LayerBlend 부분은 AL(Advanced Locomotion)의 애디티브 모션처리 부분이라 무기를 쓰지 않는 이상 필요가 없는 부분이라 없어도 Unarmed만 플레이하는 데는 문제가 없습니다.
  • IdleSM 스테이트 - TurnInPlace 부분도 Unarmed가 아닌 1인칭 시점에서 필요한 부분이라 없어도 Unarmed만 처리하는데는 문제가 없다.
  • Idle -> Idle Break 조건 분석.
    •  Time Until Next Idle Break 시간을 계산하여 Idle Break 모션이 나와야 할 타이밍을 실시간으로 계산하여 0초에 도달했을 때 Break Idle 모션이 나오도록 처리하는 구조.
  • Time Until Next Idle Break 시간은 Idle 스테이트의 SetupIdleState_Layer와 UpdateIdleState_Layer에서 계속해서 업데이트 시켜 주면서 시간을 계산해 줍니다.
  • Set Up Idle State Layer

    • Choose Idle Break Delay Time - Pawn의 위치에 달라지는 일부로직을 사용하여 모든 캐릭터가 동시에 유휴 휴식시간을 플레이하지 않고도 클라이언트 전반에 걸쳐 대략 일관된 동작을 갖도록 할 수 있습니다.
  • Reset Idle Break Transition Logic - 위에서 얻은 Idel Break Delay Time을 이용해 IdleBreak 남은 시간을 리셋 시켜줌.
  • Update Idle State Layer - Setup 에서 최종 처리된 로직을 받아 최종 모션을 찾아 뿌려준다. 여기서 뿌려주는 모션은 각 이벤트를 처리하는 부분에서 폭넓게 사용되는 Set Animation Datas 함수에서 처리된 모션을 Node와 Context로 받아 뿌려준게 된다.
  • 위에서 Idle Break 조건이 맞게 되면 Idle Break 스테이트로 넘어오게 되며, 조건에 맞는 Idle Break 모션이 나오게 된다.

 

 

 

Start 스테이트 분석 - 아래를 펼쳐 확인

더보기

 

start 스테이트에 들어오는 조건

  • Idle Source에서 Idle 스테이트와 Stop 스테이트 시에 진입 가능
  • 조건 1 : PlayStartAnim(1), InWall(0), IsValidStart Anim(1) -> Start 모션으로 진입
  • 조건 2 : PlayStartAnim(1), InWall(0), IsValidStart Anim(0) -> Cycle모션으로 진입
  • IsValidStartAnim 함수 파악하기 - 가장 적절한 스타트 모션이 출력될 수 있도록 처리하는 영역. UnArmed에서 가장 중요한 처리가 스타트모션인 만큼 가장 중요한 함수라고 할 수 있다.

    • 각 방향을 체크하여 Velocitydirection 값을 얻어온다.
  • Is Valid Fwd Start 및 나머지 방향들을 처리하는 함수를 추적해 보자.
    • Set Animation Datas의 Set Anim Valid 함수를 통해 방향에 대한 처리를 진행한다.
    • Start / Stop / Pivot의 스트럭쳐 정보를 Struct Anim Cardinal파일을 이용해 얻어오게 되며 각 방향성에 대해 참/거짓을 처리하게 된다.

 

  • Start State 내부 분석
    • Unarmed에 필요한 부분만 확인하고 나머지는 넘어가자. LayerBlending은 무기모션에 필요하다.
  • Sequece Evalutor : 시퀀스가 재생될 때의 조건을 만들어 줍니다. 지정된 애니메이션의 지정된 프레임을 구합니다. 
    • SetUpStartAnim_Layer : Get Start Anim 함수를 이용해 무엇이 가장 적절한지 파악하여 모션을 Set 해줌. 여기서 가장 중요한 변수는 LastVelocityDirection 이란 변수로 현재 캐릭터 각도를 얻어와 방향을 설정해 준다. LastVelocityDirection 값은 CT_Cmpt_Locomotion의 Event_OnAccelerationChanged 이벤트 에서 얻어오게 된다.
  • Update Start Anim_Layer : 드디어 Animation Library 플러그인을 사용하는 공간이다. 시작 애니메이션이 이동한 거리가 Pawn 소유자가 이동한 거리와 일치하는지 확인하기 위해 거리 일치를 사용합니다. 이렇게 하면 애니메이션과 모션 모델을 동기화하여 발이 미끄러지는 것을 방지할 수 있습니다. 이는 시작 애니메이션의 재생 속도를 효과적으로 제어합니다. 애니메이션이 너무 느리거나 빠르게 재생되는 것을 방지하기 위해 유효 재생속도를 제한합니다. 유효 재생률이 고정된 경우에도 여전히 약간의 미끄러짐이 나타납니다. 이 문제를 해결하기 위해 나중에 Stride Warping을 사용하여 포즈를 조정하여 나머지 차이를 수정합니다. 
    • 가장 중요한 변수는 DisplacementSinceLastUpdate 라고 할 수 있는데, 이 변수가 월드 로케이션과 Owner 로케이션에서 뺀값을 Vector Length XY로 계산하여 Pawn의 이동 거리와 애니메이션의 이동거리를 보정하는데 사용해 준다.
    • DisplacementSinceLastUpdate 값을 델타타임으로 나누면 현재 처리되고 있는 DisplacementSinceLastUpdate 값의 남은 시간을 계산하여 Cycle 모션의 InWall 상황에서 사용하게 된다.
  • SetUpStartState : 스프린트 인지 아닌지 방향이 Forward로 들어왔는지 등을 체크하여 알려주는 스테이트 입니다.
  • UpdateStartState : Root Yaw Offset Mode값을 설정하여 스켈레탈 메시의 방향과 애니메이션의 방향이 다를경우 강제로 로테이트를 시켜 주게 되는데, 그 값을 모션과 캐릭터의 움직임과 싱크를 맞춰 돌려주는 데 사용하게 되는데, 그 변수 값이 'Root Yaw Offset' 값이다. 
  • Root Yaw Offset 값을 처리하지 않게 되면.. 아래처럼 싱크가 어긋나게 Start 모션이 나오게 됩니다.
  • Root Yaw Offset 값을 처리하게 되면.. 아래처럼 싱크가 맞춰져 Start 모션이 온전하게 나오게 됩니다.

 

 

 

Cycle 스테이트 - 아래를 펼쳐 분석

더보기

 

cycle 스테이트에서는 루프모션이 잘 처리하는데 초점이 맞춰져 있다. 해당 스테이트에도 불필요한 부분을 걷어내고 가이드를 진행해 가겠습니다.

  • InWall 처리 - 벽에 닿을 때 이동 모션이 나오지 않도록 
    • 상위 Start 스테이트에서 처리된 DisplacementSinceLastUpdate 에서 구해온 DisplacementSpeed 값이 50이하일 경우와 InWall의 조건이 맞을 경우 모션이 서서히 멈추게 됩니다.

 

  • Lean 처리 - Yaw Delta Speed를 이용해 Additive Lean Angle 값을 이용해 미리 Lean 처리 되어 있는 Blend Space 모션을 활용해 캐릭터가 기울어지는 것을 표현하였다.

 

  • UpdateCycleAnim_Layer : 위에서 처리된 DisplacementSpeed 와 StrideWarpingCycleAlpha값들을 이용해 완전히 블렌딩 되는 상황이 어떤건지 처리하여 온전한 모션을 뿌리도록 처리 된다. 그리고 Sprint 상황도 체크한다.

 

 

 

Jump 분석 - 아래를 펼쳐 확인

더보기

 

점프의 시작 / 고점과 저점 / 떨어짐 / 착지 별로 스테이트가 돌아가게 됩니다.

  • 각 스테이트별 모션은 'Set Animation Datas' 함수에서 데이타테이블에서 참조된 애님 애셋이 Structure로 할당받게 되고, 할당받은 모션을 변수로 저장하여 호출하여 사용합니다.
  • Override나 Layerblend 부분은 무기 장착시 애디티브 모션을 쓰기 위해 필요한 곳이라 Unarmed 모션 에서는 없어도 작동하는데 문제 없음.




  • 착지시에는 해당 스테이트에서 처리되지 않고, 마무리 포즈를 캐싱 받아 FullBodyAdditives에서 처리하게 됩니다. 착지 모션을 Local Space 모션으로 제작하여 이동 속도에 따라 몸에 반동을 주면서 뛰어나가도록 설계하기 위함입니다.
    • 없어도 크게 어색하진 않은 이유는 ALC 자체가 모션 퀄이 높지 않아서 그런걸로보임.. 모션퀄이 좋으면 티가 많이 납니다.
  • Recovery를 이용해 Local Space 모션을 사용했을 때 - 착지 충격을 적용하며 앞으로 나아간다.
  • Recovery를 이용하지 않을 경우 - 아무런 충격없이 모션이 그냥 이어진다.

 

  • 위에서 사용된 Local Space 애디티브의 Recovery 모션.
    • 해당 에셋의 28프레임이 대상 프레임이 되어 해당 모션과 다른 프레임의 모든 모션은 Local Space 애디티브 모션이 되어 사용하게 된다.

 

 

 

최종 Output Pose 처리

  • Unarmed에 필요한 부분은 위 이미지에 표시된 내역만 있으면 문제없이 플레이 된다.
  • 1번 영역은 위에서 집중 해설된 내역으로 애님 스테이트를 처리하는 지역이다.
  • 2번 영역은 1번을 캐싱 받아 점프 Additive 및 Slot 모션등을 처리하는 지역이다.
  • 3번 영역은 위 Start 스테이트에서 얻어온 Root Yaw Offset 값을 이용해 캐릭터 root를 돌려준다.
    • 추가적으로 Leg Ik를 처리하는 부분이 처리되 있는데, 해당 내용을 그대로 쓰기보다 Ik rig 방식을 사용하는 것을 추천한다.https://tartist.tistory.com/160
 

Unreal 5 - IK Rig를 이용해 Foot IK 를 쉽게 만들어 보자.

언리얼에서는 오랜 세월 풋 IK를 최대한 직관적으로 만들어내고자 많은 노력을 해왔습니다. 언리얼 5에 도입된 IK Rig를 통해 Foot IK를 셋업 하게 돼 기존에는 제어하기 힘들었던 많은 부분들을 직

tartist.tistory.com

 

반응형
반응형

CT_Cmpt_Locomotion 에서 하는일은?

ALC(Advanced Locomotion Component) 에서 가장 중요한 기능을 하는 부분이 액터컴포넌트 블루프린트인 CT_Cmpt_Locomotion  입니다. 이 블루프린트에서 RPC( Remote Procedure Call(원격 프로시저 호출) )까지 사용하면서 데이터 통신을 하도록 설계되어 있고, 모션의 최종 결정을 하는데 있어서 중요한 정보들을 결정 짓게 합니다. 따라서 여기서 결정되는 모든 정보는 현재 플레이 중 메인 Pawn의 캐릭터 BP / 애님 BP와도 모두 공유하게 됩니다.

RPC에서 설정된 변수들은 데이터 테이블에 이미 등록되어 있는 정보들을 캐릭터의 실제데이터로 만들어주는 역할을 하게 됩니다.

 

다만 CT_Cmpt_Locomotion에도 역시나 너무나 많은 기능들이 있기 때문에, Unarmed 모드 주요 기능 처리 부분만 먼저 다루도록 하겠습니다.

 

Begin Play

  • 현재 플레이에서 메인 Pawn 정보를 얻어와서 메인 Pawn의 Rotation Mode를 체크한다.
    • 체크 후 Forward-facing( Unarmed 모드) 모드 일 경우 캐릭터 무브먼트를 '무브먼트 방향으로 회전 조정' 을 사용한다. 3인칭 시점인 Velocity Mode를 사용하겠다는 뜻이다. 

 

Event Tick

  • 현재의 무브먼트 모드를 실시간으로 체크하여 캐싱해주고, Ground(Not Air) 상태일 때 Acceleration 값을 커스텀이벤트로  체크하고, Spint 기능도 커스텀 이벤트로 실시간으로 체크하게 된다.

  • Check Acceleraition -  Custom Event
    • Has Acceleration 변수값으로 현재 이동값이 들어갔는지 체크한다.
    • Has Acceleration값이 있을 경우 Last Direction을 체크하여 캐릭터의 방향도 체크한다. 여기서 결정된 값에 의해 AnimBP에서 캐릭터의 Start 모션을 결정하게 된다.

  • 여기서 결정되는 Has Acceleration은 서버에서 실행(Excutes On Server)되는 변수로서 서버에서 언제든 읽기 쓰기가 가능한 네트워크 리플리케이트 변수로 설정되어 지속적으로 모든 영역에서 체크되게 된다.

  • Call Event On 기능을 쓰기 위해서는 이벤트 디스패처로 등록해서 사용해야 한다.

  • Anim Graph에서 위 이벤트 정보를 받아서 사용하는 방법
    • 메인 Pawn으 애님 BP의 Begin Play 이벤트에서 Initialization 함수에서 Ct_Cmpt_Locomotion를 Get Component by Class로 변수를 등록하고 이벤트를 받아서 바인딩하여 사용합니다.

 

  • Update Sprinting Value - Custom Event
    • 왼쪽 Shift를 길게 누르면 스프린트 기능이 활성화 되게 되는데, 그것을 체크하여 스프린트인지 아닌지를 모든 영역에 알려주는 역할을 하고 Set Movement Config에 스프린트 설정값으로 무브먼트 속도를 맞추게 됩니다.
    • 스프린트  기능이라 별로 기능이 없을 거 같지만, Current Movement Config의 값을 변경하게 되면서 그에 따른 Data테이블의 애님셋 정보를 읽어와서 회전량, 마찰값등을 다시 설정하게 되므로 꾀 많은 로직이 일어나게 되는 부분이다.

  • Is Sprinting 변수를 Replicate로 설정
    • Get Is Sprint 함수가 스프린트값을 보조해 줘서 스프린트가 True 일경우에 대한 Velocity Direction값을 스프린트값에 맞도록 딜레이 시켜주는 역할을 한다. 해당 기능은 조작감 이슈가 있어 호불호가 갈리는 기능이라 딜레이를 없애서 사용하는 경우도 많다.

  • Sprint Value 값 서버로 전송
    • 그러기 위해 이벤트 디스패처로 등록하여 다른 곳에서 손 쉽게 쓸수 있도록 한다.

  • 위 정보를 토대로 'BP_Character' 캐릭터 블루프린트에서 CT_Cmpt_Locomotion의 이벤트의 정보를 실시간으로 쓸 수 있게 된다.

  • Anim BP에서 바인드하여 Sprint 정보 사용
    • Ct_Cmpt_Locomotion에서 등록된 Replicate형 변수들은 다 동일하게 호출하여 사용합니다.
    • IsSprint 변수값을 이용해 Anim Set Structure에서 애님셋 데이터 값을 불러와 Sprint 상태 Value값을 Set Animation Datas 함수에서 사용하게 됩니다.

 

Unarmed 모드에서 사용하는 추가적인 이벤트 디스패처 값.

  • Evnet_OnSetMovementType
    • Enum파일인 Enum Movement Type 을 사용하여  무브먼트 상태값을 공유하게 됩니다.

  • Anim Graph에서 사용
    • Ct_Cmpt_Locomotion 이벤트를 바인드하여 해당 상태값을 변수로 등록하여 사용하게 됩니다.
    • Set Animation Datas 에서 LS AnimSet 파일을 호출하여 LS Movement Type으로 사용하게 됩니다.

 

  • Event_OnSetAnimset
    • 등록된 이벤트 디스패처를 이용하여 Anim Set Name에 따른 Anim Set Data table 정보를 얻어오는데 사용되게 됩니다.

  • Anim BP에서 사용
    • 위 이벤트 디스패처들과 동일하게 Bind 하여 사용.

 

Ct_Cmpt_Locomotion에서 Unarmed 모드를 작동하는데 필요한 이벤트는 위 정보만 있으면 됩니다. 나머지 이벤트 디스패처 내용들은 Unarmed가 아닌 다른 무기와 다른 로테이션 모드등에서 필요한 정보들이라 Unarmed에서는 필요하지 않은 정보들입니다. 다음 포스팅에서는 Anim Blueprint 작동 내용에 대해서 가이드해 드리도록 하겠습니다.

반응형

+ Recent posts