diff --git a/Apps/MetaCoreEditor/main.cpp b/Apps/MetaCoreEditor/main.cpp index 1c359df..416392a 100644 --- a/Apps/MetaCoreEditor/main.cpp +++ b/Apps/MetaCoreEditor/main.cpp @@ -148,7 +148,7 @@ int main(int argc, char* argv[]) { MetaCore::MetaCoreEditorApp editorApp; MetaCoreWriteCrashLogRaw("metacore.app: construct app done"); MetaCoreWriteCrashLogRaw("metacore.app: initialize begin"); - if (!editorApp.Initialize()) { + if (!editorApp.Initialize(argc, argv)) { MetaCoreWriteCrashLogRaw("metacore.app: initialize failed"); std::cerr << "MetaCoreEditorApp initialize failed\n"; return 1; diff --git a/Source/MetaCoreEditor/Private/MetaCoreEditorApp.cpp b/Source/MetaCoreEditor/Private/MetaCoreEditorApp.cpp index cd3556a..a2e2558 100644 --- a/Source/MetaCoreEditor/Private/MetaCoreEditorApp.cpp +++ b/Source/MetaCoreEditor/Private/MetaCoreEditorApp.cpp @@ -1,4 +1,4 @@ -#include "MetaCoreEditor/MetaCoreEditorApp.h" +#include "MetaCoreEditor/MetaCoreEditorApp.h" #include "MetaCoreEditor/MetaCoreBuiltinModules.h" #include "MetaCoreEditor/MetaCoreEditorServices.h" @@ -511,7 +511,7 @@ MetaCoreEditorApp::~MetaCoreEditorApp() { Shutdown(); } -bool MetaCoreEditorApp::Initialize() { +bool MetaCoreEditorApp::Initialize(int argc, char* argv[]) { MetaCoreTraceStartup("metacore.app: initialize begin"); if (Initialized_) { MetaCoreTraceStartup("metacore.app: already initialized"); @@ -621,7 +621,33 @@ bool MetaCoreEditorApp::Initialize() { bool loadedStartupScene = false; if (const auto scenePersistenceService = ModuleRegistry_.ResolveService(); scenePersistenceService != nullptr) { - loadedStartupScene = scenePersistenceService->LoadStartupScene(*EditorContext_); + // 尝试从命令行参数直接加载场景(支持双击打开关联的场景文件) + if (argc > 1 && argv[1] != nullptr) { + const std::filesystem::path inputPath(argv[1]); + const auto assetDatabaseService = ModuleRegistry_.ResolveService(); + if (assetDatabaseService != nullptr && assetDatabaseService->HasProject() && std::filesystem::is_regular_file(inputPath)) { + const std::filesystem::path projectRoot = assetDatabaseService->GetProjectDescriptor().RootPath; + // 计算相对路径 + std::filesystem::path relativePath = std::filesystem::relative(inputPath, projectRoot); + // 检查相对路径是否合法,不应该以 ".." 开头,也不应该是绝对路径 + std::string relStr = relativePath.generic_string(); + if (!relStr.empty() && relStr.find("..") == std::string::npos && !relativePath.is_absolute()) { + if (scenePersistenceService->LoadScene(*EditorContext_, relativePath)) { + loadedStartupScene = true; + EditorContext_->AddConsoleMessage( + MetaCoreLogLevel::Info, + "Project", + "通过命令行参数成功打开场景: " + relStr + ); + } + } + } + } + + // 如果没有通过命令行打开成功,则加载默认启动场景 + if (!loadedStartupScene) { + loadedStartupScene = scenePersistenceService->LoadStartupScene(*EditorContext_); + } if (!loadedStartupScene) { if (const auto assetDatabaseService = ModuleRegistry_.ResolveService(); diff --git a/Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorApp.h b/Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorApp.h index c561c65..723169a 100644 --- a/Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorApp.h +++ b/Source/MetaCoreEditor/Public/MetaCoreEditor/MetaCoreEditorApp.h @@ -22,7 +22,7 @@ public: MetaCoreEditorApp() = default; ~MetaCoreEditorApp(); - bool Initialize(); + bool Initialize(int argc = 0, char* argv[] = nullptr); int Run(); void Shutdown();