diff --git a/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp b/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp index f4ff7bc..7b936f5 100644 --- a/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp +++ b/Source/MetaCoreEditor/Private/MetaCoreBuiltinCoreServicesModule.cpp @@ -1,4 +1,4 @@ -#include "MetaCoreEditor/MetaCoreBuiltinModules.h" +#include "MetaCoreEditor/MetaCoreBuiltinModules.h" #include "MetaCoreEditor/MetaCoreEditorAssetTypes.h" #include "MetaCoreEditor/MetaCoreEditorContext.h" @@ -1453,6 +1453,45 @@ void MetaCoreDrawCameraComponentInspector(MetaCoreEditorContext& editorContext, isPrimary ); } + + // 获取所有选中相机的共享启用状态(支持多选和 Mixed 提示) + const auto sharedEnabled = MetaCoreGetSharedSelectedValue( + editorContext, + [](MetaCoreGameObject& selectedObject) -> std::optional { + return selectedObject.HasComponent() ? std::optional(selectedObject.GetComponent().Enabled) : std::nullopt; + }, + [](bool lhs, bool rhs) { return lhs == rhs; } + ); + bool isEnabled = sharedEnabled.value_or(gameObject.GetComponent().Enabled); + if (multiEdit && !sharedEnabled.has_value()) { + ImGui::TextDisabled("Enabled: Mixed"); + } + // 处理 Prefab 覆盖标记以及应用和回退按钮 + if (prefabObject != nullptr && prefabObject->Camera.has_value() && + gameObject.GetComponent().Enabled != prefabObject->Camera->Enabled) { + ImGui::TextColored(ImVec4(0.93F, 0.72F, 0.18F, 1.0F), "Enabled Overrides"); + ImGui::SameLine(); + if (ImGui::SmallButton("Apply##CameraEnabled")) { + (void)MetaCoreApplySelectedPrefabField(editorContext, "Camera", "enabled"); + } + ImGui::SameLine(); + if (ImGui::SmallButton("Revert##CameraEnabled")) { + (void)MetaCoreRevertSelectedPrefabField(editorContext, "Camera", "enabled"); + isEnabled = prefabObject->Camera->Enabled; + } + } + ImGui::Checkbox("Enabled##Camera", &isEnabled); + MetaCoreTrackComponentInspectorEdit(editorContext, "修改检查器属性", false); + if (ImGui::IsItemEdited()) { + // 应用新的启用状态到所有选中的相机组件 + MetaCoreApplyValueToSelectedObjects( + editorContext, + [](MetaCoreGameObject& selectedObject) -> bool* { + return selectedObject.HasComponent() ? &selectedObject.GetComponent().Enabled : nullptr; + }, + isEnabled + ); + } } void MetaCoreDrawLightComponentInspector(MetaCoreEditorContext& editorContext, MetaCoreGameObject& gameObject) { @@ -1542,6 +1581,45 @@ void MetaCoreDrawLightComponentInspector(MetaCoreEditorContext& editorContext, M intensity ); } + + // 获取所有选中光源的共享启用状态(支持多选和 Mixed 提示) + const auto sharedEnabled = MetaCoreGetSharedSelectedValue( + editorContext, + [](MetaCoreGameObject& selectedObject) -> std::optional { + return selectedObject.HasComponent() ? std::optional(selectedObject.GetComponent().Enabled) : std::nullopt; + }, + [](bool lhs, bool rhs) { return lhs == rhs; } + ); + bool isEnabled = sharedEnabled.value_or(gameObject.GetComponent().Enabled); + if (multiEdit && !sharedEnabled.has_value()) { + ImGui::TextDisabled("Enabled: Mixed"); + } + // 处理 Prefab 覆盖标记以及应用和回退按钮 + if (prefabObject != nullptr && prefabObject->Light.has_value() && + gameObject.GetComponent().Enabled != prefabObject->Light->Enabled) { + ImGui::TextColored(ImVec4(0.93F, 0.72F, 0.18F, 1.0F), "Enabled Overrides"); + ImGui::SameLine(); + if (ImGui::SmallButton("Apply##LightEnabled")) { + (void)MetaCoreApplySelectedPrefabField(editorContext, "Light", "enabled"); + } + ImGui::SameLine(); + if (ImGui::SmallButton("Revert##LightEnabled")) { + (void)MetaCoreRevertSelectedPrefabField(editorContext, "Light", "enabled"); + isEnabled = prefabObject->Light->Enabled; + } + } + ImGui::Checkbox("Enabled##Light", &isEnabled); + MetaCoreTrackComponentInspectorEdit(editorContext, "修改检查器属性", false); + if (ImGui::IsItemEdited()) { + // 应用新的启用状态到所有选中的光源组件 + MetaCoreApplyValueToSelectedObjects( + editorContext, + [](MetaCoreGameObject& selectedObject) -> bool* { + return selectedObject.HasComponent() ? &selectedObject.GetComponent().Enabled : nullptr; + }, + isEnabled + ); + } } void MetaCoreDrawMeshRendererComponentInspector(MetaCoreEditorContext& editorContext, MetaCoreGameObject& gameObject) { @@ -2166,6 +2244,10 @@ template } else if (fieldId == "primary") { prefabObjectIterator->Camera->IsPrimary = selectedObject.GetComponent().IsPrimary; changed = true; + } else if (fieldId == "enabled") { + // 应用相机的启用状态到 Prefab 模板中 + prefabObjectIterator->Camera->Enabled = selectedObject.GetComponent().Enabled; + changed = true; } } else if (componentTypeId == "Light" && selectedObject.HasComponent()) { if (!prefabObjectIterator->Light.has_value()) { @@ -2177,6 +2259,10 @@ template } else if (fieldId == "intensity") { prefabObjectIterator->Light->Intensity = selectedObject.GetComponent().Intensity; changed = true; + } else if (fieldId == "enabled") { + // 应用光源的启用状态到 Prefab 模板中 + prefabObjectIterator->Light->Enabled = selectedObject.GetComponent().Enabled; + changed = true; } } else if (componentTypeId == "MeshRenderer" && selectedObject.HasComponent()) { if (!prefabObjectIterator->MeshRenderer.has_value()) { @@ -2240,6 +2326,11 @@ template selectedObject.GetComponent().IsPrimary = prefabObject->Camera->IsPrimary; return true; } + if (fieldId == "enabled") { + // 将相机的启用状态回退为 Prefab 的设定值 + selectedObject.GetComponent().Enabled = prefabObject->Camera->Enabled; + return true; + } } if (componentTypeId == "Light" && prefabObject->Light.has_value()) { @@ -2254,6 +2345,11 @@ template selectedObject.GetComponent().Intensity = prefabObject->Light->Intensity; return true; } + if (fieldId == "enabled") { + // 将光源的启用状态回退为 Prefab 的设定值 + selectedObject.GetComponent().Enabled = prefabObject->Light->Enabled; + return true; + } } if (componentTypeId == "MeshRenderer" && prefabObject->MeshRenderer.has_value()) {