using System.Collections.Generic; using JetBrains.Annotations; using Settings; using SMPLModel; using UnityEngine; namespace Playback { public class SUPPlayer { readonly PlaybackSettings defaultPlaybackSettings; readonly DisplaySettings defaultDisplaySettings; readonly BodySettings defaultBodySettings; List currentCharacters; readonly Transform defaultOrigin; /// /// Create a new player object by supplying default settings. These settings can be overriden when playing animations. /// /// /// /// /// Optionally provide an origin transform to reposition the characters in the scene. public SUPPlayer(PlaybackSettings defaultPlaybackSettings, DisplaySettings defaultDisplaySettings, BodySettings defaultBodySettings, Transform defaultOrigin = null) { this.defaultPlaybackSettings = defaultPlaybackSettings; this.defaultDisplaySettings = defaultDisplaySettings; this.defaultBodySettings = defaultBodySettings; this.defaultOrigin = defaultOrigin; } /// /// Play a set of multiple animations simultaneously /// /// The set to play /// Optionally override settings for this set only /// Optionally override settings for this set only /// Optionally override settings for this set only /// Optionally provide an origin transform to reposition the characters in the scene. [PublicAPI] public void Play(List animationGroup, DisplaySettings overrideDisplaySettings = null, PlaybackSettings overridePlaybackSettings = null, BodySettings overrideBodySettings = null, Transform overrideOrigin = null) { DisplaySettings playWithDisplaySettings = overrideDisplaySettings != null ? overrideDisplaySettings : defaultDisplaySettings; PlaybackSettings playWithPlaybackSettings = overridePlaybackSettings != null ? overridePlaybackSettings : defaultPlaybackSettings; BodySettings playWithBodySettings = overrideBodySettings != null ? overrideBodySettings : defaultBodySettings; Transform playWithOrigin = overrideOrigin != null ? overrideOrigin : defaultOrigin; List newCharacters = new List(); for (int animationIndex = 0; animationIndex < animationGroup.Count; animationIndex++) { AMASSAnimation amassAnimation = animationGroup[animationIndex]; amassAnimation.Reset(); SMPLCharacter smplCharacter = amassAnimation.Data.Model.CreateCharacter(amassAnimation, animationIndex); newCharacters.Add(smplCharacter); smplCharacter.StartAnimation(amassAnimation, playWithPlaybackSettings, playWithDisplaySettings, playWithBodySettings); smplCharacter.SetOrigin(playWithOrigin); } currentCharacters = newCharacters; } /// /// Plays a single animation /// /// The animation to play /// Optionally override settings for this animation only /// Optionally override settings for this animation only /// Optionally override settings for this animation only /// Optionally provide an origin transform to reposition the character in the scene. [PublicAPI] public void Play(AMASSAnimation animation, DisplaySettings overrideDisplaySettings = null, PlaybackSettings overridePlaybackSettings = null, BodySettings overrideBodySettings = null, Transform overrideOrigin = null) { List asList = new List {animation}; Play(asList, overrideDisplaySettings, overridePlaybackSettings, overrideBodySettings, overrideOrigin); } /// /// Immediately stop all currently playing animations. Existing characters will be removed from the scene /// [PublicAPI] public void StopCurrentAnimations() { if (currentCharacters == null) return; foreach (SMPLCharacter character in currentCharacters) { if (character == null) continue; character.InterruptAnimation(); } } } }