Inspector Secondary Window & QuickCopy

inspector的二级界面,主要用于工具制作。
重新制作了Track的QuickCopy功能
This commit is contained in:
SoulliesOfficial
2025-02-21 01:03:01 -05:00
parent 039bc5bddf
commit cd9ef00d13
50 changed files with 2332 additions and 229 deletions

View File

@@ -26,7 +26,6 @@ namespace Ichni.Editor
public virtual void Initialize(IBaseElement baseElement, string title, string parameterName)
{
this.connectedBaseElement = baseElement;
this.parameterName = parameterName;
if (title != string.Empty)
@@ -37,7 +36,6 @@ namespace Ichni.Editor
{
this.title.gameObject.SetActive(false);
}
}
public virtual void DeviverSet(int DeviveNum){

View File

@@ -0,0 +1,28 @@
using System.Collections;
using System.Collections.Generic;
using Ichni.RhythmGame;
using TMPro;
using UnityEngine;
namespace Ichni.Editor
{
public class DynamicUIGetterInputField : DynamicUIElement
{
public TMP_InputField inputField;
public void SetDefaultText(string text)
{
inputField.text = text;
}
public T GetResult<T>()
{
return (T)System.Convert.ChangeType(inputField.text, typeof(T));
}
public string GetResult()
{
return inputField.text;
}
}
}

View File

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

View File

@@ -8,7 +8,7 @@ using UnityEngine.Events;
namespace Ichni.Editor
{
public class DynamicUIInputField : DynamicUIElement
public class DynamicUIParameterInputField : DynamicUIElement
{
public TMP_InputField inputField;

View File

@@ -0,0 +1,189 @@
using System.Collections;
using System.Collections.Generic;
using Ichni;
using Ichni.Editor;
using Ichni.RhythmGame;
using UnityEngine;
using UnityEngine.Events;
namespace Ichni.Editor
{
public interface IHaveInspection
{
public RectTransform WindowRect { get; set; }
public List<DynamicUIContainer> Containers { get; set; }
public CompositeParameterWindow GenerateCompositeParameterWindow(IBaseElement baseElement, string title,
string parameterName)
{
CompositeParameterWindow compositeParameterWindow =
Object.Instantiate(EditorManager.instance.basePrefabs.compositeParameterWindow,
EditorManager.instance.uiManager.inspector.inspectorCanvas.GetComponent<RectTransform>())
.GetComponent<CompositeParameterWindow>();
compositeParameterWindow.Initialize(baseElement, title, parameterName);
return compositeParameterWindow;
}
public DynamicUIContainer GenerateContainer(string title)
{
DynamicUIContainer container =
Object.Instantiate(EditorManager.instance.basePrefabs.dynamicUIContainer, WindowRect)
.GetComponent<DynamicUIContainer>();
container.title.text = title;
Containers.Add(container);
return container;
}
public DynamicUIContainer GenerateContainer()
{
DynamicUIContainer container =
Object.Instantiate(EditorManager.instance.basePrefabs.dynamicUIContainer, WindowRect)
.GetComponent<DynamicUIContainer>();
Object.Destroy(container.title.gameObject);
Containers.Add(container);
return container;
}
public DynamicUIButton GenerateButton(IBaseElement baseElement, DynamicUIContainer container, string buttonText,
UnityAction function, string title = "null")
{
DynamicUIButton button = Object.Instantiate(EditorManager.instance.basePrefabs.button, container.rect)
.GetComponent<DynamicUIButton>();
button.SetText(buttonText, title != "null");
button.Initialize(baseElement, title, "null");
button.ApplyFunction(function);
container.dynamicUIElements.Add(button);
return button;
}
public DynamicUIToggle GenerateToggle(IBaseElement baseElement, DynamicUIContainer container, string title,
string parameterName)
{
DynamicUIToggle toggle = Object.Instantiate(EditorManager.instance.basePrefabs.toggle, container.rect)
.GetComponent<DynamicUIToggle>();
toggle.Initialize(baseElement, title, parameterName);
container.dynamicUIElements.Add(toggle);
return toggle;
}
public DynamicUIGetterInputField GenerateGetterInputField(DynamicUIContainer container,
string title, string defaultText)
{
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;
}
public DynamicUIParameterInputField GenerateParameterInputField(IBaseElement baseElement,
DynamicUIContainer container,
string title, string parameterName)
{
DynamicUIParameterInputField parameterInputField = Object
.Instantiate(EditorManager.instance.basePrefabs.parameterInputField, container.rect)
.GetComponent<DynamicUIParameterInputField>();
parameterInputField.Initialize(baseElement, title, parameterName);
container.dynamicUIElements.Add(parameterInputField);
return parameterInputField;
}
public DynamicUIVector3InputField GenerateVector3InputField(IBaseElement baseElement,
DynamicUIContainer container,
string title, string parameterName)
{
DynamicUIVector3InputField vector3InputField =
Object.Instantiate(EditorManager.instance.basePrefabs.vector3InputField, container.rect)
.GetComponent<DynamicUIVector3InputField>();
vector3InputField.Initialize(baseElement, title, parameterName);
container.dynamicUIElements.Add(vector3InputField);
return vector3InputField;
}
public DynamicUIBaseColorPicker GenerateBaseColorPicker(IBaseElement baseElement, DynamicUIContainer container,
string title, string parameterName)
{
DynamicUIBaseColorPicker colorPicker = Object
.Instantiate(EditorManager.instance.basePrefabs.baseColorPicker, container.rect)
.GetComponent<DynamicUIBaseColorPicker>();
colorPicker.Initialize(baseElement, title, parameterName);
container.dynamicUIElements.Add(colorPicker);
return colorPicker;
}
public DynamicUIEmissionColorPicker GenerateEmissionColorPicker(IBaseElement baseElement,
DynamicUIContainer container,
string title, string emissionEnabledName, string emissionColorName, string emissionIntensityName)
{
DynamicUIEmissionColorPicker colorPicker = Object
.Instantiate(EditorManager.instance.basePrefabs.emissionColorPicker, container.rect)
.GetComponent<DynamicUIEmissionColorPicker>();
colorPicker.Initialize(baseElement, title, emissionEnabledName, emissionColorName, emissionIntensityName);
container.dynamicUIElements.Add(colorPicker);
return colorPicker;
}
public DynamicUIHintText GenerateHintText(IBaseElement baseElement, DynamicUIContainer container,
string content)
{
DynamicUIHintText hintText = Object.Instantiate(EditorManager.instance.basePrefabs.hintText, container.rect)
.GetComponent<DynamicUIHintText>();
hintText.Initialize(baseElement, string.Empty, string.Empty);
hintText.SetContent(content);
container.dynamicUIElements.Add(hintText);
return hintText;
}
public DynamicUIHintText GenerateHintText(IBaseElement baseElement, DynamicUIContainer container,
System.Func<string> action)
{
DynamicUIHintText hintText = Object.Instantiate(EditorManager.instance.basePrefabs.hintText, container.rect)
.GetComponent<DynamicUIHintText>();
hintText.Initialize(baseElement, string.Empty, string.Empty);
hintText.SetUpdatingContent(action);
container.dynamicUIElements.Add(hintText);
return hintText;
}
public DynamicUIParameterText GenerateParameterText(IBaseElement baseElement, DynamicUIContainer container,
string title,
string parameterName, bool isAlwaysUpdate = false)
{
DynamicUIParameterText parameterText = Object
.Instantiate(EditorManager.instance.basePrefabs.parameterText, container.rect)
.GetComponent<DynamicUIParameterText>();
parameterText.Initialize(baseElement, title, parameterName);
parameterText.isAlwaysUpdated = isAlwaysUpdate;
container.dynamicUIElements.Add(parameterText);
return parameterText;
}
public DynamicUIEnumDropdown GenerateDropdown(IBaseElement baseElement, DynamicUIContainer container,
string title,
System.Type enumType, string parameterName)
{
DynamicUIEnumDropdown enumDropdown = Object
.Instantiate(EditorManager.instance.basePrefabs.enumDropdown, container.rect)
.GetComponent<DynamicUIEnumDropdown>();
enumDropdown.SetUpEnum(enumType);
enumDropdown.Initialize(baseElement, title, parameterName);
container.dynamicUIElements.Add(enumDropdown);
return enumDropdown;
}
public DynamicUIStringListDropdown GenerateDropdown(IBaseElement baseElement, DynamicUIContainer container,
string title,
List<string> stringList, string parameterName)
{
DynamicUIStringListDropdown stringListDropdown = Object
.Instantiate(EditorManager.instance.basePrefabs.stringListDropdown, container.rect)
.GetComponent<DynamicUIStringListDropdown>();
stringListDropdown.SetUpStringList(stringList);
stringListDropdown.Initialize(baseElement, title, parameterName);
container.dynamicUIElements.Add(stringListDropdown);
return stringListDropdown;
}
}
}

View File

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

View File

@@ -9,12 +9,20 @@ using UnityEngine.Events;
namespace Ichni.Editor
{
public partial class Inspector : StaticWindow
public partial class Inspector : StaticWindow, IHaveInspection
{
public GameElement connectedGameElement;
public Canvas inspectorCanvas;
public RectTransform inspectorRect;
public List<DynamicUIContainer> containers;
public RectTransform WindowRect { get; set; }
public List<DynamicUIContainer> Containers { get; set; }
private void Awake()
{
WindowRect = inspectorRect;
Containers = new List<DynamicUIContainer>();
}
/// <summary>
/// 先清空所有的容器然后为当前的GameElement设置Inspector
@@ -26,159 +34,19 @@ namespace Ichni.Editor
connectedGameElement = gameElement;
connectedGameElement.SetUpInspector();
}
public void ClearInspector()
{
containers.ForEach(container => Destroy(container.gameObject));
containers.Clear();
}
}
public partial class Inspector
{
public CompositeParameterWindow GenerateCompositeParameterWindow(IBaseElement baseElement, string title, string parameterName)
{
CompositeParameterWindow compositeParameterWindow =
Instantiate(EditorManager.instance.basePrefabs.compositeParameterWindow,
EditorManager.instance.uiManager.inspector.inspectorCanvas.GetComponent<RectTransform>())
.GetComponent<CompositeParameterWindow>();
compositeParameterWindow.Initialize(baseElement, title, parameterName);
return compositeParameterWindow;
}
public DynamicUIContainer GenerateContainer(string title)
{
DynamicUIContainer container =
Instantiate(EditorManager.instance.basePrefabs.dynamicUIContainer, inspectorRect)
.GetComponent<DynamicUIContainer>();
container.title.text = title;
containers.Add(container);
return container;
Containers.ForEach(container => Destroy(container.gameObject));
Containers.Clear();
}
public DynamicUIContainer GenerateContainer()
public InspectorSecondaryWindow GenerateSecondaryWindow(GameElement gameElement, string title)
{
DynamicUIContainer container =
Instantiate(EditorManager.instance.basePrefabs.dynamicUIContainer, inspectorRect)
.GetComponent<DynamicUIContainer>();
Destroy(container.title.gameObject);
containers.Add(container);
return container;
}
public DynamicUIButton GenerateButton(IBaseElement baseElement, DynamicUIContainer container, string buttonText,
UnityAction function, string title = "null")
{
DynamicUIButton button = Instantiate(EditorManager.instance.basePrefabs.button, container.rect)
.GetComponent<DynamicUIButton>();
button.SetText(buttonText, title != "null");
button.Initialize(baseElement, title, "null");
button.ApplyFunction(function);
container.dynamicUIElements.Add(button);
return button;
}
public DynamicUIToggle GenerateToggle(IBaseElement baseElement, DynamicUIContainer container, string title,
string parameterName)
{
DynamicUIToggle toggle = Instantiate(EditorManager.instance.basePrefabs.toggle, container.rect)
.GetComponent<DynamicUIToggle>();
toggle.Initialize(baseElement, title, parameterName);
container.dynamicUIElements.Add(toggle);
return toggle;
}
public DynamicUIInputField GenerateInputField(IBaseElement baseElement, DynamicUIContainer container,
string title, string parameterName)
{
DynamicUIInputField inputField = Instantiate(EditorManager.instance.basePrefabs.inputField, container.rect)
.GetComponent<DynamicUIInputField>();
inputField.Initialize(baseElement, title, parameterName);
container.dynamicUIElements.Add(inputField);
return inputField;
}
public DynamicUIVector3InputField GenerateVec3InputField(IBaseElement baseElement, DynamicUIContainer container,
string title, string parameterName)
{
DynamicUIVector3InputField vector3InputField =
Instantiate(EditorManager.instance.basePrefabs.vector3InputField, container.rect)
.GetComponent<DynamicUIVector3InputField>();
vector3InputField.Initialize(baseElement, title, parameterName);
container.dynamicUIElements.Add(vector3InputField);
return vector3InputField;
}
public DynamicUIBaseColorPicker GenerateBaseColorPicker(IBaseElement baseElement, DynamicUIContainer container,
string title, string parameterName)
{
DynamicUIBaseColorPicker colorPicker = Instantiate(EditorManager.instance.basePrefabs.baseColorPicker, container.rect)
.GetComponent<DynamicUIBaseColorPicker>();
colorPicker.Initialize(baseElement, title, parameterName);
container.dynamicUIElements.Add(colorPicker);
return colorPicker;
}
public DynamicUIEmissionColorPicker GenerateEmissionColorPicker(IBaseElement baseElement, DynamicUIContainer container,
string title, string emissionEnabledName, string emissionColorName, string emissionIntensityName)
{
DynamicUIEmissionColorPicker colorPicker = Instantiate(EditorManager.instance.basePrefabs.emissionColorPicker, container.rect)
.GetComponent<DynamicUIEmissionColorPicker>();
colorPicker.Initialize(baseElement, title, emissionEnabledName, emissionColorName, emissionIntensityName);
container.dynamicUIElements.Add(colorPicker);
return colorPicker;
}
public DynamicUIHintText GenerateHintText(IBaseElement baseElement, DynamicUIContainer container, string content)
{
DynamicUIHintText hintText = Instantiate(EditorManager.instance.basePrefabs.hintText, container.rect)
.GetComponent<DynamicUIHintText>();
hintText.Initialize(baseElement, string.Empty, string.Empty);
hintText.SetContent(content);
container.dynamicUIElements.Add(hintText);
return hintText;
}
public DynamicUIHintText GenerateHintText(IBaseElement baseElement, DynamicUIContainer container, Func<string> action)
{
DynamicUIHintText hintText = Instantiate(EditorManager.instance.basePrefabs.hintText, container.rect)
.GetComponent<DynamicUIHintText>();
hintText.Initialize(baseElement, string.Empty, string.Empty);
hintText.SetUpdatingContent(action);
container.dynamicUIElements.Add(hintText);
return hintText;
}
public DynamicUIParameterText GenerateParameterText(IBaseElement baseElement, DynamicUIContainer container, string title,
string parameterName, bool isAlwaysUpdate = false)
{
DynamicUIParameterText parameterText = Instantiate(EditorManager.instance.basePrefabs.parameterText, container.rect)
.GetComponent<DynamicUIParameterText>();
parameterText.Initialize(baseElement, title, parameterName);
parameterText.isAlwaysUpdated = isAlwaysUpdate;
container.dynamicUIElements.Add(parameterText);
return parameterText;
}
public DynamicUIEnumDropdown GenerateDropdown(IBaseElement baseElement, DynamicUIContainer container, string title,
Type enumType, string parameterName)
{
DynamicUIEnumDropdown enumDropdown = Instantiate(EditorManager.instance.basePrefabs.enumDropdown, container.rect)
.GetComponent<DynamicUIEnumDropdown>();
enumDropdown.SetUpEnum(enumType);
enumDropdown.Initialize(baseElement, title, parameterName);
container.dynamicUIElements.Add(enumDropdown);
return enumDropdown;
}
public DynamicUIStringListDropdown GenerateDropdown(IBaseElement baseElement, DynamicUIContainer container, string title,
List<string> stringList, string parameterName)
{
DynamicUIStringListDropdown stringListDropdown = Instantiate(EditorManager.instance.basePrefabs.stringListDropdown, container.rect)
.GetComponent<DynamicUIStringListDropdown>();
stringListDropdown.SetUpStringList(stringList);
stringListDropdown.Initialize(baseElement, title, parameterName);
container.dynamicUIElements.Add(stringListDropdown);
return stringListDropdown;
InspectorSecondaryWindow secondaryWindow = Instantiate(EditorManager.instance.basePrefabs.inspectorSecondaryWindow,
inspectorCanvas.transform).GetComponent<InspectorSecondaryWindow>();
secondaryWindow.Initialize(gameElement, title);
return secondaryWindow;
}
}
}

View File

@@ -0,0 +1,29 @@
using System.Collections;
using System.Collections.Generic;
using Ichni.RhythmGame;
using UnityEngine;
namespace Ichni.Editor
{
public class InspectorSecondaryWindow : MovableWindow, IHaveInspection
{
public GameElement connectedGameElement;
public RectTransform WindowRect { get; set; }
public List<DynamicUIContainer> Containers { get; set; }
public void Initialize(GameElement gameElement, string title)
{
WindowRect = windowRect;
Containers = new List<DynamicUIContainer>();
connectedGameElement = gameElement;
this.title.text = title;
closeButton.onClick.AddListener(() =>
{
Destroy(gameObject);
});
}
}
}

View File

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

View File

@@ -12,6 +12,5 @@ namespace Ichni.Editor
public RectTransform windowRect;
public Button closeButton;
public TMP_Text title;
public DynamicUIContainer container;
}
}

View File

@@ -3,6 +3,7 @@ using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Dreamteck.Splines;
using Ichni.Editor;
using Ichni.RhythmGame.Beatmap;
using Lean.Pool;
using Unity.Mathematics;
@@ -70,6 +71,7 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
base.SetUpInspector();
var container = inspector.GenerateContainer("Displacement");
var positionXButton = inspector.GenerateButton(this, container, "Position X",

View File

@@ -46,8 +46,6 @@ namespace Ichni.RhythmGame
throw new NotImplementedException();
}
public Inspector inspector => EditorManager.instance.uiManager.inspector;
public void SetUpInspector()
{

View File

@@ -1,5 +1,6 @@
using System.Collections;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
@@ -79,6 +80,7 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Color");
var baseColor = inspector.GenerateBaseColorPicker(this, container, "Base Color", nameof(originalBaseColor));
if ((attachedGameElement as IHaveColorSubmodule).haveEmission)

View File

@@ -61,6 +61,8 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
foreach (var effect in effectCollection)
{
var container = inspector.GenerateContainer(effect.Key);
@@ -145,8 +147,7 @@ namespace Ichni.RhythmGame
}
public BaseElement_BM matchedBM { get; set; }
public Inspector inspector => EditorManager.instance.uiManager.inspector;
/// <summary>
/// 效果的持续时间如果为0则表示瞬间效果
/// </summary>

View File

@@ -13,8 +13,6 @@ namespace Ichni.RhythmGame
public BaseElement_BM matchedBM { get; set; }
public Inspector inspector => EditorManager.instance.uiManager.inspector;
public SubmoduleBase(GameElement attachedGameElement)
{
this.attachedGameElement = attachedGameElement;

View File

@@ -1,6 +1,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Ichni.Editor;
using Ichni.RhythmGame.Beatmap;
using Unity.Mathematics;
using UnityEngine;
@@ -87,10 +88,11 @@ namespace Ichni.RhythmGame
{
public override void SetUpInspector()
{
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.GenerateInputField(this, container, "Start Time", nameof(startTime));
var endTimeInputField = inspector.GenerateInputField(this, container, "End Time", nameof(endTime));
var startTimeInputField = inspector.GenerateParameterInputField(this, container, "Start Time", nameof(startTime));
var endTimeInputField = inspector.GenerateParameterInputField(this, container, "End Time", nameof(endTime));
void SetInputFieldInteractable(bool interactable)
{

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Ichni.Editor;
using Ichni.RhythmGame.Beatmap;
using UniRx;
using Unity.Mathematics;
@@ -86,14 +87,16 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Transform");
var originalPosInputField =
inspector.GenerateVec3InputField(this, container, "Start Position", nameof(originalPosition));
inspector.GenerateVector3InputField(this, container, "Start Position", nameof(originalPosition));
var originalRotInputField =
inspector.GenerateVec3InputField(this, container, "Start Rotation", nameof(originalEulerAngles));
inspector.GenerateVector3InputField(this, container, "Start Rotation", nameof(originalEulerAngles));
var originalScaleInputField =
inspector.GenerateVec3InputField(this, container, "Start Scale", nameof(originalScale));
inspector.GenerateVector3InputField(this, container, "Start Scale", nameof(originalScale));
var currentPosText =
inspector.GenerateParameterText(this, container, "Current Position", nameof(currentPosition), true);
var currentRotText =
@@ -135,6 +138,8 @@ namespace Ichni.RhythmGame
{
return;
}
bool willRefresh = false;
if (transformSubmodule.scaleDirtyMark)
{
@@ -147,6 +152,7 @@ namespace Ichni.RhythmGame
transformSubmodule.currentScale = transformSubmodule.originalScale + offset;
attachedGameElement.transform.localScale = transformSubmodule.currentScale;
transformSubmodule.scaleDirtyMark = false;
willRefresh = true;
}
if (transformSubmodule.eulerAnglesDirtyMark)
@@ -160,6 +166,7 @@ namespace Ichni.RhythmGame
transformSubmodule.currentEulerAngles = transformSubmodule.originalEulerAngles + offset;
attachedGameElement.transform.localEulerAngles = transformSubmodule.currentEulerAngles;
transformSubmodule.eulerAnglesDirtyMark = false;
willRefresh = true;
}
if (transformSubmodule.positionDirtyMark)
@@ -173,11 +180,18 @@ namespace Ichni.RhythmGame
transformSubmodule.currentPosition = transformSubmodule.originalPosition + offset;
attachedGameElement.transform.localPosition = transformSubmodule.currentPosition;
transformSubmodule.positionDirtyMark = false;
willRefresh = true;
}
if(willRefresh)
{
attachedGameElement.Refresh();
}
transformSubmodule.scaleOffset.Clear();
transformSubmodule.eulerAnglesOffset.Clear();
transformSubmodule.positionOffset.Clear();
}).AddTo(attachedGameElement);
}
}

View File

@@ -43,6 +43,7 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
base.SetUpInspector();
var container = inspector.GenerateContainer("Generate");
var folderButton = inspector.GenerateButton(this, container, "Folder",

View File

@@ -53,11 +53,12 @@ namespace Ichni.Editor
public override void SetUpInspector()
{
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.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 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 applyButton = inspector.GenerateButton(this, container, "Apply", Refresh);
useSkyboxToggle.AddListenerFunction(EditorManager.instance.backgroundController.EnableBackground);
useSkyboxToggle.AddListenerFunction(value =>

View File

@@ -39,9 +39,6 @@ namespace Ichni.RhythmGame
//存档类
public BaseElement_BM matchedBM { get; set; }
public Inspector inspector => EditorManager.instance.uiManager.inspector;
/// <summary>
/// 首次初始化
/// </summary>
@@ -151,8 +148,9 @@ namespace Ichni.RhythmGame
{
public virtual void SetUpInspector() //被点击时设置第一层Inspector
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Element Info");
var nameInputField = inspector.GenerateInputField(this, container, GetType().Name + "'s Name", nameof(elementName));
var nameInputField = inspector.GenerateParameterInputField(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

@@ -38,9 +38,10 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Bloom Shake");
var effectTimeField = inspector.GenerateInputField(this, container, "Bloom Time", nameof(bloomTime));
var bloomPeakField = inspector.GenerateInputField(this, container, "Bloom Peak", nameof(bloomPeak));
var effectTimeField = inspector.GenerateParameterInputField(this, container, "Bloom Time", nameof(bloomTime));
var bloomPeakField = inspector.GenerateParameterInputField(this, container, "Bloom Peak", nameof(bloomPeak));
}
}

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.RhythmGame.Beatmap;
using Sirenix.OdinInspector;
using UnityEngine;
@@ -42,8 +43,9 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Time Effects Collection");
var timeInputField = inspector.GenerateInputField(this, container, "Time", nameof(time));
var timeInputField = inspector.GenerateParameterInputField(this, container, "Time", nameof(time));
var addEffectButton = inspector.GenerateButton(this, container, "Add Effect", () =>
{
IHaveEffectSubmodule.EffectCollection.TryGetValue("BloomShake", out var effect);

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Ichni.Editor;
using UnityEngine;
namespace Ichni.RhythmGame
@@ -15,7 +16,8 @@ namespace Ichni.RhythmGame
tempObj.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
tempObj.themeBundleName = string.Empty;
tempObj.objectName = string.Empty;
tempObj.themeBundleList = ThemeBundleManager.instance.loadedThemeBundleList.ConvertAll(x => x.themeBundleName);
tempObj.themeBundleList =
ThemeBundleManager.instance.loadedThemeBundleList.ConvertAll(x => x.themeBundleName);
tempObj.objectNameList = new List<string>();
return tempObj;
}
@@ -25,27 +27,33 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
var container = inspector.GenerateContainer("Temporary Object");
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var themeBundleDropdown = inspector.GenerateDropdown(this, container, "Theme Bundle", themeBundleList, nameof(themeBundleName));
themeBundleDropdown.AddListenerFunction(_ => inspector.SetInspector(this));
var container = inspector.GenerateContainer("Temporary Object");
var themeBundleDropdown = inspector.GenerateDropdown(this, container, "Theme Bundle",
themeBundleList, nameof(themeBundleName));
themeBundleDropdown.AddListenerFunction(_ => inspectorMain.SetInspector(this));
if (themeBundleName != String.Empty)
{
objectNameList = ThemeBundleManager.instance.GetThemeBundle(themeBundleName).assetList_GameObject.ConvertAll(x => x.name);
var objectNameDropdown = inspector.GenerateDropdown(this, container, "Object Name", objectNameList, nameof(objectName));
objectNameDropdown.AddListenerFunction(_ => inspector.SetInspector(this));
var objectNameDropdown =
inspector.GenerateDropdown(this, container, "Object Name", objectNameList, nameof(objectName));
objectNameDropdown.AddListenerFunction(_ => inspectorMain.SetInspector(this));
}
else
{
var objectNameDropdown = inspector.GenerateDropdown(this, container, "Object Name", new List<string>(), nameof(objectName));
var objectNameDropdown = inspector.GenerateDropdown(this, container, "Object Name",
new List<string>(), nameof(objectName));
objectNameDropdown.dropdown.interactable = false;
}
var generateButton = inspector.GenerateButton(this, container, "Generate", () =>
{
Delete();
inspector.ClearInspector();
inspectorMain.ClearInspector();
SubstantialObject.GenerateElement(elementName, elementGuid, tags, false, themeBundleName, objectName, parentElement);
});

View File

@@ -3,6 +3,7 @@ using System.Collections;
using System.Collections.Generic;
using Dreamteck.Splines;
using Ichni;
using Ichni.Editor;
using Ichni.RhythmGame.Beatmap;
using Lean.Pool;
using Sirenix.OdinInspector;
@@ -82,6 +83,8 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
base.SetUpInspector();
var container = inspector.GenerateContainer("Path Node");

View File

@@ -1,6 +1,7 @@
using System;
using System.Collections;
using System.Collections.Generic;
using Ichni.Editor;
using Ichni.RhythmGame.Beatmap;
using Lean.Pool;
using UnityEngine;
@@ -70,6 +71,8 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
base.SetUpInspector();
var container = inspector.GenerateContainer("Track");
@@ -78,26 +81,26 @@ namespace Ichni.RhythmGame
{
trackPathSubmodule = new TrackPathSubmodule(this, TrackSpaceType.CatmullRom,
TrackSamplingType.TimeDistributed, false);
inspector.SetInspector(this);
inspectorMain.SetInspector(this);
});
var trackTimeMovableButton = inspector.GenerateButton(this, container, "Track Time Movable",
() =>
{
trackTimeSubmodule = new TrackTimeSubmoduleMovable(this, 0, 1, 1, AnimationCurveType.Linear);
inspector.SetInspector(this);
inspectorMain.SetInspector(this);
});
var trackTimeStaticButton = inspector.GenerateButton(this, container, "Track Time Static",
() =>
{
trackTimeSubmodule = new TrackTimeSubmoduleStatic(this, 1, AnimationCurveType.Linear);
inspector.SetInspector(this);
inspectorMain.SetInspector(this);
});
var trackRendererAutoOrientButton = inspector.GenerateButton(this, container, "Track Renderer Auto Orient",
() =>
{
trackRendererSubmodule = new TrackRendererSubmoduleAutoOrient(this);
inspector.SetInspector(this);
inspectorMain.SetInspector(this);
});
var trackRendererPathGeneratorButton = inspector.GenerateButton(this, container,
@@ -105,7 +108,7 @@ namespace Ichni.RhythmGame
() =>
{
trackRendererSubmodule = new TrackRendererSubmodulePathGenerator(this);
inspector.SetInspector(this);
inspectorMain.SetInspector(this);
});
if (trackPathSubmodule != null)
@@ -141,6 +144,29 @@ namespace Ichni.RhythmGame
Swirl.GenerateElement("New Swirl", Guid.NewGuid(), new List<string>(), true, this,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat());
});
var QuickCopyButton = inspector.GenerateButton(this, container, "QuickCopy", () =>
{
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");
qcWindow.GenerateButton(this, qcContainer, "Copy", () =>
{
CopyPasteDeleteModule cpd = EditorManager.instance.operationManager.CopyPasteDeleteModule;
cpd.CopyElement(this);
cpd.PasteElement(parentElement);
Track newTrack = cpd.pastedElementList[0] as Track;
newTrack.trackPathSubmodule.pathNodeList.ForEach(pn =>
{
Vector3 offset = new Vector3(xField.GetResult<float>(), yField.GetResult<float>(), zField.GetResult<float>());
pn.transformSubmodule.originalPosition += offset;
pn.transformSubmodule.Refresh();
});
});
});
container.SetDeviver(1);
}
}

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
using Dreamteck.Splines;
using Ichni.Editor;
using Ichni.RhythmGame;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
@@ -90,6 +91,8 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
base.SetUpInspector();
var container = inspector.GenerateContainer("Cross Track Point");
var trackSwitchButton = inspector.GenerateButton(this, container, "Track Switch",

View File

@@ -2,6 +2,7 @@ using System;
using System.Collections;
using System.Collections.Generic;
using Dreamteck.Splines;
using Ichni.Editor;
using Ichni.RhythmGame.Beatmap;
using Unity.VisualScripting;
using UnityEngine;
@@ -73,6 +74,7 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Track Path");
var trackSpaceDropdown =
inspector.GenerateDropdown(this, container, "Space Type", typeof(Track.TrackSpaceType), nameof(trackSpaceType));
@@ -120,7 +122,7 @@ namespace Ichni.RhythmGame
public override void DuplicateBM(GameElement attached)
{
Track track = attachedElement as Track;
Track track = attached as Track;
track.trackPathSubmodule = new TrackPathSubmodule(track, trackSpaceType, trackSamplingType, isClosed);
track.submoduleList.Add(track.trackPathSubmodule);
}

View File

@@ -1,8 +1,10 @@
using System.Collections;
using System.Collections.Generic;
using Dreamteck.Splines;
using Ichni.Editor;
using Unity.VisualScripting;
using UnityEngine;
using Inspector = Unity.VisualScripting.Inspector;
namespace Ichni.RhythmGame
{
@@ -63,6 +65,7 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Track Renderer Auto Orient");
}
}
@@ -143,6 +146,7 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Track Renderer Path Generator");
}
}

View File

@@ -1,5 +1,6 @@
using System.Collections;
using System.Collections.Generic;
using Ichni.Editor;
using UnityEngine;
namespace Ichni.RhythmGame
@@ -70,12 +71,15 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Track Time Movable");
var startTimeInputField =
inspector.GenerateInputField(this, container, "Start Time", nameof(trackStartTime));
var endTimeInputField = inspector.GenerateInputField(this, container, "End Time", nameof(trackEndTime));
inspector.GenerateParameterInputField(this, container, "Start Time", nameof(trackStartTime));
var endTimeInputField = inspector.GenerateParameterInputField(this, container, "End Time", nameof(trackEndTime));
var visibleTimeInputField =
inspector.GenerateInputField(this, container, "Visible Time Length", nameof(visibleTrackTimeLength));
inspector.GenerateParameterInputField(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",
@@ -83,7 +87,7 @@ namespace Ichni.RhythmGame
{
Delete();
track.trackTimeSubmodule = null;
inspector.SetInspector(track);
inspectorMain.SetInspector(track);
track.Refresh();
});
}
@@ -153,9 +157,12 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Track Time Static");
var totalTimeInputField =
inspector.GenerateInputField(this, container, "Total Time", nameof(trackTotalTime));
inspector.GenerateParameterInputField(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",
@@ -163,7 +170,7 @@ namespace Ichni.RhythmGame
{
Delete();
track.trackTimeSubmodule = null;
inspector.SetInspector(track);
inspectorMain.SetInspector(track);
track.Refresh();
});
}

View File

@@ -31,8 +31,13 @@ public class BasePrefabsCollection : SerializedScriptableObject
[Title("Effect相关")] public GameObject bloomShake;
[Title("DynamicUI相关-Simple")] public GameObject dynamicUIContainer;
public GameObject inputField;
[Title("Inspector相关")]
public GameObject inspectorSecondaryWindow;
[Title("DynamicUI相关-Simple")]
public GameObject dynamicUIContainer;
[FormerlySerializedAs("inputField")] public GameObject parameterInputField;
public GameObject getterInputField;
[FormerlySerializedAs("Vector3inputField")] public GameObject vector3InputField;
[FormerlySerializedAs("text")] public GameObject parameterText;
public GameObject hintText;

View File

@@ -35,11 +35,12 @@ namespace Ichni.Editor
public void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
string ShowCameraType() => isSceneCameraActive ? "Scene Camera" : "Game Camera";
var container = EditorManager.instance.uiManager.inspector.GenerateContainer("Camera Manager");
var cameraTypeText = EditorManager.instance.uiManager.inspector.GenerateHintText(this, container, ShowCameraType);
var switchCameraButton = EditorManager.instance.uiManager.inspector.GenerateButton(this, container, "Switch Camera", SwitchCamera);
var cameraMoveSpeedField = EditorManager.instance.uiManager.inspector.GenerateInputField(this, container, "Scene Camera Move Speed", nameof(sceneCameraMoveSpeed));
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));
sceneCamera.SetUpInspector();
}
}

View File

@@ -64,6 +64,8 @@ namespace Ichni
public override void SetUpInspector()
{
IHaveInspection inspector = uiManager.inspector;
var container = inspector.GenerateContainer("Editor Manager");
var judgeTypeDropdown = inspector.GenerateDropdown(this, container, "Judge Type",
typeof(NoteBase.NoteJudgeType), nameof(currentJudgeType));

View File

@@ -33,7 +33,8 @@ namespace Ichni.Editor
public class CopyPasteDeleteModule
{
public GameElement copiedElement;
public List<GameElement> pastedElementList;
public void CopyElement(GameElement gameElement)
{
LogWindow.Log("Copied element: " + gameElement.elementName);
@@ -49,6 +50,7 @@ namespace Ichni.Editor
}
LogWindow.Log("Pasted element: " + copiedElement.elementName + " to " + parentElement.elementName);
pastedElementList = new List<GameElement>();
AffiliatedPaste(copiedElement, parentElement);
}
@@ -74,9 +76,11 @@ namespace Ichni.Editor
{
gameElement.SaveBM();
GameElement pastedElement = (gameElement.matchedBM as GameElement_BM).DuplicateBM(parent);
pastedElementList.Add(pastedElement);
gameElement.submoduleList.ForEach(submodule =>
{
Debug.Log(submodule.GetType() + " is pasted.");
submodule.SaveBM();
(submodule.matchedBM as Submodule_BM).DuplicateBM(pastedElement);
});

View File

@@ -19,11 +19,11 @@ namespace Ichni.Editor
public void SetUpInspector()
{
Inspector inspector = EditorManager.instance.uiManager.inspector;
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.GenerateInputField(this, container, "Perspective Angle", nameof(perspectiveAngle));
var orthographicSizeField = inspector.GenerateInputField(this, container, "Orthographic Size", nameof(orthographicSize));
var perspectiveAngleField = inspector.GenerateParameterInputField(this, container, "Perspective Angle", nameof(perspectiveAngle));
var orthographicSizeField = inspector.GenerateParameterInputField(this, container, "Orthographic Size", nameof(orthographicSize));
viewTypeDropdown.AddListenerFunction(_ =>
{