ctrl + alt + F11을 누르면 vscode에서 바로 ue5 에디터로 넘어가서 라이브 코딩을 실행 할 수 있다.
C++ 코드의 표준 컴파일 프로세스
Scene Component 생성, attach, Scene의 회전, 위치, 그리고 스케일에 대한 개념
FString
WorldRotationCache에 대한 정보가 별로 없어서 정리해본다
이 글에서 는 Quat과 Rotator의 차이점에 대해서 다룹니다. 그래픽스, OpenGL 등에 대한 지식이 있으면 이해가 쉽습니다. Quat는 쿼터니언(quaternion)의 약어로, 3D 공간에서 회전을 나타내는 데 사용되는 수학적인 개념입니다.
게임 월드에서 정보를 쿼리하고 콜리전(충돌) 관련 정보를 얻을 수 있게 해줍니다
월드 오브젝트는 게임 개발에서 핵심적인 역할을 하는 개념. GetWorld() 함수 사용
SweepMultiByChannel 함수와 관련된 내용을 예제 코드와 함께 설명하겠습니다. 이 예제는 SweepMultiByChannel을 사용하여 충돌을 감지하고, 시작점과 끝점을 설정하고, 디버그 라인을 그려서 결과를 시각적으로 확인하는 방법을 포함합니다.
스윕(Sweep)은 물체가 월드 내에서 움직이면서 충돌 여부를 검사하는 과정을 의미합니다.
인풋 동작 매핑
C++클래스에서 블루프린트로 함수를 쉽게 노출시킬 수 있음
UPhysicsHandleComponent란 물체를 잡을 수 있게 만들어주는 PhysicsHandle입니다.
"GrabComponentAtLocationWithRotation" 함수
GetPhysicsHandle()
언리얼에서는 .generated.h 헤더파일이 가장 뒤에 나와야만 한다
WakeAllRigidBodies()를 통한 물체 잡고 던지기
아웃 파라미터 활용 함수 분리
블루프린트의 노드들 ERROR! 가 떠 있는 경우
오브젝트 타입이 폰인 플레이어의 반응이 다른 폰과 WorldStatic에서 반응을 하도록 만들려고 합니다.
클래스 프로퍼티에 디폴트 값을 부여할 수 있는 함수입니다.
언리얼 엔진에서 쓰이는 가장 간단한 컨테이너 클래스입니다
객체가 필요로 하느 어떤 것들을 외부에서 전달해주는 것입니다.
해당 액터에 제공된 컴포넌트의 RootComponent를 노출시킬 수 있습니다.
Actor란 레벨에 배치할 수 있는 오브젝트. Pawn 모든 액터의 베이스 클래스. 캐릭터는 기본적인 이족보행 운동 기능을 가지고 있는 Pawn
언리얼 엔진이 이 변수를 언리얼 엔진 리플렉션 시스템에 참여할 수 있게 인식하도록 하는 방법
UPROPERTY 지정자로 원하는 곳에서 노출을 시키거나 편집할 수 있게 만들 수 있습니다
Animation Blueprint 만들어보기
에픽게임즈 마켓플레이스 에셋을 프로젝트에 추가하기애니메이션 리타기팅하기
애니메이션 루트모션 잠금 로코모션 블랜드 스페이스 만들기 Input Mapping 블루프린트 노드 코멘트 에러 해결
컴파일을 생활화 하자
달리기 애니메이션은 기존 걷기 애니메이션 로직에 값을 x2배 해주는 로직을 추가하면 가능했다. 카메라 관련 기능은 굉장히 여러 방법으로 응용이 가능할 것 같다.
Mixamo에서 다운 받은 애니메이션이 조금 이상하게 적용되는 경우가 생기는데 디자이너가 이런 디테일 때문에라도 정말 필요한 것 같다.
마켓플레이스에서 다운받은 고품질의 애니메이션을 가져다 사용하는 방법을 배웠다.
UPROPERTY specifiers
private에서도 블루프린트 이벤트 그래프에 노출 시킬 수 있는 방법이 있다. PROPERTY에서 meta 지정자를 추가해주면 되는데 생각보다 다양한 일들이 가능한 것 같다.
블루프린트에서 플레이어안에 있는 Capsule Colider에 Spring Arm이랑 Camera를 추가해서 3인칭 fps 게임을 만들 수 있는데 블루프린트에서 직접하는게 아니라 c++ 코드로 생성하는 법을 배웠다.
Possession에 대해서 배웠다. 월드에서 폰을 제어하고 어떤 폰에 카메라를 부착하여 플레이어로만들어야 하는지 알게 되었다. 그리고 Axis Mapping을 통해 플레이어의 움직임을 제어하는 방법에 대해 배웠다.
UGameplayStatics에 있는 GetWorldDeltaSeconds를 사용해 Delta Time 계산을 배웠다. UWorld가 모든 객체의 최상위 객체이고 게임에 관련된 모든 객체를 담고 있다고한다.
AddActorLocalOffset의 bSweep에서 목적지 위치로 가는 도중에 중첩을 발생시킬지, 아니면 충돌검사를 해서 충돌했을때 멈추게 할지를 정할 수 있었다. AddActorLocalRotation으로 물체를 회전하는 방법에 대해서 배웠다
AController가 APlayerController의 상위 타입의 오브젝트이다. 그러니 AController 로 선언한 변수에 APlayerController를 할당할 수 없다. Cast 함수를 써서 할당해주어야한다.
언리얼 코딩표준에 대해서 조사해보았다. 접두사가 매우 신기했고 네임스페이스를 두 번 이상 사용하는 것도 신기했다.
GetHitResultUnderCursor로 화면에 보이는 물체에 대한 카메라 커서의 충돌된 위치를 반환하는 방법을 배우게 되었다. 캐릭터의 회전 방향을 정할때 유용하게 쓰인다고한다.
플레이어의 특정 메시를 GetHitResultUnderCursor로 부딪친 위치를 바라보게끔 만들게 하려고자 SetWorldRotation을 사용했다.
타워와 탱크의 거리가 일정 거리 이하로 되면 타워가 탱크를 바라보게 만들었다. 그리고 탱크와 타워가 총을 발사할 수 있도록 발사 위치에 DrawDebugSphere를 그려보았다.
C++ 클래스에서 블루프린트와 리플렉션 하는 방법을 배웠다. 그리고 SpawnActor로 C++ 클래스에서 특정 스태틱 메시 컴포넌트를 가져올 수 있다. 그리고 템플릿이기 때문에 타입을 추가해주어야한다.
UstaticMesh 와 UStaticMeshComponent의 차이점에 대해 찾아보다가 매우 좋은 언리얼 공식 사이트에 올라온 질문이 있어서 정리한다.
UPrimitiveComponent는 해당 컴포넌트의 tick동안에 다른 컴포넌트의 위치를 업데이트한다. 발사체에 대한 아주 자세한 설정이 가능하다.
언리얼에서 사용하는 델리게이트 개념을 배울 수 있었다. 콜백함수로 함수의 주소를 전달하여 사용하는 방법도 매우 신기했다. 어떤 이벤트가 발생했을때 Broadcast한다는 개념이 신기했다.
UActorComponent는 Actor에 부착할 수 있는 class. UActorComponent에 트랜스폼과 attach를 지원하면 USceneComponent. USceneComponent가 렌더링되면 PrimitiveComponents.
언리언 엔진에서 굉장히 많은 유형을 저장해둘 수 있는 TArray 배열에 대해 배웠다. TArray는 시퀀스인 컨테이너 클래스이다. GetAllActorsOfClass로 원하는 조건에 맞는 모든 Actor를 찾을 수 있었다.
SpawnEmitterAtLocation로 projectile를 스폰시키는 방법, UParticleSystem, UParticleSystemComponent로 파티클을 추가하는 방법을 배웠다. 게임의 디테일을 완성하는 단계에서 쓰인다.
ApplyDamage로 데미지를 적용시키는 방법을 학습했다. 함수로 Damage 관련된 내용이 구현되어 있는게 매우 신기했다. UDamageType에는 Damage에 관련된 아주 많은 내용을 담을 수 있었다.
Delegate 개념에 대해서 자세하게 알아보았다. c++ 오브젝트 상의 멤버 함수 호출을 하는 방식이었다. 그리고 그 델리게이트를 Serialize 가능하며, 그 함수를 이름으로 찾을 수도 있는 방식이 Dynamic Delegate이었다.
3D 3인칭 게임에서 플레이어의 움직임과 마우스 이동법에 대해서 학습했다. project settings에서 정의해놓은 input axis 와 action을 가져와서 사용했다. 빠르게 플레이어의 이동을 만들 수 있었다.
Catch2 에러가 발생했는데 알고보니 현재 5.4 버전에서 유닛 테스팅에 문제가 있다고 한다. Catch2는 C++에서의 Unit test freamwork라고 한다.
SetRootComponent()와 RootComponent = Target 의 차이에 대해서 조사해봤다. 멤버 함수와 멤버 변수의 차이라고 생각했는데 사용하는 방법에서도 차이가 있었다.
SpawnEmitterAttached로 특정 Socket 위치에 파티클 이펙트를 실행하도록 만들어 보았다.
DrawDebugCamera로 RayCast를 하기 위한 baseLocation을 뷰포트에서 어떻게 나타낼지에 대해서 탐구했다. 3인칭 슈팅게임에서는 총에서 raycast를 쏘는 것이 아닌 카메라에서 raycast를 쏘는 것이 일반적이다.
ECollisionChannel Enum 변수에서 Channel에 따른 LineTrace 방법에 대해 학습했다. LineTraceSingleByChannel으로 원하는 Channel에 linetracing을 했다.
Udemy C++ 개발자: C++ 학습하고 비디오 게임 제작하기를 완강하고 느낀점을 적은 글입니다
BeginPlay에서 처음 위치를 저장해두고 Tick에서 원하는 위치까지 계속해서 업데이트하고 가까워졌을때 방향벡터가 반대로 되도록한다.
2024-05-29Udemy 언리얼 C++ 멀티플레이어 마스터 : 중급 게임 개발 강의를 수강하며 Component에서 어떻게 Trigger를 일으키는지 알게 된 내용을 정리한 글입니다.
언리얼 엔진으로 개발한 3D 건슈팅 게임에서 총을 바꾸는 방법에 대해 적은 글입니다.
3D 모델을 추가마켓플레이스에서 Tokyo Stylized Environment 배경 추가alsV4 GameMode 추가
3D 모델과 aslV4를 연동하고 총 꺼내기를 해보았다
alsV4에 SimpleShooter에서 배운 총 발사, 피격판정, HUD 목업을 구현했다. 생각보다 오류가 많이 나와서 당황했다. 다른 캐릭터들을 사용하기위해서 mmd 캐릭터를 가져와서 리타기팅을 했다
게임 개발에서 눈에 보이지 않는 작은 실수 하나가 전체 프로젝트의 완성도에 큰 영향을 미칠 수 있습니다. 그 중 하나가 바로 Material의 사용입니다. UE5(언리얼 엔진 5)에서는 특히 Skeletal Mesh에 적용되는 Material의 사용이 매우 중요합니다.
이번 글에서는 TPS 게임에서 적 캐릭터의 다양성을 위해 ALS V4와 VRoid 모델을 리타기팅하는 과정을 소개합니다. 지난 벨로그 글에서 설명한 애니메이션 상태 머신과 함께 다양한 캐릭터를 구현하는 방법을 다룹니다.
적 캐릭터들이 무기를 조준하지 않던 문제를 해결한 과정을 다룹니다. 적 캐릭터가 무기를 제대로 소지하도록 수정했습니다. 그리고 이제 다양한 적 캐릭터가 등장합니다.
이번 포스팅에서는 탄환 수를 관리하고, 아이템을 통해 탄환을 획득하는 시스템을 구현한 과정을 다룹니다. HUD에서 플레이어의 탄환 수를 표시하고, Pickup_Item 클래스를 통해 아이템을 획득할 수 있게 만들었습니다
이번 포스팅에서는 재장전 기능과 재장전 애니메이션을 구현한 과정을 다룹니다. Gun 클래스를 기반으로 한 블루프린트에서 탄약집 교체를 시각적으로 구현하는 방법을 소개합니다.
이번 포스팅에서는 AI의 재장전 기능, Muzzle Effect 변경, Hit Effect 변경, 그리고 배경음 추가에 대해 다룹니다. 이를 통해 게임의 완성도를 높이고, 플레이어의 몰입감을 향상시키는 방법을 소개합니다.
이번 포스팅에서는 퍼즐 기믹의 완성, InteractionActor, PickupItem, DoorActor 클래스를 중심으로 추가된 기능들을 소개합니다. 이를 통해 게임의 몰입감을 한층 더 높였습니다.
이번 포스팅에서는 위젯을 플레이어 카메라에 보이게 만들고, 문을 여는 소리와 닫는 소리, 아이템을 주울 때 나는 소리를 추가하며, 키가 필요할 때 카메라 쉐이크 효과를 추가한 과정과 고민을 공유합니다. 또한, C++ 폴더 구조를 정리한 내용도 다룹니다
이번 포스팅에서는 조합 자물쇠 로직 구현 과정, 회전 정의 방법, 문과의 상호작용, 문제 상황 해결 방법 등을 다룹니다. 특히, 각 칸의 회전 처리 및 타임라인 사용법에 대해 자세히 설명합니다.
이번 포스팅에서는 방향 자물쇠 로직 구현 과정, 타임라인 사용법, Blender를 사용한 3D 에셋 편집, 문제 상황 해결 방법 등을 다룹니다. 특히, 방향 입력에 따른 자물쇠의 이동 처리 및 문과의 상호작용을 자세히 설명합니다
ButtonLockActor을 구현하면서 버튼 자물쇠를 만드는 방법을 다룹니다. 로직 구현, 타임라인 사용법, TArray 활용, USTRUCT, UCLASS로 데이터 관리의 차이점, PlayerController로 카메라 이동 등을 다룹니다
TSoftObjectPtr와 TSubclassOf는 Unreal Engine에서 자산과 클래스를 참조하는 데 사용되는 두 가지 서로 다른 방법입니다. 이 두 가지 방법은 다른 용도로 사용되며, 그에 따라 다른 방식으로 작동합니다.
이번 글에서는 ABase_Item을 상속받은 KeyActor를 월드에 배치했을 때, 자동으로 ItemID 값을 설정해주는 방법을 소개합니다. Editor Utility Widget을 사용하여 월드에 배치된 아이템의 ItemID 값을 자동으로 설정할 수 있습니다
이번 포스팅에서는 아이템 관리와 월드 스폰 시스템을 구현하는 방법을 다룹니다. 인벤토리 시스템, 아이템의 특성 관리, 아이템 스폰 시스템 등을 중점적으로 설명합니다.
Unreal Engine에서 객체 초기화 시점과 BeginPlay 시점의 차이를 이해하는 것은 매우 중요합니다. 이번 글에서는 왜 생성자에서 레벨 이름을 가져올 수 없는지, BeginPlay에서 FObjectFinder를 사용할 수 없는 이유를 살펴보겠습니다
이번 포스팅에서는 인벤토리 위젯 구현과 HUD 크로스헤어 변경 작업을 다룹니다. 월드에서 떨어진 아이템을 위젯에 표시하고, 이를 클릭하여 인벤토리에 추가하는 기능과 함께, 새로운 크로스헤어 디자인을 HUD에 적용한 과정을 설명합니다.
이번 포스팅에서는 언리얼 엔진의 다양한 오류와 컴파일 에러, 크래시 문제를 다룹니다. 엔진 실행 시 75%에서 멈추는 문제, 블루프린트 관련 이슈 등을 중점적으로 설명합니다.
이번 글에서는 탑쌓기 게임의 기획 초안을 다룹니다. 이 게임의 주요 기능, 사용 기술, 각 기능의 구현 방법 등을 상세히 설명합니다
2024.07.23 이번 글에서는 언리얼 엔진 개발자를 위한 Perforce 설정 방법과 설정시에 생기는 각종 문제 해결 방안을 제공합니다. Github 대신 Perforce를 사용해야 하는 이유와 협업 환경에서의 유용성을 설명합니다.
이번 글에서는 Unreal Engine 5에서 DynamicMeshComponent와 메쉬 불리언 연산에 대해 설명합니다.
이번 포스팅에서는 플레이 중 발생한 문제 상황과 이를 해결하는 방법들을 다룹니다. 인벤토리 상호작용을 개선한 내용과 아이템 소리 문제, 문과 관련된 위젯 및 히트박스 처리, 그리고 키 아이템 처리 문제 등을 중점적으로 설명합니다.
이번 글에서는 블루프린트로 구현한 DynamicMeshComponent의 겹쳐진 영역 자르기 기능을 C++ 코드로 변환하여 최적화하는 방법을 설명합니다. 또한 AABB의 개념과 어떻게 사용할 수 있는지를 설명합니다.
2024.08.02 이번 포스팅에서는 아이템 캡처 이미지 저장 및 충돌 처리와 관련된 문제를 해결하는 과정을 다룹니다. SceneCaptureComponent2D를 활용한 이미지 캡처 방법, 다중 충돌 처리, 그리고 히트 결과를 효과적으로 필터링하는 방법을 설명합니다.
2024.08.03 이번 글에서는 프로젝트 StackBlock의 개발 과정, 문제 해결 방법, 최적화 과정 및 최종 릴리즈에 대한 모든 것을 정리합니다. 각 단계에서 겪었던 어려움과 그에 대한 해결 방법을 상세히 설명합니다.
C++에서 정의한 Blueprint Event를 호출해서 Blueprint에서 사용할 수 있도록 만들었다.
HUD 패널에서 체력바를 나타내는 기능을 구현했고, 캐릭터가 죽었을 때 나오는 애니메이션이 정상적으로 작동하도록 만들었다.
적 캐릭터가 무기를 들고 있지 않던 문제를 해결했다.문제의 원인은 블루프린트에서 On Changed 함수 노드를 사용하지 않아서였다.
2024.08.05 이번 글에서는 원반 사격 게임의 기획 초안을 다룹니다. 이 게임의 주요 기능, 사용 기술, 각 기능의 구현 방법 등을 상세히 설명합니다. 원반 스폰, 원반 이동, 사용자 입력 처리, UI 구성, 점수 계산 등 게임의 핵심 요소들을 다룹니다.
이번 글에서는 원반이 포물선을 그리며 날아가는 이동을 구현하고, 총에 맞았을 때 원반이 부서지도록 하는 방법에 대해 다룹니다. 여러 가지 접근 방법을 고려하였으며, 각각의 장단점을 설명하고 최종 구현 방법을 선택한 이유를 자세히 다룹니다.
2024.08.12 이번 글에서는 ShootWonban 게임의 Stage 1을 완성한 내용을 정리합니다. 최고 스코어 관리 방법과 총기 시스템 구현에 대한 상세 설명을 다룹니다. 게임 오버 처리와 관련된 UI 및 전체 게임 개발 과정을 간략하게 정리합니다.
2024.08.20 이번 포스팅에서는 인벤토리 시스템에서 아이템 관리 및 무기 장착 기능을 개선한 내용을 다룹니다. 드래그 앤 드롭을 통한 무기 장착, 다양한 아이템의 마우스 클릭 입력 처리, 그리고 무기 교체 및 액션 실행을 위한 최적화 과정을 설명합니다.
2024.08.21 이번 글에서는 디펜스게임인 PickUpDefense의 기획 내용을 정리합니다. 게임의 전반적인 콘셉트, 주요 메커니즘, 그리고 시스템 구성에 대해 설명합니다.
2024.08.22 이번 글에서는 PickUpDefense 게임의 UI 위젯 시스템에 대한 개념을 정리하고, 제네릭 함수를 활용하여 코드 중복을 줄이는 과정을 다룹니다.
2024.08.31 이번 글에서는 PickUpDefense 게임에서 마우스 입력을 처리하고, 위젯을 동적으로 생성하는 과정에서 발생한 문제들을 해결하는 방법에 대해 다룹니다
2024.09.06 이번 글에서는 PickUpDefense 게임에서 캐릭터의 애니메이션을 C++ 코드로 관리하고, 데이터 테이블을 활용하여 다양한 캐릭터의 애니메이션을 설정하는 방법을 다룹니다.
2024/10/06 언리얼 엔진(UE5)에서 대규모 월드를 관리하기 위해 사용하는 두 가지 대표적인 방식인 서브레벨(Sub-Level)과 월드 파티션(World Partition)에 대해 알아보겠습니다.
언리얼 엔진에서 객체를 초기화하는 방법에는 두 가지 주요 방식이 있습니다. 하나는 UObject 기반 클래스를 사용하여 언리얼의 가비지 컬렉션 시스템을 활용하는 NewObject 방식이고, 다른 하나는 전통적인 C++ 클래스에서 메모리를 직접 관리하는 new 방식입니다
멀티스레드 프로그래밍에서 필수적인 도구인 FThreadSafeBool와 FThreadSafeCounter에 대해 다룹니다. 언리얼 엔진에서 여러 스레드가 동시에 데이터를 처리할 때 발생하는 레이스 컨디션을 방지하고, 스레드 간의 안전한 데이터 처리를 보장합니다.
Draw Call은 CPU가 GPU에 렌더링 작업을 요청하는 과정으로, 오브젝트가 많아질수록 성능 저하를 유발할 수 있습니다. 언리얼 엔진에서는 LOD, HLOD, 액터 병합 등의 최적화 방법을 활용하여 Draw Call 수를 줄이고 성능을 개선할 수 있습니다.
이 글에서는 Unreal Engine에서 블루프린트 클래스 로드와 스폰을 다루며, 이를 위한 함수인 StaticLoadClass, LoadObject 등 주요 함수들의 차이점과 사용법을 깊이 있게 살펴보겠습니다.
인벤토리 시스템을 구현하던 도중 만난 오류입니다. 객체를 관리하는 다른 경우에도 충분히 생길 수 있는 오류이기 때문에 정리해두려고 합니다.
Unreal Engine 5의 Cast와 CastChecked는 두 가지 주요 캐스팅 함수입니다. 둘 다 특정 타입으로 안전하게 형변환하는데, 사용 목적과 동작 방식이 다릅니다. 각각의 특성과 예제 코드들을 살펴보겠습니다.
Unreal Engine에서 UBlueprintGeneratedClass, UClass, UObject는 모두 게임 객체와 관련된 클래스 계층을 구성하며, 각기 다른 역할을 수행합니다.
BlueprintGeneratedClass는 블루프린트로 생성된 클래스를 의미하며, Unreal Engine에서 블루프린트가 컴파일되었을 때 자동으로 생성되는 클래스입니다.
TObjectPtr과 일반적인 포인터(`)의 차이점은 Unreal Engine의 메모리 관리, 특히 가비지 컬렉션과 관련이 있으며, TObjectPtr`은 옵션으로 지연 로드(lazy load)를 지원*하는 방식입니다.
GetWorld()->GetMapName()은 언리얼 엔진에서 매우 자주 사용되는 함수 중 하나입니다. 이 함수는 현재 로드된 맵의 이름을 반환하는데, 특히 여러 레벨을 전환하거나 레벨 데이터를 기반으로 게임 상태를 조작할 때 매우 유용합니다
Unreal Engine의 Delegate는 이벤트 기반 프로그래밍에서 자주 사용하는데, 객체 간의 메시지 전달을 효율적으로 처리할 수 있습니다.