[UE] Player 초기 세팅하기

목차
Source | ||
Characters | ||
CAnimInstance.h .cpp CPlayer.h .cpp |
||
Utilities | ||
CHelper.h CLog.h .cpp |
||
Global.h CGameMode.h .cpp U2212_06.Build.cs |
||
U2212_06.uproject | ||
Player 초기 세팅하기
Utilities 폴더 + Global.h 파일 가져오기
Utilities 폴더 + Global.h 파일을 가져와서 재사용한다.
Global.h
더보기
#pragma once #include "DrawDebugHelpers.h" #include "Kismet/KismetSystemLibrary.h" #include "Kismet/KismetMathLibrary.h" #include "Kismet/GameplayStatics.h" #include "Utilities/CHelpers.h" #include "Utilities/CLog.h"
CHelpers.h
더보기
#pragma once #include "CoreMinimal.h" #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;} #define CheckNullResult(x, y) { if(x == nullptr) return y;} #define CreateTextRender()\ {\ CHelpers::CreateComponent<UTextRenderComponent>(this, &Text, "Tex", Root);\ Text->SetRelativeLocation(FVector(0, 0, 100));\ Text->SetRelativeRotation(FRotator(0, 180, 0));\ Text->SetRelativeScale3D(FVector(2));\ Text->TextRenderColor = FColor::Red;\ Text->HorizontalAlignment = EHorizTextAligment::EHTA_Center;\ Text->Text = FText::FromString(GetName().Replace(L"Default__", L""));\ } class U2212_06_API CHelpers { public: template<typename T> static void CreateComponent(AActor* InActor, T** OutComponent, FName InName, USceneComponent* InParent = nullptr, FName InSocketName = NAME_None) { *OutComponent = InActor->CreateDefaultSubobject<T>(InName); if (!!InParent) { (*OutComponent)->SetupAttachment(InParent, InSocketName); //이렇게 사용하면 Socket Name에 _를 사용하면 안 된다. return; } InActor->SetRootComponent(*OutComponent); } //CreateActorComponent 추가 template<typename T> static void CreateActorComponent(AActor* InActor, T** OutComponent, FName InName) { *OutComponent = InActor->CreateDefaultSubobject<T>(InName); } template<typename T> static void GetAsset(T** OutObject, FString InPath) { ConstructorHelpers::FObjectFinder<T> asset(*InPath); *OutObject = asset.Object; } template<typename T> static void GetAssetDynamic(T** OutObject, FString InPath) { *OutObject = Cast<T>(StaticLoadObject(T::StaticClass(), nullptr, *InPath)); } template<typename T> static void GetClass(TSubclassOf<T>* OutClass, FString InPath) { ConstructorHelpers::FClassFinder<T> asset(*InPath); *OutClass = asset.Class; } template<typename T> static T* FindActor(UWorld* InWorld) { for (AActor* actor : InWorld->GetCurrentLevel()->Actors) { if (!!actor && actor->IsA<T>()) return Cast<T>(actor); } return nullptr; } template<typename T> static void FindActors(UWorld* InWorld, TArray<T*>& OutActors) { for (AActor* actor : InWorld->GetCurrentLevel()->Actors) { if (!!actor && actor->IsA<T>()) OutActors.Add(Cast<T>(actor)); } } template<typename T> static T* GetComponent(AActor* InActor) { return Cast<T>(InActor->GetComponentByClass(T::StaticClass())); } template<typename T> static T* GetComponent(AActor* InActor, const FString& InName) { TArray<T*> components; InActor->GetComponents<T>(components); for (T* component : components) { if (component->GetName() == InName) return component; } return nullptr; } static void AttachTo(AActor* InActor, USceneComponent* InParent, FName InSocketName) { InActor->AttachToComponent(InParent, FAttachmentTransformRules(EAttachmentRule::KeepRelative, true), InSocketName); } };
CLog.h
더보기
#pragma once #include "CoreMinimal.h" #define LogLine(){ CLog::Log(__FILE__, __FUNCTION__, __LINE__); } #define PrintLine(){ CLog::Print(__FILE__, __FUNCTION__, __LINE__); } class U2212_06_API CLog { public: static void Log(int32 InValue); static void Log(float InValue); static void Log(const FString& InValue); static void Log(const FVector& InValue); static void Log(const FRotator& InValue); static void Log(const UObject* InValue); static void Log(const FString& InFileName, const FString& InFuncName, int32 InLineNumber); static void Print(int32 InValue, int32 InKey = -1, float InDuration = 10, FColor InColor = FColor::Blue); static void Print(float InValue, int32 InKey = -1, float InDuration = 10, FColor InColor = FColor::Blue); static void Print(const FString& InValue, int32 InKey = -1, float InDuration = 10, FColor InColor = FColor::Blue); static void Print(const FVector& InValue, int32 InKey = -1, float InDuration = 10, FColor InColor = FColor::Blue); static void Print(const FRotator& InValue, int32 InKey = -1, float InDuration = 10, FColor InColor = FColor::Blue); static void Print(const UObject* InValue, int32 InKey = -1, float InDuration = 10, FColor InColor = FColor::Blue); static void Print(const FString& InFileName, const FString& InFuncName, int32 InLineNumber); };
CLog.cpp
더보기
#include "Utilities/CLog.h" #include "Engine.h" DEFINE_LOG_CATEGORY_STATIC(GP, Display, All) void CLog::Log(int32 InValue) { //GLog->Log("GP", ELogVerbosity::Display, FString::FromInt(InValue)); UE_LOG(GP, Display, L"%d", InValue); } void CLog::Log(float InValue) { UE_LOG(GP, Display, L"%f", InValue); } void CLog::Log(const FString & InValue) { UE_LOG(GP, Display, L"%s", *InValue); } void CLog::Log(const FVector & InValue) { UE_LOG(GP, Display, L"%s", *InValue.ToString()); } void CLog::Log(const FRotator & InValue) { UE_LOG(GP, Display, L"%s", *InValue.ToString()); } void CLog::Log(const UObject * InValue) { FString str; if (!!InValue) str.Append(InValue->GetName()); str.Append(!!InValue ? " Not Null" : "Null"); UE_LOG(GP, Display, L"%s", *str); } void CLog::Log(const FString & InFileName, const FString & InFuncName, int32 InLineNumber) { //C:\\Test\\Test.cpp int32 index = 0, length = 0; InFileName.FindLastChar(L'\\', index); length = InFileName.Len() - 1; FString fileName = InFileName.Right(length - index); UE_LOG(GP, Display, L"%s, %s, %d", *fileName, *InFuncName, InLineNumber); } void CLog::Print(int32 InValue, int32 InKey, float InDuration, FColor InColor) { GEngine->AddOnScreenDebugMessage(InKey, InDuration, InColor, FString::FromInt(InValue)); } void CLog::Print(float InValue, int32 InKey, float InDuration, FColor InColor) { GEngine->AddOnScreenDebugMessage(InKey, InDuration, InColor, FString::SanitizeFloat(InValue)); } void CLog::Print(const FString & InValue, int32 InKey, float InDuration, FColor InColor) { GEngine->AddOnScreenDebugMessage(InKey, InDuration, InColor, InValue); } void CLog::Print(const FVector & InValue, int32 InKey, float InDuration, FColor InColor) { GEngine->AddOnScreenDebugMessage(InKey, InDuration, InColor, InValue.ToString()); } void CLog::Print(const FRotator & InValue, int32 InKey, float InDuration, FColor InColor) { GEngine->AddOnScreenDebugMessage(InKey, InDuration, InColor, InValue.ToString()); } void CLog::Print(const UObject * InValue, int32 InKey, float InDuration, FColor InColor) { FString str; if (!!InValue) str.Append(InValue->GetName()); str.Append(!!InValue ? " Not Null" : "Null"); GEngine->AddOnScreenDebugMessage(InKey, InDuration, InColor, str); } void CLog::Print(const FString& InFileName, const FString& InFuncName, int32 InLineNumber) { int32 index = 0, length = 0; InFileName.FindLastChar(L'\\', index); length = InFileName.Len() - 1; FString fileName = InFileName.Right(length - index); FString str = FString::Printf(L"%s, %s, %d", *fileName, *InFuncName, InLineNumber); GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Blue, str); }
CPlayer + BP_CPlayer 생성하기
새 C++ 생성하기 - Character - CPlayer 생성
CPlayer.h
더보기
#pragma once #include "CoreMinimal.h" #include "GameFramework/Character.h" #include "CPlayer.generated.h" UCLASS() class U2212_06_API ACPlayer : public ACharacter { GENERATED_BODY() private: UPROPERTY(VisibleAnywhere) class USpringArmComponent* SpringArm; UPROPERTY(VisibleAnywhere) class UCameraComponent* Camera; public: ACPlayer(); protected: virtual void BeginPlay() override; public: virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override; };
CPlayer.cpp
더보기
#include "Characters/CPlayer.h" #include "Global.h" #include "CAnimInstance.h" #include "GameFramework/SpringArmComponent.h" #include "GameFramework/CharacterMovementComponent.h" #include "Camera/CameraComponent.h" #include "Components/SkeletalMeshComponent.h" #include "Components/InputComponent.h" ACPlayer::ACPlayer() { CHelpers::CreateComponent<USpringArmComponent>(this, &SpringArm, "SpringArm", GetMesh()); CHelpers::CreateComponent<UCameraComponent>(this, &Camera, "Camera", SpringArm); GetMesh()->SetRelativeLocation(FVector(0, 0, -90)); GetMesh()->SetRelativeRotation(FRotator(0, -90, 0)); USkeletalMesh* mesh; CHelpers::GetAsset<USkeletalMesh>(&mesh, "SkeletalMesh'/Game/Character/Mesh/SK_Mannequin.SK_Mannequin'"); GetMesh()->SetSkeletalMesh(mesh); TSubclassOf<UCAnimInstance> animInstance; CHelpers::GetClass<UCAnimInstance>(&animInstance, "AnimBlueprint'/Game/ABP_Character.ABP_Character_C'"); GetMesh()->SetAnimClass(animInstance); SpringArm->SetRelativeLocation(FVector(0, 0, 140)); SpringArm->SetRelativeRotation(FRotator(0, 90, 0)); SpringArm->TargetArmLength = 200; SpringArm->bDoCollisionTest = false; SpringArm->bUsePawnControlRotation = true; SpringArm->bEnableCameraLag = true; GetCharacterMovement()->RotationRate = FRotator(0, 720, 0); } void ACPlayer::BeginPlay() { Super::BeginPlay(); } void ACPlayer::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent) { Super::SetupPlayerInputComponent(PlayerInputComponent); }
BP_CPlayer

새 C++ 클래스 생성 - (방금 전에 생성한) CPlayer -

CGameMode 생성
U_06GameModeBase를 CGameMode로 이름변경
CGameMode.h
더보기
#pragma once #include "CoreMinimal.h" #include "GameFramework/GameModeBase.h" #include "CGameMode.generated.h" UCLASS() class U2212_06_API ACGameMode : public AGameModeBase { GENERATED_BODY() public: ACGameMode(); };
CGameMode.cpp
더보기
#include "CGameMode.h" #include "Global.h" ACGameMode::ACGameMode() { CHelpers::GetClass<APawn>(&DefaultPawnClass, "Blueprint'/Game/Player/BP_CPlayer.BP_CPlayer_C'"); }
프로젝트 세팅 - 맵&모드 - Default Modes - 기본 게임모드 - CGameMode로 변경

CAnimInstance + ABP_Character 생성
새 C++ 클래스 - AnimInstance - CAnimInstance 생성

CAnimInstance.h
더보기
#pragma once #include "CoreMinimal.h" #include "Animation/AnimInstance.h" #include "CAnimInstance.generated.h" UCLASS() class U2212_06_API UCAnimInstance : public UAnimInstance { GENERATED_BODY() protected: UPROPERTY(BlueprintReadOnly, Category = "Animation") float Speed; UPROPERTY(BlueprintReadOnly, Category = "Animation") float Pitch; UPROPERTY(BlueprintReadOnly, Category = "Animation") float Direction; public: void NativeBeginPlay() override; void NativeUpdateAnimation(float DeltaSeconds) override; private: class ACharacter* OwnerCharacter; private: FRotator PrevRotation; };
CAnimInstance.cpp
더보기
#include "Characters/CAnimInstance.h" #include "Global.h" #include "GameFramework/Character.h" void UCAnimInstance::NativeBeginPlay() { Super::NativeBeginPlay(); OwnerCharacter = Cast<ACharacter>(TryGetPawnOwner()); CheckNull(OwnerCharacter); } void UCAnimInstance::NativeUpdateAnimation(float DeltaSeconds) { Super::NativeUpdateAnimation(DeltaSeconds); CheckNull(OwnerCharacter); Speed = OwnerCharacter->GetVelocity().Size2D(); FRotator rotator = OwnerCharacter->GetVelocity().ToOrientationRotator(); FRotator rotator2 = OwnerCharacter->GetControlRotation(); FRotator delta = UKismetMathLibrary::NormalizedDeltaRotator(rotator, rotator2); PrevRotation = UKismetMathLibrary::RInterpTo(PrevRotation, delta, DeltaSeconds, 25); Direction = PrevRotation.Yaw; Pitch = UKismetMathLibrary::FInterpTo(Pitch, OwnerCharacter->GetBaseAimRotation().Pitch, DeltaSeconds, 25); }
애니메이션 - 애니메이션 블루프린트 - ABP_Character 생성



실행화면

'⭐ Unreal Engine > UE RPG Weapon System' 카테고리의 다른 글
[UE] AnimNotify, DoAction (0) | 2023.05.08 |
---|---|
[UE] 무기 장착 및 기본 공격하기 (0) | 2023.05.02 |
[UE] 무기 시스템 설계하기 (0) | 2023.05.01 |
[UE] Interface, AnimNotify, Backstep 구현하기 (0) | 2023.04.28 |
[UE] Component 컴포넌트, Player 이동 (0) | 2023.04.27 |
댓글
이 글 공유하기
다른 글
-
[UE] 무기 장착 및 기본 공격하기
[UE] 무기 장착 및 기본 공격하기
2023.05.02 -
[UE] 무기 시스템 설계하기
[UE] 무기 시스템 설계하기
2023.05.01 -
[UE] Interface, AnimNotify, Backstep 구현하기
[UE] Interface, AnimNotify, Backstep 구현하기
2023.04.28 -
[UE] Component 컴포넌트, Player 이동
[UE] Component 컴포넌트, Player 이동
2023.04.27
댓글을 사용할 수 없습니다.