게임엔진
[Unreal] 화면 정중앙 값 구하기
뷰포트 통해 구할 수가 있다. GetGameViewport 함수는 UGameViewportClient형 클래스를 반환한다, 이는 뷰포트의 UI, 오디오 그리고 입력 시스템이다. 이걸 바탕으로 뷰포트 클래스(FViewport )를 가져온다. auto gameViewport = GetWorld()->GetGameViewport(); FVector2D viewportSize; gameViewport->GetViewportSize(viewportSize); viewportSize /= 2; // 최종 중앙값 참고 : https://docs.unrealengine.com/4.27/en-US/API/Runtime/Engine/Engine/UGameViewportClient/ https://docs.unrealeng..

[Unreal] 플레이 누른 직후 또는 인벤토리 열 때 인게임 모드 설정
플레이를 누르면 마우스 커서가 보이고 입력을 받질 않는다 따라서 입력을 받으려면 한번 클릭해줘야 한다, 언리얼 엔진의 기본 세팅은 GameAndUIEx이다 이건 UWidgetBlueprintLibrary 클래스 내에 static 함수를 사용하여 설정할 수가 있다. 각각 함수들의 용도는 다음과 같다. GameAndUIEx : UI만 사용자의 입력을 받게끔 한다 만약에 못받는다면 플레이어 컨트롤러가 받게 된다. GameOnly : 게임 컨트롤러만 입력받게끔 한다 (플레이 직후 마우스가 인게임으로 들어가며 커서 또한 사라진다). UIOnlyEx : UI만 입력받게끔 한다 (인벤토리 열고 닫을 때 플레이어 회전이라던지 막는 용도). 시작 직후 인게임 모드를 입력만 받게끔 사용한다. if (auto p_World..

[Unreal] UI를 뷰포트 위치로 치환 및 이동하는 방법 (UI를 마우스의 위치로 또는 반대)
기본적으로 뷰포트의 크기는 현재 게임 화면이다 그 중 제일 보편적인건 fhd 1920 x 1080이다. UI의 위치를 지정할 수 있는 방법이 두 가지가 존재한다. Slot을 이용하는거다 피벗 기준이고, 여기서 주의해야할 게 대상 UI는 다른 UI의 자식으로 들어가야한다. RenderTransform의 Translation 이용하는 것이다, 하지만 RenderTransform은 할당만 가능하지 따로 가져올 방법이 존재하지가 않는다. 주의해야할건 바로 아래의 경우다, Slot이 없을 경우 널 포인터다. 아래는 UI의 위치 > 뷰포트 위치 또는 뷰포트 위치 > UI의 위치로 치환할 수 있는 함수들인데 여기서 UObject*는 GetWorld()로 보내주고 FGeometry&는 현재 UI의 위치에 대한 정보를 ..

[Unreal] Static Mesh (스태틱 메쉬) 그림자 끄는/키는 방법 C++
EditorStaticMeshLibrary 내 EnableSectionCastShadow 스태틱 전역 함수가 존재하는데 언리얼 5부턴 레거시화가 됐다. 아래 소스코드 내 유심히 살펴보니 힌트를 얻을 수가 있었다, StaticMeshEditorSubsystem를 대신 사용하라고 쓰여져있다. StaticMeshEditorSubsystem에선 클래스 멤버 함수라 참조를 해야한다. 여기서 좀 헷갈릴 수가 있는데 아래와 같이 세 개의 모듈을 추가 해줘야한다. "UnrealEd", "EditorSubsystem", "StaticMeshEditor" UnrealEd 모듈은 (UEditorEngine 클래스 포인터) GEditor에 대한 매핑 EditorSubsystem 모듈은 UEditorSubsystem 클래스 포..

[Unreal] 사용자 정의 컴포넌트 (UActorComponent)
생성 방법은 간단하다, C++ 클래스 생성 > Actor Component를 선택한다. 아래와 같이 함수들이 기본으로 설정될텐데 처음 보는 것들이다. 엑터일 시 PrimaryActorTick.bCanEverTick = true; 이지만 엑터 컴포넌트 일땐 PrimaryComponentTick.bCanEverTick = true; 이다. BeginPlay 함수는 동일하다 Tick 함수 대신 TickComponent 함수이다. 사용 조건은 간단한데 다른 컴포넌트가 들어가면 안된다 즉 데이터 들고있는 용도 또는 오버라이딩을 하여 여러군데에 같은 함수를 선언하는걸 방지용으로만 생각하면 된다. HP Comp에서 저런 형태가 나오는게 정상이다 만약에 헤더파일에 다른 기타 컴포넌트를 선언할 시 BeginPlay 함수..

[Unity] 프리팹 (Prefab)
Scene에 존재하는 오브젝트와 오브젝트의 컴퍼넌트들을 하나의 에셋(Assets)형태로 만드는 기능이다. 생성 방법 Hierarchy 창에서 프리팹으로 만들기를 원하는 오브젝트를 선택한 후, Assets 창으로 드래그 앤 드롭한다. 그러면, 다음과 같이 일반 에셋들과 구분되는, 파란색 정육면체가 생성된다. 이는 프리팹(Prefabs) 이라는 표시이다. 생성한 프리팹을 Scene으로 드래그 앤 드롭하면, 동일한 컴퍼넌트와 속성을 지닌 오브젝트가 여러개 생성된다. 이렇게 프리팹을 Scene에 배치하는 일련의 과정을 "프리팹의 인스턴스화" 라고 부른다. 오버라이딩 Scene에 배치한 프리팹을 오버라이딩 하는 것도 가능하다. 단순히 컴퍼넌트의 값을 바꿔주면 되는데, 오버라이딩을 수행한 프리팹은 다음과 같이 굵은..
[Unreal] 클래스 생성시 FObjectInitializer 사용법 (기본 컴포넌트 변경)
FObjectInitializer 구조체를 이용해서 특정 맴버를 초기화 시키는 두가지의 방법이 있다. 1. 클래스 생성자 매크로를 GENERATED_BODY() -> GENERATED_UCLASS_BODY() 로 변경하고 const FObjectInitializer& ObjectInitializer 가 있는 생성자를 구현하는 방법 // .h 파일 UCLASS() class XXXX_API ClassA : public APawn { GENERATED_UCLASS_BODY() // 언리얼에서 클래스를 생성하면 GENERATED_BODY()가 디폴트 // 기타 클래스 세팅... } // .cpp 파일 // GENERATED_UCLASS_BODY()사용시 선언이 들어가므로 .cpp에 해당 구현만 처리하면 됨 C..

[Unity] EventSystem을 이용해 아이템UI 드래그 및 다른 슬롯에 등록하기(IDragHandler, IDropHandler)
드래그, 드랍할 UI오브젝트에 Drag관련 인터페이스가 포함된 스크립트를 추가 public class ItemDragHandler : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler 그리고 인터페이스에 해당하는 함수를 구현해주면 된다. 드래그해서 마우스를 따라다니게 하고 싶으므로 IDragHandler의 OnDrag함수를 구현해주면 된다. public void OnDrag(PointerEventData eventData) { transform.position = eventData.position; } 참고로 eventData.position 말고 Input.mousePosition 을 써도 된다. 아이템을 놓았을 때 제자리로 돌아가게 하고..

[Unity] 게임 오브젝트 컴포넌트 패턴 (GameObject) C# 구현
아래는 간단하게 구현해본 컴포넌트 패턴이다, gameObject라는 매개체 즉 자기 자신을 통해 해당 오브젝트가 존재하는지 확인 및 추가 기능. using System; using System.Collections.Generic; namespace ConsoleApplication1 { public class GameObject { // 컴포넌트 리스트 public List lstComp = new List(); public T GetComponent() where T : Component { // 리스트가 해당 오브젝트를 가지고 있을 시 if (lstComp.Contains(typeof(T))) { Type type = lstComp[lstComp.IndexOf(typeof(T))]; T comp = ..

[Unreal] 캐릭터 이동 관련 컴포넌트 (UCharacter / UPawn MovementComponent*)
캐릭터의 이동 관한 행동을 담당하며 대표적인 기능들은 아래와 같다. 캐릭터 최대치 변경 수영 속도 하중 힘 걸음 속도 숙인 채 걷는 속도 캐릭터가 특정 행동 진행 중일 시 숙이는 중 낙하하는 중 날아다니는 중 지상에 다니는 중 (걷기, 운전 등) 수영 하는 중 걸을 수 있는 상태 또는 걷는 중 캐릭터가 숙이는 함수와 숙인 상태에서 일어서는 함수 플레이어가 수영하는 함수 플레이어가 점프하는 함수 플레이어가 엎드리는 함수는 따로 구현할 필요가 있다. 관련 도튜먼트 : https://docs.unrealengine.com/5.0/enUS/API/Runtime/Engine/GameFramework/UCharacterMovementComponent/