복습
- 크리에이트디폴트 서브오브젝트 → 액터 클래스에 정의되어있다.
- CHelpers는 액터가 상속되지않았기 때문에 매개변수로 받는 액터클래스에서 함수로 접근한다.
- char (문자) → CHAR* (문자열) → Ascii → 1Byte → “…”로 표현
- wchar → wCHAR* → MBCS → 1 또는 2Byte → L”…”로 표현
- tchar → TCHAR* → Unicode로 표현 → 2Byte → TEXT(”…”)
- 문자열 표현 방법
- FText : UI같은 곳에서 문자열을 보여주기 위해 사용한다.
- FString : 문자열을 다루기 위해 사용한다.
- FName : 대’소문자 구분 없이 이름을 표기하기 위해 사용한다.
- 서로rks에 상호 바꾸기가 가능하다.
- 자료형을 생성하고 반환하기 위해 2차포인터로 반환한다.
- T** OutComponent → *OutComponent = InActor→CreateDefaultSubobject<T>(InName);
- SetRootComponent는 외부에서도 부모를 설정할 수 있게하는 함수다.
- RootComponent는 Protected다.
컴포넌트 생성 순서
- 액터 클래스의 ‘오브젝트 생성 함수’를 ‘설정함 자료형’과 ‘설정한 이름’으로 호출 - 부모 컴포넌트로 붙일거면 붙이고 아니면 ‘루트 컴포넌트’로 붙인다.
에셋 가져오는 순서
- ‘오브젝트 탐색 함수’를 ‘설정한 자료형’과 ‘변수(설정한 경로)’ 를 넣어 호출한다. - 변수에 저장된 오브젝트를 설정한 자료형의 변수에 넣는다.
디폴트 게임 모드 지정 - ACGameMode로 이름 변경
- 프로젝트 세팅 - 맵 & 모드 - AGameModeBase라는 파일을 넣는다. - 디폴트 폰 클래스에 플레이어 클래스로 선택한다.
- ‘클래스 탐색 함수’에 ‘폰 액터 자료형’과 ‘플레이어 블루프린트 클래스_C’를 넣어 호출한다.
- 이후에, 더 편하게 쓰기 위해 GetClass 함수로 호출했다.
//함수 정의
template<typename T>
static void GetClass(TSubclassOf<T>* OutClass, FString InPath)
{
ConstructorHelpers::FClassFinder<T> asset(*InPath);
*OutClass = asset.Class;
}
//함수 사용
CHelpers::GetClass<APawn>(&DefaultPawnClass, "Blueprint'/Game/BP_CPlayer.BP_CPlayer_C'");
언리얼 회전 구조체
- FRotator → P, Y, R (대부분 이걸 사용한다.)
- FQuat → x, y, z, w (가끔 이걸 사용한다.)
- FRotateMatrix → 3 * 3 회전 행렬
- FMatrix 3*3
- FMatrix → 4 * 4 행렬 (위치, 회전, 크기)
CPlayer
스켈레탈 메쉬 가져오기
- FString 매개변수를 사용하면 * 포인터를 붙여야한다.
컴포넌트 디테일 기본값 설정
- 작성하고 값이 변하지 않았거나, 기본값 변경 버튼이 뜨지 않았을 경우 : 핫 리로드를 해준다.
- 프로젝트 세팅 - 맵 & 모드 - 기본 클래스 : BP_Player로 설정해야한다.
- 플레이어 스타트 액터 : 플레이어 액터가 소환되는 지점 액터를 생성한다.
좌표값 이동
축 입력 이벤트
애니메이션
- 원래 블루프린트 만드는것처럼 콘텐츠 브라우저에서 만든다.
- 단, 부모 클래스를 C로 만든 애니메이션 인스턴스 클래스로 지정한다.
- 부모를 잘못 선택한 경우 : 파일 - 블루프린트 부모변경
시작
애니메이션 인스턴스
애니메이션 인스턴스 블루프린트 생성
- 기존 애니메이션 블루프린트 생성처럼 진행 - 스켈레톤 : 애니메이션에 사용할 스켈레톤, 부모 클래스 : 애니메이션 인스턴스 C++ 클래스
애니메이션 인스턴스 C++ 생성
- C++ 클래스 추가 - 모든 클래스 - ‘AnimInstance’ 검색
코드로 플레이어 파일에서 애니메이션 인스턴스에 애님클래스(BP_Player) 지정하기
- ‘클래스타입’ 즉, ‘자료형’을 변수로 다룰때눈 ‘TSubclassOf<자료형>’ 자료형을 사용한다.
- TSubclassOf<자료형> 자체에는 ‘포인터’ 하나가 이미 내장되어있다.
- TSubclassOf<자료형>* 로 자료형을 지정하면 기본 ‘2차 포인터’로 지정된다.
- 포인터 자료형을 사용할때 ‘클래스를 지정’하는 것을 ‘상속제한’ 이라고 한다.
- FString 자료형이라도 매개변수로 넣을때는 ‘L’을 쓰지 않는것같다.
- ‘애님인스턴스’ 자료형의 변수 선언 - ‘클래스 가져오기’ 함수를 ‘클래스 자료형’ 변수와 ‘애니메이션 인스턴스 블루프린트’ 경로를 지정해서 호출한다. - ‘메쉬 반환 함수’에 있는 ‘애님 클래스 세팅 함수’를 ‘애님 인스턴스’ 자료형 변수를 넣어 호출한다.
//클래스 자료형 변수 생성
TSubclassOf<UCAnimInstance> animInstance; //애님 인스턴스 자료형 클래스 생성
//반드시 _C를 붙여야한다.
CHelpers::GetClass<UCAnimInstance>(&animInstance, "AnimBlueprint'/Game/ABP_CPlayer.ABP_CPlayer_C'");
GetMesh()->SetAnimClass(animInstance);
- #define CHECK_NULL(함수 a) < if(a == nullptr) { return; } 을 작성한다고 가정한다.
- if(OwnerCharacter == nullptr) { return; }
- CHECK_NULL(OwnerCharacter); ⇒ 위의 if문과 같은 결과가 나온다.
- ‘매크로 함수’ 라고 한다.
- 쓰면 위험한게 있다고 한다.
- 만들어서 쓸 수 있다.
- 블루프린트 클래스도 C++ 클래스에서 파생된 ‘자식 클래스’다.
- 즉, 애니메이션 인스턴스 C++ 클래스에서 생성한 변수를 파생된 블루프린트 클래스에서 사용하기 위해서는 접근 지정자를 ‘Protected’로 해줘야한다.
블루프린트 함수의 C++ 함수를 찾는법
- 블루프린트 함수와 매칭되는 C++ 함수는 ‘Native’ 라는 글자가 붙는다.
- 보통 블루프린트 함수를 찾았을때 바로 위에 있는 함수가 블루프린트 함수의 C++ 함수다.
- 해당 함수를 사용할 클래스의 상속자 f12 - 블루프린트 함수 검색 - 찾는 함수가 있다면 ‘cpp파일’로 넘어간다 - 블루프린트 함수 검색 - 발견하면 어떤 상황에서 함수가 작동하는지 함수 포함 관계에서 알 수 있다. - C++ 함수를 찾아서 복사한다. - ‘헤더 파일’로 넘어가서 복사한 함수를 검색한다. - 가상화 함수인지 확인한다. - 반환형 ‘ 함수명 ‘ (매개변수) 까지 복사한다. - 함수 포함 관계를 확인해서 함수의 접근자를 확인한다. - 함수를 넣을 곳에 복사하고, 가상화 함수였다면 ‘override’를 뒤에 붙여준다.
//블프에서 플레이어 없으면 가져오는 함수다.
void NativeBeginPlay() override;
//BlueprintUpdateAnimation의 c 함수다.
void NativeUpdateAnimation(float DeltaSeconds) override;
애니메이션
빠른 조건 확인을 위해 ‘헤더 파일’에 ‘메크로 함수’ 정의
#define CheckTrue(x) { if(x == true) return; } //참 확인 매크로 함수
#define CheckTrueResult(x, y) { if(x == true) return y; } //참값 확인 매크로 함수
#define CheckFalse(x) { if(x == false) return; } //거짓 확인 매크로 함수
#define CheckFalseResult(x, y) { if(x == false) return y;} //거짓값 확인 매크로 함수
#define CheckNull(x) { if (x == nullptr){ return; } } //null 확인 매크로 함수
#define CheckNullResult(x, y) { if(x == nullptr) return y;} //Null 값 확인 매크로 함수
애니메이션 폰 가져와서 플레이어로 형변환
- 시작시 폰 가져오고 - 폰이 플레이어로 유효하다면 실행하지만, 유효하지 않다면 플레이어로 형변환한다.
- 헤더 빠르게 찾는법 ; 헤더 넣을 자료형 f12 - 다른이름으로 저장 - class 이후가 헤더 경로다.
- C++ 가상화 부모 클래스 함수 키워드 : Super
- 애니메이션 인스턴스 헤더 파일 - ‘캐릭터 자료형’ 변수 선언 - 애니메이션 인스턴스 cpp 파일 - include 추가 - 함수 정의 - override이니 ‘Super’ 키워드를 사용한다. - 함수 정의 - Update는 ‘에디터’ 상에서도 작동하기 때문에 ‘Null’ 체크는 반드시 미리 해줘야한다.
//cpp 파일
OwnerCharacter = Cast<ACharacter>(TryGetPawnOwner());
CheckNull(OwnerCharacter); //if문을 '매크로 함수'로 줄인것이다.
속도 지정
- 캐릭터 - 속도 가져와서 - XY의 길이를 속도에 넣는다.
- 헤더 파일 - 속도 변수를 ‘블루프린트 읽기 및 에디터 상 어디서나 사용 메크로’와 ‘카테고리’를 지정해서 선언한다. - ‘가져온 캐릭터 변수’에서 ‘속도 가져오기’함수에서 ‘평면 크기’ 함수를 속도에 저장한다.
//header
UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Animation")
float Speed;
//cpp
Speed = OwnerCharacter->GetVelocity().Size2D();
달리기 키 지정
- 블프에서 변수 명 확인하는 법 ; 블루프린트 파일 - 원하는 기능에서 마우스 대기 - 이름 확인
- 헤더 파일 - 달리기 이벤트 함수 선언(눌렀을때, 땠을때) - cpp 파일 - 액션 매핑 입력 정의 - 헤더파일 선언 함수 드래그 후 ‘Ctrl + .’ 후 ‘선언 / 정의 만들기’ 클릭 - include 추가 - ‘캐릭터 무브먼트 가져오기’ 함수의 ‘최대 걷기 속도’ 변수에 값을 정의한다.
//header
void OnRun();
void OffRun();
//cpp
//달리기 이벤트
PlayerInputComponent->BindAction("Run", EInputEvent::IE_Pressed, this, &ACPlayer::OnRun);
PlayerInputComponent->BindAction("Run", EInputEvent::IE_Released, this, &ACPlayer::OffRun);
GetCharacterMovement()->MaxWalkSpeed = 600;
캐릭터 회전과 카메라 회전
- cpp 파일 - ‘요 카메라 회전’ 변수 거짓설정 - ‘캐릭터 무브먼트 가져오기’ 함수의 ‘캐릭터 움직임 회전’ 변수 참 설정 - 걷기 속도 설정
//카메라 요 회전 정지
bUseControllerRotationYaw = false;
//캐릭터 무브먼트 디테일 설정
GetCharacterMovement()->bOrientRotationToMovement = true;
GetCharacterMovement()->MaxWalkSpeed = 400;
C++ 함수 모음
- TSubclassOf<자료형> : ‘클래스타입’ 즉, ‘자료형’을 변수로 다룰때 사용하는 자료형이다.
- 즉, UClass 모든 클래스를 다루는 자료형에서 특정 자료형만 쓰기 위해 제한해서 사용하는 것이다.
- UClass* < - > TSubclassOf<자료형>* : 서로서로 변환이 가능하다.
- 맵 & 모드에 넣을 CGameMode에서 ‘BP_Player’를 지정할때 사용했다.
- 플레이어 블루프린트의 ‘애님클래스’에 ‘애니메이션 인스턴스 클래스’ 파일을 지정하기 위해 사용했다.
애니메이션 관련 함수
- NativeBeginPlay() override : 블루프린트 BeginPlay 함수다.
- NativUpdateAinmation(float DeltaSeconds) override : 블루프린트 업데이트 애니메이션 함수다.
- 이 함수는 게임 실행 중 뿐만 아니라 ‘에디터’ 상에서도 작동하기 때문에 ‘Null’ 체크를 반드시 해줘야한다.
- TryGetPawnOwner() : 애니메이션의 폰을 가지고 있는 주체를 가져오는 함수다.
- GetVelocity() : 캐릭터의 속도를 가져오는 함수다.
- Size2D() : 2D 평면의 속도값을 가져오는 함수다.
- Size() : 3D 공간의 속도 값을 가져오는 함수다.
- UInputComponent : 폰의 입력을 담당하는 자료형이다.
- BindAxis(축 매핑 이름, 입력 받을 주체, 발생할 이벤트) : 축 이벤트 발생 함수다.
- BindAction(액션 매핑 이름, 어떤 입력인지 확인하는 열거형(Pressed, Released 등), 입력 받을 주체, 발생할 이벤트) : 액션 이벤트 발생 함수다.
- UCharacterMovementComponent : 캐릭터의 움직임을 잠당하는 자료형이다.
- GetCharacterMovement() : 캐릭터 무브먼트를 가져오는 함수다.
블루프린트 함수 모음
- Try Get Pawn Owner : 애니메이션의 폰을 가지고 있는 주체를 가져오는 함수다.
- Get Velocity : 캐릭터의 속도를 가져오는 함수다.
- Use Controller Rotation Yaw : 요 카메라 회전 사용 여부 함수다.