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

@@ -9,65 +9,106 @@ using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.InputSystem;
public class FlexibleFloatTab : MonoBehaviour
{
public FlexibleFloat flexibleFloat;
public GraphicalFlexibleFloatWindow FatherWindow;
public List<EventPoint> eventPoints;
public RectTransform Area;
public RectTransform BeatArea;
public RectTransform XBeatArea;
public EventPoint eventPoint;
public GameObject BeatLine;
public string Title;
public GameObject FirstBeatLine;
public FlexibleFloat connectFloat;
public int BeatDeviver => FatherWindow.BeatDeviver;
public void Initialize(FlexibleFloat flexibleFloat, string Title)
public int BeatNextDeviver => FatherWindow.BeatNextDeviver;
// 初始化函数
public void Initialize(FlexibleFloat flexibleFloat, string title)
{
Title = title;
ClearChildren(Area);
ClearChildren(BeatArea);
eventPoints = new List<EventPoint>();
connectFloat = flexibleFloat;
CreateBeatLines();
CreateEventPoints();
RedrawEventPoints();
Area.localPosition = new Vector3(FatherWindow.songBeat * BeatDeviver, 0, 0);
}
// 清除子节点
private void ClearChildren(RectTransform parent)
{
for (int i = 0; i < parent.childCount; i++)
{
Destroy(parent.GetChild(i).gameObject);
}
}
// 创建节拍线
private void CreateBeatLines()
{
for (int i = 0; i < (int)EditorManager.instance.songInformation.song.length / FatherWindow.timePerBeat; i++)
{
GameObject u = Instantiate(BeatLine, BeatArea);
u.transform.localPosition = new Vector3(BeatDeviver * i, 0, 0);
if (i == 1) FirstBeatLine = u;
}
for (int i = 0; i <= flexibleFloat.animations.Count - 1; i++)
}
// 创建事件点
private void CreateEventPoints()
{
for (int i = 0; i <= connectFloat.animations.Count - 1; i++)
{
AnimatedFloat animatedFloat = flexibleFloat.animations[i];
AnimatedFloat animatedFloat = connectFloat.animations[i];
EventPoint eventPoint = Instantiate(this.eventPoint, Area);
eventPoint.FatherTab = this;
eventPoint.Initialize(animatedFloat);
eventPoints.Add(eventPoint);
if (i - 1 >= 0)
{
eventPoint.LastEventPoint = eventPoints[i - 1];
eventPoint.LastEventPoint.NextEventPoint = eventPoint;
}
else eventPoint.LastEventPoint = null;
if (i == flexibleFloat.animations.Count - 1) eventPoint.NextEventPoint = null;
LinkEventPoints(i, eventPoint);
}
}
// 连接事件点
private void LinkEventPoints(int index, EventPoint eventPoint)
{
if (index - 1 >= 0)
{
eventPoint.LastEventPoint = eventPoints[index - 1];
eventPoint.LastEventPoint.NextEventPoint = eventPoint;
}
else
{
eventPoint.LastEventPoint = null;
}
if (index == connectFloat.animations.Count - 1)
{
eventPoint.NextEventPoint = null;
}
}
// 重绘事件点
private void RedrawEventPoints()
{
foreach (var i in eventPoints)
{
i.ReDraw(scalevalue);
}
Area.localPosition = new Vector3(FatherWindow.songBeat * BeatDeviver, 0, 0);
}
// 更新函数
public void Update()
{
Area.localPosition = new Vector3(-FatherWindow.songBeat * BeatDeviver, 0, 0);
BeatArea.localPosition = Area.localPosition;
Vector3 newPosition = new Vector3(-FatherWindow.songBeat * BeatDeviver, 0, 0);
Area.localPosition = newPosition;
BeatArea.localPosition = newPosition;
XBeatArea.localPosition = newPosition;
}
// 添加事件
public void AddEvent()
{
if (Keyboard.current.ctrlKey.isPressed)
@@ -76,28 +117,53 @@ public class FlexibleFloatTab : MonoBehaviour
eventPoint.FatherTab = this;
eventPoint.Initialize(new AnimatedFloat(GetBeat(), GetBeat() + 1f, 0, 0, AnimationCurveType.Linear));
eventPoints.Insert(FindInsertIndex(eventPoint.animatedFloat.startTime), eventPoint);
if (eventPoints.IndexOf(eventPoint) - 1 >= 0)
{
eventPoint.LastEventPoint = eventPoints[eventPoints.IndexOf(eventPoint) - 1];
eventPoint.LastEventPoint.NextEventPoint = eventPoint;
}
if (eventPoints.IndexOf(eventPoint) + 1 < eventPoints.Count)
{
eventPoint.NextEventPoint = eventPoints[eventPoints.IndexOf(eventPoint) + 1];
eventPoint.animatedFloat.endTime = eventPoint.NextEventPoint.animatedFloat.startTime;
}
LinkNewEventPoint(eventPoint);
eventPoint.ReDraw(scalevalue);
//print(1);
eventPoint.selectButton.onClick.Invoke();
FatherWindow.ChangeValue();
connectFloat.Add(eventPoint.animatedFloat);
connectFloat.Sort();
}
else
{
if (FatherWindow.ConnectedPoint != null) FatherWindow.ConnectedPoint.UpLoad();
}
}
public void SpawnEvent(AnimatedFloat animatedFloat)
{
EventPoint eventPoint = Instantiate(this.eventPoint, Area);
eventPoint.FatherTab = this;
eventPoint.Initialize(animatedFloat);
eventPoints.Insert(FindInsertIndex(eventPoint.animatedFloat.startTime), eventPoint);
LinkNewEventPoint(eventPoint);
eventPoint.ReDraw(scalevalue);
connectFloat.Add(eventPoint.animatedFloat);
connectFloat.Sort();
}
// 连接新事件点
private void LinkNewEventPoint(EventPoint eventPoint)
{
int index = eventPoints.IndexOf(eventPoint);
if (index - 1 >= 0)
{
eventPoint.LastEventPoint = eventPoints[index - 1];
eventPoint.LastEventPoint.NextEventPoint = eventPoint;
eventPoint.LastEventPoint.ReDraw(scalevalue);
}
if (index + 1 < eventPoints.Count)
{
eventPoint.NextEventPoint = eventPoints[index + 1];
eventPoint.animatedFloat.endTime = eventPoint.NextEventPoint.animatedFloat.startTime;
eventPoint.Initialize(eventPoint.animatedFloat);
eventPoint.NextEventPoint.LastEventPoint = eventPoint;
}
}
// 查找插入索引
public int FindInsertIndex(float startTime)
{
int low = 0;
int high = eventPoints.Count - 1;
while (low <= high)
{
int mid = (low + high) / 2;
@@ -110,51 +176,26 @@ public class FlexibleFloatTab : MonoBehaviour
high = mid - 1;
}
}
return low;
}
float GetBeat()//这里出现问题:转换坐标
// 获取节拍
public float GetBeat()
{
Vector2 mouseLocalPos = MousePosition2Local();
float far = BeatArea.transform.localPosition.x;
int Beat = 0;
while (far < mouseLocalPos.x)
float mouseInputX = Mouse.current.position.ReadValue().x;
float far = BeatArea.transform.position.x;
float Beat = 0;
while (far < mouseInputX)
{
far += BeatDeviver;
Beat++;
far += (FirstBeatLine.transform.position.x - BeatArea.transform.position.x) / BeatNextDeviver;
Beat += 1f / BeatNextDeviver;
}
return FatherWindow.timePerBeat * Beat;
}
Vector2 MousePosition2Local()
{
Vector2 mousePosition = Mouse.current.position.ReadValue(); // 获取屏幕坐标
Debug.Log($"Screen Position: {mousePosition}");
Camera mainCamera;
if (EditorManager.instance.cameraManager.isSceneCameraActive)
{
mainCamera = EditorManager.instance.cameraManager.sceneCamera.sceneCamera;
}
else
{
mainCamera = EditorManager.instance.cameraManager.gameCamera.camera;
}
Vector2 mouseWorldPos = mainCamera.ScreenToWorldPoint(mousePosition); // 屏幕坐标转世界坐标
Debug.Log($"World Position: {mouseWorldPos}");
Vector2 mouseLocalPos = transform.parent.transform.InverseTransformPoint(mouseWorldPos); // 世界坐标转本地坐标
Debug.Log($"Local Position: {mouseLocalPos}");
return mouseLocalPos;
return FatherWindow.timePerBeat * (Beat - (1f / BeatNextDeviver));
}
public float scalevalue => FatherWindow.scalevalue;
// 曲线缩放
public void CurveScale(float value)
{
foreach (EventPoint i in eventPoints)
@@ -162,12 +203,32 @@ public class FlexibleFloatTab : MonoBehaviour
i.ReDraw(value);
}
}
// 改变X轴节拍
public void XbeatCnange(int num)
{
ClearChildren(XBeatArea);
for (int i = 1; i < num; i++)
{
foreach (Transform child in BeatArea)
{
GameObject newChild = Instantiate(child.gameObject, XBeatArea);
CanvasGroup canvasGroup = newChild.GetComponent<CanvasGroup>();
newChild.transform.localPosition = new Vector3(child.localPosition.x + ((float)BeatDeviver) / num * i, child.localPosition.y, child.localPosition.z);
if (canvasGroup == null)
{
canvasGroup = newChild.AddComponent<CanvasGroup>();
}
canvasGroup.alpha = 0.1f;
}
}
}
// 移除动画
public void remoceAnim(AnimatedFloat a)
{
if (connectFloat.animations.Contains(a))
{
connectFloat.animations.Remove(a);
}
}