전체 글 403

[UE4] Camera Shake (UAnimNotify, UMatineeCameraShake)

오늘은 카메라가 흔들리며 역동적인 느낌을 낼 수 있는 Camera Shake 기능을 구현해보았다. 🔷 Anim Notify - Camera Shake 카메라 쉐이크 기능은 노티파이로 제작하여 원하는 몽타주의 타이밍에 발동시킬 수 있도록 구현하였다. UAnimNotify를 상속받아 UMatineeCameraShake 객체를 생성해주었다. Notify가 발동될 때 Mesh Component를 Get Owner인 Character로 형변환시키고, Character의 PlayerController를 불러왔다. 카메라 쉐이크 기능은 APlayerController에 존재하는 PlayerCameraManager 객체의 StartCameraShake 함수를 통해 발동시킬 수 있다. 이후, Fist(맨손공격)의 마지막..

🎮Unreal4/C++ 2023.05.12

[UE4] STextBlock 글자 / SBorder 배경 색상 변경 (ColorAndOpacity, BorderImage, FSlateImageBrush)

🪄 STextBlock 글자 색상 변경 ColorAndOpacity 명령어를 사용하여 STextBlock의 Text 색상을 변경시킬 수 있다. 🪄 SBorder 배경 색상 변경 배경색상을 채울 SBorder를 생성하고, BorderImage 명령어를 통해 FSlateImageBrush 를 등록해주었다. FSlateImageBrush 객체의 브러쉬는 싱글톤으로 사용이 가능한 FWeaponStyle 클래스에 생성해주었다. 브러쉬는 생성자에서 초기화해주었고, 매개변수로 배경이 될 이미지의 경로를 전달해주었다. 이후, 배경의 크기와, Tint로 입힐 수 있는 색상값을 전달해주었다. 이후 체크박스를 그릴때에도 동일한 작업을 수행하여, 카테고리 항목의 배경 색상을 변경시켜주었다. 컴파일 후 에디터 창을 확인해보면 ..

[DX] Animation Skin 데이터 : Skinning 기법

🦿 Skinning 애니메이션에서는 Skinning 이라는 기법을 사용한다. Skinning은 단어 그대로 피부를 메꿔주는 기능을 말한다. 허벅지와 종아리가 일자로 있을때는 아무런 문제가 없지만, 캐릭터가 걸을 때 허벅지와 무릎의 관절이 회전되면서 비어있는 Mesh 공간이 생기고, 허벅지와 무릎이 연결된 정점이 비어있게 된다. 이러한 빈 공간을 메꾸기 위한 기법을 Skinning 기법이라고 한다. 본의 각 정점은 위치(Position)와 본의 번호 BlendIndices(x,y,z,w)와, 본의 가중치 BlendWeights(x,y,z,w) 값을 갖는다. 어떤 모델인지, 어떤 종류인지에 따라 x,y,z,w 4개의 데이터로 이루어질수도 있지만 8개의 데이터로 이루어질수도 있다. (인간형 Bone의 정점이 ..

🎨DirectX 2023.05.11

[UE4] Detail View 커스텀 : 배열 엘리먼트 삽입/삭제 (PostEditChangeChainProperty, EPropertyChangeType)

이전 학습부터 만들어왔던 Detail View의 커스텀작업을 마무리 해 보았다. 이전 학습에서 체크박스를 이용한 Equipment 데이터의 기본값을 설정할 수 있도록 구현해놨으니, 이번에는 Do Action Data의 내용과, Hit Data의 내용을 출력해보았다. 💻 Details View에 Do Action Data, Hit Data 추가 먼저, 두 데이터들의 내용을 Details View에 출력하기 위해 SDoActionData, SHitData 클래스를 작성하였다. 두 클래스 모두 EquipmentData와 마찬가지로 속성 값을 커스터마이징하는것이기 때문에 IPropertyTypeCustomization을 상속받았고 두 클래스간의 소스코드는 거의 동일하므로 아래부터는 Do Action Data를 ..

[프로그래머스/C++] 입국심사 - 이분탐색

입국심사 문제 설명 n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다. 처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다. 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다. 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서 심사를 받을 수도 있습니다. 모든 사람이 심사를 받는데 걸리는 시간을 최소로 하고 싶습니다. 입국심사를 기다리는 사람 수 n, 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열 times가 매개변수로 주어질 때, 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 하도록 solution 함수를 작성해주세요. 제한사항..

[UE4] Detail View 커스텀 : 체크박스 -2 (IsChecked, OnCheckStateChanged, AsShared, TSharedFromThis, IPropertyUtilities, ForceRefresh)

이전 학습에 이어서 체크박스의 체크/해제 기능을 구현해보았다. ☑️ 체크박스 체크/해제 하기 SCheckBox를 생성한 후, IsChecked 명령어를 사용하여 체크박스의 체크를 하거나 해제할 수 있다. IsChecked 명령어의 매개변수에는 ECheckBoxState 열거형 타입이 들어가는데, 해당 열거형을 살펴보면 체크해제가 0, 체크가 1 이므로 true, false로 사용해도 무방하다. 따라서 InternalDatas의 bChecked 변수로 체크의 유무를 설정하였다. ☑️ 체크박스 이벤트/델리게이트 또한 SCheckBox 객체에 OnCheckStateChange 델리게이트를 이용하여 체크박스가 체크될때마다 호출되는 함수를 등록해주었다. 🚩AsShared 에러 이 상태에서 프로그램을 실행시키면 아..

[C++] 스마트 포인터 3가지, 언리얼의 스마트 포인터(TSharedRef), TSharedFromThis (AsShared, SharedThis)

스마트 포인터 스마트 포인터는 메모리 누수를 방지하고, 동적 메모리 할당과 해제에 대한 직접적인 관리를 피할 수 있는 포인터입니다. 또한 스마트 포인터는 C++11 표준 라이브러리에서 제공되며, 포인터 변수처럼 동작하지만 메모리를 자동으로 해제하도록 디자인되어있습니다. 대표적으로는 쉐어드 포인터(Shared Pointer), 위크 포인터 (Weak Pointer), 유니크 포인터(Unique Pointer) 세 가지가 있습니다. std::shared_ptr shared_ptr은 여러 개의 스마트 포인터가 동일한 객체에 대한 소유권을 공유할 수 있게 합니다. 내부적으로 참조 카운팅 방식을 사용하여 몇 개의 shared_ptr이 해당 객체를 참조하고 있는지 추적하며, 객체를 참조하는 포인터의 개수가 0이 될..

[UE4] Detail View 커스텀 : 체크박스 (DesiredWidth, StandardDialog, UniformGridPanel, IPropertyHandle, AddProperties)

이전 학습에는 Property의 내용을 접었다 펼 수 있는 커스텀 Property를 대략적으로 만들었다. 이번에는 커스텀 Property에 Equipment의 데이터를 올바르게 출력하고, 체크박스를 추가하는 방법에 대해 학습해보았다. ☑️ Customize Header에 CheckBox 그리기 먼저, 커스터마이징 Equipment Property를 구성하는 SEquipmentData 클래스의 CustomizeHeader 함수에서 헤더를 정의하였다. 헤더의 ValueContent 영역의 넓이를 조절하기 위해 MinDesiredWidth와 MaxDesireWidth 명령어를 사용하여 넓이의 최솟값과 최댓값을 설정해주었다. DesireWidth 를 설정하는 Style값은 엔진의 StandardDialog를 사..

[DX] 3D Model 회전하기 (UpdateTransform, UpdateBones, sinf)

3D Model의 Transform을 업데이트하면서 회전시키도록 구현해보았다. 💡 3D Model 회전 ModelDemo 클래스의 Update 함수에서 탱크 객체의 포탑부분이 빙글빙글 돌아가도록 회전시켜보았다. 탱크의 포탑 부분의 Bone 인덱스는 10 이므로 인덱스를 통한 Bone을 불러오고, Transform의 회전값(rotation)을 sinf 함수로 변화시켰다. Delta 값과 PI 값을 가져와서 회전속도(100)에 맞춰 Rotation의 Yaw값을 변화시켜주었다. 💡 Update Transform ModelRender 클래스의 UpdateTransform 함수에서는 Update 시킬 Bone과 변환된 Transform 정보(Matrix)를 매개변수로 받아온다. Bone이 존재한다면 UpdateB..

🎨DirectX 2023.05.08

[DX] Model Material Render (DiffuseMap)

이전 학습을 통해 Material 파일을 Export하여 "_Textures" 경로에 .material 파일을 저장해두었다. 이번에는 해당 .material 파일을 읽어들여 Model의 Mesh에 입히는 작업을 수행하였다. ModelRender 객체를 생성하며 .material이 저장되어있는 경로를 ReadMaterial 함수에 전달해준다. ReadMaterial 함수에서는 xml 코드로 저장해두었던 .material 파일을 읽어들이기 위해 똑같이 TINYXML 라이브러리를 사용하였다. xml 코드의 root를 먼저 읽어들인 후, root 노드의 자식들에 접근하며 material 정보를 수집하였다. 차례로 Texture 정보와 Color의 정보를 읽어와 material 객체에 저장하였다. 읽어들인 mat..

🎨DirectX 2023.05.08

[UE4] Detail View 커스텀 : 카테고리, 항목 추가하기 (IDetailCustomization, EditCategory, AddProperty, IPropertyTypeCustomization, CustomizeHeader/CustomizeChildren)

Detail View를 커스터마이징 하려면 Detail View에 대한 클래스가 하나 있어야 한다. 이전에 에디터의 메인 화면에 있는 디테일 창에다 버튼을 추가하는 커스텀 작업을 이미 했었다. 2023.03.28 - [Unreal4/C++] - [UE4] 디테일 창 커스텀 : Paint 버튼 추가 (Detail Panel, RegisterCustomClassLayout, IDetailCustomization, 터널링/버블링/핸들링, #if WITH_EDITOR ~ #endif) Main 디테일 창 Weapon Editor 디테일 창 이전에는 Main 화면의 디테일 창을 수정했고, 이번에는 새로운 Weapon Editor 창을 열었을 때 나오는 디테일 창의 새로운 구조를 만드는 작업을 수행했다. 두 개의 ..

[DX] Model Material Export (.material, TINYXML)

하얀색으로만 그렸던 Model의 렌더링에 색상이나 무늬를 입히기 위해 Model Material을 입히는 작업을 학습하였다. 이전에 Mesh를 가져올때 Material Name을 가져왔던 방식과 비슷하게, Scene에 존재하는 Material을 전부 파일로 저장한 뒤, 저장해놓은 Material 배열을 읽어들여서 이름을 비교한 후 렌더링하는 방식으로 구현하였다. 👀 Material 구조체 Material의 정보를 저장하기 위한 구조체로, Material의 색상값들과 각 Material File의 경로를 저장하기 위한 변수를 담아두었다. 📦 Material Export (.material) Material을 읽기에 앞서 먼저 fbx 파일을 읽어 .material 파일로 Export 해보았다. ExportM..

🎨DirectX 2023.05.03
728x90