전체 글 403

[UE4] 디테일 창 카테고리/속성 숨기기 (HideCategory, HideProperty, GetDefaultProperties, EditCategory, IPropertyHandle)

객체를 클릭했을 때 나오는 디테일 창에서 원하는 카테고리 혹은 속성(Property) 을 숨길 수 있는 방법에 대해 공부해보았다. 🚩 카테고리 숨기기 이전에 디테일창에 새로운 카테고리를 추가하는 커스텀 작업을 진행했던 FStaticMesh_Detail 클래스의 CustomizeDetails 함수에 이어서 내용을 추가해보았다. 디테일 창의 레이아웃을 관리할 수 있는 DetailBuilder의 HideCategory 함수를 이용하면 원하는 카테고리를 통째로 숨길 수 있다. 이때 매개변수로 카테고리의 ID를 전달해야 하는데, 나는 언리얼 엔진이 한국어로 설정되어있기 때문에 카테고리의 ID를 바로 확인할 수 없었다. 따라서 에디터 개인설정에서 언어를 영어로 바꿔 카테고리의 ID를 확인하여 전달해야 한다. 입력 ..

[UE4] OpenWindow : 창 띄우기 (FAssetEditorToolkit, FTabManager, InitAssetEditor, NewObject<>)

툴바에 Open Window라는 이름의 버튼을 추가하여, 버튼이 눌렸을 때 새로운 Window 창이 열리는 기능을 구현해보았다. 1️⃣ OpenWindow 툴바 버튼 추가 이전에 툴바에 커스텀 버튼을 추가할 때 사용했던 ButtonCommand 클래스와 ExampleStyle 클래스에 Open Window 버튼 객체를 추가하였다. 2️⃣ Window 객체 생성하기 - ExampleMeshWindow : FAssetEditorToolkit Window 창을 띄우기 위한 클래스 ExampleMeshWindow를 생성하였다. 창의 형태로 클래스를 띄우기 위해선 FAssetEditorToolkit 클래스를 상속받아야 한다. ExampleMeshWindow 클래스는 싱글톤 형태로 사용할 수 있게 구성하였다. Ge..

[UE4] Load Mesh-2: Mesh 배치하기 (GEditor, GetActiveViewport, GetClient, FLevelEditorViewportClient, ProceduralMeshComponent, SpawnActorDeffered-FinishSpawning, OnConstuction)

🪧 Mesh 배치 이전시간에 바탕화면에 저장되어있는 Mesh 파일을 읽어서 정점 정보를 모두 가져오는것까지 완성하였다. 이제는 가져온 정점 정보로 Mesh 객체를 제작하여 뷰포트에 띄울 수 있도록 배치 기능을 구현하였다. 1️⃣ Mesh를 배치할 지점 구하기 - LineTrace 카메라가 바라보고있는 방향에 Mesh를 배치하기 위해, 카메라의 방향으로 LineTrace 충돌을 체크하였다. GEditor 는 에디터의 전역 객체로, GetActiveViewport 함수로 뷰포트를 가져오고, 뷰포트의 GetClient 함수를 호출하면 뷰포트의 카메라를 가져올 수 있다. 이러한 카메라 객체를 FLevelEditorViewportClient 자료형의 객체로 저장하였다. LineTrace의 시작 지점은 카메라의 위..

[Portfolio] DualSword Charge Skill 마무리, 회전 Skill 완성

https://youtu.be/NTSojrzvga8 진행중인 작업 - 두번째 무기 구현중 : 활 진행 예정 작업 - 플레이어 - 밑에서 위로 공격하는 공중콤보 구현 - 맵적용, IK, Parkour - 몬스터 AI 진행 완료 작업 - 플레이어, 무기, 공격 애니메이션 에셋 찾기 - Dual Sword 이동 및 공격 애니메이션 적용 - Dual Sword Equip/Unequip 구현 - 기본 4콤보 공격 구현 - 공중 3콤보 공격 구현 - Dead 애니메이션 적용 (공중에서 Dead / 땅에서 Dead) - 공중콤보 Enemy 데미지 처리 - 방어, 방어해제, 반격(Parrying) 구현 - 타겟팅을 이용한 공중 7콤보 공격 구현 - 검기 Trail, Particle 적용 - DualSword Slash..

[프로그래머스/C++] 게임 맵 최단거리 - BFS (너비우선탐색)

게임 맵 최단거리 문제 설명 ROR 게임은 두 팀으로 나누어서 진행하며, 상대 팀 진영을 먼저 파괴하면 이기는 게임입니다. 따라서, 각 팀은 상대 팀 진영에 최대한 빨리 도착하는 것이 유리합니다. 지금부터 당신은 한 팀의 팀원이 되어 게임을 진행하려고 합니다. 다음은 5 x 5 크기의 맵에, 당신의 캐릭터가 (행: 1, 열: 1) 위치에 있고, 상대 팀 진영은 (행: 5, 열: 5) 위치에 있는 경우의 예시입니다. 위 그림에서 검은색 부분은 벽으로 막혀있어 갈 수 없는 길이며, 흰색 부분은 갈 수 있는 길입니다. 캐릭터가 움직일 때는 동, 서, 남, 북 방향으로 한 칸씩 이동하며, 게임 맵을 벗어난 길은 갈 수 없습니다. 아래 예시는 캐릭터가 상대 팀 진영으로 가는 두 가지 방법을 나타내고 있습니다. 첫..

[프로그래머스/C++] 타켓넘버 - DFS (깊이우선탐색)

타겟 넘버 문제 설명 n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3 사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.제한사항 주어지는 숫자의 개수는 2개 이상 20개 이하입니다. 각 숫자는 1 이상 50 이하인 자연수입니다. 타겟 넘버는 1 이..

[UE4] Load Mesh-1: 데이터 읽어오기 (OpenFileDialog, LoadFileToArray, FMemoryReader, Seek)

📃 Load Mesh 이전에 추가해두었던 툴바 버튼인 LoadMesh를 누르면, 파일로 저장되어있는 Mesh 정보를 읽어서 불러올 수 있는 기능을 구현해보았다. 🚩 IDesktopPlatform::OpenFileDialog 툴바 버튼을 누르면 실행되도록 델리게이트에 등록시켜놓은 OnClicked_LoadMesh 함수에 기능을 구현하였다. 우선, 게임이 실행중이라면 Load Mesh 기능이 작동하지않도록 FApp::IsGame 함수로 조건문을 걸어주었다. 이후부터는 사실 Save Mesh의 기능을 구현했을때와 거의 동일한 코드이다. IMainFrameModule 객체로 MainFrame을 받아오고, 윈도우 Handle을 가져와서 Load할 파일을 찾을 수 있는 창을 띄우는 것이다. 이때 Save Mesh와..

[UE4] Save Mesh-2 : .bin/.csv파일로 저장 (FPaths, GetOSWindowHandle, IDesktopPlatform, SaveFileDialog, Stream <<, FArchive, FileHelper, GetBaseFilename)

4️⃣ Save 경로 지정하기 Mesh 정보를 모두 추출하였으니, Mesh 파일을 Save할 경로를 지정해줘야 한다. 첫번째 단계로는 Save 창을 띄웠을 때 Default로 나타나는 경로를 GetPath 함수로 구해주었다. (한번도 임포트 버튼을 눌러서 경로창을 띄우지 않았다면 없을 수 있음) 이때 사용되는 FPaths에는 다양한 경로에 대한 함수를 제공한다. 💡 FPaths AutomationDir : 자동화 경로 CloudDir : 클라우드 경로(빌드파일이 올라감) Combine : 슬래시를 합쳐줌 ConvertRelativePathToFull : 상대경로를 절대경로로 바꿔줌 EngineConfigDir : 엔진 Config 폴더 (다양한 Engine Dir 존재) GetBaseFileName : ..

[UE4] Command 명령어-3 : Player/Player Start 위치 변경 (FConsoleCommandWithWorldAndArgsDelegate)

🚩 Player / Player Start 위치 변경 명령어 커스텀 Command 명령어를 제작하여 Player Start의 위치를 변경시키는 기능을 만들어보았다. 게임이 플레이중이라면 플레이어의 위치를 변경하고, 플레이중이 아니라면 Player Start의 지점을 변경시키도록 구현하였다. 우선, 새로운 명령어 추가를 위한 IConsoleCommand 객체를 새로 생성해주었다. ExampleConsoleCommand 파일의 생성자에선 Command로 뷰포트의 World에 접근할 수 있는 FConsoleCommandWithWorldAndArgsDelegate 객체를 생성하고, 명령어를 델리게이트에 등록해주었다. 명령어의 이름은 "MoveToPlayer"라고 지정한 뒤, ExampleConsoleComman..

[UE4] Save Mesh-1 : 데이터 추출하기(FStaticMeshRenderData, VertexBuffer/IndexBuffer)

디테일 패널의 커스텀 기능으로 Static Mesh의 정점 정보를 저장하여 원하는 형태로 저장할 수 있는 Save Mesh 기능을 구현해보았다. 이전에 만들어두었던 Mesh 카테고리의 Paint 버튼 아래에 Save 버튼을 추가한 뒤, Save 버튼이 눌렸을때의 기능을 구현하는 OnClicked_Save 함수를 작성하였다. 1️⃣ 클릭한 모든 액터들 배열에 저장하기 Save 버튼을 눌렀을때 Ctrl 키를 누르며 선택한 모든 객체들에 대해 기능을 수행하기 위해 배열 TArray에 ACStaticMesh 객체들을 저장하였다. 2️⃣ Mesh의 정점 정보 추출하기 선택된 Mesh들의 for문을 돌면서 객체들의 Mesh Component에 접근하였다. 이때 구현 단계의 중간중간 조건에 맞지 않는경우 FReply..

[Portfolio] DualSword Charge 스킬 구현

https://youtu.be/Qw1GaF5QloA 진행중인 작업 - 스킬 수정 및 간단 스킬 추가 - 지옥의 파티클 찾기 - 두번째 무기 구현 진행 예정 작업 - 플레이어 - 밑에서 위로 공격하는 공중콤보 구현 - 맵적용, IK, Parkour - 몬스터 AI 진행 완료 작업 - 플레이어, 무기, 공격 애니메이션 에셋 찾기 - Dual Sword 이동 및 공격 애니메이션 적용 - Dual Sword Equip/Unequip 구현 - 기본 4콤보 공격 구현 - 공중 3콤보 공격 구현 - Dead 애니메이션 적용 (공중에서 Dead / 땅에서 Dead) - 공중콤보 Enemy 데미지 처리 - 방어, 방어해제, 반격(Parrying) 구현 - 타겟팅을 이용한 공중 7콤보 공격 구현 - 검기 Trail, Pa..

[UE4] 디테일 창 커스텀 : Paint 버튼 추가 (Detail Panel, 터널링/버블링/핸들링, #if WITH_EDITOR ~ #endif, RegisterCustomClassLayout, IDetailCustomization)

⌨️ Detail Panel Custom 뷰포트에 올라간 어떤 객체를 선택했을 때나 블루프린트 창을 열었을 때 디테일 패널이 나타나게 된다. 이러한 디테일 패널안에 원하는 기능을 추가할 수 있도록 커스텀하는 소스코드를 작성해보았다. 🚩 StaticMesh 생성하기 먼저, 디테일 패널을 추가할 Static Mesh를 하나 생성하였다. 카메라 모형으로 Mesh를 지정하고, Color 라는 이름의 Vector Parameter를 갖는 머티리얼을 적용해주었다. 이후, Example.Build.cs 파일에 Private Dependency Module Names로 "UEProject_05"를 추가하였다. 이는 런타임 프로젝트의 이름으로, Public이 아닌 Private로 추가하여야 순환 호출을 막을 수 있다. ..

728x90