Starting with modules

Hello,

I’ve started to try and build a plugin just to modify some default settings in the engine. From what I was able to find, that would be a non-game module (source A new, community-hosted Unreal Engine Wiki - Announcements and Releases - Unreal Engine Forums). However, no matter what I tried to do, I couldn’t get it to work. I was trying to create a blank one for starters, but I’m having trouble getting even that done.

I’ve tried to do ti exactly as in the wiki, and I’ve tried renaming all of it to “TestPlugin”, but it all failed. In editor I see the plugin, but when trying to activate it, it throws an error, can’t find the “Module” plugin.

This is what I have so far (the modified version)
…/Engine/Plugins/TestPlugin/TestPlugin.uplugin


{
    "FileVersion" : 3,
 
    "FriendlyName" : "Test Plugin",
    "Version" : 1,
    "VersionName": "1.0",
    "EngineVersion" : 1579795,
    "Description" : "Description goes here",
    "Category" : "Test.Module",
    "CreatedBy" : "arhon",
    "CreatedByURL" : "http://www.google.com",
    "CanContainContent" : "true",
 
    "Modules" :
    
        {
            "Name" : "Module",
            "Type" : "Developer",
            "LoadingPhase" : "PreDefault"
        } 
    ]
}


…/Engine/Plugins/TestPlugin/Source/TestPlugin/TestPlugin.cpp


void FTestPlugin::StartupTestPlugin()
{
	if (ITestPlugin::IsAvailable())
	{
		UE_LOG(TestPlugin, Log, TEXT("%s"), ITestPlugin::Get().IsThisNumber42(42) ? TEXT("True") : TEXT("False"));
		UE_LOG(TestPlugin, Log, TEXT("%s"), ITestPlugin::Get().IsThisNumber42(12) ? TEXT("True") : TEXT("False"));
	}
}

…/Engine/Plugins/TestPlugin/Source/TestPlugin/TestPlugin.Build.cs


using UnrealBuildTool;

public class TestPlugin : ModuleRules
{
    public TestPlugin(TargetInfo Target)
    {
        PublicDependencyModuleNames.AddRange(new string] { "Core", "CoreUObject", "Engine", "InputCore" });

        PrivateDependencyModuleNames.AddRange(new string] { "TestPlugin" });

        DynamicallyLoadedModuleNames.AddRange(new string] { "StandAlone" });
    }
}

…/Engine/Plugins/TestPlugin/Source/TestPlugin/Public/ITestPlugin.h


#pragma once

#include "ModuleManager.h"

/**
* The public interface to this module.  In most cases, this interface is only public to sibling modules
* within this plugin.
*/
class ITestPlugin : public ITestPluginInterface
{

public:

	/**
	* Singleton-like access to this module's interface.  This is just for convenience!
	* Beware of calling this during the shutdown phase, though.  Your module might have been unloaded already.
	*
	* @return Returns singleton instance, loading the module on demand if needed
	*/
	static inline ITestPlugin& Get()
	{
		return FModuleManager::LoadModuleChecked< ITestPlugin >("TestPlugin");
	}

	/**
	* Checks to see if this module is loaded and ready.  It is only valid to call Get() if IsAvailable() returns true.
	*
	* @return True if the module is loaded and ready to use
	*/
	static inline bool IsAvailable()
	{
		return FModuleManager::Get().IsModuleLoaded("TestPlugin");
	}

	virtual bool IsThisNumber42(int32 num) = 0;
};

…/Engine/Plugins/TestPlugin/Source/TestPlugin/Private/TestPluginPrivatePCH.h


#include "ITestPlugin.h"

// You should place include statements to your module's private header files here.  You only need to
// add includes for headers that are used in most of your module's source files though.


…/Engine/Plugins/TestPlugin/Source/TestPlugin/Private/TestPlugin.h


#pragma once

class TestPluginImpl : public ITestPlugin
{
public:
	/** IModuleInterface implementation */
	void StartupTestPlugin();
	void ShutdownTestPlugin();

	bool IsThisNumber42(int32 num);
};


…/Engine/Plugins/TestPlugin/Source/TestPlugin/Private/TestPlugin.cpp


#include "TestPluginPrivatePCH.h"

#include "TestPlugin.h"

void TestPluginImpl::StartupTestPlugin()
{
}

void TestPluginImpl::ShutdownTestPlugin()
{
}

bool TestPluginImpl::IsThisNumber42(int32 num)
{
	return num == 42;
}

IMPLEMENT_MODULE(TestPluginImpl, TestPlugin)

Let’s see…
The name of the module specified in your uplugin should be “TestPlugin” not “Module”.
I don’t know what the point of /Engine/Plugins/TestPlugin/Source/TestPlugin/TestPlugin.cpp is if you have /Engine/Plugins/TestPlugin/Source/TestPlugin/Private/TestPlugin.cpp.
The PrivateDependencyModuleNames and DynamicallyLoadedModuleNames settings in your .Build.cs make no sense, remove them.

Thanks, fixed it.