Files
ichni_Official/Assets/Scripts/Game/GameElements/Track/TrackPoints/TrackHeadPoint.cs

77 lines
2.8 KiB
C#
Raw Normal View History

2025-06-03 02:42:28 -04:00
using System;
using System.Collections;
using System.Collections.Generic;
using Dreamteck.Splines;
using Ichni.RhythmGame.Beatmap;
2026-03-14 03:13:10 -04:00
using Lean.Pool;
2025-07-26 04:20:25 -04:00
using UnityEngine;
2025-06-03 02:42:28 -04:00
namespace Ichni.RhythmGame
{
public partial class TrackHeadPoint : GameElement, IHaveTimeDurationSubmodule
{
2026-03-14 03:13:10 -04:00
#region [] Essential Configs
2025-06-03 02:42:28 -04:00
public Track track;
2026-03-14 03:13:10 -04:00
public bool motionApplyRotation;
public Vector3 motionEulerAngles;
#endregion
#region [] Calculated & Cached States
2025-06-03 02:42:28 -04:00
public TrackTimeSubmoduleMovable trackTimeSubmoduleMovable;
public SplinePositioner trackPositioner;
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
2026-03-14 03:13:10 -04:00
#region [] Submodules
2025-06-03 02:42:28 -04:00
public TimeDurationSubmodule timeDurationSubmodule { get; set; }
2026-03-14 03:13:10 -04:00
#endregion
2025-07-21 05:42:20 -04:00
2026-03-14 03:13:10 -04:00
#region [] Lifecycle & Factory
2025-06-03 02:42:28 -04:00
public static TrackHeadPoint GenerateElement(string elementName, Guid id, List<string> tags,
2025-08-11 14:04:06 -04:00
bool isFirstGenerated, Track track, bool motionApplyRotation, Vector3 motionEulerAngles)
2025-06-03 02:42:28 -04:00
{
2026-03-14 03:13:10 -04:00
TrackHeadPoint head =
LeanPool.Spawn(GameManager.Instance.basePrefabs.trackHeadPoint, track.transform).GetComponent<TrackHeadPoint>();
2025-06-03 02:42:28 -04:00
head.Initialize(elementName, id, tags, isFirstGenerated, track);
head.track = track;
2026-03-14 03:13:10 -04:00
head.trackPositioner = head.gameObject.GetComponent<SplinePositioner>();
2025-06-03 02:42:28 -04:00
head.trackPositioner.spline = track.trackPathSubmodule.path;
head.trackTimeSubmoduleMovable = track.trackTimeSubmodule as TrackTimeSubmoduleMovable;
2025-07-21 05:42:20 -04:00
head.motionApplyRotation = motionApplyRotation;
head.trackPositioner.motion.applyRotation = motionApplyRotation;
2025-08-11 14:04:06 -04:00
head.motionEulerAngles = motionEulerAngles;
head.trackPositioner.motion.rotationOffset = motionEulerAngles;
2025-06-03 02:42:28 -04:00
return head;
}
public override void SetDefaultSubmodules()
{
timeDurationSubmodule = new TimeDurationSubmodule(this);
}
2026-03-14 03:13:10 -04:00
public override void AfterInitialize()
2025-06-03 02:42:28 -04:00
{
2026-03-14 03:13:10 -04:00
GameManager.Instance.trackManager.RegisterHeadPoint(this);
base.AfterInitialize();
2025-06-03 02:42:28 -04:00
}
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
2026-03-14 03:13:10 -04:00
#region [] Main Update
public void ManualUpdate(float currentSongTime)
2025-06-03 02:42:28 -04:00
{
2026-03-14 03:13:10 -04:00
if (track.timeDurationSubmodule.CheckTimeInDuration(currentSongTime))
2025-06-03 02:42:28 -04:00
{
2026-03-14 03:13:10 -04:00
trackPositioner.SetPercent(trackTimeSubmoduleMovable.headPercent);
2025-06-03 02:42:28 -04:00
}
2026-03-14 03:13:10 -04:00
if(track.timeDurationSubmodule.CheckAfterEndTime(currentSongTime))
2025-06-03 02:42:28 -04:00
{
2026-03-14 03:13:10 -04:00
GameManager.Instance.trackManager.UnregisterHeadPoint(this);
2025-06-03 02:42:28 -04:00
}
}
2026-03-14 03:13:10 -04:00
#endregion
2025-06-03 02:42:28 -04:00
}
2026-03-14 03:13:10 -04:00
2025-06-03 02:42:28 -04:00
}