查看: 2920|回复: 0
收起左侧

[已翻译] 创建自定义的编辑器资源

[复制链接]

[已翻译] 创建自定义的编辑器资源[复制链接]

初末 发表于 2017-12-27 15:33:32 [显示全部楼层] |只看大图 回帖奖励 |倒序浏览 |阅读模式 回复:  0 浏览:  2920
翻译:王成林(麦克斯韦的麦斯威尔 ) 审校:黄秀美(厚德载物)
在这篇文章中我们将创建一些自定义的编辑器资源。为了拓展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++类:
DSC0000.jpg
然后在其头文件中添加以下代码:
[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]1

[size=1em][size=1em]PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "AssetTools" });



好了,保存并编译你的代码。然后重启编辑器并检查蓝图的分类:
DSC0001.png
DSC0002.jpg
为你的资源添加一个自定义缩略图
你的新资源的默认缩略图就是该资源类的名字。如果你想要一个自定义的缩略图你需要创建一个新的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]    );



最后,确保将你的插件类型标记为“运行时”而不是“开发者”,这样你就可以成功地发行你的项目了。
保存并编译代码。然后重启编辑器。
这是最终结果:

【版权声明】
原文作者未做权利声明,视为共享知识产权进入公共领域,自动获得授权

+1
2912°C
沙发哦 ^ ^ 马上
因分享而快乐,学习以自强!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

VR/AR版块|Unity3d|Unreal4|新手报道|小黑屋|站点地图|沪ICP备14023207号-9|【泰斗社区】-专注互联网游戏和应用的开发者平台 ( 沪ICP备14023207号-9 )|网站地图

© 2001-2013 Comsenz Inc.  Powered by Discuz! X3.4

1
QQ