Files
ichni_Creator_Studio/Assets/Scripts/Graphical Tools/Graphical Animation Editor/GraphicalFlexibleFloatWindow.cs

267 lines
8.4 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Diagnostics.Eventing.Reader;
using System.Linq;
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 FlexibleFloatTab unitPrefab;
public IBaseElement connectedBaseElement;
public List<FlexibleFloatTab> unitList;
public UnityAction ApplyParameters;
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 int BeatDeviver = 100;
public int BeatNextDeviver = 1;
public void Initialize(IBaseElement baseElement, string title, FlexibleFloat[] FlexibleFloats, string[] Subtitles)
{
scalevalue = 5;
transform.localScale = Vector3.zero;
StartCoroutine(WindowAnim.ShowPanelOnScale(gameObject));
this.connectedBaseElement = baseElement;
this.title.text = title;
unitList = new List<FlexibleFloatTab>();
closeButton.onClick.AddListener(Quit);
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].connectFloat.Sort();
}
};
XDeviverScale("1");
EvEndpointChangeButton.onClick.AddListener(EvEndpointStartChange);
}
public void AddUnit(FlexibleFloat flexibleFloat, string Subtitle)
{
flexibleFloat.Sort();
FlexibleFloatTab flexibleFloatTab = Instantiate(unitPrefab, windowRect);
flexibleFloatTab.FatherWindow = this;
unitList.Add(flexibleFloatTab);
flexibleFloatTab.Initialize(flexibleFloat, Subtitle);
}
public void Quit()
{
ApplyParameters();
//StartCoroutine(WindowAnim.HidePanel(gameObject, true));
Destroy(gameObject);
}
public float scalevalue;
public void CurveScale(string Rawvalue)
{
float value = float.Parse(Rawvalue);
scalevalue = value;
foreach (FlexibleFloatTab i in unitList)
{
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
{
[Title("AnimEditor")]
public TMP_InputField StartText;
public TMP_InputField EndText;
public TMP_InputField StartValueText;
public TMP_InputField EndValueText;
public TMP_InputField EventMultiplier;
public EventPoint ConnectedPoint;
public TMP_Dropdown animationCurveTypeDropdown;
public GameObject VisibleArea;
/// <summary>
/// 移除当前连接的事件点,并更新 UI。
/// </summary>
public void RemoveConnectedPoint()
{
if (ConnectedPoint != null)
{
// 调用 FlexibleFloatTab 的 RemoveEventPoint 方法
ConnectedPoint.FatherTab.RemoveEventPoint(ConnectedPoint);
// 清空连接点并隐藏可见区域
ConnectedPoint = null;
VisibleArea.SetActive(false);
}
}
public void ChangeValue()
{
if (ConnectedPoint != null)
{
float startTime = float.Parse(StartText.text);
float endTime = float.Parse(EndText.text);
float startValue = float.Parse(StartValueText.text);
float endValue = float.Parse(EndValueText.text);
ConnectedPoint.animatedFloat.startTime = startTime;
ConnectedPoint.animatedFloat.endTime = endTime;
ConnectedPoint.animatedFloat.startValue = startValue;
ConnectedPoint.animatedFloat.endValue = endValue;
ConnectedPoint.animatedFloat.animationCurveType = (AnimationCurveType)animationCurveTypeDropdown.value;
ConnectedPoint.Initialize(ConnectedPoint.animatedFloat);
ConnectedPoint.ReDraw(scalevalue);
}
}
public Button EvEndpointChangeButton;
public void EvEndpointStartChange()
{
if (ConnectedPoint != null)
{
EndText.text = (ConnectedPoint.animatedFloat.startTime + 0.01).ToString();
ChangeValue();
EvEndpointChangeButton.GetComponent<Image>().color = new Color(1f, 0.5f, 0.5f, 1);
ConnectedPoint.FatherTab.TabButton.onClick.RemoveAllListeners();
ConnectedPoint.FatherTab.TabButton.onClick.AddListener(EvEndpointEndChange);
}
}
public void EvEndpointEndChange()
{
if (ConnectedPoint != null)
{
EvEndpointChangeButton.GetComponent<Image>().color = new Color(1f, 1f, 1f, 1);
float newendtime = ConnectedPoint.FatherTab.GetBeat();
if (newendtime > ConnectedPoint.animatedFloat.startTime)
{
if (ConnectedPoint.NextEventPoint != null && newendtime > ConnectedPoint.NextEventPoint.animatedFloat.startTime)
EndText.text = ConnectedPoint.NextEventPoint.animatedFloat.startTime.ToString();
else EndText.text = newendtime.ToString();
ChangeValue();
}
ConnectedPoint.FatherTab.TabButton.onClick.RemoveAllListeners();
}
}
public Dictionary<string, List<AnimatedFloat>> ClipBoard = new();
public void Update()
{
if (Keyboard.current.deleteKey.isPressed && ConnectedPoint != null)
{
RemoveConnectedPoint();
}
if (Keyboard.current.shiftKey.isPressed && Keyboard.current.vKey.wasPressedThisFrame)
{
PasteClipboard();
}
if (Keyboard.current.escapeKey.wasPressedThisFrame)
{
foreach (var key in ClipBoard.Keys.ToList())
{
ClipBoard[key] = new List<AnimatedFloat>();
}
foreach (FlexibleFloatTab i in unitList)
{
foreach (EventPoint j in i.eventPoints)
{
j.LeftSide.sizeDelta = new Vector2(15, j.EvDrawimage.rectTransform.sizeDelta.y);
}
}
}
}
public void PasteClipboard()
{
// 获取当前时间线的节拍位置
float time = unitList[0].GetBeat();
float MinCopyTime = float.MaxValue;
// 遍历剪贴板中的所有动画数据MinCopyTime = float.MaxValue;
foreach (var list in ClipBoard.Values)
{
foreach (var animatedFloat in list)
{
if (animatedFloat.startTime < MinCopyTime)
{
MinCopyTime = animatedFloat.startTime;
}
}
}
foreach (var key in ClipBoard.Keys)
{
foreach (var animatedFloat in ClipBoard[key])
{
// 克隆动画数据并应用时间偏移
AnimatedFloat newFloat = EventPoint.CloneWithOffset(animatedFloat, time - MinCopyTime);
// 在对应的 FlexibleFloatTab 中生成事件点
unitList.Find(x => x.Title == key).SpawnEvent(newFloat);
}
}
}
}
public partial class GraphicalFlexibleFloatWindow
{//以后显示类写这里,别在叠大粪了
public TMP_Text ClipBoardMuM;
public void updateClipBoardMuM()
{
int mum = 0;
foreach (var key in ClipBoard.Keys)
{
mum += ClipBoard[key].Count();
}
ClipBoardMuM.text = "ClipBoard: " + mum.ToString();
}
}