Files
ichni_Official/Assets/Scripts/Game/GameElements/Track/TrackPoints/TrackHeadPoint.cs
SoulliesOfficial 7c60c40d6b 同步
2026-06-05 04:45:57 -04:00

92 lines
3.2 KiB
C#

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, IScheduledElement
{
#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<string> tags,
bool isFirstGenerated, Track track, bool motionApplyRotation, Vector3 motionEulerAngles)
{
TrackHeadPoint head =
LeanPool.Spawn(GameManager.Instance.basePrefabs.trackHeadPoint, track.transform).GetComponent<TrackHeadPoint>();
head.Initialize(elementName, id, tags, isFirstGenerated, track);
head.track = track;
head.trackPositioner = head.gameObject.GetComponent<SplinePositioner>();
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()
{
CoreServices.UpdateScheduler.Register(UpdatePhase.TrackFollower, this);
base.AfterInitialize();
}
public override void OnDelete()
{
base.OnDelete();
CoreServices.UpdateScheduler.Unregister(UpdatePhase.TrackFollower, this);
}
#endregion
#region [] Main Update
public void ManualUpdate(float currentSongTime)
{
if (track.timeDurationSubmodule.CheckTimeInDuration(currentSongTime))
{
trackPositioner.SetPercent(trackTimeSubmoduleMovable.headPercent);
}
if(track.timeDurationSubmodule.CheckAfterEndTime(currentSongTime))
{
CoreServices.UpdateScheduler.Unregister(UpdatePhase.TrackFollower, this);
}
}
#region [IScheduledElement] Scheduler Interface
public void ScheduledUpdate(UpdatePhase phase, float songTime)
{
ManualUpdate(songTime);
}
public bool IsScheduledActive => isActiveAndEnabled;
#endregion
#endregion
}
}