自动更新型DUI扩展,将Time变量挪出TImeline UI,Effect效果容器修缮,移除Note的transform模块,Scene Camera优化

This commit is contained in:
SoulliesOfficial
2025-02-26 00:52:08 -05:00
parent 1b4637ae95
commit 1e69a44327
36 changed files with 607 additions and 425 deletions

View File

@@ -18,11 +18,6 @@ namespace Ichni.Editor
/// 参数名,通过反射获取饿修改对应变量的值
/// </summary>
public string parameterName;
/// <summary>
/// 是否始终更新如果子类可能用到此变量则在子类中写Update即可注意如果最后仅有Text用到此变量直接移动它到Text即可
/// </summary>
public bool isAlwaysUpdated;
public virtual void Initialize(IBaseElement baseElement, string title, string parameterName)
{
@@ -54,4 +49,21 @@ namespace Ichni.Editor
//public abstract void ApplyParameters();
}
public interface IHaveAutoUpdate
{
public bool isAutoUpdate { get; set; }
public bool isReceiving { get; set; }
public void SetAutoUpdate(bool enable);
public void UpdateContent()
{
if(isAutoUpdate && isReceiving)
{
ApplyContent();
}
}
public void ApplyContent();
}
}

View File

@@ -8,18 +8,51 @@ using UnityEngine.Events;
namespace Ichni.Editor
{
public class DynamicUIParameterInputField : DynamicUIElement
public class DynamicUIInputField : DynamicUIElement, IHaveAutoUpdate
{
public TMP_InputField inputField;
public bool isAutoUpdate { get; set; }
public bool isReceiving { get; set; }
public override void Initialize(IBaseElement baseElement, string title, string parameterName)
{
base.Initialize(baseElement, title, parameterName);
inputField.text = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement).ToString(); //获取对应变量的值
inputField.onEndEdit.AddListener(ApplyParameters);
if (parameterName != string.Empty)
{
ApplyContent();
inputField.onEndEdit.AddListener(ApplyParameters);
}
}
private void Update()
{
(this as IHaveAutoUpdate).UpdateContent();
}
public void SetDefaultValue(string text)
{
inputField.text = text;
}
public T GetValue<T>()
{
return (T)Convert.ChangeType(inputField.text, typeof(T));
}
public void SetAutoUpdate(bool enable)
{
isAutoUpdate = enable;
isReceiving = true;
inputField.onSelect.AddListener(_ => isReceiving = false);
inputField.onDeselect.AddListener(_ => isReceiving = true);
}
public void ApplyContent()
{
inputField.text = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement).ToString(); //获取对应变量的值
}
private void ApplyParameters(string text)
{
Type type = connectedBaseElement.GetType().GetField(parameterName).FieldType;

View File

@@ -7,22 +7,32 @@ using UnityEngine;
namespace Ichni.Editor
{
public class DynamicUIParameterText : DynamicUIElement
public class DynamicUIParameterText : DynamicUIElement, IHaveAutoUpdate
{
public TMP_Text text;
public bool isAutoUpdate { get; set; }
public bool isReceiving { get; set; }
public override void Initialize(IBaseElement baseElement, string title, string parameterName)
{
base.Initialize(baseElement, title, parameterName);
text.text = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement).ToString();
ApplyContent();
}
private void Update()
{
if (isAlwaysUpdated)
{
text.text = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement).ToString();
}
(this as IHaveAutoUpdate).UpdateContent();
}
public void SetAutoUpdate(bool enable)
{
isAutoUpdate = enable;
isReceiving = true;
}
public void ApplyContent()
{
text.text = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement).ToString();
}
}
}

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Ichni.RhythmGame;
@@ -10,27 +11,66 @@ using UnityEngine.UIElements.Experimental;
namespace Ichni.Editor
{
public class DynamicUIVector3InputField : DynamicUIElement
public class DynamicUIVector3InputField : DynamicUIElement, IHaveAutoUpdate
{
public TMP_InputField inputFieldX;
public TMP_InputField inputFieldY;
public TMP_InputField inputFieldZ;
public bool isAutoUpdate { get; set; }
public bool isReceiving { get; set; }
public override void Initialize(IBaseElement baseElement, string title, string parameterName)
{
base.Initialize(baseElement, title, parameterName);
if (parameterName != string.Empty)
{
ApplyContent();
inputFieldX.onEndEdit.AddListener(_ => ApplyParameters());
inputFieldY.onEndEdit.AddListener(_ => ApplyParameters());
inputFieldZ.onEndEdit.AddListener(_ => ApplyParameters());
}
}
private void Update()
{
(this as IHaveAutoUpdate).UpdateContent();
}
public void SetDefaultValue(Vector3 value)
{
inputFieldX.text = value.x.ToString();
inputFieldY.text = value.y.ToString();
inputFieldZ.text = value.z.ToString();
}
public Vector3 GetValue()
{
return new Vector3(float.Parse(inputFieldX.text), float.Parse(inputFieldY.text), float.Parse(inputFieldZ.text));
}
public void SetAutoUpdate(bool enable)
{
isAutoUpdate = enable;
isReceiving = true;
inputFieldX.onSelect.AddListener(_ => isReceiving = false);
inputFieldY.onSelect.AddListener(_ => isReceiving = false);
inputFieldZ.onSelect.AddListener(_ => isReceiving = false);
inputFieldX.onDeselect.AddListener(_ => isReceiving = true);
inputFieldY.onDeselect.AddListener(_ => isReceiving = true);
inputFieldZ.onDeselect.AddListener(_ => isReceiving = true);
}
public void ApplyContent()
{
Vector3 pos = (Vector3)connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement); //获取对应变量的值
inputFieldX.text = pos.x.ToString();
inputFieldY.text = pos.y.ToString();
inputFieldZ.text = pos.z.ToString();
inputFieldX.onEndEdit.AddListener(_ => ApplyParameters());
inputFieldY.onEndEdit.AddListener(_ => ApplyParameters());
inputFieldZ.onEndEdit.AddListener(_ => ApplyParameters());
}
public override void DeviverSet(int i){
//我什么也不做
}
private void ApplyParameters()
{
Vector3 newValue = new Vector3(float.Parse(inputFieldX.text), float.Parse(inputFieldY.text), float.Parse(inputFieldZ.text));
@@ -44,5 +84,9 @@ namespace Ichni.Editor
inputFieldY.onEndEdit.AddListener(_ => action());
inputFieldZ.onEndEdit.AddListener(_ => action());
}
public override void DeviverSet(int i){
//我什么也不做
}
}
}

View File

@@ -66,38 +66,49 @@ namespace Ichni.Editor
return toggle;
}
public DynamicUIGetterInputField GenerateGetterInputField(DynamicUIContainer container,
string title, string defaultText)
public DynamicUIInputField GenerateInputField(DynamicUIContainer container,
string title, string defaultText = "") //不与参数绑定的InputField
{
DynamicUIGetterInputField getterInputField = Object
.Instantiate(EditorManager.instance.basePrefabs.getterInputField, container.rect)
.GetComponent<DynamicUIGetterInputField>();
getterInputField.Initialize(null, title, string.Empty);
getterInputField.SetDefaultText(defaultText);
container.dynamicUIElements.Add(getterInputField);
return getterInputField;
DynamicUIInputField inputField = Object
.Instantiate(EditorManager.instance.basePrefabs.parameterInputField, container.rect)
.GetComponent<DynamicUIInputField>();
inputField.Initialize(null, title, string.Empty);
inputField.SetDefaultValue(defaultText);
container.dynamicUIElements.Add(inputField);
return inputField;
}
public DynamicUIParameterInputField GenerateParameterInputField(IBaseElement baseElement,
DynamicUIContainer container,
string title, string parameterName)
public DynamicUIInputField GenerateInputField(IBaseElement baseElement,
DynamicUIContainer container, string title, string parameterName, bool isAutoUpdate = false) //与参数绑定的InputField
{
DynamicUIParameterInputField parameterInputField = Object
DynamicUIInputField inputField = Object
.Instantiate(EditorManager.instance.basePrefabs.parameterInputField, container.rect)
.GetComponent<DynamicUIParameterInputField>();
parameterInputField.Initialize(baseElement, title, parameterName);
container.dynamicUIElements.Add(parameterInputField);
return parameterInputField;
.GetComponent<DynamicUIInputField>();
inputField.Initialize(baseElement, title, parameterName);
container.dynamicUIElements.Add(inputField);
return inputField;
}
public DynamicUIVector3InputField GenerateVector3InputField(DynamicUIContainer container, string title,
Vector3 defaultVector3 = default)
{
DynamicUIVector3InputField vector3InputField =
Object.Instantiate(EditorManager.instance.basePrefabs.vector3InputField, container.rect)
.GetComponent<DynamicUIVector3InputField>();
vector3InputField.Initialize(null, title, string.Empty);
vector3InputField.SetDefaultValue(defaultVector3);
container.dynamicUIElements.Add(vector3InputField);
return vector3InputField;
}
public DynamicUIVector3InputField GenerateVector3InputField(IBaseElement baseElement,
DynamicUIContainer container,
string title, string parameterName)
DynamicUIContainer container, string title, string parameterName, bool isAutoUpdate = false)
{
DynamicUIVector3InputField vector3InputField =
Object.Instantiate(EditorManager.instance.basePrefabs.vector3InputField, container.rect)
.GetComponent<DynamicUIVector3InputField>();
vector3InputField.Initialize(baseElement, title, parameterName);
vector3InputField.SetAutoUpdate(isAutoUpdate);
container.dynamicUIElements.Add(vector3InputField);
return vector3InputField;
}
@@ -148,14 +159,13 @@ namespace Ichni.Editor
}
public DynamicUIParameterText GenerateParameterText(IBaseElement baseElement, DynamicUIContainer container,
string title,
string parameterName, bool isAlwaysUpdate = false)
string title, string parameterName, bool isAutoUpdate = false)
{
DynamicUIParameterText parameterText = Object
.Instantiate(EditorManager.instance.basePrefabs.parameterText, container.rect)
.GetComponent<DynamicUIParameterText>();
parameterText.Initialize(baseElement, title, parameterName);
parameterText.isAlwaysUpdated = isAlwaysUpdate;
parameterText.SetAutoUpdate(isAutoUpdate);
container.dynamicUIElements.Add(parameterText);
return parameterText;
}

View File

@@ -0,0 +1,23 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Ichni.RhythmGame;
using UnityEngine;
using UnityEngine.UI;
namespace Ichni.Editor
{
public class MusicPlayModule : MonoBehaviour
{
public Button playButton;
public Button pauseButton;
public Button stopButton;
private void Start()
{
playButton.onClick.AddListener(EditorManager.instance.musicPlayer.PlayMusic);
pauseButton.onClick.AddListener(EditorManager.instance.musicPlayer.PauseMusic);
stopButton.onClick.AddListener(EditorManager.instance.musicPlayer.StopMusic);
}
}
}

View File

@@ -44,9 +44,8 @@ namespace Ichni.Editor
private void Update()
{
if (timeline.musicPlayer.isPlaying)
if (EditorManager.instance.musicPlayer.isPlaying)
{
songInformation.songTime = timeline.musicPlayer.audioSource.time;
SetRange(songInformation.songTime);
}

View File

@@ -8,6 +8,7 @@ using TMPro;
using Unity.VisualScripting;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Serialization;
using UnityEngine.UI;
namespace Ichni.Editor
@@ -23,7 +24,7 @@ namespace Ichni.Editor
public GameObject timelineTabRect;
public TimePointerModule timePointerModule;
public MusicPlayer musicPlayer;
public MusicPlayModule musicPlayModule;
public TMP_InputField TimeField;
@@ -32,7 +33,7 @@ namespace Ichni.Editor
public RectTransform GetinputArea;
public void Update()
{
if (musicPlayer.isPlaying) UpdateTime();
if (EditorManager.instance.musicPlayer.isPlaying) UpdateTime();
if (RectTransformUtility.RectangleContainsScreenPoint(GetinputArea, Mouse.current.position.ReadValue()))
{
@@ -85,8 +86,8 @@ namespace Ichni.Editor
public void SetTime(string time)
{
musicPlayer.PauseMusic();
musicPlayer.audioSource.time = float.Parse(time);
EditorManager.instance.musicPlayer.PauseMusic();
EditorManager.instance.musicPlayer.audioSource.time = float.Parse(time);
EditorManager.instance.songInformation.songTime = float.Parse(time);
timePointerModule.UpdatePointers();
@@ -95,15 +96,13 @@ namespace Ichni.Editor
}
public void SetBeat(string beat)
{
musicPlayer.PauseMusic();
musicPlayer.audioSource.time = float.Parse(beat) * timePerBeat;
EditorManager.instance.musicPlayer.PauseMusic();
EditorManager.instance.musicPlayer.audioSource.time = float.Parse(beat) * timePerBeat;
EditorManager.instance.songInformation.songTime = float.Parse(beat) * timePerBeat;
timePointerModule.UpdatePointers();
timePointerModule.SetRange(songTime);
}
}

View File

@@ -91,8 +91,8 @@ namespace Ichni.RhythmGame
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Time Duration");
var overrideToggle = inspector.GenerateToggle(this, container, "Override Duration", nameof(isOverridingDuration));
var startTimeInputField = inspector.GenerateParameterInputField(this, container, "Start Time", nameof(startTime));
var endTimeInputField = inspector.GenerateParameterInputField(this, container, "End Time", nameof(endTime));
var startTimeInputField = inspector.GenerateInputField(this, container, "Start Time", nameof(startTime));
var endTimeInputField = inspector.GenerateInputField(this, container, "End Time", nameof(endTime));
void SetInputFieldInteractable(bool interactable)
{

View File

@@ -56,22 +56,27 @@ namespace Ichni.Editor
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Background Setter");
var useSkyboxToggle = inspector.GenerateToggle(this, container, "Use Skybox", nameof(useSkybox));
var skyboxThemeBundleField = inspector.GenerateParameterInputField(this, container, "Skybox Theme Bundle", nameof(skyboxThemeBundleName));
var skyboxMaterialNameField = inspector.GenerateParameterInputField(this, container, "Skybox Material", nameof(skyboxMaterialName));
var backgroundSpriteField = inspector.GenerateParameterInputField(this, container, "Background Sprite", nameof(backgroundSpriteName));
var skyboxThemeBundleField = inspector.GenerateInputField(this, container, "Skybox Theme Bundle", nameof(skyboxThemeBundleName));
var skyboxMaterialNameField = inspector.GenerateInputField(this, container, "Skybox Material", nameof(skyboxMaterialName));
var backgroundSpriteField = inspector.GenerateInputField(this, container, "Background Sprite", nameof(backgroundSpriteName));
var applyButton = inspector.GenerateButton(this, container, "Apply", Refresh);
useSkyboxToggle.AddListenerFunction(EditorManager.instance.backgroundController.EnableBackground);
useSkyboxToggle.AddListenerFunction(value =>
void SetFields(bool value)
{
skyboxThemeBundleField.inputField.interactable = value;
skyboxMaterialNameField.inputField.interactable = value;
backgroundSpriteField.inputField.interactable = !value;
});
}
SetFields(useSkybox);
useSkyboxToggle.AddListenerFunction(value => EditorManager.instance.backgroundController.EnableBackground(!value));
useSkyboxToggle.AddListenerFunction(SetFields);
}
public override void Refresh()
{
EditorManager.instance.backgroundController.EnableBackground(useSkybox);
EditorManager.instance.backgroundController.EnableBackground(!useSkybox);
if (useSkybox)
{
SetSkybox(skyboxThemeBundleName, skyboxMaterialName);

View File

@@ -150,7 +150,7 @@ namespace Ichni.RhythmGame
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Element Info");
var nameInputField = inspector.GenerateParameterInputField(this, container, GetType().Name + "'s Name", nameof(elementName));
var nameInputField = inspector.GenerateInputField(this, container, GetType().Name + "'s Name", nameof(elementName));
var guidText = inspector.GenerateParameterText(this, container, "Element GUID", nameof(elementGuid));
var tagsListButton = inspector.GenerateButton(this, container, "Tags List", () =>
{

View File

@@ -40,8 +40,8 @@ namespace Ichni.RhythmGame
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Bloom Shake");
var effectTimeField = inspector.GenerateParameterInputField(this, container, "Bloom Time", nameof(bloomTime));
var bloomPeakField = inspector.GenerateParameterInputField(this, container, "Bloom Peak", nameof(bloomPeak));
var effectTimeField = inspector.GenerateInputField(this, container, "Bloom Time", nameof(bloomTime));
var bloomPeakField = inspector.GenerateInputField(this, container, "Bloom Peak", nameof(bloomPeak));
}
}

View File

@@ -11,7 +11,7 @@ namespace Ichni.RhythmGame
public partial class TimeEffectsCollection : GameElement, IHaveEffectSubmodule
{
public EffectSubmodule effectSubmodule { get; set; }
public float time;
public float time; //触发效果的时间
public static TimeEffectsCollection GenerateElement(string name, Guid guid, List<string> tags,
bool isFirstGenerated, GameElement parentElement, float time)
@@ -26,6 +26,7 @@ namespace Ichni.RhythmGame
protected override void SetDefaultSubmodules()
{
effectSubmodule = new EffectSubmodule(this);
submoduleList.Add(effectSubmodule);
}
private void Update()
@@ -38,18 +39,30 @@ namespace Ichni.RhythmGame
{
public override void SaveBM()
{
matchedBM = new TimeEffectsCollection_BM(this);
matchedBM = new TimeEffectsCollection_BM(elementName, elementGuid, tags,
parentElement.matchedBM as GameElement_BM, this);
}
public override void SetUpInspector()
{
base.SetUpInspector();
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Time Effects Collection");
var timeInputField = inspector.GenerateParameterInputField(this, container, "Time", nameof(time));
var timeInputField = inspector.GenerateInputField(this, container, "Time", nameof(time));
var effectNameInputField = inspector.GenerateInputField(container, "Effect Name");
var addEffectButton = inspector.GenerateButton(this, container, "Add Effect", () =>
{
IHaveEffectSubmodule.EffectCollection.TryGetValue("BloomShake", out var effect);
effectSubmodule.effectCollection["Default"].Add(effect);
if (IHaveEffectSubmodule.EffectCollection.TryGetValue(effectNameInputField.GetValue<string>(), out var effect))
{
effectSubmodule.effectCollection["Default"].Add(effect);
inspectorMain.SetInspector(this);
}
else
{
LogWindow.Log("Effect Type not found.", Color.red);
}
});
foreach (var effect in effectSubmodule.effectCollection["Default"])
@@ -69,21 +82,24 @@ namespace Ichni.RhythmGame
{
}
public TimeEffectsCollection_BM(TimeEffectsCollection timeEffectsCollection)
public TimeEffectsCollection_BM(string elementName, Guid elementGuid, List<string> tags,
GameElement_BM attachedElement, TimeEffectsCollection timeEffectsCollection)
: base(elementName, elementGuid, tags, attachedElement)
{
time = timeEffectsCollection.time;
}
public override void ExecuteBM()
{
matchedElement = TimeEffectsCollection.GenerateElement("Time Effects Collection", elementGuid,
matchedElement = TimeEffectsCollection.GenerateElement(elementName, elementGuid,
tags, false, GetElement(attachedElementGuid), time);
}
public override GameElement DuplicateBM(GameElement attached)
{
return TimeEffectsCollection.GenerateElement("Time Effects Collection", elementGuid,
return TimeEffectsCollection.GenerateElement(elementName, elementGuid,
tags, false, attached, time);
}
}

View File

@@ -21,8 +21,6 @@ namespace Ichni.RhythmGame
flick.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
flick.exactJudgeTime = exactJudgeTime;
flick.availableFlickDirections = directions;
flick.transformSubmodule = new TransformSubmodule(flick);
flick.timeDurationSubmodule = new TimeDurationSubmodule(flick);
if (parentElement.TryGetComponent(out Track track))
{

View File

@@ -8,7 +8,7 @@ using UnityEngine;
namespace Ichni.RhythmGame
{
public abstract partial class NoteBase : GameElement, IHaveTransformSubmodule, IHaveTimeDurationSubmodule
public abstract partial class NoteBase : GameElement, IHaveTimeDurationSubmodule
{
[Title("Basic Info")]
public float exactJudgeTime;
@@ -22,7 +22,6 @@ namespace Ichni.RhythmGame
public NoteVisualBase noteVisual;
[Title("Submodules")]
public TransformSubmodule transformSubmodule { get; set; }
public TimeDurationSubmodule timeDurationSubmodule { get; set; }
public NoteJudgeSubmodule noteJudgeSubmodule { get; set; }
@@ -57,11 +56,9 @@ namespace Ichni.RhythmGame
protected override void SetDefaultSubmodules()
{
transformSubmodule = new TransformSubmodule(this);
timeDurationSubmodule = new TimeDurationSubmodule(this);
noteJudgeSubmodule = new NoteJudgeSubmodule(this);
submoduleList.Add(transformSubmodule);
submoduleList.Add(timeDurationSubmodule);
submoduleList.Add(noteJudgeSubmodule);
}
@@ -139,14 +136,14 @@ namespace Ichni.RhythmGame
//我想把时间放在第一层菜单所以
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Element Info");
var nameInputField = inspector.GenerateParameterInputField(this, container, GetType().Name + "'s Name", nameof(elementName));
var nameInputField = inspector.GenerateInputField(this, container, GetType().Name + "'s Name", nameof(elementName));
var guidText = inspector.GenerateParameterText(this, container, "Element GUID", nameof(elementGuid));
var tagsListButton = inspector.GenerateButton(this, container, "Tags List", () =>
{
inspector.GenerateCompositeParameterWindow(this, "Tags List", nameof(tags)).SetAsStringList();
});
var exactJudgeTimeInputField =
inspector.GenerateParameterInputField(this, container, "exactJudgeTime", nameof(exactJudgeTime));
inspector.GenerateInputField(this, container, "exactJudgeTime", nameof(exactJudgeTime));
exactJudgeTimeInputField.AddListenerFunction(_ => UpdateNoteInTrack());
foreach (var submodule in submoduleList)

View File

@@ -17,9 +17,7 @@ namespace Ichni.RhythmGame
Stay stay = Instantiate(EditorManager.instance.basePrefabs.tapNote, parentElement.transform).GetComponent<Stay>();
stay.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
stay.exactJudgeTime = exactJudgeTime;
stay.transformSubmodule = new TransformSubmodule(stay);
stay.timeDurationSubmodule = new TimeDurationSubmodule(stay);
if (parentElement.TryGetComponent(out Track track))
{
if (track.trackTimeSubmodule != null)

View File

@@ -19,8 +19,6 @@ namespace Ichni.RhythmGame
.GetComponent<Tap>();
tap.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
tap.exactJudgeTime = exactJudgeTime;
tap.transformSubmodule = new TransformSubmodule(tap);
tap.timeDurationSubmodule = new TimeDurationSubmodule(tap);
if (parentElement.TryGetComponent(out Track track))
{

View File

@@ -52,7 +52,7 @@ namespace Ichni.RhythmGame
var generateButton = inspector.GenerateButton(this, container, "Generate", () =>
{
Delete();
EditorManager.instance.operationManager.CopyPasteDeleteModule.DeleteElement(this);
inspectorMain.ClearInspector();
SubstantialObject.GenerateElement(elementName, elementGuid, tags, true, themeBundleName, objectName, parentElement);
});

View File

@@ -198,17 +198,17 @@ namespace Ichni.RhythmGame
{
IHaveInspection qcWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Quick Copy");
var qcContainer = qcWindow.GenerateContainer();
var xField = qcWindow.GenerateGetterInputField(qcContainer, "X offset", "0");
var yField = qcWindow.GenerateGetterInputField(qcContainer, "Y offset", "0");
var zField = qcWindow.GenerateGetterInputField(qcContainer, "Z offset", "0");
var timeField = qcWindow.GenerateGetterInputField(qcContainer, "Time offset", "0");
var iterationField = qcWindow.GenerateGetterInputField(qcContainer, "Iteration", "0");
var xField = qcWindow.GenerateInputField(qcContainer, "X offset", "0");
var yField = qcWindow.GenerateInputField(qcContainer, "Y offset", "0");
var zField = qcWindow.GenerateInputField(qcContainer, "Z offset", "0");
var timeField = qcWindow.GenerateInputField(qcContainer, "Time offset", "0");
var iterationField = qcWindow.GenerateInputField(qcContainer, "Iteration", "0");
var includeAnimationToggle = qcWindow.GenerateToggle(null, qcContainer, "Include Animation", string.Empty);
qcWindow.GenerateButton(this, qcContainer, "Copy", () =>
{
Vector3 positionOffset = new Vector3(xField.GetResult<float>(), yField.GetResult<float>(), zField.GetResult<float>());
float timeOffset = timeField.GetResult<float>();
int iteration = iterationField.GetResult<int>();
Vector3 positionOffset = new Vector3(xField.GetValue<float>(), yField.GetValue<float>(), zField.GetValue<float>());
float timeOffset = timeField.GetValue<float>();
int iteration = iterationField.GetValue<int>();
bool includeAnimation = includeAnimationToggle.toggle.isOn;
QuickCopy(positionOffset, timeOffset, includeAnimation, iteration);
});
@@ -218,12 +218,12 @@ namespace Ichni.RhythmGame
{
IHaveInspection wholeMoveWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Whole Track Move");
var wmContainer = wholeMoveWindow.GenerateContainer();
var xField = wholeMoveWindow.GenerateGetterInputField(wmContainer, "X offset", "0");
var yField = wholeMoveWindow.GenerateGetterInputField(wmContainer, "Y offset", "0");
var zField = wholeMoveWindow.GenerateGetterInputField(wmContainer, "Z offset", "0");
var xField = wholeMoveWindow.GenerateInputField(wmContainer, "X offset", "0");
var yField = wholeMoveWindow.GenerateInputField(wmContainer, "Y offset", "0");
var zField = wholeMoveWindow.GenerateInputField(wmContainer, "Z offset", "0");
wholeMoveWindow.GenerateButton(this, wmContainer, "Move", () =>
{
Vector3 positionOffset = new Vector3(xField.GetResult<float>(), yField.GetResult<float>(), zField.GetResult<float>());
Vector3 positionOffset = new Vector3(xField.GetValue<float>(), yField.GetValue<float>(), zField.GetValue<float>());
WholeTrackMove(positionOffset);
});
}); //整体移动
@@ -232,39 +232,39 @@ namespace Ichni.RhythmGame
{
IHaveInspection wholeSwirlWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Whole Track Swirl");
var wsContainer = wholeSwirlWindow.GenerateContainer();
var angleField = wholeSwirlWindow.GenerateGetterInputField(wsContainer, "Angle", "0");
var centerXField = wholeSwirlWindow.GenerateGetterInputField(wsContainer, "Center X", "0");
var centerYField = wholeSwirlWindow.GenerateGetterInputField(wsContainer, "Center Y", "0");
var centerZField = wholeSwirlWindow.GenerateGetterInputField(wsContainer, "Center Z", "0");
var axisDirXField = wholeSwirlWindow.GenerateGetterInputField(wsContainer, "Axis Direction X", "0");
var axisDirYField = wholeSwirlWindow.GenerateGetterInputField(wsContainer, "Axis Direction Y", "0");
var axisDirZField = wholeSwirlWindow.GenerateGetterInputField(wsContainer, "Axis Direction Z", "0");
var angleField = wholeSwirlWindow.GenerateInputField(wsContainer, "Angle", "0");
var centerXField = wholeSwirlWindow.GenerateInputField(wsContainer, "Center X", "0");
var centerYField = wholeSwirlWindow.GenerateInputField(wsContainer, "Center Y", "0");
var centerZField = wholeSwirlWindow.GenerateInputField(wsContainer, "Center Z", "0");
var axisDirXField = wholeSwirlWindow.GenerateInputField(wsContainer, "Axis Direction X", "0");
var axisDirYField = wholeSwirlWindow.GenerateInputField(wsContainer, "Axis Direction Y", "0");
var axisDirZField = wholeSwirlWindow.GenerateInputField(wsContainer, "Axis Direction Z", "0");
wholeSwirlWindow.GenerateButton(this, wsContainer, "Swirl", () =>
{
float angle = angleField.GetResult<float>();
Vector3 center = new Vector3(centerXField.GetResult<float>(), centerYField.GetResult<float>(), centerZField.GetResult<float>());
Vector3 axisDirection = new Vector3(axisDirXField.GetResult<float>(), axisDirYField.GetResult<float>(), axisDirZField.GetResult<float>());
float angle = angleField.GetValue<float>();
Vector3 center = new Vector3(centerXField.GetValue<float>(), centerYField.GetValue<float>(), centerZField.GetValue<float>());
Vector3 axisDirection = new Vector3(axisDirXField.GetValue<float>(), axisDirYField.GetValue<float>(), axisDirZField.GetValue<float>());
WholeTrackSwirl(angle, center, axisDirection);
});
}); //整体旋转
var wholeTrackFlipButton = inspector.GenerateButton(this, toolsContainerTrack, "Whole Track Flip", () =>
{
IHaveInspection wholeFlipWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Whole Track Flip");
var wfContainer = wholeFlipWindow.GenerateContainer();
var axisStartXField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis Start X", "0");
var axisStartYField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis Start Y", "0");
var axisStartZField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis Start Z", "0");
var axisEndXField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis End X", "0");
var axisEndYField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis End Y", "0");
var axisEndZField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis End Z", "0");
wholeFlipWindow.GenerateButton(this, wfContainer, "Flip", () =>
{
Vector3 axisStart = new Vector3(axisStartXField.GetResult<float>(), axisStartYField.GetResult<float>(), axisStartZField.GetResult<float>());
Vector3 axisEnd = new Vector3(axisEndXField.GetResult<float>(), axisEndYField.GetResult<float>(), axisEndZField.GetResult<float>());
WholeTrackFlip(axisStart, axisEnd);
});
}); //整体翻转
// var wholeTrackFlipButton = inspector.GenerateButton(this, toolsContainerTrack, "Whole Track Flip", () =>
// {
// IHaveInspection wholeFlipWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Whole Track Flip");
// var wfContainer = wholeFlipWindow.GenerateContainer();
// var axisStartXField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis Start X", "0");
// var axisStartYField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis Start Y", "0");
// var axisStartZField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis Start Z", "0");
// var axisEndXField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis End X", "0");
// var axisEndYField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis End Y", "0");
// var axisEndZField = wholeFlipWindow.GenerateGetterInputField(wfContainer, "Axis End Z", "0");
// wholeFlipWindow.GenerateButton(this, wfContainer, "Flip", () =>
// {
// Vector3 axisStart = new Vector3(axisStartXField.GetResult<float>(), axisStartYField.GetResult<float>(), axisStartZField.GetResult<float>());
// Vector3 axisEnd = new Vector3(axisEndXField.GetResult<float>(), axisEndYField.GetResult<float>(), axisEndZField.GetResult<float>());
// WholeTrackFlip(axisStart, axisEnd);
// });
// }); //整体翻转
var toolsContainerPathNode = inspector.GenerateContainer("Path Node Tools"); //路径点快捷工具
var setAllPathNodeSphereButton = inspector.GenerateButton(this, toolsContainerPathNode,

View File

@@ -76,10 +76,10 @@ namespace Ichni.RhythmGame
var container = inspector.GenerateContainer("Track Time Movable");
var startTimeInputField =
inspector.GenerateParameterInputField(this, container, "Start Time", nameof(trackStartTime));
var endTimeInputField = inspector.GenerateParameterInputField(this, container, "End Time", nameof(trackEndTime));
inspector.GenerateInputField(this, container, "Start Time", nameof(trackStartTime));
var endTimeInputField = inspector.GenerateInputField(this, container, "End Time", nameof(trackEndTime));
var visibleTimeInputField =
inspector.GenerateParameterInputField(this, container, "Visible Time Length", nameof(visibleTrackTimeLength));
inspector.GenerateInputField(this, container, "Visible Time Length", nameof(visibleTrackTimeLength));
var animationCurveDropdown = inspector.GenerateDropdown(this, container, "Animation Curve",
typeof(AnimationCurveType), nameof(animationCurveType));
var deleteButton = inspector.GenerateButton(this, container, "Delete",
@@ -162,7 +162,7 @@ namespace Ichni.RhythmGame
var container = inspector.GenerateContainer("Track Time Static");
var totalTimeInputField =
inspector.GenerateParameterInputField(this, container, "Total Time", nameof(trackTotalTime));
inspector.GenerateInputField(this, container, "Total Time", nameof(trackTotalTime));
var animationCurveDropdown = inspector.GenerateDropdown(this, container, "Animation Curve",
typeof(AnimationCurveType), nameof(animationCurveType));
var deleteButton = inspector.GenerateButton(this, container, "Delete",

View File

@@ -42,7 +42,7 @@ namespace Ichni.Editor
var container = inspector.GenerateContainer("Camera Manager");
var cameraTypeText = inspector.GenerateHintText(this, container, ShowCameraType);
var switchCameraButton = inspector.GenerateButton(this, container, "Switch Camera", SwitchCamera);
var cameraMoveSpeedField = inspector.GenerateParameterInputField(this, container, "Scene Camera Move Speed", nameof(sceneCameraMoveSpeed));
var cameraMoveSpeedField = inspector.GenerateInputField(this, container, "Scene Camera Move Speed", nameof(sceneCameraMoveSpeed));
sceneCamera.SetUpInspector();
}
}

View File

@@ -15,6 +15,7 @@ namespace Ichni
public static EditorManager instance;
public ProjectManager projectManager;
public MusicPlayer musicPlayer;
public EditorUIManager uiManager;
public EditorSettings editorSettings;
public OperationManager operationManager;
@@ -53,7 +54,7 @@ namespace Ichni
uiManager.hierarchy.GenerateTab(this, null);
projectManager.loadManager.Load("TestProject");
uiManager.timeline.musicPlayer.audioSource.clip = songInformation.song;
musicPlayer.audioSource.clip = songInformation.song;
beatmapContainer.gameElementList.ForEach(gameElement =>
{

View File

@@ -16,8 +16,10 @@ namespace Ichni.Editor
private void Update()
{
if (EditorManager.instance.cameraManager.isSceneCameraActive ||
!Keyboard.current.leftCtrlKey.isPressed) // 场景相机的移动和旋转
bool isPointerOverUI = IsPointerOverUI(out GameObject hoveredUI);
if (EditorManager.instance.cameraManager.isSceneCameraActive &&
!Keyboard.current.leftCtrlKey.isPressed && !isPointerOverUI) // 场景相机的移动和旋转
{
float cameraMoveSpeed = EditorManager.instance.cameraManager.sceneCameraMoveSpeed * Time.deltaTime;
Transform sceneCameraTransform = EditorManager.instance.cameraManager.sceneCamera.transform;
@@ -46,8 +48,6 @@ namespace Ichni.Editor
sceneCameraTransform.position -= sceneCameraTransform.up * cameraMoveSpeed;
}
bool isPointerOverUI = IsPointerOverUI(out GameObject hoveredUI);
if (Mouse.current.rightButton.isPressed && !isPointerOverUI)
{
float cameraRotateSpeed = EditorManager.instance.cameraManager.sceneCameraRotateSpeed * Time.deltaTime;
@@ -61,16 +61,15 @@ namespace Ichni.Editor
}
}
if (eventSystem.currentSelectedGameObject == null &&
Keyboard.current.enterKey.wasPressedThisFrame) // 播放或暂停音乐
if (!isPointerOverUI && Keyboard.current.enterKey.wasPressedThisFrame) // 播放或暂停音乐
{
if (!EditorManager.instance.uiManager.timeline.musicPlayer.isPlaying)
if (!EditorManager.instance.musicPlayer.isPlaying)
{
EditorManager.instance.uiManager.timeline.musicPlayer.PlayMusic();
EditorManager.instance.musicPlayer.PlayMusic();
}
else
{
EditorManager.instance.uiManager.timeline.musicPlayer.PauseMusic();
EditorManager.instance.musicPlayer.PauseMusic();
}
}
@@ -98,7 +97,7 @@ namespace Ichni.Editor
}
else if (Keyboard.current.dKey.wasPressedThisFrame)
{
EditorManager.instance.operationManager.currentSelectedElement.Delete();
EditorManager.instance.operationManager.CopyPasteDeleteModule.DeleteElement(EditorManager.instance.operationManager.currentSelectedElement);
}
// 开关移动设备分辨率提示

View File

@@ -3,7 +3,6 @@ using System.Collections;
using System.Collections.Generic;
using Ichni.RhythmGame;
using UnityEngine;
using UnityEngine.UI;
namespace Ichni.Editor
{
@@ -12,16 +11,12 @@ namespace Ichni.Editor
public bool isPlaying;
public AudioSource audioSource;
public Button playButton;
public Button pauseButton;
public Button stopButton;
private void Awake()
private void Update()
{
audioSource = GetComponent<AudioSource>();
playButton.onClick.AddListener(PlayMusic);
pauseButton.onClick.AddListener(PauseMusic);
stopButton.onClick.AddListener(StopMusic);
if (isPlaying)
{
EditorManager.instance.songInformation.songTime = EditorManager.instance.musicPlayer.audioSource.time;
}
}
public void PlayMusic()
@@ -29,8 +24,8 @@ namespace Ichni.Editor
isPlaying = !isPlaying;
Trail.SetAllTrails(true, false);
EditorManager.instance.songInformation.songTime = audioSource.time;
if( isPlaying)audioSource.Play();
else audioSource.Pause();
if(isPlaying)audioSource.Play();
else audioSource.Pause();
}
public void PauseMusic()

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 6c12bb7674cd5416f8d846e62018a96d
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -17,38 +17,36 @@ namespace Ichni.Editor
public BaseElement_BM matchedBM { get; set; }
[HideInInspector]
public Vector3 cameraPosition; //注意这里的Position和EulerAngles是transform的中介变量仅能用于Inspector显示
[HideInInspector]
public Vector3 cameraEulerAngles;
public void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Scene Camera");
var viewTypeDropdown = inspector.GenerateDropdown(this, container, "View Type", typeof(GameCamera.CameraViewType), nameof(viewType));
var perspectiveAngleField = inspector.GenerateParameterInputField(this, container, "Perspective Angle", nameof(perspectiveAngle));
var orthographicSizeField = inspector.GenerateParameterInputField(this, container, "Orthographic Size", nameof(orthographicSize));
var perspectiveAngleField = inspector.GenerateInputField(this, container, "Perspective Angle", nameof(perspectiveAngle));
var orthographicSizeField = inspector.GenerateInputField(this, container, "Orthographic Size", nameof(orthographicSize));
viewTypeDropdown.AddListenerFunction(_ => camera.orthographic = viewType == GameCamera.CameraViewType.Orthographic);
perspectiveAngleField.AddListenerFunction(_ => camera.fieldOfView = perspectiveAngle);
orthographicSizeField.AddListenerFunction(_ => camera.orthographicSize = orthographicSize);
viewTypeDropdown.AddListenerFunction(_ =>
{
camera.orthographic = viewType == GameCamera.CameraViewType.Orthographic;
});
perspectiveAngleField.AddListenerFunction(_ =>
{
camera.fieldOfView = perspectiveAngle;
});
orthographicSizeField.AddListenerFunction(_ =>
{
camera.orthographicSize = orthographicSize;
});
string GetPosition() => $"Position: {camera.transform.position}";
var positionText = inspector.GenerateHintText(this, container, GetPosition);
string GetEulerAngles() => $"Euler Angles: {camera.transform.eulerAngles}";
var eulerAnglesText = inspector.GenerateHintText(this, container, GetEulerAngles);
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);
}
public void MoveCamera(Vector3 delta)
private void Update()
{
camera.transform.position += delta;
cameraPosition = camera.transform.position;
cameraEulerAngles = camera.transform.eulerAngles;
}
}
}