- C#과 C++의 가장 큰 차이 : C#은 메모리 관리를 직접하고 개발자는 개발만 하지만, C++은 개발도 책임도 개발자가 지는것이다.
- 언리얼 C++ : C++에서 게임 개발에 필요한 기능을 가져온 것이다.
- 헤더에서 변수를 선언할때 상속받는 클래스에 따라 구별하기도 한다.
플레이어 - 이동 컴포넌트, 무기 소환 예제
(작성한) 무브먼트 컴포넌트 생성
- ClassGroup = (Custom) ⇒ 컴포넌트 검색시 묶음의 이름
- meta = (BlueprintSpawnableComponent) ⇒ 컴포넌트 검색에 컴포넌트가 나타나도록 설정하는 명령어다.
- 헤더 파일 - 무브먼트 컴포넌트 선언 - cpp 파일 - ‘무브먼트 컴포넌트’ 자료형을 인스턴스화 시키는 함수로 호출해서 저장
//header
private:
UPROPERTY(VisibleAnywhere)
class UCMovementComponent* Movement;
//cpp
CHelpers::CreateActorComponent<UCMovementComponent>(this, &Movement, "Movement");
컴포넌트를 소유한 ‘액터 컴포넌트’를 캐릭터 컴포넌트로 바꾸기
- 헤더 파일 - 캐릭터 변수 선언 - 컴포넌트의 ‘오너 가져오기’ 함수를 호출하여 캐릭터 클래스로 바꿔서 저장하기
//header
private:
//누가 소유하고있는 클래스인가 저장 : 캐릭터 클래스에서 상속받아서 사용한다.
class ACharacter* OwnerCharacter;
//cpp
//오너 캐릭터 : 이걸 넣은 클래스의 캐릭터를 가져온다.(플레이어에 넣으면 플레이어 캐릭터, 적에 넣으면 적 캐릭터가 나온다.)
OwnerCharacter = Cast<ACharacter>(GetOwner());
맵 입력 이벤트 연결
- 함수 선언 정의 여러개 한번에 만들기 : 헤더 파일 - 함수 여러개 선언 - 드래그 - 우클릭 - ‘선언 / 정의 만들기’ 클릭
- 생성한 컴포넌트가 깨진것을 고치는법 : 블루프린트 파일 - 우클릭 - 에셋 액션 - 리로드
- 헤더 파일 - 이벤트를 실행할 함수 선언 - cpp 파일 - 움직임이 가능한지 확인한다. - 회전값은 마우스 ‘요 회전값’을 넣는다. - 방향을 회전한 값의 전방 벡터를 가져와서 저장한다. - 캐릭터의 이동 입력을 방향과 입력된 축을 받아서 호출한다. - 축 입력 이벤트를 연결할 cpp 파일 - 축 이벤트 연결
//header
public:
void OnMoveForward(float InAxis);
void OnMoveRight(float InAxis);
void OnHorizontalLook(float InAxis);
void OnVerticalLook(float InAxis);
//cpp
CheckFalse(bCanMove);
//캐릭터의 카메라 회전값을 가져와서 로테이터 변수에 저장한다.
FRotator rotator = FRotator(0, OwnerCharacter->GetControlRotation().Yaw, 0);
//캐릭터의 방향을 회전값의 방향으로 지정한다.
FVector direction = FQuat(rotator).GetForwardVector();
FVector direction = FQuat(rotator).GetRightVector();
OwnerCharacter->AddMovementInput(direction, InAxis);
//축 입력 이벤트를 연결할 cpp
PlayerInputComponent->BindAxis("MoveForward", Movement, &UCMovementComponent::OnMoveForward);
PlayerInputComponent->BindAxis("MoveRight", Movement, &UCMovementComponent::OnMoveRight);
애니메이션 속도값 전달
- 오버라이드 함수의 Super 빠르게 치는 법 : 선언한 함수 정의 - 클래스 명 뒤에 전체 드래그 - Super::를 치고 복붙(매개변수는 자료형을 지우고 넣는다.)
- 정의되지 않은 형식을 사용했습니다 Error : ‘헤더 파일’을 추가하지 않았다는 뜻이다.
- 애님 인스턴스 헤더 파일 - 속도 변수 선언 - BeginPlay와 Update 함수 선언 - 애님 인스턴스를 소유한 오너를 저장할 변수 선언 - cpp 파일 - 폰의 주인을 가져오는 함수를 호출하여 ‘캐릭터 클래스’로 바꿔서 저장하고 비어있는지 확인한다. - 업데이트 함수 정의 - 폰의 오너가 비어있는지 확인한다.
//header
protected:
UPROPERTY(BlueprintReadOnly, EditAnywhere, Category = "Animation")
float Speed;
public:
void NativeBeginPlay() override;
void NativeUpdateAnimation(float DeltaSeconds) override;
private:
class ACharacter* OwnerCharacter;
//cpp
OwnerCharacter = Cast<ACharacter>(TryGetPawnOwner());
CheckNull(OwnerCharacter);
CheckNull(OwnerCharacter);
Speed = OwnerCharacter->GetVelocity().Size2D();
애니메이션에 속도 연결
- 슬롯 Slot 검색하는 법 : ‘Default Slot’ 검색 - 노드 클릭 - 슬롯 변경
- 본 별로 레이어로 블렌딩 노드 정리 : 노드 클릭 - 런타임 - 웨이트 블렌드 - ‘핀으로 노출’ 체크 해제 - 다이내믹 값(외부에서 설정할 수 있는 값) 체크
- 블루프린트 파일 - 새 스테이트 머신 추가 - 기본 상태 블랜드 스페이스 추가 - 블랜드 스페이스의 속도를 넣는 핀에 ‘Get Speed’를 검색하여 연결한다. - 생성한 스테이트 머신을 ‘포즈 저장’ - 저장할 포즈를 모을 ‘포즈 저장’을 생성하여 연결한다. - ‘본 별로 레이어로 블렌딩’을 상체를 ‘포즈 저장’한다. - 레이어 설정 ‘ 인덱스 ‘ 분기 필터 + ‘ 본 이름 : spine_01(허리)로 저장한다. - 상체 포즈를 가져와 ‘본 별로 레이어로 블렌딩’을 ‘풀바디’를 섞는다. - 레이어 설정 ‘ 인덱스 ‘ 분기 필터 + ‘ 본 이름 : root(몸 전체)로 저장하고 최종 노드로 연결한다.
애니메이션에 할당할 속도 설정
- 헤더 파일 - 속도 설정 함수 선언 - 행동 설정 함수 선언 - cpp 파일 - 오너 캐릭터의 ‘캐릭터 무브먼트 컴포넌트 가져오기’ 함수를 호출하여 ‘최대 걷기 속도’를 설정한다. : 설정하는 값은 ‘속도배열 중 입력된 행동 상태의 열거 타입’으로 정해진다. - 각 행동 설정 함수 정의 : 속도 설정 함수를 스피드 타입을 줘서 호출한다. - 축 입력 이벤트 cpp - 축 이벤트 연결
//header
public:
void OnSprint();
void OnRun();
void OnWalk();
private:
void SetSpeed(ESpeedType InType);
//cpp
//최대걷기속도 설정
OwnerCharacter->GetCharacterMovement()->MaxWalkSpeed = Speed[(int32)InType];
SetSpeed(ESpeedType::Sprint);
//축 입력 이벤트 cpp
PlayerInputComponent->BindAction("Sprint", EInputEvent::IE_Pressed, Movement, &UCMovementComponent::OnSprint);
마우스로 카메라 회전
- 헤더 파일 - 어느 축인지 함수 선언 - 카메라 회전 강도를 설정할 변수 선언 - cpp 파일 - 마우스 요 회전값을 ‘축값 * 회전 강도 * (컴퓨터 성능 보정 값 : Update에서는 없어도 된다.)’를 넣어 호출한다. - 축 입력 이벤트 cpp - 축 입력 연결
//header
void OnHorizontalLook(float InAxis);
void OnVerticalLook(float InAxis);
//cpp
//카메라 회전
//GetWorld()->GetDeltaSeconds() : 컴퓨터 성능 차이 보정 값
OwnerCharacter->AddControllerYawInput(InAxis * HorizontalLook * GetWorld()->GetDeltaSeconds());
//축 입력 이벤트 cpp
PlayerInputComponent->BindAxis("VerticalLook", Movement, &UCMovementComponent::OnVerticalLook);
PlayerInputComponent->BindAxis("HorizontalLook", Movement, &UCMovementComponent::OnHorizontalLook);
전투 상태를 위해 캐릭터 정면 회전을 사용할건지, 마우스 회전을 사용할건지 정하는 함수 정의
- 헤더 파일 - 마우스 회전 사용 및 비사용 함수 선언 - cpp 파일 - 사용할때는 ‘마우스 요 회전’ 체크하고, 캐릭터 무브먼트 컴포넌트의 ‘캐릭터 회전 사용’ 체크 해제한다. - 비사용은 반대다. - 오너 캐릭터 cpp 파일 - 게임 시작시 ‘마우스 회전 비사용’ 함수를 호출한다.
//header
public:
//카메라의 회전을 따르겠다는 함수
void EnableControlRotation();
//카메라의 회전을 따르지 않겠다는 함수
void DisableControlRotation();
//cpp
//카메라 요 사용 체크
OwnerCharacter->bUseControllerRotationYaw = true;
//캐릭터 정면 회전 체크 해제
OwnerCharacter->GetCharacterMovement()->bOrientRotationToMovement = false;
//오너 캐릭터 cpp 파일
Movement->DisableControlRotation();
무기 메쉬 가져오기
- 무기 헤더 파일 - 필요한 컴포넌트 선언 - cpp 파일 - 컴포넌트 생성 - 무기 메쉬 가져오기
//cpp
USkeletalMesh* mesh;
CHelpers::GetAsset<USkeletalMesh>(&mesh, "SkeletalMesh'/Game/Characters/Weapons/Sword/SK_Sword.SK_Sword'");
Mesh->SetSkeletalMesh(mesh);