自动更新型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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -18,11 +18,6 @@ namespace Ichni.Editor
/// 参数名,通过反射获取饿修改对应变量的值 /// 参数名,通过反射获取饿修改对应变量的值
/// </summary> /// </summary>
public string parameterName; public string parameterName;
/// <summary>
/// 是否始终更新如果子类可能用到此变量则在子类中写Update即可注意如果最后仅有Text用到此变量直接移动它到Text即可
/// </summary>
public bool isAlwaysUpdated;
public virtual void Initialize(IBaseElement baseElement, string title, string parameterName) public virtual void Initialize(IBaseElement baseElement, string title, string parameterName)
{ {
@@ -54,4 +49,21 @@ namespace Ichni.Editor
//public abstract void ApplyParameters(); //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 namespace Ichni.Editor
{ {
public class DynamicUIParameterInputField : DynamicUIElement public class DynamicUIInputField : DynamicUIElement, IHaveAutoUpdate
{ {
public TMP_InputField inputField; public TMP_InputField inputField;
public bool isAutoUpdate { get; set; }
public bool isReceiving { get; set; }
public override void Initialize(IBaseElement baseElement, string title, string parameterName) public override void Initialize(IBaseElement baseElement, string title, string parameterName)
{ {
base.Initialize(baseElement, title, 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) private void ApplyParameters(string text)
{ {
Type type = connectedBaseElement.GetType().GetField(parameterName).FieldType; Type type = connectedBaseElement.GetType().GetField(parameterName).FieldType;

View File

@@ -7,22 +7,32 @@ using UnityEngine;
namespace Ichni.Editor namespace Ichni.Editor
{ {
public class DynamicUIParameterText : DynamicUIElement public class DynamicUIParameterText : DynamicUIElement, IHaveAutoUpdate
{ {
public TMP_Text text; public TMP_Text text;
public bool isAutoUpdate { get; set; }
public bool isReceiving { get; set; }
public override void Initialize(IBaseElement baseElement, string title, string parameterName) public override void Initialize(IBaseElement baseElement, string title, string parameterName)
{ {
base.Initialize(baseElement, title, parameterName); base.Initialize(baseElement, title, parameterName);
text.text = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement).ToString(); ApplyContent();
} }
private void Update() private void Update()
{ {
if (isAlwaysUpdated) (this as IHaveAutoUpdate).UpdateContent();
{ }
text.text = connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement).ToString();
} 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;
using System.Collections.Generic; using System.Collections.Generic;
using Ichni.RhythmGame; using Ichni.RhythmGame;
@@ -10,27 +11,66 @@ using UnityEngine.UIElements.Experimental;
namespace Ichni.Editor namespace Ichni.Editor
{ {
public class DynamicUIVector3InputField : DynamicUIElement public class DynamicUIVector3InputField : DynamicUIElement, IHaveAutoUpdate
{ {
public TMP_InputField inputFieldX; public TMP_InputField inputFieldX;
public TMP_InputField inputFieldY; public TMP_InputField inputFieldY;
public TMP_InputField inputFieldZ; public TMP_InputField inputFieldZ;
public bool isAutoUpdate { get; set; }
public bool isReceiving { get; set; }
public override void Initialize(IBaseElement baseElement, string title, string parameterName) public override void Initialize(IBaseElement baseElement, string title, string parameterName)
{ {
base.Initialize(baseElement, title, 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); //获取对应变量的值 Vector3 pos = (Vector3)connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement); //获取对应变量的值
inputFieldX.text = pos.x.ToString(); inputFieldX.text = pos.x.ToString();
inputFieldY.text = pos.y.ToString(); inputFieldY.text = pos.y.ToString();
inputFieldZ.text = pos.z.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() private void ApplyParameters()
{ {
Vector3 newValue = new Vector3(float.Parse(inputFieldX.text), float.Parse(inputFieldY.text), float.Parse(inputFieldZ.text)); 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()); inputFieldY.onEndEdit.AddListener(_ => action());
inputFieldZ.onEndEdit.AddListener(_ => action()); inputFieldZ.onEndEdit.AddListener(_ => action());
} }
public override void DeviverSet(int i){
//我什么也不做
}
} }
} }

View File

@@ -66,38 +66,49 @@ namespace Ichni.Editor
return toggle; return toggle;
} }
public DynamicUIGetterInputField GenerateGetterInputField(DynamicUIContainer container, public DynamicUIInputField GenerateInputField(DynamicUIContainer container,
string title, string defaultText) string title, string defaultText = "") //不与参数绑定的InputField
{ {
DynamicUIGetterInputField getterInputField = Object DynamicUIInputField inputField = Object
.Instantiate(EditorManager.instance.basePrefabs.getterInputField, container.rect) .Instantiate(EditorManager.instance.basePrefabs.parameterInputField, container.rect)
.GetComponent<DynamicUIGetterInputField>(); .GetComponent<DynamicUIInputField>();
getterInputField.Initialize(null, title, string.Empty); inputField.Initialize(null, title, string.Empty);
getterInputField.SetDefaultText(defaultText); inputField.SetDefaultValue(defaultText);
container.dynamicUIElements.Add(getterInputField); container.dynamicUIElements.Add(inputField);
return getterInputField; return inputField;
} }
public DynamicUIParameterInputField GenerateParameterInputField(IBaseElement baseElement, public DynamicUIInputField GenerateInputField(IBaseElement baseElement,
DynamicUIContainer container, DynamicUIContainer container, string title, string parameterName, bool isAutoUpdate = false) //与参数绑定的InputField
string title, string parameterName)
{ {
DynamicUIParameterInputField parameterInputField = Object DynamicUIInputField inputField = Object
.Instantiate(EditorManager.instance.basePrefabs.parameterInputField, container.rect) .Instantiate(EditorManager.instance.basePrefabs.parameterInputField, container.rect)
.GetComponent<DynamicUIParameterInputField>(); .GetComponent<DynamicUIInputField>();
parameterInputField.Initialize(baseElement, title, parameterName); inputField.Initialize(baseElement, title, parameterName);
container.dynamicUIElements.Add(parameterInputField); container.dynamicUIElements.Add(inputField);
return parameterInputField; 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, public DynamicUIVector3InputField GenerateVector3InputField(IBaseElement baseElement,
DynamicUIContainer container, DynamicUIContainer container, string title, string parameterName, bool isAutoUpdate = false)
string title, string parameterName)
{ {
DynamicUIVector3InputField vector3InputField = DynamicUIVector3InputField vector3InputField =
Object.Instantiate(EditorManager.instance.basePrefabs.vector3InputField, container.rect) Object.Instantiate(EditorManager.instance.basePrefabs.vector3InputField, container.rect)
.GetComponent<DynamicUIVector3InputField>(); .GetComponent<DynamicUIVector3InputField>();
vector3InputField.Initialize(baseElement, title, parameterName); vector3InputField.Initialize(baseElement, title, parameterName);
vector3InputField.SetAutoUpdate(isAutoUpdate);
container.dynamicUIElements.Add(vector3InputField); container.dynamicUIElements.Add(vector3InputField);
return vector3InputField; return vector3InputField;
} }
@@ -148,14 +159,13 @@ namespace Ichni.Editor
} }
public DynamicUIParameterText GenerateParameterText(IBaseElement baseElement, DynamicUIContainer container, public DynamicUIParameterText GenerateParameterText(IBaseElement baseElement, DynamicUIContainer container,
string title, string title, string parameterName, bool isAutoUpdate = false)
string parameterName, bool isAlwaysUpdate = false)
{ {
DynamicUIParameterText parameterText = Object DynamicUIParameterText parameterText = Object
.Instantiate(EditorManager.instance.basePrefabs.parameterText, container.rect) .Instantiate(EditorManager.instance.basePrefabs.parameterText, container.rect)
.GetComponent<DynamicUIParameterText>(); .GetComponent<DynamicUIParameterText>();
parameterText.Initialize(baseElement, title, parameterName); parameterText.Initialize(baseElement, title, parameterName);
parameterText.isAlwaysUpdated = isAlwaysUpdate; parameterText.SetAutoUpdate(isAutoUpdate);
container.dynamicUIElements.Add(parameterText); container.dynamicUIElements.Add(parameterText);
return 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() private void Update()
{ {
if (timeline.musicPlayer.isPlaying) if (EditorManager.instance.musicPlayer.isPlaying)
{ {
songInformation.songTime = timeline.musicPlayer.audioSource.time;
SetRange(songInformation.songTime); SetRange(songInformation.songTime);
} }

View File

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

View File

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

View File

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

View File

@@ -150,7 +150,7 @@ namespace Ichni.RhythmGame
{ {
IHaveInspection inspector = EditorManager.instance.uiManager.inspector; IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Element Info"); 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 guidText = inspector.GenerateParameterText(this, container, "Element GUID", nameof(elementGuid));
var tagsListButton = inspector.GenerateButton(this, container, "Tags List", () => var tagsListButton = inspector.GenerateButton(this, container, "Tags List", () =>
{ {

View File

@@ -40,8 +40,8 @@ namespace Ichni.RhythmGame
{ {
IHaveInspection inspector = EditorManager.instance.uiManager.inspector; IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Bloom Shake"); var container = inspector.GenerateContainer("Bloom Shake");
var effectTimeField = inspector.GenerateParameterInputField(this, container, "Bloom Time", nameof(bloomTime)); var effectTimeField = inspector.GenerateInputField(this, container, "Bloom Time", nameof(bloomTime));
var bloomPeakField = inspector.GenerateParameterInputField(this, container, "Bloom Peak", nameof(bloomPeak)); 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 partial class TimeEffectsCollection : GameElement, IHaveEffectSubmodule
{ {
public EffectSubmodule effectSubmodule { get; set; } public EffectSubmodule effectSubmodule { get; set; }
public float time; public float time; //触发效果的时间
public static TimeEffectsCollection GenerateElement(string name, Guid guid, List<string> tags, public static TimeEffectsCollection GenerateElement(string name, Guid guid, List<string> tags,
bool isFirstGenerated, GameElement parentElement, float time) bool isFirstGenerated, GameElement parentElement, float time)
@@ -26,6 +26,7 @@ namespace Ichni.RhythmGame
protected override void SetDefaultSubmodules() protected override void SetDefaultSubmodules()
{ {
effectSubmodule = new EffectSubmodule(this); effectSubmodule = new EffectSubmodule(this);
submoduleList.Add(effectSubmodule);
} }
private void Update() private void Update()
@@ -38,18 +39,30 @@ namespace Ichni.RhythmGame
{ {
public override void SaveBM() 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() public override void SetUpInspector()
{ {
base.SetUpInspector();
IHaveInspection inspector = EditorManager.instance.uiManager.inspector; IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Time Effects Collection"); 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", () => var addEffectButton = inspector.GenerateButton(this, container, "Add Effect", () =>
{ {
IHaveEffectSubmodule.EffectCollection.TryGetValue("BloomShake", out var effect); if (IHaveEffectSubmodule.EffectCollection.TryGetValue(effectNameInputField.GetValue<string>(), out var effect))
effectSubmodule.effectCollection["Default"].Add(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"]) 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; time = timeEffectsCollection.time;
} }
public override void ExecuteBM() public override void ExecuteBM()
{ {
matchedElement = TimeEffectsCollection.GenerateElement("Time Effects Collection", elementGuid, matchedElement = TimeEffectsCollection.GenerateElement(elementName, elementGuid,
tags, false, GetElement(attachedElementGuid), time); tags, false, GetElement(attachedElementGuid), time);
} }
public override GameElement DuplicateBM(GameElement attached) public override GameElement DuplicateBM(GameElement attached)
{ {
return TimeEffectsCollection.GenerateElement("Time Effects Collection", elementGuid, return TimeEffectsCollection.GenerateElement(elementName, elementGuid,
tags, false, attached, time); tags, false, attached, time);
} }
} }

View File

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

View File

@@ -8,7 +8,7 @@ using UnityEngine;
namespace Ichni.RhythmGame namespace Ichni.RhythmGame
{ {
public abstract partial class NoteBase : GameElement, IHaveTransformSubmodule, IHaveTimeDurationSubmodule public abstract partial class NoteBase : GameElement, IHaveTimeDurationSubmodule
{ {
[Title("Basic Info")] [Title("Basic Info")]
public float exactJudgeTime; public float exactJudgeTime;
@@ -22,7 +22,6 @@ namespace Ichni.RhythmGame
public NoteVisualBase noteVisual; public NoteVisualBase noteVisual;
[Title("Submodules")] [Title("Submodules")]
public TransformSubmodule transformSubmodule { get; set; }
public TimeDurationSubmodule timeDurationSubmodule { get; set; } public TimeDurationSubmodule timeDurationSubmodule { get; set; }
public NoteJudgeSubmodule noteJudgeSubmodule { get; set; } public NoteJudgeSubmodule noteJudgeSubmodule { get; set; }
@@ -57,11 +56,9 @@ namespace Ichni.RhythmGame
protected override void SetDefaultSubmodules() protected override void SetDefaultSubmodules()
{ {
transformSubmodule = new TransformSubmodule(this);
timeDurationSubmodule = new TimeDurationSubmodule(this); timeDurationSubmodule = new TimeDurationSubmodule(this);
noteJudgeSubmodule = new NoteJudgeSubmodule(this); noteJudgeSubmodule = new NoteJudgeSubmodule(this);
submoduleList.Add(transformSubmodule);
submoduleList.Add(timeDurationSubmodule); submoduleList.Add(timeDurationSubmodule);
submoduleList.Add(noteJudgeSubmodule); submoduleList.Add(noteJudgeSubmodule);
} }
@@ -139,14 +136,14 @@ namespace Ichni.RhythmGame
//我想把时间放在第一层菜单所以 //我想把时间放在第一层菜单所以
IHaveInspection inspector = EditorManager.instance.uiManager.inspector; IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Element Info"); 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 guidText = inspector.GenerateParameterText(this, container, "Element GUID", nameof(elementGuid));
var tagsListButton = inspector.GenerateButton(this, container, "Tags List", () => var tagsListButton = inspector.GenerateButton(this, container, "Tags List", () =>
{ {
inspector.GenerateCompositeParameterWindow(this, "Tags List", nameof(tags)).SetAsStringList(); inspector.GenerateCompositeParameterWindow(this, "Tags List", nameof(tags)).SetAsStringList();
}); });
var exactJudgeTimeInputField = var exactJudgeTimeInputField =
inspector.GenerateParameterInputField(this, container, "exactJudgeTime", nameof(exactJudgeTime)); inspector.GenerateInputField(this, container, "exactJudgeTime", nameof(exactJudgeTime));
exactJudgeTimeInputField.AddListenerFunction(_ => UpdateNoteInTrack()); exactJudgeTimeInputField.AddListenerFunction(_ => UpdateNoteInTrack());
foreach (var submodule in submoduleList) 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 stay = Instantiate(EditorManager.instance.basePrefabs.tapNote, parentElement.transform).GetComponent<Stay>();
stay.Initialize(elementName, id, tags, isFirstGenerated, parentElement); stay.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
stay.exactJudgeTime = exactJudgeTime; stay.exactJudgeTime = exactJudgeTime;
stay.transformSubmodule = new TransformSubmodule(stay);
stay.timeDurationSubmodule = new TimeDurationSubmodule(stay);
if (parentElement.TryGetComponent(out Track track)) if (parentElement.TryGetComponent(out Track track))
{ {
if (track.trackTimeSubmodule != null) if (track.trackTimeSubmodule != null)

View File

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

View File

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

View File

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

View File

@@ -42,7 +42,7 @@ namespace Ichni.Editor
var container = inspector.GenerateContainer("Camera Manager"); var container = inspector.GenerateContainer("Camera Manager");
var cameraTypeText = inspector.GenerateHintText(this, container, ShowCameraType); var cameraTypeText = inspector.GenerateHintText(this, container, ShowCameraType);
var switchCameraButton = inspector.GenerateButton(this, container, "Switch Camera", SwitchCamera); 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(); sceneCamera.SetUpInspector();
} }
} }

View File

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

View File

@@ -16,8 +16,10 @@ namespace Ichni.Editor
private void Update() private void Update()
{ {
if (EditorManager.instance.cameraManager.isSceneCameraActive || bool isPointerOverUI = IsPointerOverUI(out GameObject hoveredUI);
!Keyboard.current.leftCtrlKey.isPressed) // 场景相机的移动和旋转
if (EditorManager.instance.cameraManager.isSceneCameraActive &&
!Keyboard.current.leftCtrlKey.isPressed && !isPointerOverUI) // 场景相机的移动和旋转
{ {
float cameraMoveSpeed = EditorManager.instance.cameraManager.sceneCameraMoveSpeed * Time.deltaTime; float cameraMoveSpeed = EditorManager.instance.cameraManager.sceneCameraMoveSpeed * Time.deltaTime;
Transform sceneCameraTransform = EditorManager.instance.cameraManager.sceneCamera.transform; Transform sceneCameraTransform = EditorManager.instance.cameraManager.sceneCamera.transform;
@@ -46,8 +48,6 @@ namespace Ichni.Editor
sceneCameraTransform.position -= sceneCameraTransform.up * cameraMoveSpeed; sceneCameraTransform.position -= sceneCameraTransform.up * cameraMoveSpeed;
} }
bool isPointerOverUI = IsPointerOverUI(out GameObject hoveredUI);
if (Mouse.current.rightButton.isPressed && !isPointerOverUI) if (Mouse.current.rightButton.isPressed && !isPointerOverUI)
{ {
float cameraRotateSpeed = EditorManager.instance.cameraManager.sceneCameraRotateSpeed * Time.deltaTime; float cameraRotateSpeed = EditorManager.instance.cameraManager.sceneCameraRotateSpeed * Time.deltaTime;
@@ -61,16 +61,15 @@ namespace Ichni.Editor
} }
} }
if (eventSystem.currentSelectedGameObject == null && if (!isPointerOverUI && Keyboard.current.enterKey.wasPressedThisFrame) // 播放或暂停音乐
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 else
{ {
EditorManager.instance.uiManager.timeline.musicPlayer.PauseMusic(); EditorManager.instance.musicPlayer.PauseMusic();
} }
} }
@@ -98,7 +97,7 @@ namespace Ichni.Editor
} }
else if (Keyboard.current.dKey.wasPressedThisFrame) 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 System.Collections.Generic;
using Ichni.RhythmGame; using Ichni.RhythmGame;
using UnityEngine; using UnityEngine;
using UnityEngine.UI;
namespace Ichni.Editor namespace Ichni.Editor
{ {
@@ -12,16 +11,12 @@ namespace Ichni.Editor
public bool isPlaying; public bool isPlaying;
public AudioSource audioSource; public AudioSource audioSource;
public Button playButton; private void Update()
public Button pauseButton;
public Button stopButton;
private void Awake()
{ {
audioSource = GetComponent<AudioSource>(); if (isPlaying)
playButton.onClick.AddListener(PlayMusic); {
pauseButton.onClick.AddListener(PauseMusic); EditorManager.instance.songInformation.songTime = EditorManager.instance.musicPlayer.audioSource.time;
stopButton.onClick.AddListener(StopMusic); }
} }
public void PlayMusic() public void PlayMusic()
@@ -29,8 +24,8 @@ namespace Ichni.Editor
isPlaying = !isPlaying; isPlaying = !isPlaying;
Trail.SetAllTrails(true, false); Trail.SetAllTrails(true, false);
EditorManager.instance.songInformation.songTime = audioSource.time; EditorManager.instance.songInformation.songTime = audioSource.time;
if( isPlaying)audioSource.Play(); if(isPlaying)audioSource.Play();
else audioSource.Pause(); else audioSource.Pause();
} }
public void PauseMusic() 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; } public BaseElement_BM matchedBM { get; set; }
[HideInInspector]
public Vector3 cameraPosition; //注意这里的Position和EulerAngles是transform的中介变量仅能用于Inspector显示
[HideInInspector]
public Vector3 cameraEulerAngles;
public void SetUpInspector() public void SetUpInspector()
{ {
IHaveInspection inspector = EditorManager.instance.uiManager.inspector; IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Scene Camera"); var container = inspector.GenerateContainer("Scene Camera");
var viewTypeDropdown = inspector.GenerateDropdown(this, container, "View Type", typeof(GameCamera.CameraViewType), nameof(viewType)); var viewTypeDropdown = inspector.GenerateDropdown(this, container, "View Type", typeof(GameCamera.CameraViewType), nameof(viewType));
var perspectiveAngleField = inspector.GenerateParameterInputField(this, container, "Perspective Angle", nameof(perspectiveAngle)); var perspectiveAngleField = inspector.GenerateInputField(this, container, "Perspective Angle", nameof(perspectiveAngle));
var orthographicSizeField = inspector.GenerateParameterInputField(this, container, "Orthographic Size", nameof(orthographicSize)); 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(_ => var positionInputFields = inspector.GenerateVector3InputField(this, container, "Position", nameof(cameraPosition), true);
{ positionInputFields.AddListenerFunction(() => camera.transform.position = cameraPosition);
camera.orthographic = viewType == GameCamera.CameraViewType.Orthographic;
}); var eulerAnglesInputFields = inspector.GenerateVector3InputField(this, container, "Euler Angles", nameof(cameraEulerAngles), true);
eulerAnglesInputFields.AddListenerFunction(() => camera.transform.eulerAngles = cameraEulerAngles);
perspectiveAngleField.AddListenerFunction(_ =>
{
camera.fieldOfView = perspectiveAngle; container.SetDeviver(1);
});
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);
} }
public void MoveCamera(Vector3 delta) private void Update()
{ {
camera.transform.position += delta; cameraPosition = camera.transform.position;
cameraEulerAngles = camera.transform.eulerAngles;
} }
} }
} }

View File

@@ -43,112 +43,6 @@
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "ac931bb4-963e-473f-9ec6-4eb2121aed7d" "value" : "ac931bb4-963e-473f-9ec6-4eb2121aed7d"
} }
},{
"__type" : "Ichni.RhythmGame.Beatmap.Displacement_BM,Assembly-CSharp",
"positionX" : {
"animatedFloatList" : [
]
},
"positionY" : {
"animatedFloatList" : [
{
"startValue" : 0,
"endValue" : 10,
"startTime" : 0,
"endTime" : 2,
"animationCurveType" : 0
}
]
},
"positionZ" : {
"animatedFloatList" : [
]
},
"elementName" : "Displacement-0",
"tags" : [
],
"elementGuid" : {
"value" : "4e670cae-92bf-414d-98fe-5af126b8470c"
},
"attachedElementGuid" : {
"value" : "ac931bb4-963e-473f-9ec6-4eb2121aed7d"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "4e670cae-92bf-414d-98fe-5af126b8470c"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.Displacement_BM,Assembly-CSharp",
"positionX" : {
"animatedFloatList" : [
{
"startValue" : 0,
"endValue" : -4,
"startTime" : 0,
"endTime" : 0.5,
"animationCurveType" : 2
},{
"startValue" : -4,
"endValue" : 0,
"startTime" : 0.5,
"endTime" : 1,
"animationCurveType" : 1
},{
"startValue" : 0,
"endValue" : 4,
"startTime" : 1,
"endTime" : 1.5,
"animationCurveType" : 2
},{
"startValue" : 4,
"endValue" : 0,
"startTime" : 1.5,
"endTime" : 2,
"animationCurveType" : 1
}
]
},
"positionY" : {
"animatedFloatList" : [
{
"startValue" : 0,
"endValue" : -10,
"startTime" : 0,
"endTime" : 2,
"animationCurveType" : 0
}
]
},
"positionZ" : {
"animatedFloatList" : [
]
},
"elementName" : "Displacement-1",
"tags" : [
],
"elementGuid" : {
"value" : "08f7383b-ebca-49c7-b543-94811d625215"
},
"attachedElementGuid" : {
"value" : "ac931bb4-963e-473f-9ec6-4eb2121aed7d"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "08f7383b-ebca-49c7-b543-94811d625215"
}
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.Track_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.Track_BM,Assembly-CSharp",
"elementName" : "Track", "elementName" : "Track",
@@ -404,26 +298,6 @@
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "04f7a1d6-76f2-4b15-9632-494515114d5d" "value" : "04f7a1d6-76f2-4b15-9632-494515114d5d"
} }
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "c5134d2c-c175-458c-99ff-07523169ec21"
}
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false, "isOverridingDuration" : false,
@@ -626,6 +500,36 @@
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "04f7a1d6-76f2-4b15-9632-494515114d5d" "value" : "04f7a1d6-76f2-4b15-9632-494515114d5d"
} }
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "49905a7f-456c-491d-a607-0aebebd5ab7f"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.NoteJudgeSubmodule_BM,Assembly-CSharp",
"judgeUnitList" : [
],
"attachedElementGuid" : {
"value" : "49905a7f-456c-491d-a607-0aebebd5ab7f"
}
},{
"__type" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.Beatmap.DTMNoteVisual_BM,Assembly-CSharp",
"themeBundleName" : "departure_to_multiverse",
"objectName" : "DTM_NoteVisualTap",
"elementName" : "New Note Visual",
"tags" : [
],
"elementGuid" : {
"value" : "cb918977-3e38-4d90-be47-b2170285fd71"
},
"attachedElementGuid" : {
"value" : "49905a7f-456c-491d-a607-0aebebd5ab7f"
}
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : { "originalPosition" : {
@@ -644,7 +548,7 @@
"z" : 1 "z" : 1
}, },
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "49905a7f-456c-491d-a607-0aebebd5ab7f" "value" : "cb918977-3e38-4d90-be47-b2170285fd71"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
@@ -652,15 +556,124 @@
"startTime" : -32767, "startTime" : -32767,
"endTime" : 32767, "endTime" : 32767,
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "49905a7f-456c-491d-a607-0aebebd5ab7f" "value" : "cb918977-3e38-4d90-be47-b2170285fd71"
} }
},{ },{
"__type" : "Ichni.RhythmGame.Beatmap.NoteJudgeSubmodule_BM,Assembly-CSharp", "__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"judgeUnitList" : [ "originalBaseColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"emissionEnabled" : false,
"originalEmissionColor" : {
"r" : 0,
"g" : 0,
"b" : 0,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "cb918977-3e38-4d90-be47-b2170285fd71"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp",
"effectCollection" : {"Generate":[
],"GeneralJudge":[
],"Holding":[
],"Perfect":[
{
"__type" : "Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse.Beatmap.DTMNotePerfectBurst_BM,Assembly-CSharp",
"effectTime" : 0
}
],"Good":[
],"Bad":[
],"Miss":[
]
},
"attachedElementGuid" : {
"value" : "cb918977-3e38-4d90-be47-b2170285fd71"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.Displacement_BM,Assembly-CSharp",
"positionX" : {
"animatedFloatList" : [
]
},
"positionY" : {
"animatedFloatList" : [
{
"startValue" : 0,
"endValue" : 10,
"startTime" : 0,
"endTime" : 2,
"animationCurveType" : 0
},{
"startValue" : 10,
"endValue" : 0,
"startTime" : 2,
"endTime" : 4,
"animationCurveType" : 0
}
]
},
"positionZ" : {
"animatedFloatList" : [
]
},
"elementName" : "Displacement-0",
"tags" : [
], ],
"elementGuid" : {
"value" : "4e670cae-92bf-414d-98fe-5af126b8470c"
},
"attachedElementGuid" : { "attachedElementGuid" : {
"value" : "49905a7f-456c-491d-a607-0aebebd5ab7f" "value" : "3fdf0e9f-2d69-4f55-8167-a77ade5ac0ac"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "4e670cae-92bf-414d-98fe-5af126b8470c"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeEffectsCollection_BM,Assembly-CSharp",
"time" : 0.3,
"elementName" : "New Time Effects Collection",
"tags" : [
],
"elementGuid" : {
"value" : "c0e55af0-21a6-4d5e-bb5c-b08c28341fab"
},
"attachedElementGuid" : {
"value" : "ac931bb4-963e-473f-9ec6-4eb2121aed7d"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.EffectSubmodule_BM,Assembly-CSharp",
"effectCollection" : {"Default":[
{
"__type" : "Ichni.RhythmGame.Beatmap.BloomShake_BM,Assembly-CSharp",
"bloomTime" : 0.2,
"bloomPeak" : 10,
"effectTime" : 0
}
]
},
"attachedElementGuid" : {
"value" : "c0e55af0-21a6-4d5e-bb5c-b08c28341fab"
} }
} }
] ]

View File

@@ -41,7 +41,7 @@ namespace Ichni.RhythmGame.ThemeBundles.Basic
{ {
IHaveInspection inspector = EditorManager.instance.uiManager.inspector; IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Basic Note Bad Expand"); var container = inspector.GenerateContainer("Basic Note Bad Expand");
var effectTimeField = inspector.GenerateParameterInputField(this, container, "Effect Time", nameof(effectTime)); var effectTimeField = inspector.GenerateInputField(this, container, "Effect Time", nameof(effectTime));
} }
} }

View File

@@ -41,8 +41,8 @@ namespace Ichni.RhythmGame.ThemeBundles.Basic
{ {
IHaveInspection inspector = EditorManager.instance.uiManager.inspector; IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Basic Note Generate Expand"); var container = inspector.GenerateContainer("Basic Note Generate Expand");
var generateTimeField = inspector.GenerateParameterInputField(this, container, "Generate Time", nameof(generateTime)); var generateTimeField = inspector.GenerateInputField(this, container, "Generate Time", nameof(generateTime));
var effectTimeField = inspector.GenerateParameterInputField(this, container, "Effect Time", nameof(effectTime)); var effectTimeField = inspector.GenerateInputField(this, container, "Effect Time", nameof(effectTime));
} }
} }

View File

@@ -46,7 +46,7 @@ namespace Ichni.RhythmGame.ThemeBundles.Basic
{ {
IHaveInspection inspector = EditorManager.instance.uiManager.inspector; IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Basic Note Good Burst"); var container = inspector.GenerateContainer("Basic Note Good Burst");
var effectTimeField = inspector.GenerateParameterInputField(this, container, "Effect Time", nameof(effectTime)); var effectTimeField = inspector.GenerateInputField(this, container, "Effect Time", nameof(effectTime));
} }
} }

View File

@@ -42,7 +42,7 @@ namespace Ichni.RhythmGame.ThemeBundles.Basic
{ {
IHaveInspection inspector = EditorManager.instance.uiManager.inspector; IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Basic Note Miss Pale"); var container = inspector.GenerateContainer("Basic Note Miss Pale");
var effectTimeField = inspector.GenerateParameterInputField(this, container, "Effect Time", nameof(effectTime)); var effectTimeField = inspector.GenerateInputField(this, container, "Effect Time", nameof(effectTime));
} }
} }

View File

@@ -46,7 +46,7 @@ namespace Ichni.RhythmGame.ThemeBundles.Basic
{ {
IHaveInspection inspector = EditorManager.instance.uiManager.inspector; IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Basic Note Perfect Burst"); var container = inspector.GenerateContainer("Basic Note Perfect Burst");
var effectTimeField = inspector.GenerateParameterInputField(this, container, "Effect Time", nameof(effectTime)); var effectTimeField = inspector.GenerateInputField(this, container, "Effect Time", nameof(effectTime));
} }
} }