using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Dreamteck.Splines; using Ichni.RhythmGame.Beatmap; using Lean.Pool; using UniRx; using UnityEngine; namespace Ichni.RhythmGame { public partial class PathNode : GameElement, IHaveTransformSubmodule, IHaveTimeDurationSubmodule, IHaveColorSubmodule { #region [暴露属性字段] Essential Configs public Track track; public SplinePoint node; public bool isShowingSphere; public override int HierarchyPriority => -100; public bool haveEmission => false; #endregion #region [计算与状态缓存] Calculated & Cached States public int index => track.trackPathSubmodule.pathNodeList.IndexOf(this); #endregion #region [子模块接口] Submodules public TransformSubmodule transformSubmodule { get; set; } public TimeDurationSubmodule timeDurationSubmodule { get; set; } public ColorSubmodule colorSubmodule { get; set; } #endregion #region [生命周期] Lifecycle & Factory public static PathNode GenerateElement(string elementName, Guid id, List tags, bool isFirstGenerated, Track track, bool isShowingSphere) { PathNode pathNode = LeanPool.Spawn(GameManager.Instance.basePrefabs.pathNode, track.transform).GetComponent(); pathNode.Initialize(elementName, id, tags, isFirstGenerated, track); pathNode.track = track; pathNode.isShowingSphere = isShowingSphere; track.trackPathSubmodule.pathNodeList.Add(pathNode); track.trackPathSubmodule.SetPathNode(pathNode); return pathNode; } public override void AfterInitialize() { base.AfterInitialize(); if (childElementList.Any(c => c is AnimationBase)) { if(track.trackRendererSubmodule != null) track.trackRendererSubmodule.meshGenerator.autoUpdate = true; } else { //LeanPool.Despawn(gameObject); } } public override void SetDefaultSubmodules() { transformSubmodule = new TransformSubmodule(this); timeDurationSubmodule = new TimeDurationSubmodule(this); colorSubmodule = new ColorSubmodule(this); } #endregion } #region [行为重写] Behavior Overrides public partial class PathNode { public override void Refresh() { base.Refresh(); Vector3 position = transformSubmodule.currentPosition; Vector3 normal = Quaternion.Euler(transformSubmodule.currentEulerAngles) * Vector3.up; float size = transformSubmodule.currentScale.x; Color color = colorSubmodule.currentBaseColor; transform.localPosition = position; transform.localRotation = Quaternion.LookRotation(normal); transform.localScale = Vector3.one * size; node = new SplinePoint(position, Vector3.up, normal, size, color); track.trackPathSubmodule.SetPathNode(this); } } #endregion }