Paso 2: Adición de un ComponentModeDelegate de - LumberyardGuía de usuario de

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Paso 2: Adición de un ComponentModeDelegate de

Para añadir esta característica al componente Point Light (Luz puntual), debe actualizar el componente para que pueda detectar la intención de comenzar a editar un componente y administrar la creación de un Modo de componente. Para hacerlo, añada un nuevo tipo denominado ComponentModeDelegate al componente existente.

Para añadir unComponentModeDelegate

  1. Vaya al archivo EditorPointLightComponent.h y abra el archivo en un editor de texto.

  2. Añada el ComponentModeDelegate.

    ejemplo EditorPointLightComponent.h

    Before
    #pragma once #include "EditorLightComponent.h" namespace LmbrCentral { /*! * In-editor Point Light component. * Handles previewing and activating lights in the editor. */ class EditorPointLightComponent : public EditorLightComponent { public: AZ_COMPONENT(EditorPointLightComponent, "{00818135-138D-42AD-8657-FF3FD38D9E7A}", AzToolsFramework::Components::EditorComponentBase); static void Reflect(AZ::ReflectContext* context); void Init() override; protected: const char* GetLightTypeText() const override { return "Point Light"; } }; } // namespace LmbrCentral
    After

    Consulte los siguientes cambios de código.

    #pragma once #include "EditorLightComponent.h" // BEGIN ADD #include <AzToolsFramework/ComponentMode/ComponentModeDelegate.h> // END ADD namespace LmbrCentral { /** * In-editor Point Light component. * Handles previewing and activating lights in the editor. */ class EditorPointLightComponent : public EditorLightComponent { public: AZ_COMPONENT(EditorPointLightComponent, "{00818135-138D-42AD-8657-FF3FD38D9E7A}", AzToolsFramework::Components::EditorComponentBase); static void Reflect(AZ::ReflectContext* context); void Init() override; // BEGIN ADD void Activate() override; void Deactivate() override; // END ADD protected: const char* GetLightTypeText() const override { return "Point Light"; } // BEGIN ADD using ComponentModeDelegate = AzToolsFramework::ComponentModeFramework::ComponentModeDelegate; ComponentModeDelegate m_componentModeDelegate; ///< Responsible for detecting ComponentMode activation ///< and creating a concrete ComponentMode(s). /// END ADD }; } // namespace LmbrCentral

    En este ejemplo, hay un #include para ComponentModeDelegate.h, que es donde se añade el archivo como miembro. La declaración using reduce la longitud de la definición de m_componentDelegate. El archivo actualizado también proporciona las funciones de miembros Activate y Deactivate para el componente.

  3. Guarde el archivo.

Ahora que ha actualizado el archivo EditorPointLightComponent.h, debe realizar cambios en el archivo de implementación EditorPointLightComponent.cpp.

Para actualizar elEditorPointLightComponent.cpp

  1. Abra el archivo EditorPointLightComponent.cpp en un editor de texto.

  2. Añada un #include para el Modo de componente no escrito y comente el cambio. Esto se convierte en el archivo EditorPointLightComponentMode.h.

    // #include "EditorPointLightComponentMode.h"
  3. Serialice el miembro m_componentModeDelegate para exponerlo al EditContext.

    ->Field("ComponentMode", &EditorPointLightComponent::m_componentModeDelegate)
  4. Introduzca los siguientes cambios para que ComponentModeDelegate aparezca en el Entity Inspector. Este cambio agrega el botón Edit (Editar) al componente Point Light (Luz puntual).

    ->DataElement(AZ::Edit::UIHandlers::Default, &EditorPointLightComponent::m_componentModeDelegate, "Component Mode", "Point Light Component Mode") ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly)
    sugerencia

    El Attribute garantiza que el botón Edit (Editar) aparezca sin estar anidado dentro de la clase/estructura ComponentModeDelegate.

  5. Dentro de la llamada Activate, añada el siguiente código.

    m_componentModeDelegate.ConnectWithSingleComponentMode < EditorPointLightComponent, /*EditorPointLightComponentMode*/>( AZ::EntityComponentIdPair(GetEntityId(), GetId()), nullptr);
    1. La función auxiliar ConnectWithSingleComponentMode gestiona el caso más común de añadir un Modo de componente. Esta llamada envuelve una API más compleja en la que se pueden activar al mismo tiempo varios Modos de componente.

      Por ejemplo, consulte el archivo EditorTubeShapeComponent.h.

    2. Especifique el tipo de componente y el propio Modo de componente.

      nota

      Los parámetros de la plantilla generalizan la conexión y la creación de una instancia de Modos de componente. Para obtener más información, consulte CreateComponentModeBuilder.h y su función AddComponentModes.

    3. Especifique el EntityId al que se ha adjuntado el componente y el ComponentId.

      nota

      Es posible (aunque no se utiliza a menudo) dirigirse a un EBus no solo por el EntityId sino por el par EntityId y ComponentId. No se garantiza que un ComponentId sea único por sí mismo, pero cuando se combina con un EntityId, puede dirigirse a un componente específico asociado a una entidad. Esto resulta útil cuando tiene varios componentes del mismo tipo asociados a una única entidad.

    4. El argumento final es un nullptr, que es un EditorComponentSelectionRequestBus::Handler. Para utilizar este controlador, EditorComponent debe implementar EditorComponentSelectionRequestsBus. Si la EBus se ha implementado, puede pasar 'this' aquí, pero dado que aún no la ha implementado, escriba nullptr por ahora.

      Estos cambios le permiten hacer doble clic en en la ventanilla para seleccionar un componente. Implemente el EditorComponentSelectionRequestBus en Paso 5: Gestionar selección en la ventanilla.

      Para ver ejemplos, consulte los archivos EditorSplineComponent.h y EditorBaseShapeComponent.h.

  6. Escriba el siguiente código para desconectar el ComponentModeDelegate cuando el EditorComponent se desactiva.

    m_componentModeDelegate.Disconnect();

    Este cambio garantiza que el ComponentModeDelegate se desconecte de los distintos EBuses que están conectados a en la función Activate.

ejemplo EditorPointLightComponent.cpp

El código debería tener el siguiente aspecto.

Before
#include "LmbrCentral_precompiled.h" #include "EditorPointLightComponent.h" #include <AzCore/Serialization/SerializeContext.h> #include <AzCore/Serialization/EditContext.h> #include <AzCore/RTTI/BehaviorContext.h> namespace LmbrCentral { void EditorPointLightComponent::Reflect(AZ::ReflectContext* context) { if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) { serializeContext->Class<EditorPointLightComponent, EditorLightComponent>() ->Version(1) ; if (AZ::EditContext* editContext = serializeContext->GetEditContext()) { editContext->Class<EditorPointLightComponent>( "Point Light", "The Point Light component allows an entity to create a point of light") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Category, "Rendering") ->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/PointLight.png") ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/Viewport/PointLight.png") ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c)) ->Attribute(AZ::Edit::Attributes::AutoExpand, true) ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://docs.aws.amazon.com/lumberyard/latest/userguide/component-point-light.html") ; } } if (auto behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context)) { behaviorContext->Class<EditorPointLightComponent>()->RequestBus("EditorPointLightComponentBus"); } } void EditorPointLightComponent::Init() { SetLightType(EditorLightConfiguration::LightType::Point); EditorLightComponent::Init(); } } // namespace LmbrCentral
After
#include "LmbrCentral_precompiled.h" #include "EditorPointLightComponent.h" // BEGIN ADD // #include "EditorPointLightComponentMode.h" // END ADD #include <AzCore/Serialization/SerializeContext.h> #include <AzCore/Serialization/EditContext.h> #include <AzCore/RTTI/BehaviorContext.h> namespace LmbrCentral { void EditorPointLightComponent::Reflect(AZ::ReflectContext* context) { if (auto serializeContext = azrtti_cast<AZ::SerializeContext*>(context)) { serializeContext->Class<EditorPointLightComponent, EditorLightComponent>() ->Version(1) // BEGIN ADD ->Field("ComponentMode", &EditorPointLightComponent::m_componentModeDelegate) // END ADD ; if (AZ::EditContext* editContext = serializeContext->GetEditContext()) { editContext->Class<EditorPointLightComponent>( "Point Light", "The Point Light component allows an entity to create a point of light") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Category, "Rendering") ->Attribute(AZ::Edit::Attributes::Icon, "Editor/Icons/Components/PointLight.png") ->Attribute(AZ::Edit::Attributes::ViewportIcon, "Editor/Icons/Components/Viewport/PointLight.png") ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c)) ->Attribute(AZ::Edit::Attributes::AutoExpand, true) ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) ->Attribute(AZ::Edit::Attributes::HelpPageURL, "https://docs.aws.amazon.com/lumberyard/latest/userguide/component-point-light.html") // BEGIN ADD ->DataElement(AZ::Edit::UIHandlers::Default, &EditorPointLightComponent::m_componentModeDelegate, "Component Mode", "Point Light Component Mode") ->Attribute(AZ::Edit::Attributes::Visibility, AZ::Edit::PropertyVisibility::ShowChildrenOnly) // END ADD ; } } if (auto behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context)) { behaviorContext->Class<EditorPointLightComponent>()->RequestBus("EditorPointLightComponentBus"); } } void EditorPointLightComponent::Init() { SetLightType(EditorLightConfiguration::LightType::Point); EditorLightComponent::Init(); } // BEGIN ADD void EditorPointLightComponent::Activate() { EditorLightComponent::Activate(); // m_componentModeDelegate.ConnectWithSingleComponentMode < // EditorPointLightComponent, EditorPointLightComponentMode>( // AZ::EntityComponentIdPair(GetEntityId(), GetId()), nullptr); } void EditorPointLightComponent::Deactivate() { // m_componentModeDelegate.Disconnect(); EditorLightComponent::Deactivate(); } // END ADD } // namespace LmbrCentral