using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Ichni.RhythmGame; using Sirenix.Utilities; using TMPro; using Unity.VisualScripting; using UnityEngine; using UnityEngine.InputSystem; using UnityEngine.Serialization; using UnityEngine.UI; namespace Ichni.Editor { public partial class Timeline : StaticWindow { public float songTime => EditorManager.instance.songInformation.songTime; public float songBeat => EditorManager.instance.songInformation.songBeat; public float beatmapStartTime => -EditorManager.instance.songInformation.delay; public float timePerBeat => 60f / EditorManager.instance.songInformation.bpm; public GameObject timelineTabRect; public TimePointerModule timePointerModule; public MusicPlayModule musicPlayModule; public TMP_InputField TimeField; public TMP_InputField BeatField; public RectTransform GetinputArea; public void Update() { if (EditorManager.instance.musicPlayer.isPlaying) UpdateTime(); if (RectTransformUtility.RectangleContainsScreenPoint(GetinputArea, Mouse.current.position.ReadValue())) { DetectSetRange(); } } private void DetectSetRange() { if (Mouse.current.scroll.ReadValue().y != 0) { if (Keyboard.current.leftCtrlKey.isPressed || Keyboard.current.rightCtrlKey.isPressed) { float scrollValue = Mouse.current.scroll.ReadValue().y / 12; if (timePointerModule.timePointerInterval + scrollValue >= 30) { timePointerModule.timePointerInterval += scrollValue; timePointerModule.UpdatePointers(); timePointerModule.SetRange(songTime); } } else { if (Mouse.current.scroll.ReadValue().y >= 0) { SetTime((EditorManager.instance.songInformation.songTime + timePerBeat).ToString()); } else { if (EditorManager.instance.songInformation.songTime - timePerBeat >= 0) SetTime((EditorManager.instance.songInformation.songTime - timePerBeat).ToString()); else SetTime("0"); } UpdateTime(); } } } private void UpdateTime() { TimeField.text = songTime.ToString("F2"); BeatField.text = songBeat.ToString("F2"); } public void SetTime(string time) { EditorManager.instance.musicPlayer.PauseMusic(); EditorManager.instance.musicPlayer.audioSource.time = float.Parse(time); EditorManager.instance.songInformation.songTime = float.Parse(time); timePointerModule.UpdatePointers(); timePointerModule.SetRange(songTime); } public void SetBeat(string beat) { EditorManager.instance.musicPlayer.PauseMusic(); EditorManager.instance.musicPlayer.audioSource.time = float.Parse(beat) * timePerBeat; EditorManager.instance.songInformation.songTime = float.Parse(beat) * timePerBeat; timePointerModule.UpdatePointers(); timePointerModule.SetRange(songTime); } } public partial class Timeline { public TimelineTab timelineTabPrefab; public Dictionary timelineTabList = new Dictionary(); public void SetTimeLine(GameElement element) { for (int i = timelineTabList.Count - 1; i >= 0; i--) { Destroy(timelineTabList.ElementAt(i).Value.gameObject); timelineTabList.Remove(timelineTabList.ElementAt(i).Key); } print(1); if (element is Track) Trackfind(element); } public void Trackfind(GameElement Track) {//这也是if山 foreach (var i in Track.childElementList) { if (i is NoteBase) { if (!timelineTabList.ContainsKey(i.GetType())) { TimelineTab timelineTab = Instantiate(timelineTabPrefab, timelineTabRect.transform); timelineTab.SetTab(i, i.GetType()); timelineTabList.Add(i.GetType(), timelineTab); } else { timelineTabList[i.GetType()].AddElement(i); } } } } } }