Plugins in Unreal Engine
Unreal Engine contains various types of plugins. Plugins are reusable components independent of the project - for each project, you can decide whether to enable them or not. Through plugins, you can easily share functionality across multiple projects.
You can explore, activate, and deactivate plugins in a window accessible through the toolbox under the option Edit
→ Plugins
.
By default, in the "Plugins" window, you can see only the so-called "Built-in" plugins, which are basic components of Unreal Engine. However, you can extend this selection with "unofficial" Project plugins, which you can write yourself or use some downloaded from the internet.
Moving plugins between projects is then very simple - just copy the plugin folder to the "Plugins" folder of your Unreal Project. Nothing more is needed, even if the plugin is of C++ type and your project is not (Blueprint project without C++ compilation). If you don't even want that, you can use a symlink from the folder of the specific project to the folder of the current project.
Working with Plugins in Development and Projects
Assets created as plugins are available within Unreal Engine in the same way as regular project assets - you'll find them in the folder hierarchy under "Plugins" instead of "Content". In terms of work, there isn't much difference, except for the possibilities depending on the specific purpose of the plugin.
So, when should you create C++ classes as project classes and when as part of a plugin? This always depends on the structure of the projects you commonly develop. In principle, any reusable components are better kept in the form of plugins, while project-specific components are assigned to the project.
As for the structure of plugins, it's similar to that of classes. Generally, it's better to work with multiple plugins that differ in the "category" of functions, rather than putting all general functions into a single plugin. In Vrealmatik, for instance, I have separate plugins (= libraries) for general components, specialized components, physics, interactions, etc.
If you're not using a single plugin code source for all projects (using symlinks / shortcuts), it's certainly possible to modify the plugin code for the needs of individual projects. This applies to both class-level plugins and project classes through overridden functions.
Creating a Project Plugin in Unreal Engine
Plugins in Unreal Engine can be created through the Toolbox menu Edit
→ Plugins
, where in the displayed "Plugins" window, you choose the option + Add
.
The newly opened "New Plugin" window offers several predefined Plugin templates.
- If you're working from a Blueprint Project, only the "Content Only" option is available.
- If your project allows writing C++ functions, the options are the same as shown in the image above:
After choosing a template from the menu and filling in basic information about the plugin (name, author, description), simply click the "Create Plugin" button at the bottom right, and the Unreal Project will be expanded / supplemented with a folder for the plugin located within the "Plugins" folder of the current Unreal project.
Basic plugin configuration
Basic plugin configuration (such as enabling / disabling Content
folder through CanContainContent
key) + changing plugin metadata (version, author, description...) is possible to do in .uplugin
file of the plugin.
Editor Standalone Window Plugin
Adds an button into window
list, see the screenshot below.
On pressing that button, a new standalone window is opened. This window can be placed by user anywhere within the engine viewport, such as any other Engine window.
The window content (text) of the standalone window is defined with following code:
TSharedRef FfwtrendEditorStwModule::OnSpawnPluginTab(const FSpawnTabArgs& SpawnTabArgs)
{
FText WidgetText = FText::Format(
LOCTEXT("WindowWidgetText", "Add code to {0} in {1} to override this window's contents"),
FText::FromString(TEXT("FfwtrendEditorStwModule::OnSpawnPluginTab")),
FText::FromString(TEXT("fwtrendEditorStw.cpp"))
);
return SNew(SDockTab)
.TabRole(ETabRole::NomadTab)
[
// Put your tab content here!
SNew(SBox)
.HAlign(HAlign_Center)
.VAlign(VAlign_Center)
[
SNew(STextBlock)
.Text(WidgetText)
]
];
}
Editor Toolbar Button Plugin
Adds an button into a toolbar
section, window
list or both, see the screenshot below. You can trigger some action on pressing that button(s).
Default message on pressing that button
The content (message) above was generated with the following code:
void FfwtrendEditorTBModule::PluginButtonClicked()
{
// Put your "OnButtonClicked" stuff here
FText DialogText = FText::Format(
LOCTEXT("PluginButtonDialogText", "Add code to {0} in {1} to override this button's actions"),
FText::FromString(TEXT("FfwtrendEditorTBModule::PluginButtonClicked()")),
FText::FromString(TEXT("fwtrendEditorTB.cpp"))
);
FMessageDialog::Open(EAppMsgType::Ok, DialogText);
}
Creating a C++ Class for the Plugin
The process of creating a C++ class, which is a part of the plugin, is identical to creating regular classes (Tools → New C++ class). After selecting the type of the class, within the definition window, choose the destination for saving that is related to the plugin instead of the project.
Process of Moving a Plugin from One Project to Another
Files related to the plugin are located in the specific Unreal Engine project folder (in the image below, "VrealmaticLibrary"), within the "Plugins" subfolder. If you navigate to this folder using any file explorer, you will see a list of plugins. In the image above, there's just one plugin named "VrealmaticComponents."
To transfer a plugin to another project, simply copy the plugin folder to the "Plugins" folder of the other project. If the "Plugins" folder doesn't exist in the other project, you can create it. If the plugin is not visible after launching the project, you can try turning off the project and then launching it again by right-clicking and selecting "Generate Visual Studio project files."
Accessing data in the plugin's Content folder
There are 2 ways to access the assets in the plugin's folder. The proper way depends on the function used:
- Absolute Path - Absolute path to the asset
D:/UnrealEngine/MyProject/Plugins/PluginName/Content/Path/To/Asset
- Relative Path - Relative path to the asset
/PluginName/Path/To/Asset