TimeLine大改

Signed-off-by: TRAfoer <lhf190@outlook.com>
This commit is contained in:
2025-07-18 18:43:09 +08:00
parent fc3b4d7207
commit 1b5084626d
29 changed files with 16837 additions and 17453 deletions

View File

@@ -17,22 +17,28 @@ public class SubTab : MonoBehaviour
private TimePointerModule timePointerModule;
public TimelineTab father;
private Timeline timeline;
public float Time;
public float time;
public void Set(IBaseElement Objs, float time)
{
songInformation = EditorManager.instance.songInformation;
timePointerModule = EditorManager.instance.uiManager.timeline.timePointerModule;
timeline = EditorManager.instance.uiManager.timeline;
Time = time;
this.time = time;
connectObj.Add(Objs);
button.GetComponentInChildren<TMP_Text>().text = connectObj.Count().ToString();
transform.localPosition = new Vector3(Time / timeline.timePerBeat * timePointerModule.timePointerInterval + 15f - timePointerModule.delayDistanceOffset,
-(42.5f + (father.TabIndex * 25)), 0);
//transform.position = new Vector3(transform.position.x, father.Title.transform.position.y, 0);
transform.localPosition = new Vector3((this.time / timeline.timePerBeat * timePointerModule.timePointerInterval),
-(42.5f + ((father.TabIndex + 1) * 25)), 0);
//transform.position = new Vector3(transform.position.x, father.Title.transform.position.y + 12, 0);
}
void Update()
{
if (Time.frameCount % 3 == 0)
{
transform.localScale = new Vector3(time > songInformation.songTime ? 1f : 0f, 1f, 1f);
}
}
// public void GetClick()//?
// {
// if (connectObj[0] is GameElement)

View File

@@ -15,230 +15,73 @@ namespace Ichni.Editor
public GameObject timePointerPrefab;
public List<TimePointer> timePointerList;
private TimePointer NowPointer;
public RectTransform moveTabPoint;
public RectTransform timePointerContainer;
public RectTransform rightSide;
public float timePointerInterval = 100f;
public RectTransform timePointerArea;
public RectTransform visibleTimePointerArea;
public RectTransform moveTabPoint;//用于显示timeline上的tab
public RectTransform mainTimePointer;
public float intervalUnit;
public float timePointerInterval;
public float sizeNegative, sizePositive;
public int negativePointerAmount; // 负方向指示线的数量
public int positivePointerAmount, totalPointerAmount;
/// <summary>
/// delay时间区间中(-delay, 0)的距离偏移量
/// </summary>
public float delayDistanceOffset;
public float leftSideSongTime, rightSideSongTime, songTimeDistance;
private void Start()
public void Start()
{
Observable.NextFrame().Subscribe(_ =>
{
timePointerList = new List<TimePointer>();
Initialize(songInformation.delay, songInformation.bpm);
});
timePointerInterval = 100f;
EditorManager.instance.uiManager.timeline.timePointerModule = this;
OnceSpawn();
}
private void Update()
public void OnceSpawn()
{
if (EditorManager.instance.musicPlayer.isPlaying)
for (int i = timePointerList.Count - 1; i >= 0; i--)
{
SetRange(songInformation.songTime);
}
timePointerList.ForEach(pointer =>
{
bool isActive = pointer.time >= leftSideSongTime && pointer.time <= rightSideSongTime;
if(isActive != pointer.gameObject.activeSelf) pointer.gameObject.SetActive(isActive);
});
if (OnePointer != null) moveTabPoint.localPosition =
new Vector3(timePointerArea.localPosition.x + OnePointer.transform.localPosition.x - 30f, 0, 0);
foreach (var i in moveTabPoint.transform.GetComponentsInChildren<SubTab>())
{
i.gameObject.transform.localScale = i.Time >= timeline.songTime ? Vector3.one : Vector3.zero;
}
}
/// <summary>
/// 初始化所有Timeline指示线
/// </summary>
/// <param name="delay"></param>
/// <param name="bpm"></param>
public void Initialize(float delay, float bpm)
{
timePointerInterval = 80;
ClearPointers();
int beatDivider = 1;
intervalUnit = (60f / bpm) / beatDivider * 1000;
sizeNegative = delay * beatDivider / timeline.timePerBeat;
// 计算负方向指示线的数量
negativePointerAmount = Mathf.CeilToInt(sizeNegative);
sizePositive = songInformation.song.length * beatDivider / timeline.timePerBeat;
positivePointerAmount = Mathf.CeilToInt(sizePositive);
totalPointerAmount = negativePointerAmount + positivePointerAmount;
timePointerArea.sizeDelta = new Vector2(timePointerInterval * (sizeNegative + sizePositive), 60f);
delayDistanceOffset = timePointerInterval * (negativePointerAmount - sizeNegative);
leftSideSongTime = timeline.beatmapStartTime;
rightSideSongTime = timeline.timePerBeat * (visibleTimePointerArea.rect.width / timePointerInterval);
songTimeDistance = rightSideSongTime;
for (int i = -negativePointerAmount; i <= positivePointerAmount; i++)
{
CreatePointer(beatDivider, i);
}
//ChangeSongTimeDistance(0);
SetRange(timeline.beatmapStartTime);
}
}
public partial class TimePointerModule
{
/// <summary>
/// 设置Timeline的显示区间区间宽度使用当前的区间宽度
/// </summary>
/// <param name="startTime">开始时间,结束时间即(开始时间+区间宽度)</param>
public void SetRange(float startTime)
{
startTime = Mathf.Clamp(startTime, timeline.beatmapStartTime, songInformation.song.length);
timePointerArea.anchoredPosition =
new Vector2((timePointerArea.sizeDelta.x / 2) -
(startTime + songInformation.delay) / timeline.timePerBeat * timePointerInterval, 0);
float proportion = mainTimePointer.anchoredPosition.x / visibleTimePointerArea.rect.width;
leftSideSongTime = startTime - songTimeDistance * proportion;
rightSideSongTime = startTime + songTimeDistance * (1 - proportion);
}
/// <summary>
/// 生成指示线
/// </summary>
/// <param name="beatDivider">细分X分音符</param>
/// <param name="index"></param>
TimePointer OnePointer = null;//第一个pointer
private void CreatePointer(int beatDivider, int index)
{
TimePointer pointer = Instantiate(timePointerPrefab, timePointerArea).GetComponent<TimePointer>();
timePointerList.Add(pointer);
pointer.index = index;
pointer.GetComponent<RectTransform>().anchoredPosition =
new Vector2((index + negativePointerAmount) * timePointerInterval + 15f - delayDistanceOffset, 0);
pointer.time = index * intervalUnit / 1000f;
pointer.intervalUnitText.text = Mathf.RoundToInt(index * intervalUnit).ToString();
if (index == 0)
{
OnePointer = pointer;
}
if (beatDivider > 1)
{
}
}
/// <summary>
/// 更新指示线位置
/// </summary>
public void UpdatePointers()
{
// 计算延迟距离偏移量
delayDistanceOffset = timePointerInterval * (negativePointerAmount - sizeNegative);
// 更新指示线区域的大小
timePointerArea.sizeDelta = new Vector2(timePointerInterval * totalPointerAmount, 55f);
// 更新每个指示线的位置
foreach (var pointer in timePointerList)
{
pointer.GetComponent<RectTransform>().anchoredPosition =
new Vector2((pointer.index + negativePointerAmount) * timePointerInterval + 15f - delayDistanceOffset, 0);
}
}
/// <summary>
/// 清楚所有指示线
/// </summary>
private void ClearPointers()
{
foreach (var pointer in timePointerList)
{
Destroy(pointer.gameObject);
Destroy(timePointerList[i].gameObject);
}
timePointerList.Clear();
}
/// <summary>
/// 缩放时间线的展示时间宽度
/// </summary>
/// <param name="value">增减值</param>
public void ChangeSongTimeDistance(float value)
{
float oldDistance = songTimeDistance;
float changedDistance = songTimeDistance + value;
float songLength = songInformation.song.length;
if (changedDistance < 1 || changedDistance > songLength)
for (int i = 0; i < songInformation.songLength / timeline.timePerBeat; i++)
{
return;
TimePointer timePointer = Instantiate(timePointerPrefab, timePointerContainer).GetComponent<TimePointer>();
timePointerList.Add(timePointer);
timePointer.intervalUnitText.text = (i * timeline.timePerBeat).ToString("F3");
timePointer.GetComponent<RectTransform>().localPosition = new Vector3(i * timePointerInterval, 0f, 0f);
timePointer.index = i;
timePointer.gameObject.SetActive(false);
}
float finalDistance = 0, finalValue = 0;
float superfluousDistance = changedDistance - songLength;
if (superfluousDistance > 0)
}
public void SortPos()
{
foreach (var i in timePointerList)
{
finalDistance = songLength;
finalValue = value - superfluousDistance;
i.GetComponent<RectTransform>().localPosition = new Vector3(i.index * timePointerInterval, 0f, 0f);
}
}
public void Update()
{
timePointerContainer.localPosition = new Vector3(-EditorManager.instance.songInformation.songTime / timeline.timePerBeat * timePointerInterval, timePointerContainer.localPosition.y, 0f);
if (NowPointer == null)
{
NowPointer = timePointerList[0];
}
else
{
finalDistance = changedDistance;
finalValue = value;
while (NowPointer.index < timePointerList.Count - 1 && NowPointer.index * timeline.timePerBeat < EditorManager.instance.songInformation.songTime)
{
NowPointer.gameObject.SetActive(false);
NowPointer = timePointerList[NowPointer.index + 1];
}
while (NowPointer.index > 0 && NowPointer.index * timeline.timePerBeat >= EditorManager.instance.songInformation.songTime)
{
NowPointer.gameObject.SetActive(true);
NowPointer = timePointerList[NowPointer.index - 1 >= 0 ? NowPointer.index - 1 : 0];
}
}
songTimeDistance = finalDistance;
float proportion = mainTimePointer.anchoredPosition.x /
visibleTimePointerArea.rect.width;
leftSideSongTime -= finalValue * (proportion);
rightSideSongTime += finalValue * (1 - proportion);
if (leftSideSongTime < -songInformation.delay)
for (int i = NowPointer.index + 1; i < timePointerList.Count; i++)
{
rightSideSongTime += Mathf.Abs(leftSideSongTime);
leftSideSongTime = -songInformation.delay;
}
else if (rightSideSongTime > songLength)
{
leftSideSongTime -= (rightSideSongTime - songLength);
rightSideSongTime = songLength;
timePointerList[i].gameObject.SetActive(true);
if (timePointerList[i].GetComponent<RectTransform>().position.x > rightSide.position.x)
{
timePointerList[i].gameObject.SetActive(false);
break;
}
}
timePointerInterval = timePointerInterval / finalDistance * oldDistance;
UpdatePointers();
//UpdateListItems();
SetRange(leftSideSongTime);
}
}
}

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using DG.Tweening;
using Ichni.RhythmGame;
using Sirenix.Utilities;
using TMPro;
@@ -61,8 +62,7 @@ namespace Ichni.Editor
if (timePointerModule.timePointerInterval + scrollValue >= 30)
{
timePointerModule.timePointerInterval += scrollValue;
timePointerModule.UpdatePointers();
timePointerModule.SetRange(songTime);
timePointerModule.SortPos();
SetTimeLine(EditorManager.instance.uiManager.inspector.connectedGameElement);
}
@@ -91,24 +91,43 @@ namespace Ichni.Editor
BeatField.text = songBeat.ToString("F2");
}
private Tweener _activeTweener; // 保存当前动画的引用
public void SetTime(string time)
{
EditorManager.instance.musicPlayer.PauseMusic();
EditorManager.instance.musicPlayer.audioSource.time = Mathf.Clamp(float.Parse(time) - EditorManager.instance.songInformation.offset, 0, EditorManager.instance.songInformation.songLength);
EditorManager.instance.songInformation.songTime = float.Parse(time);
float parsedTime = float.Parse(time);
float offsetedtime = Mathf.Clamp(parsedTime - EditorManager.instance.songInformation.offset, 0, EditorManager.instance.songInformation.songLength);
EditorManager.instance.musicPlayer.audioSource.time = offsetedtime;
if (_activeTweener != null && _activeTweener.IsActive())
{
_activeTweener.Complete();
}
// 使用 DOTween 来平滑过渡到新的时间
_activeTweener = DOTween.To(() => EditorManager.instance.songInformation.songTime, x => EditorManager.instance.songInformation.songTime = x, parsedTime, 0.2f)
.OnUpdate(UpdateTime);
timePointerModule.UpdatePointers();
timePointerModule.SetRange(songTime);
// timePointerModule.UpdatePointers();
// timePointerModule.SetRange(songTime);
}
public void SetBeat(string beat)
{
EditorManager.instance.musicPlayer.PauseMusic();
EditorManager.instance.musicPlayer.audioSource.time = Mathf.Clamp((float.Parse(beat) * timePerBeat) - EditorManager.instance.songInformation.offset, 0, EditorManager.instance.songInformation.songLength);
EditorManager.instance.songInformation.songTime = float.Parse(beat) * timePerBeat;
float parsedTime = float.Parse(beat) * timePerBeat;
float offsetedtime = Mathf.Clamp(parsedTime - EditorManager.instance.songInformation.offset, 0, EditorManager.instance.songInformation.songLength);
EditorManager.instance.musicPlayer.audioSource.time = offsetedtime;
if (_activeTweener != null && _activeTweener.IsActive())
{
_activeTweener.Complete();
}
timePointerModule.UpdatePointers();
timePointerModule.SetRange(songTime);
_activeTweener = DOTween.To(() => EditorManager.instance.songInformation.songTime, x => EditorManager.instance.songInformation.songTime = x, parsedTime, 0.2f)
.OnUpdate(UpdateTime);
// EditorManager.instance.musicPlayer.audioSource.time = Mathf.Clamp((float.Parse(beat) * timePerBeat) - EditorManager.instance.songInformation.offset, 0, EditorManager.instance.songInformation.songLength);
// EditorManager.instance.songInformation.songTime = float.Parse(beat) * timePerBeat;
// timePointerModule.UpdatePointers();
// timePointerModule.SetRange(songTime);
}
}

View File

@@ -53,7 +53,7 @@ public class TimelineTab : MonoBehaviour
else if (gameElement is NoteBase)
{
float Judgetime = ((NoteBase)gameElement).exactJudgeTime;
if (SubTabs.ContainsKey(Judgetime))
{
SubTabs[Judgetime].Set(gameElement, Judgetime);

View File

@@ -90,7 +90,7 @@ namespace Ichni.RhythmGame
UnityAction action = (() =>
{
Debug.Log($"Song Information Updated: {songName}, BPM: {bpm}, Delay: {delay}, Offset: {offset}");
EditorManager.instance.uiManager.timeline.timePointerModule.Initialize(delay, bpm);
EditorManager.instance.uiManager.timeline.timePointerModule.OnceSpawn();
});
p.AddListenerFunction(action);
o.AddListenerFunction(action);

View File

@@ -79,75 +79,73 @@ namespace Ichni.RhythmGame
}
protected virtual void Update()
{
if (isOnTrack)
var editor = EditorManager.instance;
var cameraManager = editor.cameraManager;
float songTime = editor.songInformation.songTime;
// 轨道位置更新
if (isOnTrack && track.trackTimeSubmodule is TrackTimeSubmoduleStatic)
{
if (track.trackTimeSubmodule is TrackTimeSubmoduleStatic)
{
UpdateNoteInStaticTrack();
}
UpdateNoteInStaticTrack();
}
float songTime = EditorManager.instance.songInformation.songTime;
// 判定状态更新
if (isFirstJudged && songTime < exactJudgeTime)
{
isFirstJudged = false;
}
if (!isFirstJudged && songTime >= exactJudgeTime)
else if (!isFirstJudged && songTime >= exactJudgeTime)
{
if (!isFirstJudged)
noteAudioSubmodule?.PlayNoteJudgeAudios(editor.currentJudgeType);
isFirstJudged = true;
}
// 判定单元更新
if (noteJudgeSubmodule != null && !cameraManager.isSceneCameraActive)
{
foreach (var unit in noteJudgeSubmodule.judgeUnitList)
{
noteAudioSubmodule.PlayNoteJudgeAudios(EditorManager.instance.currentJudgeType);
isFirstJudged = true;
}
}
if (noteJudgeSubmodule != null && !EditorManager.instance.cameraManager.isSceneCameraActive)
{
foreach (NoteJudgeUnit unit in noteJudgeSubmodule.judgeUnitList.Where(unit => unit.isShowingJudge))
{
unit.UpdateJudge();
if (unit.isShowingJudge) unit.UpdateJudge();
}
}
// 视觉效果更新
if (noteVisual != null)
{
noteVisual.effectSubmodule.effectCollection["Generate"].ForEach(e => e.UpdateEffect(exactJudgeTime));
noteVisual.effectSubmodule.effectCollection["GeneralJudge"].ForEach(e => e.UpdateEffect(exactJudgeTime));
var effects = noteVisual.effectSubmodule.effectCollection;
UpdateEffectList(effects["Generate"]);
UpdateEffectList(effects["GeneralJudge"]);
switch (EditorManager.instance.currentJudgeType)
switch (editor.currentJudgeType)
{
case NoteJudgeType.Perfect:
noteVisual.effectSubmodule.effectCollection["Perfect"].ForEach(e => e.UpdateEffect(exactJudgeTime));
break;
case NoteJudgeType.Good:
noteVisual.effectSubmodule.effectCollection["Good"].ForEach(e => e.UpdateEffect(exactJudgeTime));
break;
case NoteJudgeType.Bad:
noteVisual.effectSubmodule.effectCollection["Bad"].ForEach(e => e.UpdateEffect(exactJudgeTime));
break;
case NoteJudgeType.Miss:
noteVisual.effectSubmodule.effectCollection["Miss"].ForEach(e => e.UpdateEffect(exactJudgeTime));
break;
case NoteJudgeType.Perfect: UpdateEffectList(effects["Perfect"]); break;
case NoteJudgeType.Good: UpdateEffectList(effects["Good"]); break;
case NoteJudgeType.Bad: UpdateEffectList(effects["Bad"]); break;
case NoteJudgeType.Miss: UpdateEffectList(effects["Miss"]); break;
}
noteVisual.effectSubmodule.effectCollection["AfterJudge"].ForEach(e => e.UpdateEffect(exactJudgeTime));
UpdateEffectList(effects["AfterJudge"]);
if (EditorManager.instance.cameraManager.haveGameCamera)
// 屏幕位置更新(降低频率)
if (cameraManager.haveGameCamera)//&& Time.frameCount % 3 == 0)
{
noteScreenPosition = EditorManager.instance.cameraManager.gameCamera.gameCamera.WorldToScreenPoint(noteVisual.transform.position);
noteScreenPosition = cameraManager.gameCamera.gameCamera.WorldToScreenPoint(
noteVisual.transform.position);
}
}
//Editor
if (noteVisual != null)
{
// 碰撞体状态
noteVisual.GetComponent<Collider>().enabled = !isFirstJudged;
}
}
// 辅助方法:更新效果列表
private void UpdateEffectList(List<EffectBase> effects)
{
for (int i = 0; i < effects.Count; i++)
{
effects[i].UpdateEffect(exactJudgeTime);
}
}
public void ExecuteStartJudge()
{

View File

@@ -8,7 +8,7 @@ namespace Ichni.RhythmGame
{
public partial class Track
{
public TrackNoteEditor trackNoteEditor;
/// <summary>
/// 快速复制粘贴Track
/// </summary>

View File

@@ -51,6 +51,11 @@ public class EventPoint : MonoBehaviour
}
public float value => FatherTab.scalevalue;
public void Refresh()
{
ReDraw(value);
UpdateValue();
}
public void ReDraw(float value)
{
@@ -130,13 +135,7 @@ public class EventPoint : MonoBehaviour
}
private void Update()
{
if (RectTransformUtility.RectangleContainsScreenPoint(CurveCanvas.GetComponent<RectTransform>(), Mouse.current.position.ReadValue()))
{
}
}
public void SelectButtonClick()//unity内当按钮按下时
{
if (Keyboard.current.leftShiftKey.isPressed)
@@ -187,7 +186,12 @@ public class EventPoint : MonoBehaviour
FatherTab.FatherWindow.ConnectedPoint.EvDrawimage.color.b, 0.5f
);
}
UpdateValue();
}
private void UpdateValue()
{
// 设置新的连接点并更新UI
FatherTab.FatherWindow.ConnectedPoint = this;
EvDrawimage.color = new Color(EvDrawimage.color.r, 0.75f, EvDrawimage.color.b, 1f);
@@ -208,7 +212,6 @@ public class EventPoint : MonoBehaviour
FatherTab.FatherWindow.animationCurveTypeDropdown.onValueChanged.AddListener(value => FatherTab.FatherWindow.ChangeValue());
}
// 添加静态方法:查找插入索引
public static int FindInsertIndex(List<EventPoint> eventPoints, float startTime)
{

View File

@@ -221,18 +221,20 @@ public partial class GraphicalFlexibleFloatWindow
}
}
}
if (RectTransformUtility.RectangleContainsScreenPoint(GetComponent<RectTransform>(), Mouse.current.position.ReadValue()))
if (ConnectedPoint != null && RectTransformUtility.RectangleContainsScreenPoint(GetComponent<RectTransform>(), Mouse.current.position.ReadValue()))
{
if (Keyboard.current.aKey.wasPressedThisFrame)
{
if (ConnectedPoint != null)
{
ConnectedPoint.animatedFloat.endValue *= -1;
ConnectedPoint.animatedFloat.startValue *= -1;
ConnectedPoint.ReDraw(scalevalue);
}
ConnectedPoint.animatedFloat.endValue *= -1;
ConnectedPoint.animatedFloat.startValue *= -1;
ConnectedPoint.Refresh();
}
if (Keyboard.current.sKey.wasPressedThisFrame)
{
float value = ConnectedPoint.animatedFloat.startValue;
ConnectedPoint.animatedFloat.startValue = ConnectedPoint.animatedFloat.endValue;
ConnectedPoint.animatedFloat.endValue = value;
ConnectedPoint.Refresh();
}
}

View File

@@ -234,34 +234,34 @@ public class SampleWindow : MovableWindow//该window高度为300横的要XWid
far -= 1f / Xdevide;
float time = far * timePerBeat;
;
switch (NoteCode)
{
case 0:
Tap a = Tap.GenerateElement("New Tap", Guid.NewGuid(), new List<string>(), true, gameElement, time);
noteBases.Add(a);
a.noteVisual.transformSubmodule.originalPosition = new Vector3(localMousePosition.x / XWidth, 0f, 0f);
a.noteVisual.transformSubmodule.originalPosition = new Vector3(isExpand ? (localMousePosition.x / XWidth) : 0f, 0f, 0f);
a.noteVisual.transformSubmodule.Refresh();
SpawnNote(a, isExpand ? localMousePosition.x : 0f);
break;
case 3:
Hold b = Hold.GenerateElement("New Hold", Guid.NewGuid(), new List<string>(), true, gameElement, time, time + 0.5f);
noteBases.Add(b);
b.noteVisual.transformSubmodule.originalPosition = new Vector3(localMousePosition.x / XWidth, 0f, 0f);
b.noteVisual.transformSubmodule.originalPosition = new Vector3(isExpand ? (localMousePosition.x / XWidth) : 0f, 0f, 0f);
b.noteVisual.transformSubmodule.Refresh();
SpawnNote(b, isExpand ? localMousePosition.x : 0f);
break;
case 1:
Stay c = Stay.GenerateElement("New Stay", Guid.NewGuid(), new List<string>(), true, gameElement, time);
noteBases.Add(c);
c.noteVisual.transformSubmodule.originalPosition = new Vector3(localMousePosition.x / XWidth, 0f, 0f);
c.noteVisual.transformSubmodule.originalPosition = new Vector3(isExpand ? (localMousePosition.x / XWidth) : 0f, 0f, 0f);
c.noteVisual.transformSubmodule.Refresh();
SpawnNote(c, isExpand ? localMousePosition.x : 0f);
break;
case 2:
Flick d = Flick.GenerateElement("New Flick", Guid.NewGuid(), new List<string>(), true, gameElement, time, new List<Vector2>());
noteBases.Add(d);
d.noteVisual.transformSubmodule.originalPosition = new Vector3(localMousePosition.x / XWidth, 0f, 0f);
d.noteVisual.transformSubmodule.originalPosition = new Vector3(isExpand ? (localMousePosition.x / XWidth) : 0f, 0f, 0f);
d.noteVisual.transformSubmodule.Refresh();
SpawnNote(d, isExpand ? localMousePosition.x : 0f);
break;

View File

@@ -1,8 +0,0 @@
fileFormatVersion: 2
guid: f613492402ff5f2449535cf8161474ef
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -1,28 +0,0 @@
using System.Collections;
using System.Collections.Generic;
using Dreamteck.Splines;
using Ichni.RhythmGame;
using Unity.VisualScripting;
using UnityEngine;
public class TrackNoteEditor : MonoBehaviour
{
public SplineRenderer splineRenderer;
public SplineComputer splineComputer;
public int BeatDevider = 4; // 节拍分割数
public Track Track;
public void Initialize(Track track)
{
Track = track;
Track.trackNoteEditor = this;
// 初始化其他相关组件或数据
UnityEditorInternal.ComponentUtility.CopyComponent(Track.trackPathSubmodule.path);
UnityEditorInternal.ComponentUtility.PasteComponentAsNew(gameObject);
splineComputer = GetComponent<SplineComputer>();
if (Track.trackTimeSubmodule is TrackTimeSubmoduleMovable movable)
{
}
}
}

View File

@@ -1,11 +0,0 @@
fileFormatVersion: 2
guid: c643f60e3c1d85543a8835265334bd58
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -62,7 +62,7 @@ namespace Ichni.Editor
isPlaying = false;
EditorManager.instance.songInformation.songTime = 0;
audioSource.Stop();
EditorManager.instance.uiManager.timeline.timePointerModule.SetRange(0);
//EditorManager.instance.uiManager.timeline.timePointerModule.SetRange(0);
}
}
}