Пустой модуль Unreal Engine 4

Я пытаюсь заняться разработкой модуля Unreal Engine 4, начиная с пустого модуля для начала, но попадая в блок в начале.

Учебник, который я прошел для неигрового модуля: https://wiki.unrealengine.com/An_Introduction_to_UE4_Plugins. Я пробовал идти точно по источнику, а затем все модифицировать в TestPlugin (так как я тоже не мог заставить его работать с помощью учебника).

По какой-то причине, когда я пытаюсь активировать модуль в редакторе, я получаю сообщение «не могу найти модуль« Модуль »». Я пытаюсь выяснить, не упустил ли я что-то, вот код, который у меня есть на данный момент:

../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://stackoverflowcom",
    "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)

person arhon    schedule 04.08.2014    source источник
comment
Люди видят только первые 10 слов или около того, когда ваш вопрос отображается на первой странице. Используйте эти слова осторожно.   -  person Pascal Cuoq    schedule 04.08.2014
comment
Спасибо за совет. Есть предложения, как перефразировать вопрос?   -  person arhon    schedule 04.08.2014
comment
Я уже отредактировал его, чтобы опустить «извините за вопрос новичка» или что-то еще.   -  person Pascal Cuoq    schedule 04.08.2014
comment
Спасибо, я постараюсь иметь это в виду в следующий раз, когда опубликую вопрос (я уверен, что в ближайшем будущем будет еще много ужасных вопросов, подобных этим)   -  person arhon    schedule 04.08.2014


Ответы (1)


В файле .uplugin посмотрите на имя своего модуля, затем в testplugin.cpp посмотрите на эту строку:

IMPLEMENT_MODULE(TestPluginImpl, TestPlugin)

Я уверен, что они должны совпадать.

e.g.:

"Modules" :
    [
        {
            "Name" : "NebulaAudioAnalysisPlugin",
            "Type" : "Runtime"
        } 
    ]

и моя реализация выглядит так:

IMPLEMENT_MODULE(FNebulaAudioAnalysisPlugin, NebulaAudioAnalysisPlugin) 

Я все это выяснил на собственном горьком опыте ...

person xdbxdbx    schedule 07.08.2014
comment
Вы абсолютно правы. Было несколько других ошибок (я не могу вспомнить, какие из них на данный момент), и в конце концов я решил использовать менее сложную версию плагина, которая на данный момент, по крайней мере, удовлетворяет мои потребности. Но это определенно правильный ответ. - person arhon; 20.08.2014