목록Game Dev/Unreal C++ : Dev Log (51)
KoreanFoodie's Study
UUserWidget 의 Native 함수 //native SObjectWidget methods (see the corresponding BlueprintImplementableEvent declarations above for more info on each) friend class SObjectWidget; virtual void NativeOnInitialized(); virtual void NativePreConstruct(); virtual void NativeConstruct(); virtual void NativeDestruct(); virtual void NativeTick(const FGeometry& MyGeometry, float InDeltaTime); UserWidget 에는 위..
더티 플래그 패턴이란? 더티 플래그 패턴에 대해서는, 이전 블로그 글에서 간단하게 언급한 바 있다. 더티 플래그 패턴은 일반적으로 렌더링 과정에서, 계층 구조가 존재할 경우, 필요할 때 / 필요한 타이밍에 화면을 갱신하는 부분에서 자주 쓰인다. 또한 더티 플래그를 체크해 UI 를 갱신하게 되면, Tick 마다 UI 업데이트가 중복해서 일어나는 것을 막을 수 있다. 그렇다면 이 패턴을 언리얼에서는 어떤 방식으로 적용해 볼 수 있을까? 예를 들어, 우리가 어떤 UI 를 갱신 하는데,Dirty Flag 를 두어 해당 더티 플래그가 켜져 있을 때만 UI 를 갱신한다고 가정해 보자. 일단, 실제로 UI 클래스를 만들기 전에, 더티 플래그 패턴을 사용할 위젯들이 공통적으로 사용할 인터페이스를 다음과 같이 정의할 수..
MoveTo 와 애니메이션 비헤이비어 트리 로직을 짜면서 MoveTo 를 테스트했는데, 해당 지점으로 이동할 때 걷는 애니메이션이 재생되는 것이 아니라 캐릭터 메시 자체가 미끄러지듯이 슬라이딩하는 현상이 생겼다. 애니메이션을 어떻게 하면 재생할 수 있지? 라고 생각하며 AnimBP 를 잘 연결해줬는데도 동작이 제대로 안되는 상황이 있었다. 언리얼 포럼에서는 다양한 해결책을 제시한다. 1. 애니메이션 블루프린트 연결 확인하기 2. CharacterMovement -> NashMovement 에서 Use Acceleration for Paths 체크하기 근데 나는 이 두가지 전부 아니였다. 나의 경우, 아래와 같이 Speed 값에 따라 애니메이션을 변경하는 블렌드 스페이스를 만들었는데, 알고보니 Speed ..
[언리얼] 어떤 개념 : 어떻게 하기 맨 처음 언리얼을 설치하고 프로젝트를 열려고 하면, 다음과 같이 연결이 되어 있지 않다. 이 문제는 속성에서 연결 프로그램을 다음과 같이 해 주면 된다 : "C:\Program Files (x86)\Epic Games\Launcher\Engine\Binaries\Win64\UnrealVersionSelector.exe" 만약 위의 방법이 안 되면, 위의 UnrealVersionSelector.exe 를, 다음 경로에 복붙한다 : "C:\Program Files\Epic Games\UE_4.27\Engine\Binaries\Win64" 그래도 안 될 경우 : 해당 UnrealVersionSelector.exe 파일을 관리자 권한으로 한 번 실행시켜, 레지스트리에 등록 ..
Unreal unresolved external symbol 에러 오랜만에 언리얼을 켰는데 다음과 같은 에러가 발생했다. 일반적으로, 크게 두 가지로 나뉘는데.... 1. 함수를 선언만 하고 구현을 안함 링커에서 에러가 났다는 건, 링킹 과정에서 적절한 함수를 찾지 못했다는 의미이기도 하다. 따라서 선언만 해놓고 실제로 구현을 하지 않은 메소드가 있는지 체크해보도록 하자! 근데 이 경우는 구현이 안된 함수가 있다고 알려줘서 쉬운데... 2. 적절한 모듈을 추가하지 않음 사실 이 경우가 매우매우 빡친다. 왜냐하면 명시적으로 원인이 드러나지 않기 때문이다. 하지만 에러로그를 잘 보면 힌트를 찾을 수 있는데... 실제 예시를 보자. 위 경우에서는, 잘 보면 LNK2019 에러에서 BehaviorTree 관련에..
Widget 에 들어갈 데이터와 클래스 멤버 변수 연동 (bind) 하기 게임을 플레이하다 보면 아이템마다 다른 설명 창이 뜨는 것을 확인할 수 있다. 이 경우, 사실 이를 보여주는 위젯(창)은 똑같이 생겼지만, 내용물은 다른 것을 알 수 있는데... 위젯에 들어가는 내용과 클래스의 정보를 연동하면 위젯의 내용을 아이템에 맞게 띄워 줄 수 있다. 순서대로 이를 만들어 보자. 1. 먼저 Widget Blueprint 를 만든다. 그리고 내용물을 우리가 원하는 대로 채워넣는다. 2. 해당 위젯을 띄울 클래스에서 위젯 컴포넌트를 선언하고, 이를 넣어 준다. item.h /* Popup widget for when the players look at the item */ UPROPERTY(EditAnywhere..
int8 이 외않되? 물론 Visual Studio 에서는 int8 을 잘만 쓸 수 있다. 하지만 만약 int8 변수를 언리얼에서도 쓰려고 한다면... /* Item count (ammo, etc) */ UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Item Properties", meta = (AllowPrivateAccess = "true")) int8 ItemCount; 에러가 발생한다. 찾아보니 버그 픽스를 요청하던데... 단순히 언리얼에서는 int8 을 지원하지 않아서 그런게 아닐까? 뭐, uint8 은 지원하니 메모리 절약을 위한 것이 목적이라면 uint8 을 쓰면 되겠다. int8 을 써서 에러가 생기는 경우, 어디서 에러가 생겼는지 짚어주..
헤드샷 구현하기 (부위별 피격 데미지 설정) FPS 게임을 하다보면 헤드샷에 추가 데미지 (혹은 즉사) 를 주는 경우가 많은데, 이는 어떻게 구현하면 될까? 간단한 방식으로는, 일단 총알을 맞은 Enemy 클래스 내 Skeletal Mesh 의 Bone Name 을 참고하는 방법이 있다. 스켈레톤 트리를 보면 일반적으로 다음과 같이 head 가 있는 것을 확인할 수 있다. 이제 데미지를 받는 함수를 다음과 같이 수정하면 된다. AEnemy* HitEnemy = Cast(BeamHitResult.Actor.Get()); if (HitEnemy) { if (BeamHitResult.BoneName.ToString() == HitEnemy->GetHeadBone()) { // Head shot } else {..
Does Implement Interface 기능으로 데미지, 인터랙션 구현하기 총을 쏘았을때, 맞은 대상이 Enemy 이면 데미지를 전달하고 싶거나, 만약 상호작용 가능한 오브젝트인 경우 상호작용을 하고 싶다고 가정하자. 해당 기능을 어떻게 구현하면 좋을까? 물체의 경우, 각 물체에 트리거를 심는 경우도 생각해 볼 수 있겠지만, 배치되는 모든 오브젝트마다 트리거를 따로 설정해야 된다고 생각하면 너무 끔찍할 것이다. 데미지의 경우, 총에 맞은 액터가 데미지를 받을 수 있는지 없는지를 어떻게 판별하면 좋을까? 사실 Enemy 말고도 부술 수 있는 오브젝트도 마찬가지로 데미지를 받아야 할텐데, 각 클래스마다 데미지를 받는지 안 받는지를 설정하는 것은 매우 귀찮은 일이다. 언리얼에서는 Does Implemen..
1인칭 시점 구현하기 일반적으로 언리얼을 처음 배울때는 다들 3인칭으로 시작하는데, 3인칭의 FPS 의 경우 시점과 동작이 함께 움직이지 않는 특징이 있다. 따라서, 시점은 바닥을 바라보는데 팔은 총을 든 상태로 앞을 향하고 있는 부자연스러운 상황이 연출된다. 이를 해결하는 방법은 간단한데, 바로 FirstPersonBP (시작용 컨텐츠) 처럼, 기본으로 주어지는 Skeletal Mesh 를 Clear 하고, 카메라의 자식(Children)에 우리가 원하는 Skeletal Mesh 를 추가하는 것이다. 알맞은 Skeletal Mesh 를 연결한 다음, 미리 만들어 놓은 Animation Blueprint 를 선택만 해주면, 애니메이션도 잘 재생될 것이다.