using System; using System.Collections; using System.Collections.Generic; using Dreamteck.Splines; using Ichni.RhythmGame.Beatmap; using Lean.Pool; using UnityEngine; namespace Ichni.RhythmGame { public partial class TrackHeadPoint : GameElement, IHaveTimeDurationSubmodule { #region [暴露属性字段] Essential Configs public Track track; public bool motionApplyRotation; public Vector3 motionEulerAngles; #endregion #region [计算与状态缓存] Calculated & Cached States public TrackTimeSubmoduleMovable trackTimeSubmoduleMovable; public SplinePositioner trackPositioner; #endregion #region [子模块接口] Submodules public TimeDurationSubmodule timeDurationSubmodule { get; set; } #endregion #region [生命周期] Lifecycle & Factory public static TrackHeadPoint GenerateElement(string elementName, Guid id, List tags, bool isFirstGenerated, Track track, bool motionApplyRotation, Vector3 motionEulerAngles) { TrackHeadPoint head = LeanPool.Spawn(GameManager.Instance.basePrefabs.trackHeadPoint, track.transform).GetComponent(); head.Initialize(elementName, id, tags, isFirstGenerated, track); head.track = track; head.trackPositioner = head.gameObject.GetComponent(); head.trackPositioner.spline = track.trackPathSubmodule.path; head.trackTimeSubmoduleMovable = track.trackTimeSubmodule as TrackTimeSubmoduleMovable; head.motionApplyRotation = motionApplyRotation; head.trackPositioner.motion.applyRotation = motionApplyRotation; head.motionEulerAngles = motionEulerAngles; head.trackPositioner.motion.rotationOffset = motionEulerAngles; return head; } public override void SetDefaultSubmodules() { timeDurationSubmodule = new TimeDurationSubmodule(this); } public override void AfterInitialize() { GameManager.Instance.trackManager.RegisterHeadPoint(this); base.AfterInitialize(); } #endregion #region [轮询更新] Main Update public void ManualUpdate(float currentSongTime) { if (track.timeDurationSubmodule.CheckTimeInDuration(currentSongTime)) { trackPositioner.SetPercent(trackTimeSubmoduleMovable.headPercent); } if(track.timeDurationSubmodule.CheckAfterEndTime(currentSongTime)) { GameManager.Instance.trackManager.UnregisterHeadPoint(this); } } #endregion } }