목록언리얼 (116)
초보 코린이의 성장 일지
DoActionData에 배열로 정보를 보여주기 위해 작업을 시작해 보겠다. 우선 DoActionData 카테고리 안에 DoActionDatas 배열 구역을 나타내는 또 다른 Header를 만들어 줘야한다. 더보기 #pragma once #include "CoreMinimal.h" #include "IPropertyTypeCustomization.h" class WEAPON_API SWeaponDoActionData : public IPropertyTypeCustomization { public: void CustomizeHeader(TSharedRef InPropertyHandle, FDetailWidgetRow& InHeaderRow, IPropertyTypeCustomizationUtils& InC..
기본값에서 변경된 내용을 보여주게 만들어 줄 것이다. GetValue를 보면 24가지 자료형이 override가 되어있다. 사용하게 될 자료형 몇개만 추려서 선언해 놓고 시작할 것이다. 더보기 #pragma once #include "CoreMinimal.h" class WEAPON_API SWeaponCheckBoxes : public TSharedFromThis // 직접적으로 상속받으면 주소가 일치하게된다. { public: void CheckDefaultObject(int32 InIndex, UObject* InValue); // float로 cast가 될수도 있기 때문에 UObject로 객체 구분 void CheckDefaultValue(int32 InIndex, float InValue); v..
이제 체크박스를 클릭시 알맞은 데이터가 노출되고, 선택하지 않은 데이터는 안보이도록 만들어 볼 것이다. 위에 조건도 수용하면서, 새로고침이 되면 CreateCheckBoxes로 만들어진 체크박스는 사라지는게 아닌 유지가 되어야한다. 그 이유는 한번 클릭할때마다 박스가 생성이된다면 그전에 있던 박스에 정보들을 지우고 새롭게 생성하기 때문에 가지고 있는 정보를 소유하고 있어야한다. 더보기 #pragma once #include "CoreMinimal.h" #include "IDetailCustomization.h" class WEAPON_API SWeaponDetailsView : public IDetailCustomization { public: void CustomizeDetails(IDetailLayo..
체크박스를 생성하고, 체크한 목록에 관한 내용이 나오도록 만들어 나갈 것이다. 1. Grid Panel을 사용할때, 범위가 줄어들게 된다면 줄어든 범위만큼 Text가 보정처리가 안된다. 2. Uniform Grid Panel을 사용하게되면, 범위가 줄어들어도 균등하게 보정처리가 이뤄지기 때문에 이걸 사용할 것이다. 더보기 #pragma once #include "CoreMinimal.h" class WEAPON_API SWeaponCheckBoxes { public: // 하나의 프로퍼티에 대한 식별자 역할, IPropertyHandle void AddProperties(TSharedPtr InHandle); // SNew에 최상의 부모가 SWidget이 된다. 레퍼런스를 사용하기 때문에 동일하게 쓰기위..
왼쪽 카테고리창은 마무리가 되었으며, 오른쪽 창을 이제 커스텀 해보도록 하겠다. 1. 오른쪽 창을 커스텀하려면 Class를 하나 생성해줘야 한다. 더보기 #pragma once #include "CoreMinimal.h" #include "IDetailCustomization.h" class WEAPON_API SWeaponDetailsView : public IDetailCustomization { public: static TSharedRef MakeInstance(); void CustomizeDetails(IDetailLayoutBuilder& DetailBuilder) override; }; #include "SWeaponDetailsView.h" TSharedRef SWeaponDetailsV..
Weapon를 관리해주는 Plugin에 검색 기능과 검색을 할때 이름을 입력하면 알맞(연관된)은 이름만 나오도록 만들어볼 것이다. 더보기 #pragma once #include "CoreMinimal.h" #include "Widgets/SCompoundWidget.h" #include "Widgets/Views/STableRow.h" class WEAPON_API SWeaponLeftArea : public SCompoundWidget { private: void OnTextChanged(const FText& InText); // 입력한 Text void OnTextCommitted(const FText& InText, ETextCommit::Type InType); // Enter을 눌러 입력이 완..
Weapon Plugin 영역안에 Row로 내가 지정한 이름과 항목들을 받아서 등록시키게 만들어 볼 것이다. 1. 클래스를 생성해준다. 더보기 #pragma once #include "CoreMinimal.h" #include "Widgets/SCompoundWidget.h" #include "Widgets/Views/STableRow.h" struct FWeaponRowData { int Number; FString Name; class UCWeaponAsset* Asset; // 기본 생성자 FWeaponRowData() { } // 생성자 FWeaponRowData(int32 InNumber, FString InName, class UCWeaponAsset* InAsset) : Number(InNu..
에디터 메뉴바에 Weapon Plugin 아이콘을 입혀 버튼을 등록하고, 클릭했을시 창이 열리도록 만들어 볼 것이다. 기존 플러그인 작업을 할때는 Toolbar 모양과 Command를 Module에서 작업했었다. 이번에는 WeaponCommand 클래스를 생성하여 두가지 기능을 하나로 통합해서 사용할 것이다. 1. 기능을 통합해서 사용할 클래스를 생성해준다. 더보기 #pragma once #include "CoreMinimal.h" #include "Framework/Commands/Commands.h" class WEAPON_API FWeaponCommand : public TCommands { public: FWeaponCommand(); ~FWeaponCommand(); void Startup();..
Weapon을 생성 및 기능들을 관리까지 할 수 있는 하나의 계층인 플러그인을 만들어 볼 것이다. 1. Weapon.Bulld.cs에 추가를 해주고 작업을 진행한다. 1. 에디터 안에서 마우스 우클릭을 누르면, 생성할 수 있는 기능들이 모여져있다. 2. 이안에 메뉴를 한개 추가하는 작업을 진행할 것이다. 언리얼에서는 모든 에셋을 생성할 때는 팩토리패턴을 사용하기 때문에 팩토리를 상속받아서 만들어줘야한다. 1. 플러그인이지만 에디터안에서 통신을 해야하므로 직렬화를 시켜줘야한다.2 2. 최상의 부모인 Factory를 선택. 3. 클래스를 생성해 준다. 1. 상위 헤더로 들어가서 기능을 살펴보며 사용할 함수를 override해서 가져올 것이다. 2. 파일을 읽어들여서 에셋을 직접 생성하는 가상 함수를 선택. ..
마지막 무기인 Fist를 추가해 볼 것이다. 구조가 짜여져 있기 때문에 추가하는데 그리 많은 작업이 소요되지 않는다. 1. Sword를 복사해서 Fist로 이름을 변경해준다. 1. 양손, 양발에 충돌체를 붙일것이므로, 위 사진처럼 Sphere를 4개 추가해준다. 1. 무기나 무언가를 장착시키거나 몸에 붙일때는 AttachActorToComponent를 주로 쓰곤 한다. 2. Owner과 Mesh 2개는 고정적으로 필요하고, 이제 소켓이름이 필요한데 이를 C++에서 처리해 줄 것이다. 중요한 부분이 하나 있다. AttachActorToComponent가 BP에서는 Attach할 어떠한 객체를 여러개 지정하면, 앞에서부터 순차적으로 들어가서 잘 붙게된다. 하지만 C++에서는 for문을 돌려서 여러가지 객체를..