공부/Unreal

24.07.18

월러비 2024. 7. 23. 15:47
  • 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);

 

'공부 > Unreal' 카테고리의 다른 글

24.07.22  (0) 2024.07.26
24.07.19  (0) 2024.07.26
24.07.17  (1) 2024.07.23
24.07.15  (1) 2024.07.17
24.07.12  (0) 2024.07.15