GraphicEditor基本完成

不过还有优化空间
TODO:
用整个的Rawimage贴图替换beatline
This commit is contained in:
2025-03-08 22:39:54 +08:00
parent cff772d29a
commit 28e0a6e4b0
15 changed files with 99603 additions and 496 deletions

View File

@@ -6,18 +6,20 @@ using Ichni;
using Ichni.Editor;
using Ichni.RhythmGame;
using Sirenix.OdinInspector;
using Sirenix.Utilities;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.InputSystem;
using UnityEngine.UI;
public partial class GraphicalFlexibleFloatWindow : MovableWindow
{
public Button addNewUnitButton;
public FlexibleFloatTab unitPrefab;
public IBaseElement connectedBaseElement;
public List<FlexibleFloatTab> unitList;
public string parameterName;
public UnityAction ApplyParameters;
@@ -27,31 +29,34 @@ public partial class GraphicalFlexibleFloatWindow : MovableWindow
public float timePerBeat => 60f / EditorManager.instance.songInformation.bpm;
public int BeatDeviver = 100;
public int BeatNextDeviver = 1;
public void Initialize(IBaseElement baseElement, string title, FlexibleFloat[] FlexibleFloats, string[] Subtitles)
{
scalevalue = 5;
transform.localScale = Vector3.zero;
this.connectedBaseElement = baseElement;
this.title.text = title;
unitList = new List<FlexibleFloatTab>();
for (int i = 0; i <= FlexibleFloats.Length - 1; i++)
{
AddUnit(FlexibleFloats[i], Subtitles[i]);
}
closeButton.onClick.AddListener(Quit);
StartCoroutine(WindowAnim.ShowPanelOnScale(gameObject));
for (int i = 0; i <= FlexibleFloats.Length - 1; i++)
{
ClipBoard.Add(Subtitles[i], new List<AnimatedFloat>());
AddUnit(FlexibleFloats[i], Subtitles[i]);
}
ApplyParameters = () =>
{
for (int i = 0; i <= unitList.Count - 1; i++)
{
unitList[i].flexibleFloat.Sort();
unitList[i].connectFloat.Sort();
}
//Dangered
//connectedBaseElement.SetParameter(parameterName, unitList.Select(unit => unit.flexibleFloat).ToArray());
};
XDeviverScale("1");
}
public void AddUnit(FlexibleFloat flexibleFloat, string Subtitle)
{
@@ -82,6 +87,26 @@ public partial class GraphicalFlexibleFloatWindow : MovableWindow
i.CurveScale(value);
}
}
public void DeviverScale(string Rawvalue)
{
if (ConnectedPoint != null) ConnectedPoint.UpLoad();
BeatDeviver = int.Parse(Rawvalue);
ChangeValue();
for (int i = unitList.Count - 1; i >= 0; i--)
{
unitList[i].Initialize(unitList[i].connectFloat, unitList[i].Title);
}
XDeviverScale(BeatNextDeviver.ToString());
}
public void XDeviverScale(string Rawvalue)
{
BeatNextDeviver = int.Parse(Rawvalue);
foreach (FlexibleFloatTab i in unitList)
{
i.XbeatCnange(BeatNextDeviver);
}
}
}
public partial class GraphicalFlexibleFloatWindow
@@ -106,6 +131,7 @@ public partial class GraphicalFlexibleFloatWindow
{
ConnectedPoint.LastEventPoint.NextEventPoint = ConnectedPoint.NextEventPoint;
if (ConnectedPoint.LastEventPoint.NextEventPoint != null) ConnectedPoint.LastEventPoint.NextEventPoint.ReDraw(scalevalue);
ConnectedPoint.LastEventPoint.ReDraw(scalevalue);
}
if (ConnectedPoint.NextEventPoint != null)
@@ -123,6 +149,8 @@ public partial class GraphicalFlexibleFloatWindow
}
}
public void ChangeValue()
{
if (ConnectedPoint != null)
{
@@ -140,4 +168,49 @@ public partial class GraphicalFlexibleFloatWindow
ConnectedPoint.ReDraw(scalevalue);
}
}
public Dictionary<string, List<AnimatedFloat>> ClipBoard = new();
public float MinCopyTime = 0f;
public void Update()
{
if (Keyboard.current.shiftKey.isPressed && Keyboard.current.vKey.wasPressedThisFrame)
{
Paste();
}
}
public void Paste()
{
float time = unitList[0].GetBeat();
print(time);
FindMinStartTime();
foreach (KeyValuePair<string, List<AnimatedFloat>> i in ClipBoard)
{
foreach (AnimatedFloat j in i.Value)
{
AnimatedFloat newone = new AnimatedFloat(j.startTime, j.endTime, j.startValue, j.endValue, j.animationCurveType)
{
startTime = j.startTime - MinCopyTime + time,
endTime = j.endTime - MinCopyTime + time
};
unitList.Find(x => x.Title == i.Key).SpawnEvent(newone);
}
}
}
public void FindMinStartTime()
{
MinCopyTime = float.MaxValue;
foreach (var list in ClipBoard.Values)
{
foreach (var animatedFloat in list)
{
if (animatedFloat.startTime < MinCopyTime)
{
MinCopyTime = animatedFloat.startTime;
}
}
}
}
}