UMovieSceneSection: derived types should populate this structure with all of its channels as in the example below. Channels are stored by their base
FMovieSceneChannel* in buckets by derived type. With this in mind, any reallocation of channels should be immediately followed by a re-creation of the channel proxy; doing so will invalidate any pointers and handles to the channels stored in the old proxy.
All interaction with channels is through either the
FMovieSceneChannel interface directly, or
ISequencerChannelInterface, depending on context. The latter is registered per-type through the sequencer module
Failure to do so will result in a failed assertion at runtime when trying to edit such channels. A templated helper is provided through
TSequencerChannelInterface which allows single-concept overloading for any given channel type, resolved through argument-dependent lookup (ADL).
This allows customization of specific behavior without having to re-implement the entire interface if the defaults are suitable for most channels. It also means that core sequencer code can automatically populate UI for channel data without having to manually define
ISequencerSection interfaces and manually defining the channel layout in the editor as well as in the runtime. This streamlines the creation of custom section types to a degree, particularly when composing sections from already supported intrinsic channel data.
Default implementation functions for
ISequencerChannelInterface are defined in the Sequencer namespace, but overloads should be added either to your channel’s namespace or the global namespace.
It is recommended that custom channels follow the pattern of storing times and values in parallel arrays, and provide a
TMovieSceneChannelData<T> GetData() method for interacting with the keys. The majority of
FMovieSceneChannel’s interface directly maps to functions callable on
Using this proxy approach, all data required for constructing UI and interacting with the channel’s keys is readily available to Sequencer UI code.