Plugin Api
API ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² Wudgine ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π½Π°Π±ΠΎΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ² ΠΈ Ρ ΡΠΊΠΎΠ² Π΄Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Ρ ΡΠ΄ΡΠΎΠΌ Π΄Π²ΠΈΠΆΠΊΠ°.
ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΡ
Π‘ΠΈΡΡΠ΅ΠΌΠ° ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² Wudgine ΠΏΠΎΡΡΡΠΎΠ΅Π½Π° Π²ΠΎΠΊΡΡΠ³ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΎΠ²:
IPlugin
ΠΠ°Π·ΠΎΠ²ΡΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π΄Π»Ρ Π²ΡΠ΅Ρ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²:
namespace Wudgine::Plugin {
class IPlugin {
public:
virtual ~IPlugin() = default;
// ΠΠΈΠ·Π½Π΅Π½Π½ΡΠΉ ΡΠΈΠΊΠ»
virtual bool Initialize() = 0;
virtual void Shutdown() = 0;
// ΠΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅
virtual const char* GetName() const = 0;
virtual const char* GetVersion() const = 0;
virtual const char* GetAuthor() const = 0;
virtual const char* GetDescription() const = 0;
// ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ (ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎ)
virtual void RenderSettings() {}
// ΠΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ
virtual bool IsCompatibleWithEngineVersion(const char* version) const;
};
} // namespace Wudgine::Plugin
PluginManager
ΠΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π·Π° Π·Π°Π³ΡΡΠ·ΠΊΡ, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ:
namespace Wudgine::Core {
class PluginManager {
public:
static PluginManager& GetInstance();
// ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²
bool LoadPlugin(const std::string& name);
bool LoadPluginFromPath(const std::string& path);
bool LoadAllPlugins();
// Π£ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ
bool InitializePlugin(const std::string& name);
void ShutdownPlugin(const std::string& name);
void ShutdownAllPlugins();
// ΠΠΎΡΡΡΠΏ ΠΊ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌ
Plugin::IPlugin* GetPlugin(const std::string& name);
bool IsPluginLoaded(const std::string& name) const;
std::vector<Plugin::IPlugin*> GetAllPlugins() const;
// ΠΠ°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ
bool ResolveDependencies(const std::string& name);
};
} // namespace Wudgine::Core
Π₯ΡΠΊΠΈ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²
Π₯ΡΠΊΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌ Π²ΡΡΡΠ°ΠΈΠ²Π°ΡΡΡΡ Π² ΡΠ°Π·Π»ΠΈΡΠ½ΡΠ΅ ΡΠ°ΡΡΠΈ Π΄Π²ΠΈΠΆΠΊΠ°:
Π₯ΡΠΊΠΈ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π°
// Π Π²Π°ΡΠ΅ΠΌ ΠΏΠ»Π°Π³ΠΈΠ½Π΅
bool MyPlugin::Initialize() {
// Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ Ρ
ΡΠΊΠΎΠ²
Wudgine::Core::HookSystem::GetInstance().RegisterHook<Wudgine::Core::Hooks::OnSceneLoad>(
[this](Wudgine::Core::Scene* scene) {
// ΠΠΎΠ΄, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ ΡΡΠ΅Π½Ρ
return true; // ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΈΡ
Ρ
ΡΠΊΠΎΠ²
}
);
return true;
}
ΠΠΎΡΡΡΠΏΠ½ΡΠ΅ Ρ ΡΠΊΠΈ
- OnEngineInitialize β Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π²ΠΈΠΆΠΊΠ°
- OnEngineShutdown β Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠΈ ΡΠ°Π±ΠΎΡΡ Π΄Π²ΠΈΠΆΠΊΠ°
- OnSceneLoad β Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ Π·Π°Π³ΡΡΠ·ΠΊΠ΅ ΡΡΠ΅Π½Ρ
- OnSceneSave β Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠΈ ΡΡΠ΅Π½Ρ
- OnSceneUnload β Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ Π²ΡΠ³ΡΡΠ·ΠΊΠ΅ ΡΡΠ΅Π½Ρ
- OnUpdate β Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΊΠ°Π΄Ρ
- OnFixedUpdate β Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠ°ΡΡΠΎΡΠΎΠΉ
- OnRender β Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ΅
- OnGUI β Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ ΠΎΡΡΠΈΡΠΎΠ²ΠΊΠ΅ GUI
Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ°
API ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°ΡΡΠΈΡΡΡΡ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ Wudgine:
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ°
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ°
class MyEditorTool : public Wudgine::Editor::EditorTool {
public:
const char* GetName() const override { return "ΠΠΎΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ"; }
const char* GetIcon() const override { return "path/to/icon.png"; }
void Initialize() override {
// ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°
}
void Render() override {
// ΠΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°
ImGui::Begin(GetName());
ImGui::Text("Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°");
ImGui::End();
}
};
// Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° Π² ΠΏΠ»Π°Π³ΠΈΠ½Π΅
bool MyPlugin::Initialize() {
if (Wudgine::Core::IsEditor()) {
auto* tool = new MyEditorTool();
Wudgine::Editor::EditorToolManager::GetInstance().RegisterTool(tool);
}
return true;
}
ΠΠ½ΡΠΏΠ΅ΠΊΡΠΎΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ²
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΎΡΠ° Π΄Π»Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°
class MyComponentInspector : public Wudgine::Editor::ComponentInspector {
public:
bool CanInspect(Wudgine::ECS::Component* component) override {
return dynamic_cast<MyPluginComponent*>(component) != nullptr;
}
void Render(Wudgine::ECS::Component* component) override {
auto* myComponent = static_cast<MyPluginComponent*>(component);
// ΠΡΡΠΈΡΠΎΠ²ΠΊΠ° ΠΏΠΎΠ»Π΅ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°
float value = myComponent->GetValue();
if (ImGui::DragFloat("ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅", &value)) {
myComponent->SetValue(value);
MarkDirty();
}
}
};
// Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΠΈΠ½ΡΠΏΠ΅ΠΊΡΠΎΡΠ° Π² ΠΏΠ»Π°Π³ΠΈΠ½Π΅
bool MyPlugin::Initialize() {
if (Wudgine::Core::IsEditor()) {
auto* inspector = new MyComponentInspector();
Wudgine::Editor::InspectorManager::GetInstance().RegisterInspector(inspector);
}
return true;
}
ΠΡΠ½ΠΊΡΡ ΠΌΠ΅Π½Ρ
// ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΡΠ½ΠΊΡΠ° ΠΌΠ΅Π½Ρ
bool MyPlugin::Initialize() {
if (Wudgine::Core::IsEditor()) {
Wudgine::Editor::EditorMenuManager::GetInstance().AddMenuItem(
"ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ/ΠΠΎΠΉ ΠΏΠ»Π°Π³ΠΈΠ½/ΠΠ΅ΠΉΡΡΠ²ΠΈΠ΅",
[this]() {
// ΠΠ΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΏΡΠΈ Π²ΡΠ±ΠΎΡΠ΅ ΠΏΡΠ½ΠΊΡΠ° ΠΌΠ΅Π½Ρ
WG_LOG_INFO("ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΈΠ· ΠΌΠ΅Π½Ρ");
}
);
}
return true;
}
Π Π°Π±ΠΎΡΠ° Ρ ΡΠ΅ΡΡΡΡΠ°ΠΌΠΈ
API ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΡΠ΅ΡΡΡΡΠΎΠ²:
// ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΡΠ΅ΡΡΡΡΠ°
bool MyPlugin::Initialize() {
// ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΡΠ΅ΠΊΡΡΡΡΡ
auto* texture = Wudgine::Resource::ResourceManager::GetInstance().LoadTexture("path/to/texture.png");
if (texture) {
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΡΡΡ
}
// ΠΠ°Π³ΡΡΠ·ΠΊΠ° ΠΌΠΎΠ΄Π΅Π»ΠΈ
auto* model = Wudgine::Resource::ResourceManager::GetInstance().LoadModel("path/to/model.fbx");
if (model) {
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠΎΠ΄Π΅Π»ΠΈ
}
return true;
}
Π Π°Π±ΠΎΡΠ° Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ
API ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΠΈ Π·Π°Π³ΡΡΠΆΠ°ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ:
// ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ
struct MyPluginSettings {
bool enableFeature = true;
int quality = 5;
std::string outputPath = "output";
// Π‘Π΅ΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π°ΡΡΡΠΎΠ΅ΠΊ
template<typename Archive>
void serialize(Archive& ar) {
ar & enableFeature;
ar & quality;
ar & outputPath;
}
};
// Π Π²Π°ΡΠ΅ΠΌ ΠΏΠ»Π°Π³ΠΈΠ½Π΅
class MyPlugin : public Wudgine::Plugin::IPlugin {
private:
MyPluginSettings m_settings;
public:
bool Initialize() override {
// ΠΠ°Π³ΡΡΠ·ΠΊΠ° Π½Π°ΡΡΡΠΎΠ΅ΠΊ
if (Wudgine::Core::SettingsManager::GetInstance().HasPluginSettings(GetName())) {
m_settings = Wudgine::Core::SettingsManager::GetInstance().LoadPluginSettings<MyPluginSettings>(GetName());
}
return true;
}
void RenderSettings() override {
// ΠΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π² ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ΅
ImGui::Checkbox("ΠΠΊΠ»ΡΡΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ", &m_settings.enableFeature);
ImGui::SliderInt("ΠΠ°ΡΠ΅ΡΡΠ²ΠΎ", &m_settings.quality, 1, 10);
// Π‘ΠΎΡ
ΡΠ°Π½Π΅Π½ΠΈΠ΅ Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ
Wudgine::Core::SettingsManager::GetInstance().SavePluginSettings(
GetName(), m_settings
);
}
};
ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ
ΠΠ»Π°Π³ΠΈΠ½Ρ ΠΌΠΎΠ³ΡΡ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΎΠ²Π°ΡΡ Π΄ΡΡΠ³ Ρ Π΄ΡΡΠ³ΠΎΠΌ:
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Π°
bool MyPlugin::Initialize() {
// ΠΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π°Π»ΠΈΡΠΈΡ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Π°
if (Wudgine::Core::PluginManager::GetInstance().IsPluginLoaded("OtherPlugin")) {
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½Π°
auto* otherPlugin = static_cast<OtherPlugin*>(
Wudgine::Core::PluginManager::GetInstance().GetPlugin("OtherPlugin")
);
// ΠΠ·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ Ρ Π΄ΡΡΠ³ΠΈΠΌ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠΌ
otherPlugin->DoSomething();
}
return true;
}
Π‘Π΅ΡΠ²ΠΈΡΡ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²
ΠΠ»Π°Π³ΠΈΠ½Ρ ΠΌΠΎΠ³ΡΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΠ΅ΡΠ²ΠΈΡΡ Π΄Π»Ρ Π΄ΡΡΠ³ΠΈΡ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²:
// ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° ΡΠ΅ΡΠ²ΠΈΡΠ°
class IMyService {
public:
virtual ~IMyService() = default;
virtual void DoSomething() = 0;
};
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠ°
class MyService : public IMyService {
public:
void DoSomething() override {
// Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ
}
};
// Π Π΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠ° Π² ΠΏΠ»Π°Π³ΠΈΠ½Π΅
bool MyPlugin::Initialize() {
// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠ°
auto* service = new MyService();
Wudgine::Core::ServiceLocator::GetInstance().RegisterService<IMyService>(service);
return true;
}
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΠ° Π² Π΄ΡΡΠ³ΠΎΠΌ ΠΏΠ»Π°Π³ΠΈΠ½Π΅
bool OtherPlugin::Initialize() {
// ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΠ°
auto* service = Wudgine::Core::ServiceLocator::GetInstance().GetService<IMyService>();
if (service) {
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅ΡΠ²ΠΈΡΠ°
service->DoSomething();
}
return true;
}
ΠΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΡΠΎΠ±ΡΡΠΈΠΉ
API ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΡΠΈΡΡΠ΅ΠΌΠΎΠΉ ΡΠΎΠ±ΡΡΠΈΠΉ:
// ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ±ΡΡΠΈΡ
struct MyEvent {
int value;
std::string message;
};
// ΠΠΎΠ΄ΠΏΠΈΡΠΊΠ° Π½Π° ΡΠΎΠ±ΡΡΠΈΠ΅
bool MyPlugin::Initialize() {
// ΠΠΎΠ΄ΠΏΠΈΡΠΊΠ° Π½Π° ΡΠΎΠ±ΡΡΠΈΠ΅
Wudgine::Core::EventSystem::GetInstance().Subscribe<MyEvent>(
[this](const MyEvent& event) {
WG_LOG_INFO("ΠΠΎΠ»ΡΡΠ΅Π½ΠΎ ΡΠΎΠ±ΡΡΠΈΠ΅: {} - {}", event.value, event.message);
}
);
return true;
}
// ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΠΎΠ±ΡΡΠΈΡ
void MyPlugin::DoSomething() {
// ΠΡΠΏΡΠ°Π²ΠΊΠ° ΡΠΎΠ±ΡΡΠΈΡ
MyEvent event;
event.value = 42;
event.message = "ΠΡΠΈΠ²Π΅Ρ, ΠΌΠΈΡ!";
Wudgine::Core::EventSystem::GetInstance().Publish(event);
}
ΠΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡ
API ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡΡ:
// ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠ»Π° ΠΏΠΎΡΠΎΠΊΠΎΠ²
bool MyPlugin::Initialize() {
// ΠΡΠΏΡΠ°Π²ΠΊΠ° Π·Π°Π΄Π°ΡΠΈ Π² ΠΏΡΠ» ΠΏΠΎΡΠΎΠΊΠΎΠ²
Wudgine::Core::ThreadPool::GetInstance().Enqueue(
[]() {
// ΠΠΎΠ΄, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡΠΉ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅
WG_LOG_INFO("ΠΠ°Π΄Π°ΡΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅");
}
);
return true;
}
Π§ΡΠΎ Π΄Π°Π»ΡΡΠ΅?
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° Π²Ρ Π·Π½Π°ΠΊΠΎΠΌΡ Ρ API ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ², Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅:
- ΠΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΡ Π³ΠΎΡΠΎΠ²ΡΡ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²
- Π£Π·Π½Π°ΡΡ, ΠΊΠ°ΠΊ ΠΏΡΠ±Π»ΠΈΠΊΠΎΠ²Π°ΡΡ ΡΠ²ΠΎΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Ρ
API ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² Wudgine ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΈΡΠΎΠΊΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π΄Π»Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΠΎΡΡΠΈ Π΄Π²ΠΈΠΆΠΊΠ°. ΠΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΡΠΉΡΠ΅ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΠΉΡΠ΅ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ ΡΠ²ΠΎΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ²!