翻译:王成林(麦克斯韦的麦斯威尔 ) 审校:黄秀美(厚德载物) 在这篇文章中我们将创建一些自定义的编辑器资源。为了拓展UE4编辑器的功能并加入你自己的资源你需要两个类: · 一个包含你的资源的不同属性的类 · 一个将以上类构建为一项编辑器资源(即.uasset文件)的类(名为XFactory,其中X代表资源的类名) 对于大多数的资源,它们的工厂类(factory class)位于编辑器的EditorFactories文件中。例如,当你在编辑器中创建一个新的纹理时,编辑器会显示Texture.h文件中定义的关于纹理的各种属性。然而,编辑器中构建该资源的类(名为UTexture2DFactoryNew)则位于EditorFactories中。 那么,我们来创建我们自定义的编辑器资源吧。 创建资源类 为了创建一个自定义类,我们添加一个新的C++类(我将其命名为OrfeasCustomAsset),它继承自Object类且包含以下代码: [size=1em][size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
[size=1em]14
[size=1em]15
[size=1em]16
[size=1em]17
[size=1em]18
[size=1em]19
[size=1em]20
[size=1em]21
[size=1em]22
[size=1em]23
[size=1em]24
| [size=1em][size=1em]#include "CoreMinimal.h"
[size=1em]#include "UObject/NoExportTypes.h"
[size=1em]#include "OrfeasCustomAsset.generated.h"
[size=1em]/**
[size=1em] *
[size=1em] */
[size=1em]UCLASS()
[size=1em]class CUSTOMASSET_API UOrfeasCustomAsset : public UObject
[size=1em]{
[size=1em] GENERATED_BODY()
[size=1em]
[size=1em]
[size=1em]protected:
[size=1em] //Just some properties to display on the Editor
[size=1em] UPROPERTY(EditAnywhere)
[size=1em] FString Description;
[size=1em] UPROPERTY(EditAnywhere)
[size=1em] int32 BonusCoins;
[size=1em]
[size=1em]};
|
然后添加一个新的继承自工厂类的C++类: 然后在其头文件中添加以下代码: [size=1em][size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
[size=1em]14
[size=1em]15
[size=1em]16
[size=1em]17
| [size=1em][size=1em]UCLASS()
[size=1em]class CUSTOMASSET_API UOrfeasFactory : public UFactory
[size=1em]{
[size=1em] GENERATED_BODY()
[size=1em]public:
[size=1em] UOrfeasFactory();
[size=1em] /* New assets that don't override this function are automatically placed into the
[size=1em] "Miscellaneous" category in the editor */
[size=1em] virtual uint32 GetMenuCategories() const override;
[size=1em]
[size=1em]
[size=1em] /* Creates the asset inside the UE4 Editor */
[size=1em] virtual UObject* FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn) override;
[size=1em]
[size=1em]};
|
在我们的源文件中为这些函数添加以下逻辑: [size=1em][size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
[size=1em]14
[size=1em]15
[size=1em]16
[size=1em]17
[size=1em]18
[size=1em]19
[size=1em]20
[size=1em]21
[size=1em]22
[size=1em]23
[size=1em]24
[size=1em]25
[size=1em]26
[size=1em]27
| [size=1em][size=1em]#include "OrfeasFactory.h"
[size=1em]//The asset header file that we wish to create
[size=1em]#include "OrfeasCustomAsset.h"
[size=1em]//The asset type categories will let us access the various asset categories inside the Editor
[size=1em]#include "AssetTypeCategories.h"
[size=1em]UOrfeasFactory::UOrfeasFactory()
[size=1em]{
[size=1em] bCreateNew = true;
[size=1em] bEditAfterNew = true;
[size=1em] //Configure the class that this factory creates
[size=1em] SupportedClass = UOrfeasCustomAsset::StaticClass();
[size=1em]}
[size=1em]uint32 UOrfeasFactory::GetMenuCategories() const
[size=1em]{
[size=1em] //Let's place this asset in the Blueprints category in the Editor
[size=1em] return EAssetTypeCategories::Blueprint;
[size=1em]}
[size=1em]UObject* UOrfeasFactory::FactoryCreateNew(UClass* InClass, UObject* InParent, FName InName, EObjectFlags Flags, UObject* Context, FFeedbackContext* Warn)
[size=1em]{
[size=1em] //Create the editor asset
[size=1em] UOrfeasCustomAsset* OrfeasEditorAsset = NewObject<uorfeascustomasset>(InParent, InClass, InName, Flags);
[size=1em] return OrfeasEditorAsset;
[size=1em]}
|
为了使用AssetTypeCategories.h文件你需要在你的项目的公有依赖中添加 “AssetTools” : [size=1em] | [size=1em][size=1em]PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "AssetTools" });
|
好了,保存并编译你的代码。然后重启编辑器并检查蓝图的分类: 为你的资源添加一个自定义缩略图 你的新资源的默认缩略图就是该资源类的名字。如果你想要一个自定义的缩略图你需要创建一个新的Slate风格并将其和该资源类绑定。 理想情况下,你应将新资源放入一个新的模块或者插件中。为了这个例子的需要,我将使用一个插件的起始模块来为我的自定义资源创建一个新的slate风格。之前我已经在项目中添加了一个名为“OrfeasPlugin”的空白插件,现在我要使用它的默认图标作为一个新的缩略图。进入你的插件的头文件然后添加以下代码: [size=1em][size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
[size=1em]14
[size=1em]15
| [size=1em][size=1em]#include "CoreMinimal.h"
[size=1em]#include "ModuleManager.h"
[size=1em]#include "SlateStyle.h"
[size=1em]class FOrfeasPluginModule : public IModuleInterface
[size=1em]{
[size=1em]public:
[size=1em] TSharedPtr<fslatestyleset> StyleSet;
[size=1em] /** IModuleInterface implementation */
[size=1em] virtual void StartupModule() override;
[size=1em] virtual void ShutdownModule() override;
[size=1em]};
|
然后在插件的源文件中添加以下代码: [size=1em][size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
[size=1em]12
[size=1em]13
[size=1em]14
[size=1em]15
[size=1em]16
[size=1em]17
[size=1em]18
[size=1em]19
[size=1em]20
[size=1em]21
[size=1em]22
[size=1em]23
[size=1em]24
[size=1em]25
[size=1em]26
[size=1em]27
[size=1em]28
[size=1em]29
[size=1em]30
[size=1em]31
[size=1em]32
[size=1em]33
[size=1em]34
[size=1em]35
[size=1em]36
[size=1em]37
[size=1em]38
[size=1em]39
[size=1em]40
[size=1em]41
[size=1em]42
[size=1em]43
| [size=1em][size=1em]#include "IPluginManager.h"
[size=1em]#include "SlateStyleRegistry.h"
[size=1em]#define LOCTEXT_NAMESPACE "FOrfeasPluginModule"
[size=1em]void FOrfeasPluginModule::StartupModule()
[size=1em]{
[size=1em] // This code will execute after your module is loaded into memory; the exact timing is
[size=1em] specified in the .uplugin file per-module
[size=1em] StyleSet = MakeShareable(new FSlateStyleSet("OrfeasStyle"));
[size=1em] //Content path of this plugin
[size=1em] FString ContentDir = IPluginManager::Get().FindPlugin("OrfeasPlugin")->GetBaseDir();
[size=1em] //The image we wish to load is located inside the Resources folder inside the Base Directory
[size=1em] //so let's set the content dir to the base dir and manually switch to the Resources folder:
[size=1em] StyleSet->SetContentRoot(ContentDir);
[size=1em] //Create a brush from the icon
[size=1em] FSlateImageBrush* ThumbnailBrush = new FSlateImageBrush(StyleSet->RootToContentDir(TEXT("Resources/Icon128"), TEXT(".png")), FVector2D(128.f, 128.f));
[size=1em] if (ThumbnailBrush)
[size=1em] {
[size=1em] //In order to bind the thumbnail to our class we need to type ClassThumbnail.X where X
[size=1em] is the name of the C++ class of the asset
[size=1em] StyleSet->Set("ClassThumbnail.OrfeasCustomAsset", ThumbnailBrush);
[size=1em] //Reguster the created style
[size=1em] FSlateStyleRegistry::RegisterSlateStyle(*StyleSet);
[size=1em] }
[size=1em]}
[size=1em]void FOrfeasPluginModule::ShutdownModule()
[size=1em]{
[size=1em] // This function may be called during shutdown to clean up your module. For modules that
[size=1em] support dynamic reloading,
[size=1em] // we call this function before unloading the module.
[size=1em] //Unregister the style
[size=1em] FSlateStyleRegistry::UnRegisterSlateStyle(StyleSet->GetStyleSetName());
[size=1em]}
[size=1em]#undef LOCTEXT_NAMESPACE
[size=1em]
[size=1em]IMPLEMENT_MODULE(FOrfeasPluginModule, OrfeasPlugin)
|
为了使用IPluginManager.h头文件你需要在你的插件的依赖中添加 “Projects” 依赖: [size=1em][size=1em]1
[size=1em]2
[size=1em]3
[size=1em]4
[size=1em]5
[size=1em]6
[size=1em]7
[size=1em]8
[size=1em]9
[size=1em]10
[size=1em]11
| [size=1em][size=1em]PrivateDependencyModuleNames.AddRange(
[size=1em] new string[]
[size=1em] {
[size=1em] "CoreUObject",
[size=1em] "Engine",
[size=1em] "Slate",
[size=1em] "SlateCore",
[size=1em] "Projects"
[size=1em] // ... add private dependencies that you statically link with here ...
[size=1em] }
[size=1em] );
|
最后,确保将你的插件类型标记为“运行时”而不是“开发者”,这样你就可以成功地发行你的项目了。 保存并编译代码。然后重启编辑器。 这是最终结果:
【版权声明】 原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权
|