godotengine / godot-cpp

C++ bindings for the Godot script API
MIT License
1.75k stars 577 forks source link

c++ GDExtension how to get Autoload Global Data #1623

Open Caesar454905970 opened 1 month ago

Caesar454905970 commented 1 month ago

Godot version

4.3

godot-cpp version

4.3

System information

Window10 godot-cpp4.3

Issue description

ERROR: Failed to retrieve non-existent singleton 'GlobalEcgResObj'. at: (core/config/engine.cpp:294)

image image image

Steps to reproduce

// 获取 GlobalEcgResObj 单例
Object *global_ecg_res_obj = Engine::get_singleton()->get_singleton("GlobalEcgResObj");

// 检查是否成功获取单例
if (global_ecg_res_obj) {
    // 获取 check_uid 变量的值
    Variant check_uid_variant = global_ecg_res_obj->get("check_uid");

    // 转换为字符串类型
    String check_uid_str = check_uid_variant.operator String();

    // 打印输出
    UtilityFunctions::print("check_uid: " + check_uid_str);
} else {
    UtilityFunctions::print("Failed to  GlobalEcgResObj singleton.");
}

Minimal reproduction project

Failed to GlobalEcgResObj singleton.

AThousandShips commented 1 month ago

Autoloads are not singletons, see here

You access them with the node path I believe

xana43 commented 3 weeks ago

if this needs to be an autoload that's present in the scene then what @AThousandShips said should be used.

if this is meant to be a singleton in all sense of the word then those can be made

NOTE: there could possibly be a better way to do this, but this is the way I found that works.

like so

Singleton class somewhere in your project image

In register_types.cpp

Singleton registration image

Singleton cleanup image