using System; using System.Collections.Generic; using System.Linq; using UnityEngine; namespace Ichni.RhythmGame { public abstract partial class AnimationBase : GameElement, IHaveTimeDurationSubmodule, IScheduledElement { #region [属性和相关对象] Attributes & Related Objects public GameElement animatedObject; public FlexibleReturnType animationReturnType; #endregion #region [子模块接口] Submodule Interfaces public TimeDurationSubmodule timeDurationSubmodule { get; set; } public override void SetDefaultSubmodules() { timeDurationSubmodule = new TimeDurationSubmodule(this); } #endregion #region [生命周期与控制管理] Lifecycle & Management public override void AfterInitialize() { base.AfterInitialize(); CoreServices.UpdateScheduler.Register(UpdatePhase.Animation, this); float delay = GameManager.Instance.songInformation.delay; if (timeDurationSubmodule.CheckTimeInDuration(-delay)) { ManualUpdate(-delay, true); } } public override void OnDelete() { base.OnDelete(); CoreServices.UpdateScheduler.Unregister(UpdatePhase.Animation, this); } /// /// 更新动画 /// /// 歌曲时间 protected abstract void UpdateAnimation(float songTime, bool forceUpdate); public virtual void ManualUpdate(float currentSongTime, bool forceUpdate = false) { if (timeDurationSubmodule.CheckTimeInDuration(currentSongTime)) { UpdateAnimation(currentSongTime, forceUpdate); } if (timeDurationSubmodule.CheckAfterEndTime(currentSongTime)) { CoreServices.UpdateScheduler.Unregister(UpdatePhase.Animation, this); } } #region [IScheduledElement] Scheduler Interface public virtual void ScheduledUpdate(UpdatePhase phase, float songTime) { ManualUpdate(songTime); } public bool IsScheduledActive => isActiveAndEnabled; #endregion /// /// 施加时间偏移,即移动所有Flexible参数的时间 /// /// public virtual void ApplyTimeOffset(float offset) { timeDurationSubmodule.startTime += offset; timeDurationSubmodule.endTime += offset; } #endregion } }