制作点击添加组件然后出现bug

This commit is contained in:
2025-03-02 00:09:31 +08:00
parent ded6f14d06
commit ed863d6591
8 changed files with 1966 additions and 120 deletions

View File

@@ -1,7 +1,9 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Ichni;
using Ichni.RhythmGame;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
@@ -21,6 +23,7 @@ public class EventPoint : MonoBehaviour
public RawImage CurveCanvas;
public RawImage CurveCanvas2;
public FlexibleFloatTab FatherTab;
public int BeatDeviver => FatherTab.BeatDeviver;
public void Initialize(AnimatedFloat animatedFloat)
{
@@ -39,12 +42,13 @@ public class EventPoint : MonoBehaviour
//记得
CurveCanvas2.rectTransform.sizeDelta = new Vector2(NextEventPoint.transform.localPosition.x - RightSide.sizeDelta.x, EvDrawimage.rectTransform.sizeDelta.y + 50);
ReDraw(FatherTab.scalevalue);
}
public float value => FatherTab.scalevalue;
public void ReDraw(float value)
{
Texture2D Texture = new Texture2D((int)CurveCanvas.rectTransform.sizeDelta.x / 5, (int)CurveCanvas.rectTransform.sizeDelta.y / 5);
@@ -59,14 +63,82 @@ public class EventPoint : MonoBehaviour
for (int i = 0; i < Texture.width; i++)
{
float t = (float)i / Texture.width;
Texture.SetPixel(i,
(int)(
(Texture.height / 2) + ((animatedFloat.endValue - animatedFloat.startValue)
* AnimationCurveEvaluator.Evaluate(animatedFloat.animationCurveType, t) * value)
), Color.green);//丑陋
int f = (int)(
(Texture.height / 2) + (animatedFloat.startValue * value + ((animatedFloat.endValue - animatedFloat.startValue)
* AnimationCurveEvaluator.Evaluate(animatedFloat.animationCurveType, t) * value))
);
if (f < Texture.height) Texture.SetPixel(i, f, Color.green);//丑陋
else Texture.SetPixel(i, f, Color.red);
}
Texture.Apply();
CurveCanvas.texture = Texture;
if (NextEventPoint != null)
{
OvDrawimage.transform.localPosition = new Vector3(RightSide.transform.localPosition.x, animatedFloat.endValue * value * 5, 0);
OvDrawimage.rectTransform.sizeDelta = new Vector2((NextEventPoint.animatedFloat.startTime - animatedFloat.endTime) / EditorManager.instance.uiManager.timeline.timePerBeat * FatherTab.BeatDeviver, OvDrawimage.rectTransform.sizeDelta.y);
OvDrawimage.color = new Color(0, 1, 0, 1);
while (OvDrawimage.transform.localPosition.y > 130)
{
OvDrawimage.color = new Color(1, 0, 0, 0.3f);
OvDrawimage.transform.localPosition = new Vector3(OvDrawimage.transform.localPosition.x, OvDrawimage.transform.localPosition.y - 260, OvDrawimage.transform.localPosition.z);
}
while (OvDrawimage.transform.localPosition.y < -130)
{
OvDrawimage.color = new Color(1, 0, 0, 0.3f);
OvDrawimage.transform.localPosition = new Vector3(OvDrawimage.transform.localPosition.x, OvDrawimage.transform.localPosition.y + 260, OvDrawimage.transform.localPosition.z);
}
}
else
{
OvDrawimage.rectTransform.sizeDelta = new Vector2(0, OvDrawimage.rectTransform.sizeDelta.y
);
}
selectButton.transform.localPosition = EvDrawimage.transform.localPosition;
selectButton.GetComponent<RectTransform>().sizeDelta = EvDrawimage.rectTransform.sizeDelta;
}
public void UpLoad()
{
if (FatherTab.FatherWindow.ConnectedPoint == this)
{
FatherTab.FatherWindow.VisibleArea.SetActive(false);
FatherTab.FatherWindow.ConnectedPoint = null;
EvDrawimage.color = new Color(
EvDrawimage.color.r,
0.3019607843137255f,
EvDrawimage.color.b, 0.5f
);
FatherTab.FatherWindow.StartText.text = "";
FatherTab.FatherWindow.EndText.text = "";
FatherTab.FatherWindow.StartValueText.text = "";
FatherTab.FatherWindow.EndValueText.text = "";
return;
}
if (FatherTab.FatherWindow.ConnectedPoint != null)
{
FatherTab.FatherWindow.ConnectedPoint.EvDrawimage.color = new Color(
FatherTab.FatherWindow.ConnectedPoint.EvDrawimage.color.r,
0.3019607843137255f,
FatherTab.FatherWindow.ConnectedPoint.EvDrawimage.color.b, 0.5f)
;
}
List<string> enumNameList = System.Enum.GetNames(typeof(AnimationCurveType)).ToList();
FatherTab.FatherWindow.VisibleArea.SetActive(true);
FatherTab.FatherWindow.animationCurveTypeDropdown.ClearOptions();
FatherTab.FatherWindow.animationCurveTypeDropdown.AddOptions(enumNameList);
FatherTab.FatherWindow.animationCurveTypeDropdown.value = (int)animatedFloat.animationCurveType;
FatherTab.FatherWindow.ConnectedPoint = this;
EvDrawimage.color = new Color(
EvDrawimage.color.r,
0.75f,
EvDrawimage.color.b,
1f);
FatherTab.FatherWindow.StartText.text = animatedFloat.startTime.ToString();
FatherTab.FatherWindow.EndText.text = animatedFloat.endTime.ToString();
FatherTab.FatherWindow.StartValueText.text = animatedFloat.startValue.ToString();
FatherTab.FatherWindow.EndValueText.text = animatedFloat.endValue.ToString();
}
}

View File

@@ -1,7 +1,9 @@
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using Ichni;
using Ichni.Editor;
using Ichni.RhythmGame;
using Unity.VisualScripting;
using UnityEngine;
@@ -22,9 +24,11 @@ public class FlexibleFloatTab : MonoBehaviour
public EventPoint eventPoint;
public GameObject BeatLine;
public FlexibleFloat connectFloat;
public int BeatDeviver => FatherWindow.BeatDeviver;
public void Initialize(FlexibleFloat flexibleFloat, string Title)
{
connectFloat = flexibleFloat;
for (int i = 0; i < (int)EditorManager.instance.songInformation.song.length / FatherWindow.timePerBeat; i++)
{
GameObject u = Instantiate(BeatLine, BeatArea);
@@ -47,6 +51,10 @@ public class FlexibleFloatTab : MonoBehaviour
}
foreach (var i in eventPoints)
{
i.ReDraw(scalevalue);
}
Area.localPosition = new Vector3(FatherWindow.songBeat * BeatDeviver, 0, 0);
}
@@ -55,23 +63,96 @@ public class FlexibleFloatTab : MonoBehaviour
Area.localPosition = new Vector3(-FatherWindow.songBeat * BeatDeviver, 0, 0);
BeatArea.localPosition = Area.localPosition;
CheckForAddEvent();
}
private void CheckForAddEvent()
public void AddEvent()
{
if (Keyboard.current.rKey.wasPressedThisFrame && RectTransformUtility.RectangleContainsScreenPoint(Area, Mouse.current.position.ReadValue()))
if (Keyboard.current.ctrlKey.isPressed)
{
AddEvent();
EventPoint eventPoint = Instantiate(this.eventPoint, Area);
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;
}
eventPoint.ReDraw(scalevalue);
//print(1);
}
}
private void AddEvent()
public int FindInsertIndex(float startTime)
{
print(1);
int low = 0;
int high = eventPoints.Count - 1;
while (low <= high)
{
int mid = (low + high) / 2;
if (eventPoints[mid].animatedFloat.startTime < startTime)
{
low = mid + 1;
}
else
{
high = mid - 1;
}
}
return low;
}
float GetBeat()//这里出现问题:转换坐标
{
Vector2 mouseLocalPos = MousePosition2Local();
float far = BeatArea.transform.localPosition.x;
int Beat = 0;
while (far < mouseLocalPos.x)
{
far += BeatDeviver;
Beat++;
}
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.camera;
}
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;
}
public float scalevalue => FatherWindow.scalevalue;
public void CurveScale(float value)
@@ -81,5 +162,13 @@ public class FlexibleFloatTab : MonoBehaviour
i.ReDraw(value);
}
}
public void remoceAnim(AnimatedFloat a)
{
if (connectFloat.animations.Contains(a))
{
connectFloat.animations.Remove(a);
}
}
}

View File

@@ -1,14 +1,17 @@
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 TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
public class GraphicalFlexibleFloatWindow : MovableWindow
public partial class GraphicalFlexibleFloatWindow : MovableWindow
{
public Button addNewUnitButton;
public FlexibleFloatTab unitPrefab;
@@ -80,3 +83,61 @@ public class GraphicalFlexibleFloatWindow : MovableWindow
}
}
}
public partial class GraphicalFlexibleFloatWindow
{
[Title("AnimEditor")]
public TMP_InputField StartText;
public TMP_InputField EndText;
public TMP_InputField StartValueText;
public TMP_InputField EndValueText;
public EventPoint ConnectedPoint;
public TMP_Dropdown animationCurveTypeDropdown;
public GameObject VisibleArea;
public void Removed()
{
if (ConnectedPoint != null)
{
ConnectedPoint.FatherTab.remoceAnim(ConnectedPoint.animatedFloat);
ConnectedPoint.FatherTab.eventPoints.Remove(ConnectedPoint);
if (ConnectedPoint.LastEventPoint != null)
{
ConnectedPoint.LastEventPoint.NextEventPoint = ConnectedPoint.NextEventPoint;
if (ConnectedPoint.LastEventPoint.NextEventPoint != null) ConnectedPoint.LastEventPoint.NextEventPoint.ReDraw(scalevalue);
}
if (ConnectedPoint.NextEventPoint != null)
{
ConnectedPoint.NextEventPoint.LastEventPoint = ConnectedPoint.LastEventPoint;
if (ConnectedPoint.NextEventPoint.LastEventPoint != null) ConnectedPoint.NextEventPoint.LastEventPoint.ReDraw(scalevalue);
}
//Destroy(ConnectedPoint.animatedFloat);
VisibleArea.SetActive(false);
Destroy(ConnectedPoint.gameObject);
ApplyParameters();
}
}
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);
}
}
}

View File

@@ -35,11 +35,11 @@ namespace Ichni.Editor
var positionInputFields = inspector.GenerateVector3InputField(this, container, "Position", nameof(cameraPosition), true);
positionInputFields.AddListenerFunction(() => camera.transform.position = cameraPosition);
var eulerAnglesInputFields = inspector.GenerateVector3InputField(this, container, "Euler Angles", nameof(cameraEulerAngles), true);
eulerAnglesInputFields.AddListenerFunction(() => camera.transform.eulerAngles = cameraEulerAngles);
container.SetDeviver(1);
}