목록Game Dev/Unreal C++ : Dev Log (53)
KoreanFoodie's Study

Does Implement Interface 기능으로 데미지, 인터랙션 구현하기 총을 쏘았을때, 맞은 대상이 Enemy 이면 데미지를 전달하고 싶거나, 만약 상호작용 가능한 오브젝트인 경우 상호작용을 하고 싶다고 가정하자. 해당 기능을 어떻게 구현하면 좋을까? 물체의 경우, 각 물체에 트리거를 심는 경우도 생각해 볼 수 있겠지만, 배치되는 모든 오브젝트마다 트리거를 따로 설정해야 된다고 생각하면 너무 끔찍할 것이다. 데미지의 경우, 총에 맞은 액터가 데미지를 받을 수 있는지 없는지를 어떻게 판별하면 좋을까? 사실 Enemy 말고도 부술 수 있는 오브젝트도 마찬가지로 데미지를 받아야 할텐데, 각 클래스마다 데미지를 받는지 안 받는지를 설정하는 것은 매우 귀찮은 일이다. 언리얼에서는 Does Implemen..

1인칭 시점 구현하기 일반적으로 언리얼을 처음 배울때는 다들 3인칭으로 시작하는데, 3인칭의 FPS 의 경우 시점과 동작이 함께 움직이지 않는 특징이 있다. 따라서, 시점은 바닥을 바라보는데 팔은 총을 든 상태로 앞을 향하고 있는 부자연스러운 상황이 연출된다. 이를 해결하는 방법은 간단한데, 바로 FirstPersonBP (시작용 컨텐츠) 처럼, 기본으로 주어지는 Skeletal Mesh 를 Clear 하고, 카메라의 자식(Children)에 우리가 원하는 Skeletal Mesh 를 추가하는 것이다. 알맞은 Skeletal Mesh 를 연결한 다음, 미리 만들어 놓은 Animation Blueprint 를 선택만 해주면, 애니메이션도 잘 재생될 것이다.

UFUNCTION 과 FORCEINLINE 일반적으로, UFUNCTION 과 FORCEINLINE 은 호환되지 않는다. 우리가 UFUNCTION 을 붙이는 이유는 대개 블루프린트에서 해당 함수를 호출할 필요가 있기 때문인데, C++ 에서 작성된 코드를 BP 에서 읽어오려면, FORCEINLINE 을 붙이지 않아야 한다(Function call 의 형태이어야 함). 따라서 아래와 같은 함수는 블루프린트에서 인식되지 않는다. UFUNCTION(BlueprintCallable) FORCEINLINE void Foo() {}

AddMovementInput 함수로 간단하게 처리하기 ////////////////////////////////////// ////////////////////////////////////// BlasterCharacter.h ////////////////////////////////////// ////////////////////////////////////// #pragma once #include "CoreMinimal.h" #include "GameFramework/Character.h" #include "BlasterCharacter.generated.h" UCLASS() class BLASTER_API ABlasterCharacter : public ACharacter { GENERATED_..

UPoseableMeshComponent 언리얼에서 GhostTrail 등을 구현할 때, UPoseableMeshComponent 를 사용하는 것을 볼 수 있다. UPosebleMeshComponent 는 무엇일까? 먼저 정의로 넘어가보면, /** *UPoseableMeshComponent that allows bone transforms to be driven by blueprint. */ UCLASS(ClassGroup=Rendering, hidecategories=(Object,Physics), config=Engine, editinlinenew, meta=(BlueprintSpawnableComponent)) class ENGINE_API UPoseableMeshComponent : public ..

AttachedActors vs ChildActors 만약 다음과 같이 부모 액터에 부착된 액터들을 삭제하려고 하면 어떻게 해야 할까? 만약 현재 액터에 자식으로 설정된 ActorComponent 들의 경우, 다음과 같은 코드로 조회할 수 있다. TArray tempChildActors; AActor* owner = GetOwner(); // SomeChildActor->SetOwner(this); 가 어디선가 실행되었다고 가정 owner->GetAllChildActors( tempChildActors, true ); uint32 count = tempChildActors.Num(); 하지만 위와 같은 경우나, 무기를 캐릭터의 소켓에 부착 (AttachToComponent) 하는 경우..

오브젝트 생성 및 애셋 불러오기 언리얼에서 오브젝트를 생성하고 애셋을 불러올 때는 보통 CreateDefaultSubobject 로 CDO 를 만들어 준 다음, ConstructorHelpers::FObjectFinder 로 애셋을 연결시켜 준다. 이 과정을 단축시켜주는 Helper Function 을 만들어 사용해 보자. CHelpers.h #pragma once #include "CoreMinimal.h" #include "Components/SkeletalMeshComponent.h" #include "Kismet/GameplayStatics.h" #include "Particles/ParticleSystem.h" #include "NiagaraSystem.h" #include "NiagaraFun..

화면에 출력하는 로깅시스템 콘솔에 출력했던 것과 비슷하게, 이번에는 UE_LOG 가 아닌 AddOnScreenDebugMessage 함수를 활용해 화면에 값을 출력해보자. 출처는 여기! CLog.h class UE_PROJECT_NAME_API CLog { public: 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& I..

언리얼 로그 언리얼은 UE_LOG 함수를 이용하여 로그를 출력한다. 먼저, .h 파일에 카테고리를 선언하고, 그에 맞는 정의를 .cpp 파일에서 Define 해주면 된다. MyGame.h //General Log DECLARE_LOG_CATEGORY_EXTERN(LogMyGame, Log, All); //Logging during game startup DECLARE_LOG_CATEGORY_EXTERN(LogMyGameInit, Log, All); MyGame.cpp #include "MyGame.h" //General Log DEFINE_LOG_CATEGORY(LogMyGame); //Logging during game startup DEFINE_LOG_CATEGORY(LogMyGameInit); 헤더..
Level Design 컨셉 : 무한맵. 4 개중의 하나의 방향으로 이동함. 목표 지점이 정해져 있음. 목표지점에 도달하여, 성화를 봉송하면 게임이 클리어. 전투 : 새 공간에 도착하면, 문이 닫히면서 적이 랜덤으로 스폰된 적과 싸우게 됨. 목표 지점에 가까이 갈수록 적이 강력해짐. 목표 지점 방에서는 보스와 전투를 하게 만들 수도 있음. 전투 완료 : 적을 전부 무찌르면, 2개의 아이템 박스가 나옴. 이때 선택을 해야 함. 선택지는 다음과 같음. 무기변경 무기강화 무기 내구도 수리 캐릭터 HP 증가 캐릭터 이동속도 증가 캐릭터 공격속도 증가 다만 2 가지 전부 효과 카테고리는 같은데, 하나는 "100% 확률로 10% 성능 향상" 이며, 나머지 하나는 "10% 확률로 성능 50% 상승, 40%확률로 성능..