@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@ namespace Ichni.RhythmGame
|
||||
{
|
||||
public partial class Track
|
||||
{
|
||||
public TrackNoteEditor trackNoteEditor;
|
||||
|
||||
/// <summary>
|
||||
/// 快速复制粘贴Track
|
||||
/// </summary>
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1,8 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f613492402ff5f2449535cf8161474ef
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c643f60e3c1d85543a8835265334bd58
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user