using System; using System.Collections.Generic; using System.Linq; using Dreamteck.Splines; using Ichni.RhythmGame.Beatmap; using Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.Beatmap; using UniRx; using UnityEngine; namespace Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse { public partial class DTMNoteVisualHold : DTMNoteVisual, INoteVisualHold, IHaveTransformSubmodule { public Hold hold { get; set; } public MeshGenerator meshGenerator; public SplinePositioner headPoint, tailPoint; public static DTMNoteVisualHold GenerateElement(string elementName, Guid id, List tags, bool isFirstGenerated, GameElement parentElement, string themeBundleName, string objectName) { DTMNoteVisualHold noteVisualHold = SubstantialObject.GenerateElement(elementName, id, tags, isFirstGenerated, themeBundleName, objectName, parentElement).GetComponent(); return noteVisualHold; } public override void FirstSetUpObject(bool isFirstGenerated) { NoteBase note = parentElement as NoteBase; if(note == null) throw new System.Exception("NoteVisual只能生成在Note下。"); if(!note.isOnTrack) throw new System.Exception("这种HoldNoteVisual只能生成在Track上。"); this.note = note; note.noteVisual = this; this.hold = note as Hold; this.headPoint = notePartList[0].GetComponent(); this.meshGenerator = notePartList[1].GetComponent(); this.tailPoint = notePartList[2].GetComponent(); this.hold.trackPositioner.autoUpdate = false; headPoint.spline = hold.track.trackPathSubmodule.path; meshGenerator.spline = hold.track.trackPathSubmodule.path; tailPoint.spline = hold.track.trackPathSubmodule.path; } public override void AfterInitialize() { base.AfterInitialize(); Recover(); } public override void Recover() { foreach (GameObject part in notePartList) { Renderer rend = part.GetComponent(); if (rend != null) { rend.material.SetFloat("_MainAlpha", 1f); } } foreach (EffectBase effect in effectSubmodule.effectCollection["Generate"]) { effect.Recover(); } } } public partial class DTMNoteVisualHold { public override void SaveBM() { matchedBM = new DTMNoteVisualHold_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM, themeBundleName, objectName); } private float startPercent, endPercent; public void UpdateHoldInMovableTrack() { if (effectSubmodule.effectCollection["Generate"].Any(e => e.nowEffectState == EffectBase.EffectState.Middle)) { return; } TrackTimeSubmoduleMovable trackTimeSubmoduleMovable = hold.track.trackTimeSubmodule as TrackTimeSubmoduleMovable; startPercent = trackTimeSubmoduleMovable.GetTrackPercent(hold.exactJudgeTime + hold.holdingTime); endPercent = trackTimeSubmoduleMovable.GetTrackPercent(hold.holdEndTime); hold.trackPositioner.SetPercent(startPercent); meshGenerator.SetClipRange(startPercent, endPercent); headPoint.SetPercent(startPercent); tailPoint.SetPercent(endPercent); } public void UpdateHoldInStaticTrack() { //throw new NotImplementedException(); } public void UpdateTransform(bool refreshAll = true) { bool willRefresh = false; if (transformSubmodule.positionDirtyMark) { transformSubmodule.currentPosition = transformSubmodule.originalPosition + transformSubmodule.positionOffset; transformSubmodule.positionDirtyMark = false; willRefresh = true; transformSubmodule.positionOffset = Vector3.zero; } if (refreshAll && willRefresh) { Refresh(); } } public override void Refresh() { base.Refresh(); Vector2 posOffset = new Vector2(transformSubmodule.currentPosition.x, transformSubmodule.currentPosition.y); hold.trackPositioner.motion.offset = posOffset; meshGenerator.offset = posOffset; headPoint.motion.offset = posOffset; tailPoint.motion.offset = posOffset; } } namespace Beatmap { public class DTMNoteVisualHold_BM : SubstantialObject_BM { public DTMNoteVisualHold_BM() { } public DTMNoteVisualHold_BM(string elementName, Guid id, List tags, GameElement_BM parent, string themeBundleName, string objectName) : base(elementName, id, tags, parent, themeBundleName, objectName) { } public override void ExecuteBM() { matchedElement = DTMNoteVisualHold.GenerateElement(elementName, elementGuid, tags, false, GetElement(attachedElementGuid), themeBundleName, objectName); } public override GameElement DuplicateBM(GameElement parent) { return DTMNoteVisualHold.GenerateElement(elementName, Guid.NewGuid(), tags, false, parent, themeBundleName, objectName); } } } }