Lumberyard
Guía del usuario (Version 1.20)

Exponer componentes personalizados en Track View para su animación

Para incluir componentes personalizados en escenas de cinemática y películas representadas en disco, debe exponer propiedades de componente que se puedan animar en Editor Track View y el Entity Inspector de Lumberyard. Para exponer un componente personalizado y sus propiedades, debe realizar tres pasos:

  1. Crear métodos getter y setter para la propiedad animada en uno de los buses de eventos de la solicitud del componente.

  2. Implementar los controladores de la solicitud getter y setter en el componente.

  3. Reflejar el componente para el contexto de edición y el contexto del comportamiento. El reflejo de contexto de edición expone el componente en el Entity Inspector y el reflejo de contexto de comportamiento lo expone en Editor Track View.

Exponer componente personalizado: ejemplo

En el siguiente ejemplo se supone que se ha creado un componente personalizado llamado ImaginaryTargetComponent. El componente tiene una propiedad Vector3 llamada ImaginaryPosition que desea animar en Track View. También se ha creado un bus de solicitud llamado ImaginaryTargetComponentBus para el componente. En este ejemplo se supone que se conocen los buses de eventos de programación y los controladores de componentes para ellos. Para obtener más información, consulte Trabajo con el sistema de bus de eventos (EBus) y Creación de un componente.

Para exponer un componente personalizado en Track View

  1. Crear métodos getter y setter

    Cada propiedad debe proporcionar un método para establecer su valor y obtener el valor actual. Para implementar esto, cree métodos getter y setter en uno de los buses de solicitudes del componente. Después refleje estos métodos en el contexto de comportamiento como parte del reflejo de clase para el componente.

    En el siguiente ejemplo se crean solicitudes getter y setter en el ImaginaryTargetComponentRequestBus.

    /*! * ImaginaryTargetComponentRequests EBus Interface * Messages serviced by ImaginaryTargetComponents. */ class ImaginaryTargetComponentRequests : public AZ::ComponentBus { public: // EBusTraits overrides - Application is a singleton. // Only one component on an entity can implement the events. static const AZ::EBusHandlerPolicy HandlerPolicy = AZ::EBusHandlerPolicy::Single; // Getter/Setter methods for ImaginaryTargetPosition. virtual AZ::Vector3 GetImaginaryTargetPosition() = 0; virtual void SetImaginaryTargetPosition(const AZ::Vector3& newPosition) = 0; }; using ImaginaryTargetComponentRequestBus = AZ::EBus<ImaginaryTargetComponentRequests>;
  2. Implementar controladores en el componente

    Implemente controladores en el componente para las solicitudes setter y getter que ha declarado en el primer paso, como en el siguiente ejemplo.

    class ImaginaryTargetComponent : public AzToolsFramework::Components::EditorComponentBase , public LmbrCentral::ImaginaryTargetComponentRequestBus::Handler { public: AZ_EDITOR_COMPONENT(ImaginaryTargetComponent, "{4491D282-C120-4B2E-BC63-AC86296956A2}"); ImaginaryTargetComponent() : m_imaginaryPosition(.0f) {}; // ImaginaryTargetComponentRequestBus::Handler implementation. // Implementations for Getter/Setter methods for ImaginaryTargetPosition. // Presumably these would be used for something useful; this example just // stores and returns the value. AZ::Vector3 GetImaginaryTargetPosition() override { return m_imaginaryPosition; } void SetImaginaryTargetPosition(const AZ::Vector3& newPosition) override { m_imaginaryPosition = newPosition; } protected: // Required Reflect function. static void Reflect(AZ::ReflectContext* context); private: AZ::Vector3 m_imaginaryPosition; };
  3. Reflejar el componente

    Utilizando el contexto de edición y los contextos de comportamiento, refleje la clase del componente, el bus de eventos de solicitud y los métodos getter y setter. Track View utiliza los métodos getter y setter que refleja en este paso para establecer y obtener los valores de la propiedad animada. También debe reflejar una declaración de VirtualProperty que indica a Track View que el componente es capaz de ser animado.

    /*static*/ void ImaginaryTargetComponent::Reflect(AZ::ReflectContext* context) { AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context); if (serializeContext) { serializeContext->Class<ImaginaryTargetComponent, AzToolsFramework::Components::EditorComponentBase>() ->Version(0) ->Field("ImaginaryPosition", &ImaginaryTargetComponent::m_imaginaryPosition); AZ::EditContext* editContext = serializeContext->GetEditContext(); if (editContext) { editContext->Class<ImaginaryTargetComponent>("ImaginaryTarget", "A Code Sample enabling Track View Animation") ->ClassElement(AZ::Edit::ClassElements::EditorData, "") ->Attribute(AZ::Edit::Attributes::Category, "Game") ->Attribute(AZ::Edit::Attributes::AppearsInAddComponentMenu, AZ_CRC("Game", 0x232b318c)) ->DataElement(0, &ImaginaryTargetComponent::m_imaginaryPosition, "Imaginary Target Pos", "Imaginary Target Position") ; } } AZ::BehaviorContext* behaviorContext = azrtti_cast<AZ::BehaviorContext*>(context); if (behaviorContext) { // Reflect the setter and getter methods and create a virtual property that refers to them. behaviorContext->EBus<ImaginaryTargetComponentRequestBus>("ImaginaryTargetRequestBus") ->Event("GetImaginaryTargetPosition", &ImaginaryTargetComponentRequestBus::Events::GetImaginaryTargetPosition) ->Event("SetImaginaryTargetPosition", &ImaginaryTargetComponentRequestBus::Events::SetImaginaryTargetPosition) ->VirtualProperty("ImaginaryPosition", "GetImaginaryTargetPosition", "SetImaginaryTargetPosition"); // Attach the "ImaginaryTargetRequestBus" EBus that you reflected to the behavior context of the ImaginaryTargetComponent class. behaviorContext->Class<ImaginaryTargetComponent>()->RequestBus("ImaginaryTargetRequestBus"); } }
  4. (Opcional) Colocar atributos de unidad en los métodos getter

    La interfaz de usuario de Track View depende del tipo de datos que usan los métodos getter y setter. En el ejemplo anterior se utiliza un tipo de AZ::Vector3 para que Track View haga un seguimiento compuesto x,y,z a partir de la propiedad. En cambio, si los métodos getter y setter usan bool, Track View crea un seguimiento booleano. Para la mayoría de las propiedades que se pueden animar, el tipo es suficiente. No obstante, en algunos casos, es posible que tenga que establecer unidades para una propiedad reflejada. Por ejemplo, si la propiedad AZ::Vector3 representa un color, debe añadir un atributo a el reflejo del evento getter. El atributo indica a Track View que use un selector de color para esa propiedad. Si tiene una propiedad denominada ImaginaryTargetColor que llama a un evento denominado GetImaginaryTargetColor, utilice código de reflejo como el siguiente:

    ->Event("GetImaginaryTargetColor", &ImaginaryTargetComponentRequestBus::Events::GetImaginaryTargetColor) ->Attribute("Units", AZ::Edit::Attributes:: PropertyUnits8BitColor)

    Track View, a continuación, utiliza un color para el seguimiento de la propiedad, tal y como se muestra en la imagen siguiente.

    
            Selector de color en Track View

    Otras unidades se pueden encontrar en el archivo dev\Code\Framework\AZCore\AZCore\Serialization\EditContextConstants.inl. A partir del lanzamiento Lumberyard 1.8, estas unidades son las siguientes.

    const static AZ::Crc32 PropertyUnitsRadian = AZ_CRC("Radians"); const static AZ::Crc32 PropertyUnits8BitColor = AZ_CRC("8BitColor");

    Si tiene un parámetro angular en radianes que desea que Track View convierta en grados en su interfaz de usuario, utilice AZ::Crc32 PropertyUnitsRadian.

Visualización del resultado

Ahora puede ver que el componente y la propiedad de ejemplo aparecen en el Entity Inspector y Editor Track View.

En la siguiente imagen del Entity Inspector, el reflejo EditContext ha expuesto el componente ImaginaryTarget y su propiedad Imaginary Target Pos.


        Componente ImaginaryTarget en el Entity Inspector

En la siguiente imagen de Track View, el reflejo BehaviorContext ha expuesto el componente ImaginaryTarget y la pista ImaginaryPosition de la propiedad virtual correspondiente.


        Componente ImaginaryTarget en Editor Track View