[UE5 KDT2024] 7. 트리거 (키눌림) 차이, 언리얼 빌드 시스템
1. 입력 컨텍스트에서
트리거 - 인덱스 설정에 다른 차이를 알아보자
1) IA_Test 입력액션 추가 후, IA_Context에 IA_Test추가.
(1) 두개 추가 후, 트리거와 시간 한계치 설정
ㄴ 언리얼에서 언리얼 기능 테스트시 블루프린트가 편할 수 있음
2) BP_Character 블루프린트에
IA _TEST추가해서 함수마다 PrintString 붙여줘서 테스트준비
3) 디폴트 폰 클래스를 BP_Character로 변경 하고 실행
▶️ 길게 누르기 : Hold 입력 결과
ㄴ Start -> OnGoing ..
ㄴ 2초 안지났으면 OnGoing 반복 .. OnGoing
ㄴ 2초 안지나고 떼면 OnGoing -> 뗌 -> Canceled
ㄴ 2초 지나면 OnGoing -> 2초지남 -> Trigger -> .. -> Trigger (떼기 전까지)
ㄴ 2초 지나고 떼면 Trigger-> 뗌 -> Complete
▶️ 길게 누르기 및 해제 : Hold and Release
ㄴ Start -> OnGoing ..
ㄴ 2초 안지났으면 OnGoing .. OnGoing
ㄴ 2초 안지나고 떼면 OnGoing -> 뗌 -> Canceled
ㄴ 2초 지나면 OnGoing -> 2초지남 -> OnGoing -> .. -> OnGoing (떼기 전까지)
ㄴ 2초 지나고 떼면 OnGoing -> 뗌 -> Trigger -> Complete
✅ 길게 누르기와 길게 누르기 및 해제의 차이
지정한 시간이 지나면
길게 누르기 : Trigger 상태로 변함
길게 누르기 및 해제 : OnGoing 상태 유지.
▶️ 눌림
Pressed
한번만 처리됨.
꾹눌러도 한번만 처리
▶️ 다운
Down
눌린 프레임만큼 Trigger 처리. 뗄 때 Completed
▶️ 탭
0.2초(시간한계치)를 넘어서도 탭을 누르고 있을 경우 -> 마지막 Canceled |
0.2초 (시간 한계치) 이하로 눌릴 경우 -> 놓았을때 Trigger -> Completed ㄴ 눌림과 비슷하지만 눌린 프레임만큼 OnGoing 호출 |
|
0.2초(시간한계치)를 넘어서도 탭을 누르고 있을 경우 -> 마지막 Canceled
0.2초 (시간 한계치) 이하로 눌릴 경우
-> 놓았을때 Trigger -> Completed
ㄴ 눌림과 비슷하지만
눌린 프레임만큼 OnGoing 호출
▶️ 펄스
간격 : 시간간격
트리거 제한 : 0으로하면 무제한
Start -> 첫프레임은 Trigger -> 시간 간격 사이 OnGoing호출 -> 시간간격(0.1초마다) Trigger호출 -> 반복 … -> 떼면 -> Canceled
▶️ 콤보 ( 베타 )
시간내에 입력된 콤보가 순서대로 모두 눌리면 Trigger 발생
▶️ 코딩된 액션 (Chorded Action)
: 트리거 되기 위해 다른 특정 액션이 Triggerd 되어 있어야 하는 액션.
ex) 점프 공격은 점프 액션이 선행되어 있어야 트리거 될 것.
ex) 특정 키 입력 조합이 입력 되어야 트리거 됨 => ctrl + c 를 같이 눌러야 복사
1) 생성
(1) IA_CodingAction 입력액션 추가
(2) IA_Context - IA_Test 내 추가 - 인덱스 코딩된 액션 추가, 코드액션에 IA_CodingAction 설정
(3) IA_Context 에 IA_CodingAction 추가
(4) 블루프린트에 테스트 출력 함수 연결
(5) 실행 후
5를 누르면 반응없음
6을 누르면 coding trigger 출력됨
5를 누른상태에서 6을 누르면 TestTrigger 출력
6을 누른상태에서 5를 누르면 coding trigger 출력
2. [이론] 언리얼 빌드 시스템
▶️언리얼만의 빌드 시스템을 가지고 있다 UBT (Unreal Build Tool)
- C++ 소스들의 빌드 과정 총괄하는 프로그램.
▶️ 프로젝트 생성시 3개의 C#파일이 생성
1) 프로젝트명.Build.cs
- 빌드 옵션을 관리 (PCH쓸건지, 외부 모듈 쓸건지)
- 시작파일.
- 추가할 언리얼 모듈 체크 (PublicDependencyModuleNames)
- 언리얼은 기능을 모듈로 분리함.
- 모듈 추가시 PublicDependencyModuleNames.AddRange 여기나 private에 추가하면 됨
- 언리얼은 기능을 모듈로 분리함.
2) 프로젝트명.Target.cs
- 빌드 타입을 정의한다. : 어떤 모듈을 빌드에 포함 시킬 건지, 어떤 타입의 빌드 결과물을 만들건지 (dll, exe)
- 타겟 : 윈도우인지, 모바일인지
3) 프로젝트명Editor.target.cs
▶️ 공식링크 : DedecatedServer용 target.cs를 만드는 방법인데, target.cs 이해하기 좋음
시작시 위 두개의 파일을 읽음
빌드구성 : 개발, 디버그, 출시, 테스트 등 다양한 빌드 구성 지원
플랫폼 지원 : 크로스플랫폼 빌드를 지원, 각 플랫폼에 맞는 툴체인과 설정을 자동으로 지원 -> Target.cs
모듈시스템 : 언리얼 엔진은 모듈 단위로 구성되어 있으며
ubt는 각 모듈의 빌드 규칙을 정의한 *Build.cs 파일을 기반으로 빌드
▶️ 언리얼 리플렉션 시스템
객체가 런타임 중에 자기 자신을 탐색하고 조작할 수 있는 기능
주요기능
- 클래스, 구조체, 열거형, 변수 등의 메타 데이터등을 런타임에 검색
- 객체의 속성(변수) 값을 런타임에 읽고 쓰기
- 함수 호출을 런타임에 동적으로 수행
- 블루프린트에 c++코드, 함수를 노출
- 네트워크, 가비지 컬렉션 기능 지원
리플렉션 시스템을 통해 자신의 루트를 쫓아갈 수 있다.
▶️에디터를 실행하거나 솔루션 빌드 -> 언리얼 빌드 툴(UBT)이 실행됨
-> Target.cs, Build.cs파일들이 c# 컴파일러에 의해 컴파일됨.
-> 모듈 시스템은 빌드 하는 중에 Unreal header tool(UHT)를 호출한다.
-> UHT는 언리얼 c++의 들어간 헤더 파일들을 조사하여 리플렉션 데이터를 생성
- UHT가 작업 끝나면 생성된 리플렉션 데이터는 헤더파일의 GENERATED_BODY()로 들어간다
-> 빌드그래프 생성 (.xml) : 빌드 후처리 여기서
-> c++ 컴파일러 실행
좀더 자세한 설명 링크
▶️ 언리얼 헤더 툴(Unreal Header Tool, UHT) 는 UObject 시스템을 지원하는 맞춤형 파싱 및 코드 생성 툴입니다.
- c++코드들을 컴파일 하기 전에 모든 헤더 파일들을 순회하면서 리플렉션 시스템에 필요한 정보들을 읽어들인 후, .generated.h파일과 .gen.cpp 파일을 Intermediate 폴더에 생성하는 소프트웨어다.
- 컴파일 전 클래스를 분석하여 언리얼 오브젝트 정보를 담은 메타 데이터를 생성한다.
- 메타 데이터는 UClass라는 클래스에 보관되며 클래스 계층구조, 멤버변수, 함수 가 저장된다.
- UClass 클래스에 보관된 데이터 덕분에 Reflection이 가능해진다.
- 메타 데이터는 UClass라는 클래스에 보관되며 클래스 계층구조, 멤버변수, 함수 가 저장된다.
- 바이너리 파일 위치 : (언리얼 버전)\Engine\Binaries\DotNET\UnrealBuildTool\EpicGames.UHT.dll
- exe 파일이 아니라 dll 파일인 것에서 알 수 있듯, 독립적으로 실행되는 프로그램이 아니라 UBT같은 다른 프로그램의 모듈 방식으로 포함되는 프로그램이다.
코드 컴파일은 두 단계로 이루어집니다.
1) 언리얼 관련 클래스 메타데이터의 C++ 헤더를 파싱하고 여러 UObject 관련 기능을 구현하는 맞춤형 코드를 생성하는 UHT가 호출됩니다.
2) 일반 C++ 컴파일러가 호출되어 결과를 컴파일합니다.
▶️ UHT의 동작방식
빌드 시작 -> UBT 실행 -> UBT는 c++ 컴파일러 실행 전에 UHT을 실행
-> UHT의 작업
- 헤더 파일들을 파싱하고 ~.generated.h파일과 ~.gen.cpp 파일들에
UPROPERTY, UFUNCTION, UCLASS 등 매크로 선언된 정보들을 저장하는 역할을 수행한다.
-> 위 과정 완료시 UHT 작업은 끝남 -> 일반 c++ 컴파일러가 UHT가 생성한 코드를 포함하여 c++ 컴파일을 수행.
▶️ UHT 존재 이유
언리얼은 자체적으로 리플렉션 시스템을 구현하기 위해서 UCLASS(), UPROPERTY(), UFUNCTION()등의 매크로를 사용하는데 이 매크로를 해석해서 c++ 컴파일러가 알아들을 수 있게 코드를 재생성( .generated.h, .gen.cpp) 해주는 작업이 필요하기 때문.
▶️ 위 내용이 잘 정리되어있는 링크
생성되면 generate_body()에 들어가게됨.
빌드 그래프 (.xml) : 빌드 후처리 등
c++ 소스코드가 만들어지면 소스코드를 c++ 컴파일
▶️ Unreal header tool 사용하는 매크로
UCLASS
클래스를 리플렉션 시스템에 등록
UFUNCTION
함수를 리플렉션 시스템에 등록
UPROPERTY
변수(프로퍼티)를 리플레션 시스템에 등록
- 프로퍼티에 들어가는 옵션도 매크로에 해당. ex) VisibleAnyWhere
USTRUCT
구조체를 리플렉션 시스템에 등록
UENUM -> 언리얼에서 사용하는 enum
열거형을 리플렉션 시스템에 등록