重构inspector!

This commit is contained in:
SoulliesOfficial
2025-04-14 17:49:47 -04:00
parent bbca8b43fe
commit 11543b4997
81 changed files with 1037 additions and 903 deletions

View File

@@ -43,38 +43,45 @@ namespace Ichni.RhythmGame
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
base.SetUpInspector();
var container = inspector.GenerateContainer("Generate");
var folderButton = inspector.GenerateButton(this, container, "Folder",
var generateBase = container.GenerateSubcontainer(3);
var folderButton = inspector.GenerateButton(this, generateBase, "Folder",
() => ElementFolder.GenerateElement("New Folder", Guid.NewGuid(), new List<string>(), true, this));
var trackButton = inspector.GenerateButton(this, container, "Track",
var trackButton = inspector.GenerateButton(this, generateBase, "Track",
() => Track.GenerateElement("New Track", Guid.NewGuid(), new List<string>(), true, this));
var cameraButton = inspector.GenerateButton(this, container, "Camera",
var cameraButton = inspector.GenerateButton(this, generateBase, "Camera",
() => GameCamera.GenerateElement("New Camera", Guid.NewGuid(), new List<string>(), true, this,
GameCamera.CameraViewType.Perspective, 60, 10));
var crossTrackPoint = inspector.GenerateButton(this, container, "Cross Track Point",
var crossTrackPoint = inspector.GenerateButton(this, generateBase, "Cross Track Point",
() => CrossTrackPoint.GenerateElement("New Cross Track Point", Guid.NewGuid(), new List<string>(), true,
this, new FlexibleInt(), new FlexibleFloat()));
var tapButton = inspector.GenerateButton(this, container, "Tap",
var generateNote = container.GenerateSubcontainer(3);
var tapButton = inspector.GenerateButton(this, generateNote, "Tap",
() => Tap.GenerateElement("New Tap", Guid.NewGuid(), new List<string>(), true, this, 0f));
var stayButton = inspector.GenerateButton(this, container, "Stay",
var stayButton = inspector.GenerateButton(this, generateNote, "Stay",
() => Stay.GenerateElement("New Stay", Guid.NewGuid(), new List<string>(), true, this, 0f));
// var holdButton = inspector.GenerateButton(this, container, "Generate Hold",
// () => Hold.GenerateElement("New Hold", Guid.NewGuid(), new List<string>(), true, this, 0f));
var flickButton = inspector.GenerateButton(this, container, "Flick",
var holdButton = inspector.GenerateButton(this, generateNote, "Hold",
() => Hold.GenerateElement("New Hold", Guid.NewGuid(), new List<string>(), true, this, 0f, 1f));
var flickButton = inspector.GenerateButton(this, generateNote, "Flick",
() => Flick.GenerateElement("New Flick", Guid.NewGuid(), new List<string>(), true, this, 0f,
new List<Vector2>()));
var environmentObjectButton = inspector.GenerateButton(this, container, "Environment Object",
var generateEnvironment = container.GenerateSubcontainer(3);
var environmentObjectButton = inspector.GenerateButton(this, generateEnvironment, "Environment Object",
() => TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(),
true, this));
var displacementButton = inspector.GenerateButton(this, container, "Displacement",
() => Displacement.GenerateElement("New Displacement", Guid.NewGuid(), new List<string>(), true, this,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()));
var swirlButton = inspector.GenerateButton(this, container, "Swirl",
() => Swirl.GenerateElement("New Swirl", Guid.NewGuid(), new List<string>(), true, this,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()));
var timeEffectsCollectionButton = inspector.GenerateButton(this, container, "Time Effects Collection",
var timeEffectsCollectionButton = inspector.GenerateButton(this, generateEnvironment, "Time Effects Collection",
() => TimeEffectsCollection.GenerateElement("New Time Effects Collection", Guid.NewGuid(),
new List<string>(), true, this, 0));
container.SetDeviver(1);
var generateAnimation = container.GenerateSubcontainer(3);
var displacementButton = inspector.GenerateButton(this, generateAnimation, "Displacement",
() => Displacement.GenerateElement("New Displacement", Guid.NewGuid(), new List<string>(), true, this,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()));
var swirlButton = inspector.GenerateButton(this, generateAnimation, "Swirl",
() => Swirl.GenerateElement("New Swirl", Guid.NewGuid(), new List<string>(), true, this,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()));
}
}

View File

@@ -41,33 +41,29 @@ namespace Ichni.RhythmGame
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Generate");
var environmentObjectButton = inspector.GenerateButton(this, container, "Environment Object",
var objectSettings = container.GenerateSubcontainer(3);
var environmentObjectButton = inspector.GenerateButton(this, objectSettings, "Environment Object",
() => TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(),
true, this));
var isStaticToggle = inspector.GenerateToggle(this, container, "Is Static", nameof(isStatic));
isStaticToggle.AddListenerFunction(() => gameObject.isStatic = isStatic);
var isStaticToggle = inspector.GenerateToggle(this, objectSettings, "Is Static", nameof(isStatic))
.AddListenerFunction(() => gameObject.isStatic = isStatic);
var generateContainer = inspector.GenerateContainer("Generate");
var generateDisplacementButton = inspector.GenerateButton(this, generateContainer, "Displacement",
var generateAnimation = container.GenerateSubcontainer(3);
var generateDisplacementButton = inspector.GenerateButton(this, generateAnimation, "Displacement",
() => Displacement.GenerateElement("New Displacement", Guid.NewGuid(), new List<string>(), true,
this, new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()));
var generateSwirlButton = inspector.GenerateButton(this, generateContainer, "Swirl",
var generateSwirlButton = inspector.GenerateButton(this, generateAnimation, "Swirl",
() => Swirl.GenerateElement("New Swirl", Guid.NewGuid(), new List<string>(), true,
this, new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()));
var generateScaleButton = inspector.GenerateButton(this, generateContainer, "Scale",
var generateScaleButton = inspector.GenerateButton(this, generateAnimation, "Scale",
() => Scale.GenerateElement("New Scale", Guid.NewGuid(), new List<string>(), true,
this, new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()));
var generateBaseColorChangeButton = inspector.GenerateButton(this, generateContainer, "Base Color Change",
var generateBaseColorChangeButton = inspector.GenerateButton(this, generateAnimation, "Base Color Change",
() => BaseColorChange.GenerateElement("New Base Color Change", Guid.NewGuid(), new List<string>(), true,
this, new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()));
if (haveEmission)
{
var generateEmissionColorChangeButton = inspector.GenerateButton(this, generateContainer, "Emission Color Change",
var generateEmissionColorChangeButton = inspector.GenerateButton(this, generateAnimation, "Emission Color Change",
() => EmissionColorChange.GenerateElement("New Emission Color Change", Guid.NewGuid(), new List<string>(), true,
this, new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()));
}

View File

@@ -157,12 +157,17 @@ namespace Ichni.RhythmGame
{
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 guidText = inspector.GenerateParameterText(this, container, "Element GUID", nameof(elementGuid));
var tagsListButton = inspector.GenerateButton(this, container, "Tags List", () =>
//基础信息
var info = container.GenerateSubcontainer(3);
var nameInputField = inspector.GenerateInputField(this, info, GetType().Name + "'s Name", nameof(elementName));
var guidText = inspector.GenerateParameterText(this, info, "Element GUID", nameof(elementGuid));
var tagsListButton = inspector.GenerateButton(this, info, "Tags List", () =>
{
inspector.GenerateCompositeParameterWindow(this, "Tags List", nameof(tags)).SetAsStringList();
});
//次级模块
foreach (var submodule in submoduleList)
{
submodule.SetUpInspector();

View File

@@ -44,12 +44,13 @@ namespace Ichni.RhythmGame
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Bloom Shake");
var effectTimeField = inspector.GenerateInputField(this, container, "Bloom Time", nameof(duration));
var bloomPeakField = inspector.GenerateInputField(this, container, "Bloom Peak", nameof(peak));
var intensityCurveButton = inspector.GenerateButton(this, container, "Intensity Curve", () =>
var effectSettings = container.GenerateSubcontainer(3);
var effectTimeField = inspector.GenerateInputField(this, effectSettings, "Bloom Time", nameof(duration));
var bloomPeakField = inspector.GenerateInputField(this, effectSettings, "Bloom Peak", nameof(peak));
var intensityCurveButton = inspector.GenerateButton(this, effectSettings, "Intensity Curve", () =>
{
var intensityCurveWindow = inspector.GenerateCompositeParameterWindow(this, "Intensity Curve", nameof(intensityCurve));
intensityCurveWindow.SetAsCustomCurve();
var intensityCurveWindow =
inspector.GenerateCompositeParameterWindow(this, "Intensity Curve", nameof(intensityCurve)).SetAsCustomCurve();
});
}
}

View File

@@ -48,11 +48,12 @@ namespace Ichni.RhythmGame
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Camera Shake");
var durationInputField = inspector.GenerateInputField(this, container, "Duration", nameof(duration));
var frequencyInputField = inspector.GenerateInputField(this, container, "Frequency", nameof(frequency));
var amplitudeXInputField = inspector.GenerateInputField(this, container, "Amplitude X", nameof(amplitudeX));
var amplitudeYInputField = inspector.GenerateInputField(this, container, "Amplitude Y", nameof(amplitudeY));
var amplitudeZInputField = inspector.GenerateInputField(this, container, "Amplitude Z", nameof(amplitudeZ));
var effectSettings = container.GenerateSubcontainer(3);
var durationInputField = inspector.GenerateInputField(this, effectSettings, "Duration", nameof(duration));
var frequencyInputField = inspector.GenerateInputField(this, effectSettings, "Frequency", nameof(frequency));
var amplitudeXInputField = inspector.GenerateInputField(this, effectSettings, "Amplitude X", nameof(amplitudeX));
var amplitudeYInputField = inspector.GenerateInputField(this, effectSettings, "Amplitude Y", nameof(amplitudeY));
var amplitudeZInputField = inspector.GenerateInputField(this, effectSettings, "Amplitude Z", nameof(amplitudeZ));
}
}

View File

@@ -42,12 +42,13 @@ namespace Ichni.RhythmGame
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Chromatic Aberration");
var effectTimeField = inspector.GenerateInputField(this, container, "Duration", nameof(duration));
var bloomPeakField = inspector.GenerateInputField(this, container, "Peak Value", nameof(peak));
var intensityCurveButton = inspector.GenerateButton(this, container, "Intensity Curve", () =>
var effectSettings = container.GenerateSubcontainer(3);
var effectTimeField = inspector.GenerateInputField(this, effectSettings, "Duration", nameof(duration));
var bloomPeakField = inspector.GenerateInputField(this, effectSettings, "Peak Value", nameof(peak));
var intensityCurveButton = inspector.GenerateButton(this, effectSettings, "Intensity Curve", () =>
{
var intensityCurveWindow = inspector.GenerateCompositeParameterWindow(this, "Intensity Curve", nameof(intensityCurve));
intensityCurveWindow.SetAsCustomCurve();
var intensityCurveWindow =
inspector.GenerateCompositeParameterWindow(this, "Intensity Curve", nameof(intensityCurve)).SetAsCustomCurve();
});
}
}

View File

@@ -62,8 +62,9 @@ namespace Ichni.RhythmGame
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Enable Control");
var connectedGameElementInputField = inspector.GenerateInputField(container, "Game Element Name");
var connectGameElementButton = inspector.GenerateButton(this, container, "Connect Game Element", () =>
var effectSettings = container.GenerateSubcontainer(3);
var connectedGameElementInputField = inspector.GenerateInputField(effectSettings, "Game Element Name");
var connectGameElementButton = inspector.GenerateButton(this, effectSettings, "Connect Game Element", () =>
{
connectedGameElement = EditorManager.instance.beatmapContainer.gameElementList
.First(e => e.elementName == connectedGameElementInputField.GetValue<string>());
@@ -77,14 +78,15 @@ namespace Ichni.RhythmGame
});
string ShowConnection() => connectedGameElement == null ? "No Game Element Connected" : "Connected With: " + connectedGameElement.elementName;
var connectHintText = inspector.GenerateHintText(this, container, ShowConnection);
var connectHintText = inspector.GenerateHintText(this, effectSettings, ShowConnection);
var connectedVariableNameInputField = inspector.GenerateInputField(this, container, "Connected Variable Name", nameof(connectedVariableName));
var enableValueInputField = inspector.GenerateInputField(this, container, "Enable Value", nameof(enableValue));
var connectedVariableNameInputField = inspector.GenerateInputField(this, effectSettings, "Connected Variable Name", nameof(connectedVariableName));
var enableValueInputField = inspector.GenerateInputField(this, effectSettings, "Enable Value", nameof(enableValue));
var useExpressionToggle = inspector.GenerateToggle(this, container, "Use Expression", nameof(useExpression));
// 自定义表达式暂时不可用
var useExpressionToggle = inspector.GenerateToggle(this, effectSettings, "Use Expression", nameof(useExpression));
useExpressionToggle.toggle.interactable = false;
var expressionInputField = inspector.GenerateInputField(this, container, "Expression", nameof(expression));
var expressionInputField = inspector.GenerateInputField(this, effectSettings, "Expression", nameof(expression));
expressionInputField.inputField.interactable = false;
}
}

View File

@@ -45,11 +45,12 @@ namespace Ichni.RhythmGame
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Set Integer");
var targetVariableNameInputField = inspector.GenerateInputField(this, container, "Target Variable Name", nameof(targetVariableName));
var targetValueInputField = inspector.GenerateInputField(this, container, "Target Value", nameof(targetValue));
var isRandomToggle = inspector.GenerateToggle(this, container, "Is Random", nameof(isRandom));
var minValueInputField = inspector.GenerateInputField(this, container, "Min Value", nameof(minValue));
var maxValueInputField = inspector.GenerateInputField(this, container, "Max Value", nameof(maxValue));
var effectSettings = container.GenerateSubcontainer(3);
var targetVariableNameInputField = inspector.GenerateInputField(this, effectSettings, "Target Variable Name", nameof(targetVariableName));
var targetValueInputField = inspector.GenerateInputField(this, effectSettings, "Target Value", nameof(targetValue));
var isRandomToggle = inspector.GenerateToggle(this, effectSettings, "Is Random", nameof(isRandom));
var minValueInputField = inspector.GenerateInputField(this, effectSettings, "Min Value", nameof(minValue));
var maxValueInputField = inspector.GenerateInputField(this, effectSettings, "Max Value", nameof(maxValue));
}
}

View File

@@ -50,7 +50,8 @@ namespace Ichni.RhythmGame
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Time Effects Collection");
var timeInputField = inspector.GenerateInputField(this, container, "Time", nameof(time));
var collectionSettings = container.GenerateSubcontainer(3);
var timeInputField = inspector.GenerateInputField(this, collectionSettings, "Time", nameof(time));
}
}

View File

@@ -51,16 +51,18 @@ namespace Ichni.RhythmGame
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Vignette");
var durationField = inspector.GenerateInputField(this, container, "Duration", nameof(duration));
var peakField = inspector.GenerateInputField(this, container, "Peak Value", nameof(peak));
var smoothnessField = inspector.GenerateInputField(this, container, "Smoothness", nameof(smoothness));
var colorField = inspector.GenerateBaseColorPicker(this, container, "Color", nameof(color));
var intensityCurveButton = inspector.GenerateButton(this, container, "Intensity Curve", () =>
var effectSettings = container.GenerateSubcontainer(3);
var durationField = inspector.GenerateInputField(this, effectSettings, "Duration", nameof(duration));
var peakField = inspector.GenerateInputField(this, effectSettings, "Peak Value", nameof(peak));
var smoothnessField = inspector.GenerateInputField(this, effectSettings, "Smoothness", nameof(smoothness));
var intensityCurveButton = inspector.GenerateButton(this, effectSettings, "Intensity Curve", () =>
{
var intensityCurveWindow = inspector.GenerateCompositeParameterWindow(this, "Intensity Curve", nameof(intensityCurve));
intensityCurveWindow.SetAsCustomCurve();
var intensityCurveWindow =
inspector.GenerateCompositeParameterWindow(this, "Intensity Curve", nameof(intensityCurve)).SetAsCustomCurve();
});
container.SetDeviver(1);
var colorSettings = container.GenerateSubcontainer(3);
var colorField = inspector.GenerateBaseColorPicker(this, colorSettings, "Color", nameof(color));
}
}

View File

@@ -62,11 +62,12 @@ namespace Ichni.RhythmGame
{
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 applyButton = inspector.GenerateButton(this, container, "Apply", Refresh);
var backgroundSettings = container.GenerateSubcontainer(3);
var useSkyboxToggle = inspector.GenerateToggle(this, backgroundSettings, "Use Skybox", nameof(useSkybox));
var skyboxThemeBundleField = inspector.GenerateInputField(this, backgroundSettings, "Skybox Theme Bundle", nameof(skyboxThemeBundleName));
var skyboxMaterialNameField = inspector.GenerateInputField(this, backgroundSettings, "Skybox Material", nameof(skyboxMaterialName));
var backgroundSpriteField = inspector.GenerateInputField(this, backgroundSettings, "Background Sprite", nameof(backgroundSpriteName));
var applyButton = inspector.GenerateButton(this, backgroundSettings, "Apply", Refresh);
void SetInputFields(bool value) // 根据是否使用Skybox设置输入框的可交互性
{

View File

@@ -65,16 +65,19 @@ namespace Ichni.RhythmGame
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Variables Container");
var originalVariablesButton = inspector.GenerateButton(this, container, "Original Variables", () =>
var subcontainer = container.GenerateSubcontainer(3);
var originalVariablesButton = inspector.GenerateButton(this, subcontainer, "Original Variables", () =>
{
var ov = inspector.GenerateCompositeParameterWindow(this, "Original Variables List", nameof(originalVariables));
ov.SetAsStringIntDictionary();
ov.AddListenerFunction(RevertAllVariables);
var ov =
inspector.GenerateCompositeParameterWindow(this, "Original Variables List", nameof(originalVariables))
.SetAsStringIntDictionary()
.AddListenerFunction(RevertAllVariables);
});
var currentVariablesButton = inspector.GenerateButton(this, container, "Current Variables", () =>
var currentVariablesButton = inspector.GenerateButton(this, subcontainer, "Current Variables", () =>
{
inspector.GenerateCompositeParameterWindow(this, "Current Variables List", nameof(currentVariables)).SetAsStringIntDictionary();
var cv =
inspector.GenerateCompositeParameterWindow(this, "Current Variables List", nameof(currentVariables))
.SetAsStringIntDictionary();
});
}
}

View File

@@ -32,12 +32,11 @@ namespace Ichni.RhythmGame
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Full Screen Near Time Judge Unit");
var isShowingJudgeField = inspector.GenerateToggle(this, container, "Is Showing Judge", nameof(isShowingJudge));
isShowingJudgeField.AddListenerFunction(() => SetShowingJudge(isShowingJudge));
var removeButton = inspector.GenerateButton(this, container, "Remove", () =>
var judgeModuleSettings = container.GenerateSubcontainer(3);
var isShowingJudgeField =
inspector.GenerateToggle(this, judgeModuleSettings, "Is Showing Judge", nameof(isShowingJudge))
.AddListenerFunction(() => SetShowingJudge(isShowingJudge));
var removeButton = inspector.GenerateButton(this, judgeModuleSettings, "Remove", () =>
{
SetShowingJudge(false);
note.noteJudgeSubmodule.judgeUnitList.Remove(this);

View File

@@ -43,19 +43,19 @@ namespace Ichni.RhythmGame
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Judge Submodule");
foreach (var judgeUnit in judgeUnitList)
{
judgeUnit.SetUpInspector();
}
var effectNameInputField = inspector.GenerateInputField(container, "Judge Unit Name");
var addJudgeUnitButton = inspector.GenerateButton(this, container, "Add Judge Unit",
var submoduleSettings = container.GenerateSubcontainer(3);
var effectNameInputField = inspector.GenerateInputField(submoduleSettings, "Judge Unit Name");
var addJudgeUnitButton = inspector.GenerateButton(this, submoduleSettings, "Add Judge Unit",
() =>
{
AddJudgeUnit(effectNameInputField.GetValue<string>());
inspectorMain.SetInspector(note);
});
foreach (var judgeUnit in judgeUnitList)
{
judgeUnit.SetUpInspector();
}
}
}

View File

@@ -37,13 +37,12 @@ namespace Ichni.RhythmGame
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Touch Area Judge Unit");
var isShowingJudgeField = inspector.GenerateToggle(this, container, "Is Showing Judge", nameof(isShowingJudge));
isShowingJudgeField.AddListenerFunction(() => SetShowingJudge(isShowingJudge));
var areaRadiusField = inspector.GenerateInputField(this, container, "Area Radius", nameof(areaRadius));
var removeButton = inspector.GenerateButton(this, container, "Remove", () =>
var judgeModuleSettings = container.GenerateSubcontainer(3);
var isShowingJudgeField =
inspector.GenerateToggle(this, judgeModuleSettings, "Is Showing Judge", nameof(isShowingJudge))
.AddListenerFunction(() => SetShowingJudge(isShowingJudge));
var areaRadiusField = inspector.GenerateInputField(this, judgeModuleSettings, "Area Radius", nameof(areaRadius));
var removeButton = inspector.GenerateButton(this, judgeModuleSettings, "Remove", () =>
{
SetShowingJudge(false);
note.noteJudgeSubmodule.judgeUnitList.Remove(this);

View File

@@ -47,13 +47,14 @@ namespace Ichni.RhythmGame
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Trigger Connect Judge Unit");
var isShowingJudgeField = inspector.GenerateToggle(this, container, "Is Showing Judge", nameof(isShowingJudge));
isShowingJudgeField.AddListenerFunction(() => SetShowingJudge(isShowingJudge));
var judgeModuleSettings = container.GenerateSubcontainer(3);
var isShowingJudgeField =
inspector.GenerateToggle(this, judgeModuleSettings, "Is Showing Judge", nameof(isShowingJudge))
.AddListenerFunction(() => SetShowingJudge(isShowingJudge));
var triggerNameField = inspector.GenerateInputField(container, "Trigger Name");
var triggerNameField = inspector.GenerateInputField(judgeModuleSettings, "Trigger Name");
var connectTriggerButton = inspector.GenerateButton(this, container, "Connect Trigger", () =>
var connectTriggerButton = inspector.GenerateButton(this, judgeModuleSettings, "Connect Trigger", () =>
{
GameElement trigger = EditorManager.instance.operationManager.FindingModule.FindGameElementByName(triggerNameField.GetValue<string>());
@@ -67,7 +68,7 @@ namespace Ichni.RhythmGame
(trigger as IHaveNoteJudgeTriggerSubmodule).noteJudgeTriggerSubmodule.connectedNotes.Add(note);
});
var removeButton = inspector.GenerateButton(this, container, "Remove", () =>
var removeButton = inspector.GenerateButton(this, judgeModuleSettings, "Remove", () =>
{
SetShowingJudge(false);
note.noteJudgeSubmodule.judgeUnitList.Remove(this);

View File

@@ -13,6 +13,7 @@ namespace Ichni.RhythmGame
public partial class Flick : NoteBase
{
public List<Vector2> availableFlickDirections;
public float flickBufferAngle = 60f;
public static Flick GenerateElement(string elementName, Guid id, List<string> tags, bool isFirstGenerated,
GameElement parentElement, float exactJudgeTime, List<Vector2> directions)
@@ -66,16 +67,15 @@ namespace Ichni.RhythmGame
base.SetUpInspector();
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Flick");
var generateNoteVisualButton = inspector.GenerateButton(this, container, "Generate Note Visual", () =>
{
TemporaryObject.GenerateElement("New Note Visual", Guid.NewGuid(), new List<string>(), true, this);
});
if (noteVisual != null)
{
generateNoteVisualButton.button.interactable = false;
}
var flickSpecial = inspector.GenerateContainer("Flick Special");
var flickSpecialSubcontainer = flickSpecial.GenerateSubcontainer(3);
var availableDirectionsButton =
inspector.GenerateButton(this, flickSpecialSubcontainer, "Available Directions", () =>
{
var widthCurveWindow = inspector.GenerateCompositeParameterWindow(this, "Available Directions", nameof(availableFlickDirections));
widthCurveWindow.SetAsFlexibleFloat();
});
}
}

View File

@@ -95,9 +95,9 @@ namespace Ichni.RhythmGame
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Hold");
var holdEndTimeInputField = inspector.GenerateInputField(this, container, "holdEndTime", nameof(holdEndTime));
var holdSpecial = inspector.GenerateContainer("Hold");
var holdSpecialSubcontainer = holdSpecial.GenerateSubcontainer(3);
var holdEndTimeInputField = inspector.GenerateInputField(this, holdSpecialSubcontainer, "holdEndTime", nameof(holdEndTime));
holdEndTimeInputField.AddListenerFunction(() =>
{
noteVisual?.effectSubmodule.effectCollection["Holding"].ForEach(effect =>
@@ -105,6 +105,7 @@ namespace Ichni.RhythmGame
effect.effectTime = holdEndTime - exactJudgeTime;
});
});
inspector.MarkedElements["ExactJudgeTime"].AddListenerFunction(() =>
{
noteVisual?.effectSubmodule.effectCollection["Holding"].ForEach(effect =>
@@ -112,16 +113,6 @@ namespace Ichni.RhythmGame
effect.effectTime = holdEndTime - exactJudgeTime;
});
});
var generateNoteVisualButton = inspector.GenerateButton(this, container, "Generate Note Visual", () =>
{
TemporaryObject.GenerateElement("New Note Visual", Guid.NewGuid(), new List<string>(), true, this);
});
if (noteVisual != null)
{
generateNoteVisualButton.button.interactable = false;
}
}
}

View File

@@ -152,20 +152,31 @@ namespace Ichni.RhythmGame
base.SetUpInspector();
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Note Info");
var infoContainer = inspector.GenerateContainer("Note Info");
var noteBaseSettings = infoContainer.GenerateSubcontainer(3);
var exactJudgeTimeInputField =
inspector.GenerateInputField(this, container, "exactJudgeTime", nameof(exactJudgeTime));
exactJudgeTimeInputField.AddListenerFunction(UpdateNoteInTrack);
exactJudgeTimeInputField.Mark(inspector, "ExactJudgeTime");
inspector.GenerateInputField(this, noteBaseSettings, "exactJudgeTime", nameof(exactJudgeTime))
.AddListenerFunction(UpdateNoteInTrack).Mark("ExactJudgeTime");
var saveNotePrefabButton =
inspector.GenerateButton(this, container, "Save Note Prefab", () =>
inspector.GenerateButton(this, noteBaseSettings, "Save Note Prefab", () =>
{
EditorManager.instance.projectManager.notePrefabManager.SaveNotePrefab(this, GetNoteTypeName(this) + "_Prefab");
});
var noteScreenPositionText = inspector.GenerateHintText(this, noteBaseSettings,
() => "Note Screen Position: " + noteScreenPosition);
var noteScreenPositionText = inspector.GenerateHintText(this, container, () => "Note Screen Position: " + noteScreenPosition);
var noteVisualContainer = inspector.GenerateContainer("Note Visual");
var noteVisualGeneration = noteVisualContainer.GenerateSubcontainer(3);
var generateNoteVisualButton = inspector.GenerateButton(this, noteVisualGeneration, "Generate Note Visual", () =>
{
TemporaryObject.GenerateElement("New Note Visual", Guid.NewGuid(), new List<string>(), true, this);
});
if (noteVisual != null)
{
generateNoteVisualButton.button.interactable = false;
}
}
}

View File

@@ -55,23 +55,6 @@ namespace Ichni.RhythmGame
{
matchedBM = new Stay_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM, exactJudgeTime);
}
public override void SetUpInspector()
{
base.SetUpInspector();
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Stay");
var generateNoteVisualButton = inspector.GenerateButton(this, container, "Generate Note Visual", () =>
{
TemporaryObject.GenerateElement("New Note Visual", Guid.NewGuid(), new List<string>(), true, this);
});
if (noteVisual != null)
{
generateNoteVisualButton.button.interactable = false;
}
}
}
namespace Beatmap

View File

@@ -56,23 +56,6 @@ namespace Ichni.RhythmGame
{
matchedBM = new Tap_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM, exactJudgeTime);
}
public override void SetUpInspector()
{
base.SetUpInspector();
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Tap");
var generateNoteVisualButton = inspector.GenerateButton(this, container, "Generate Note Visual", () =>
{
TemporaryObject.GenerateElement("New Note Visual", Guid.NewGuid(), new List<string>(), true, this);
});
if (noteVisual != null)
{
generateNoteVisualButton.button.interactable = false;
}
}
}
namespace Beatmap

View File

@@ -31,25 +31,26 @@ namespace Ichni.RhythmGame
var container = inspector.GenerateContainer("Temporary Object");
var themeBundleDropdown = inspector.GenerateDropdown(this, container, "Theme Bundle",
themeBundleList, nameof(themeBundleName));
themeBundleDropdown.AddListenerFunction(() => inspectorMain.SetInspector(this));
// 生成实体
var generate = container.GenerateSubcontainer(3);
var themeBundleDropdown =
inspector.GenerateDropdown(this, generate, "Theme Bundle", themeBundleList, nameof(themeBundleName))
.AddListenerFunction(() => inspectorMain.SetInspector(this));
if (themeBundleName != String.Empty && ThemeBundleManager.instance.TryGetThemeBundle(themeBundleName, out ThemeBundle themeBundle))
{
objectNameList = themeBundle.assetList_GameObject.ConvertAll(x => x.name);
var objectNameDropdown =
inspector.GenerateDropdown(this, container, "Object Name", objectNameList, nameof(objectName));
objectNameDropdown.AddListenerFunction(() => inspectorMain.SetInspector(this));
inspector.GenerateDropdown(this, generate, "Object Name", objectNameList, nameof(objectName))
.AddListenerFunction(() => inspectorMain.SetInspector(this));
}
else
{
var objectNameDropdown = inspector.GenerateDropdown(this, container, "Object Name",
new List<string>(), nameof(objectName));
var objectNameDropdown =
inspector.GenerateDropdown(this, generate, "Object Name", new List<string>(), nameof(objectName));
objectNameDropdown.dropdown.interactable = false;
}
} // 如果没有选择主题包,则物体名称下拉框不可用
var generateButton = inspector.GenerateButton(this, container, "Generate", () =>
var generateButton = inspector.GenerateButton(this, generate, "Generate", () =>
{
EditorManager.instance.operationManager.CopyPasteDeleteModule.DeleteElement(this);
inspectorMain.ClearInspector();

View File

@@ -97,9 +97,12 @@ namespace Ichni.RhythmGame
base.SetUpInspector();
var container = inspector.GenerateContainer("Path Node");
var indexText = inspector.GenerateHintText(this, container, "Index: " + index);
var isShowingSphereToggle = inspector.GenerateToggle(this, container, "Is Showing Sphere", nameof(isShowingSphere));
isShowingSphereToggle.AddListenerFunction(() => SetPathNodeSphere(isShowingSphere));
var pathNodeSettings = container.GenerateSubcontainer(3);
var indexText = inspector.GenerateHintText(this, pathNodeSettings, "Index: " + index);
var isShowingSphereToggle =
inspector.GenerateToggle(this, pathNodeSettings, "Is Showing Sphere", nameof(isShowingSphere))
.AddListenerFunction(() => SetPathNodeSphere(isShowingSphere));
}
}

View File

@@ -84,118 +84,94 @@ namespace Ichni.RhythmGame
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
base.SetUpInspector();
var trackSubmodulesContainer = inspector.GenerateContainer("Track Submodules"); //次级模块
var trackPathButton = inspector.GenerateButton(this, trackSubmodulesContainer, "Track Path",
() =>
{
trackPathSubmodule = new TrackPathSubmodule(this, TrackSpaceType.CatmullRom,
TrackSamplingType.TimeDistributed, false, false);
inspectorMain.SetInspector(this);
});
var trackTimeMovableButton = inspector.GenerateButton(this, trackSubmodulesContainer, "Track Time Movable",
() =>
//次级模块
var trackSubmodulesContainer = inspector.GenerateContainer("Track Submodules");
var trackPathSubcontainer = trackSubmodulesContainer.GenerateSubcontainer(3);
var trackPathButton = inspector.GenerateButton(this, trackPathSubcontainer, "Track Path", () =>
{
trackPathSubmodule = new TrackPathSubmodule(this, TrackSpaceType.CatmullRom,
TrackSamplingType.TimeDistributed, false, false);
inspectorMain.SetInspector(this);
});
var trackTimeSubcontainer = trackSubmodulesContainer.GenerateSubcontainer(3);
var trackTimeMovableButton =
inspector.GenerateButton(this, trackTimeSubcontainer, "Track Time Movable", () =>
{
trackTimeSubmodule = new TrackTimeSubmoduleMovable(this, 0, 1, 1, AnimationCurveType.Linear);
inspectorMain.SetInspector(this);
});
var trackTimeStaticButton = inspector.GenerateButton(this, trackSubmodulesContainer, "Track Time Static",
() =>
var trackTimeStaticButton =
inspector.GenerateButton(this, trackTimeSubcontainer, "Track Time Static", () =>
{
trackTimeSubmodule = new TrackTimeSubmoduleStatic(this, 1, AnimationCurveType.Linear);
inspectorMain.SetInspector(this);
});
var trackRendererAutoOrientButton = inspector.GenerateButton(this, trackSubmodulesContainer, "Track Renderer Auto Orient",
() =>
var trackRendererSubcontainer = trackSubmodulesContainer.GenerateSubcontainer(3);
var trackRendererAutoOrientButton =
inspector.GenerateButton(this, trackRendererSubcontainer, "Track Renderer Auto Orient", () =>
{
trackRendererSubmodule = new TrackRendererSubmoduleAutoOrient(this, false, 0);
inspectorMain.SetInspector(this);
});
var trackRendererPathGeneratorButton = inspector.GenerateButton(this, trackSubmodulesContainer,
"Track Renderer Path Generator",
() =>
var trackRendererPathGeneratorButton =
inspector.GenerateButton(this, trackRendererSubcontainer, "Track Renderer Path Generator", () =>
{
trackRendererSubmodule = new TrackRendererSubmodulePathGenerator(this, false, 0);
inspectorMain.SetInspector(this);
});
var trackRenderTubeGeneratorButton = inspector.GenerateButton(this, trackSubmodulesContainer,
"Track Renderer Tube Generator",
() =>
var trackRenderTubeGeneratorButton =
inspector.GenerateButton(this, trackRendererSubcontainer, "Track Renderer Tube Generator", () =>
{
trackRendererSubmodule = new TrackRendererSubmoduleTubeGenerator(this, false, 0, 4);
inspectorMain.SetInspector(this);
});
var trackRendererSurfaceButton = inspector.GenerateButton(this, trackSubmodulesContainer, "Track Renderer Surface",
() =>
var trackRendererSurfaceButton =
inspector.GenerateButton(this, trackRendererSubcontainer, "Track Renderer Surface", () =>
{
trackRendererSubmodule = new TrackRendererSubmoduleSurface(this, false, 0);
inspectorMain.SetInspector(this);
});
var generateContainer = inspector.GenerateContainer("Generate Elements"); //物体生成
//物体生成
var generateContainer = inspector.GenerateContainer("Generate Elements");
var pathNodeSubcontainer = generateContainer.GenerateSubcontainer(3);
var pathNodeButton = inspector.GenerateButton(this, pathNodeSubcontainer, "Path Node",
() => { PathNode.GenerateElement("New Path Node", Guid.NewGuid(), new List<string>(), true, this, true); }); //路径点
var pathNodeButton = inspector.GenerateButton(this, generateContainer, "Path Node",
() =>
{
PathNode.GenerateElement("New Path Node", Guid.NewGuid(), new List<string>(), true, this, true);
}); //路径点
var trackPercentPointButton = inspector.GenerateButton(this, generateContainer, "Track Percent Point",
() =>
{
TrackPercentPoint.GenerateElement("New Track Percent Point", Guid.NewGuid(), new List<string>(),
true, this, new FlexibleFloat());
}); //百分比点
var trackHeadPointButton = inspector.GenerateButton(this, generateContainer, "Track Head Point",
() =>
{
TrackHeadPoint.GenerateElement("New Track Head Point", Guid.NewGuid(), new List<string>(),
true, this);
}); //头部点必须先有TrackTimeSubmoduleMovable
var trackMajorPointSubcontainer = generateContainer.GenerateSubcontainer(3);
var trackPercentPointButton = inspector.GenerateButton(this, trackMajorPointSubcontainer, "Track Percent Point",
() => { TrackPercentPoint.GenerateElement("New Track Percent Point", Guid.NewGuid(), new List<string>(), true, this, new FlexibleFloat()); }); //百分比点
var trackHeadPointButton = inspector.GenerateButton(this, trackMajorPointSubcontainer, "Track Head Point",
() => { TrackHeadPoint.GenerateElement("New Track Head Point", Guid.NewGuid(), new List<string>(), true, this); }); //头部点必须先有TrackTimeSubmoduleMovable
if (trackTimeSubmodule is not TrackTimeSubmoduleMovable) trackHeadPointButton.button.interactable = false;
var tapButton = inspector.GenerateButton(this, generateContainer, "Tap",
() =>
{
Tap.GenerateElement("New Tap", Guid.NewGuid(), new List<string>(), true, this, 0f);
}); //Note Tap
var noteSubcontainer = generateContainer.GenerateSubcontainer(3);
var tapButton = inspector.GenerateButton(this, noteSubcontainer, "Tap",
() => { Tap.GenerateElement("New Tap", Guid.NewGuid(), new List<string>(), true, this, 0f); }); //Note Tap
var stayButton = inspector.GenerateButton(this, generateContainer, "Stay",
() =>
{
Stay.GenerateElement("New Stay", Guid.NewGuid(), new List<string>(), true, this, 0f);
}); //Note Stay
var stayButton = inspector.GenerateButton(this, noteSubcontainer, "Stay",
() => { Stay.GenerateElement("New Stay", Guid.NewGuid(), new List<string>(), true, this, 0f); }); //Note Stay
var holdButton = inspector.GenerateButton(this, generateContainer, "Hold",
() =>
{
Hold.GenerateElement("New Hold", Guid.NewGuid(), new List<string>(), true, this, 0f, 1f);
}); //Note Hold
var holdButton = inspector.GenerateButton(this, noteSubcontainer, "Hold",
() => { Hold.GenerateElement("New Hold", Guid.NewGuid(), new List<string>(), true, this, 0f, 1f); }); //Note Hold
var flickButton = inspector.GenerateButton(this, generateContainer, "Flick",
() =>
{
Flick.GenerateElement("New Flick", Guid.NewGuid(), new List<string>(), true, this, 0f,
new List<Vector2>());
}); //Note Flick
var flickButton = inspector.GenerateButton(this, noteSubcontainer, "Flick",
() => { Flick.GenerateElement("New Flick", Guid.NewGuid(), new List<string>(), true, this, 0f, new List<Vector2>()); }); //Note Flick
var displacementButton = inspector.GenerateButton(this, generateContainer, "Displacement",
() =>
{
Displacement.GenerateElement("New Displacement", Guid.NewGuid(), new List<string>(), true, this,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat());
}); //位移
var animationSubcontainer = generateContainer.GenerateSubcontainer(3);
var displacementButton = inspector.GenerateButton(this, animationSubcontainer, "Displacement", () =>
{
Displacement.GenerateElement("New Displacement", Guid.NewGuid(), new List<string>(), true, this,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat());
}); //位移
var swirlButton = inspector.GenerateButton(this, generateContainer, "Swirl",
() =>
{
Swirl.GenerateElement("New Swirl", Guid.NewGuid(), new List<string>(), true, this,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat());
}); //旋转
var swirlButton = inspector.GenerateButton(this, animationSubcontainer, "Swirl", () =>
{
Swirl.GenerateElement("New Swirl", Guid.NewGuid(), new List<string>(), true, this,
new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat());
}); //旋转
if (trackPathSubmodule != null)
{
@@ -220,18 +196,20 @@ namespace Ichni.RhythmGame
trackRendererSurfaceButton.button.interactable = false;
}
var toolsContainerTrack = inspector.GenerateContainer("Track Tools"); //轨道(整体)快捷工具
var quickCopyButton = inspector.GenerateButton(this, toolsContainerTrack, "QuickCopy", () =>
var trackToolsContainer = inspector.GenerateContainer("Track Tools"); //轨道(整体)快捷工具
var trackToolsSubcontainer = trackToolsContainer.GenerateSubcontainer(3);
var quickCopyButton = inspector.GenerateButton(this, trackToolsSubcontainer, "QuickCopy", () =>
{
IHaveInspection qcWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Quick Copy");
var qcContainer = qcWindow.GenerateContainer();
var xField = qcWindow.GenerateInputField(qcContainer, "X offset", "0");
var yField = qcWindow.GenerateInputField(qcContainer, "Y offset", "0");
var zField = qcWindow.GenerateInputField(qcContainer, "Z offset", "0");
var timeField = qcWindow.GenerateInputField(qcContainer, "Time offset", "0");
var iterationField = qcWindow.GenerateInputField(qcContainer, "Iteration", "0");
var includeAnimationToggle = qcWindow.GenerateToggle(null, qcContainer, "Include Animation", string.Empty);
qcWindow.GenerateButton(this, qcContainer, "Copy", () =>
var qcSubcontainer = qcContainer.GenerateSubcontainer(3);
var xField = qcWindow.GenerateInputField(qcSubcontainer, "X offset", "0");
var yField = qcWindow.GenerateInputField(qcSubcontainer, "Y offset", "0");
var zField = qcWindow.GenerateInputField(qcSubcontainer, "Z offset", "0");
var timeField = qcWindow.GenerateInputField(qcSubcontainer, "Time offset", "0");
var iterationField = qcWindow.GenerateInputField(qcSubcontainer, "Iteration", "0");
var includeAnimationToggle = qcWindow.GenerateToggle(null, qcSubcontainer, "Include Animation", string.Empty);
qcWindow.GenerateButton(this, qcSubcontainer, "Copy", () =>
{
Vector3 positionOffset = new Vector3(xField.GetValue<float>(), yField.GetValue<float>(), zField.GetValue<float>());
float timeOffset = timeField.GetValue<float>();
@@ -241,32 +219,34 @@ namespace Ichni.RhythmGame
});
}); //快速复制
var wholeTrackMoveButton = inspector.GenerateButton(this, toolsContainerTrack, "Whole Track Move", () =>
var wholeTrackMoveButton = inspector.GenerateButton(this, trackToolsSubcontainer, "Whole Track Move", () =>
{
IHaveInspection wholeMoveWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Whole Track Move");
var wmContainer = wholeMoveWindow.GenerateContainer();
var xField = wholeMoveWindow.GenerateInputField(wmContainer, "X offset", "0");
var yField = wholeMoveWindow.GenerateInputField(wmContainer, "Y offset", "0");
var zField = wholeMoveWindow.GenerateInputField(wmContainer, "Z offset", "0");
wholeMoveWindow.GenerateButton(this, wmContainer, "Move", () =>
var wmSubcontainer = wmContainer.GenerateSubcontainer(3);
var xField = wholeMoveWindow.GenerateInputField(wmSubcontainer, "X offset", "0");
var yField = wholeMoveWindow.GenerateInputField(wmSubcontainer, "Y offset", "0");
var zField = wholeMoveWindow.GenerateInputField(wmSubcontainer, "Z offset", "0");
wholeMoveWindow.GenerateButton(this, wmSubcontainer, "Move", () =>
{
Vector3 positionOffset = new Vector3(xField.GetValue<float>(), yField.GetValue<float>(), zField.GetValue<float>());
WholeTrackMove(positionOffset);
});
}); //整体移动
var wholeTrackSwirlButton = inspector.GenerateButton(this, toolsContainerTrack, "Whole Track Swirl", () =>
var wholeTrackSwirlButton = inspector.GenerateButton(this, trackToolsSubcontainer, "Whole Track Swirl", () =>
{
IHaveInspection wholeSwirlWindow = inspectorMain.GenerateSecondaryWindow(this, elementName + "'s Whole Track Swirl");
var wsContainer = wholeSwirlWindow.GenerateContainer();
var angleField = wholeSwirlWindow.GenerateInputField(wsContainer, "Angle", "0");
var centerXField = wholeSwirlWindow.GenerateInputField(wsContainer, "Center X", "0");
var centerYField = wholeSwirlWindow.GenerateInputField(wsContainer, "Center Y", "0");
var centerZField = wholeSwirlWindow.GenerateInputField(wsContainer, "Center Z", "0");
var axisDirXField = wholeSwirlWindow.GenerateInputField(wsContainer, "Axis Direction X", "0");
var axisDirYField = wholeSwirlWindow.GenerateInputField(wsContainer, "Axis Direction Y", "0");
var axisDirZField = wholeSwirlWindow.GenerateInputField(wsContainer, "Axis Direction Z", "0");
wholeSwirlWindow.GenerateButton(this, wsContainer, "Swirl", () =>
var wsSubcontainer = wsContainer.GenerateSubcontainer(3);
var angleField = wholeSwirlWindow.GenerateInputField(wsSubcontainer, "Angle", "0");
var centerXField = wholeSwirlWindow.GenerateInputField(wsSubcontainer, "Center X", "0");
var centerYField = wholeSwirlWindow.GenerateInputField(wsSubcontainer, "Center Y", "0");
var centerZField = wholeSwirlWindow.GenerateInputField(wsSubcontainer, "Center Z", "0");
var axisDirXField = wholeSwirlWindow.GenerateInputField(wsSubcontainer, "Axis Direction X", "0");
var axisDirYField = wholeSwirlWindow.GenerateInputField(wsSubcontainer, "Axis Direction Y", "0");
var axisDirZField = wholeSwirlWindow.GenerateInputField(wsSubcontainer, "Axis Direction Z", "0");
wholeSwirlWindow.GenerateButton(this, wsSubcontainer, "Swirl", () =>
{
float angle = angleField.GetValue<float>();
Vector3 center = new Vector3(centerXField.GetValue<float>(), centerYField.GetValue<float>(), centerZField.GetValue<float>());
@@ -293,16 +273,18 @@ namespace Ichni.RhythmGame
// });
// }); //整体翻转
var toolsContainerPathNode = inspector.GenerateContainer("Path Node Tools"); //路径点快捷工具
var setAllPathNodeSphereButton = inspector.GenerateButton(this, toolsContainerPathNode,
"Set All Path Node Sphere", () =>
{
bool firstPathNodeSphere = trackPathSubmodule.pathNodeList[0].isShowingSphere;
SetAllPathNodeSphere(!firstPathNodeSphere);
});
var pathNodeToolsContainer = inspector.GenerateContainer("Path Node Tools"); //路径点快捷工具
var pathNodeToolsSubcontainer = pathNodeToolsContainer.GenerateSubcontainer(3);
var setAllPathNodeSphereButton =
inspector.GenerateButton(this, pathNodeToolsSubcontainer, "Set All Path Node Sphere", () =>
{
bool firstPathNodeSphere = trackPathSubmodule.pathNodeList[0].isShowingSphere;
SetAllPathNodeSphere(!firstPathNodeSphere);
});
var setOnlyStartEndPathNodeSphereEnabledButton = inspector.GenerateButton(this, toolsContainerPathNode,
"Only Start & End Path Node's sphere enabled", SetOnlyStartEndPathNodeSphereEnabled);
var setOnlyStartEndPathNodeSphereEnabledButton =
inspector.GenerateButton(this, pathNodeToolsSubcontainer, "Only Enable Start & End Path Node's sphere",
SetOnlyStartEndPathNodeSphereEnabled);
}
}

View File

@@ -95,25 +95,27 @@ namespace Ichni.RhythmGame
base.SetUpInspector();
var container = inspector.GenerateContainer("Cross Track Point");
var trackSwitchButton = inspector.GenerateButton(this, container, "Track Switch",
() =>
var pointSettings = container.GenerateSubcontainer(3);
var trackSwitchButton = inspector.GenerateButton(this, pointSettings, "Track Switch", () =>
{
inspector.GenerateCompositeParameterWindow(this, "Track Switch", nameof(trackSwitch)).SetAsFlexibleInt();
});
var trackPercentButton = inspector.GenerateButton(this, container, "Track Percent",
() =>
var trackPercentButton = inspector.GenerateButton(this, pointSettings, "Track Percent", () =>
{
inspector.GenerateCompositeParameterWindow(this, "Track Percent", nameof(trackPercent)).SetAsFlexibleFloat();
});
var pasteTrackListButton = inspector.GenerateButton(this, container, "Paste Track List", PasteTrackList);
var generateContainer = inspector.GenerateContainer("Generate");
var generateCameraButton = inspector.GenerateButton(this, generateContainer, "Game Camera",
var pasteTrackListButton = inspector.GenerateButton(this, pointSettings, "Paste Track List", PasteTrackList);
var generation = container.GenerateSubcontainer(3);
var generateCameraButton = inspector.GenerateButton(this, generation, "Game Camera",
() => GameCamera.GenerateElement("New Game Camera", Guid.NewGuid(), new List<string>(),
true, this, GameCamera.CameraViewType.Perspective, 60, 10));
var generateTrailButton = inspector.GenerateButton(this, generateContainer, "Trail",
var generateTrailButton = inspector.GenerateButton(this, generation, "Trail",
() => Trail.GenerateElement("New Trail", Guid.NewGuid(), new List<string>(),
true, this, 1, true, 1, AnimationCurve.Constant(0,1,1)));
var environmentObjectButton = inspector.GenerateButton(this, generation, "Environment Object",
() => TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(),
true, this));
}
}

View File

@@ -93,17 +93,19 @@ namespace Ichni.RhythmGame
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Track Percent Point");
var trackPercentButton = inspector.GenerateButton(this, container, "Track Percent", () =>
{
inspector.GenerateCompositeParameterWindow(this, "Track Percent", nameof(trackPercent)).SetAsFlexibleFloat();
});
var pointSettings = container.GenerateSubcontainer(3);
var trackPercentButton = inspector.GenerateButton(this, pointSettings, "Track Percent",
() => { inspector.GenerateCompositeParameterWindow(this, "Track Percent", nameof(trackPercent)).SetAsFlexibleFloat(); });
var generateTrailButton = inspector.GenerateButton(this, container, "Generate Trail", () =>
var generation = container.GenerateSubcontainer(3);
var generateTrailButton = inspector.GenerateButton(this, generation, "Generate Trail", () =>
{
Trail.GenerateElement("New Trail", Guid.NewGuid(), new List<string>(),
true, this, 1, true,
1, AnimationCurve.Constant(0, 1, 1));
Trail.GenerateElement("New Trail", Guid.NewGuid(), new List<string>(), true,
this, 1, true, 1, AnimationCurve.Constant(0, 1, 1));
});
var environmentObjectButton = inspector.GenerateButton(this, generation, "Environment Object",
() => TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(),
true, this));
}
}

View File

@@ -117,25 +117,22 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Track Path");
var trackPathSubmoduleSettings = container.GenerateSubcontainer(3);
var trackSpaceDropdown =
inspector.GenerateDropdown(this, container, "Space Type", typeof(Track.TrackSpaceType), nameof(trackSpaceType));
inspector.GenerateDropdown(this, trackPathSubmoduleSettings, "Space Type", typeof(Track.TrackSpaceType), nameof(trackSpaceType));
var trackSamplingDropdown =
inspector.GenerateDropdown(this, container, "Sampling Type", typeof(Track.TrackSamplingType), nameof(trackSamplingType));
inspector.GenerateDropdown(this, trackPathSubmoduleSettings, "Sampling Type", typeof(Track.TrackSamplingType), nameof(trackSamplingType));
var isClosedToggle =
inspector.GenerateToggle(this, container, "Is Closed", nameof(isClosed));
isClosedToggle.AddListenerFunction(ClosePath);
var generatePathNodeButton = inspector.GenerateButton(this, container, "Generate Path Node", () =>
{
PathNode.GenerateElement("New Path Node", Guid.NewGuid(), new List<string>(), true, track, true);
});
var showDisplayToggle = inspector.GenerateToggle(this, container, "Show Display", nameof(isShowingDisplay));
showDisplayToggle.AddListenerFunction(() => SetDisplay(isShowingDisplay));
inspector.GenerateToggle(this, trackPathSubmoduleSettings, "Is Closed", nameof(isClosed))
.AddListenerFunction(ClosePath);
var generatePathNodeButton = inspector.GenerateButton(this, trackPathSubmoduleSettings, "Generate Path Node", () =>
{
PathNode.GenerateElement("New Path Node", Guid.NewGuid(), new List<string>(), true, track, true);
});
var showDisplayToggle = inspector.GenerateToggle(this, trackPathSubmoduleSettings, "Show Display", nameof(isShowingDisplay))
.AddListenerFunction(() => SetDisplay(isShowingDisplay));
}
}

View File

@@ -67,6 +67,50 @@ namespace Ichni.RhythmGame
}
public partial class TrackRendererSubmodule
{
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Track Renderer Auto Orient");
var emissionSettings = container.GenerateSubcontainer(3);
var enableEmissionToggle =
inspector.GenerateToggle(this, emissionSettings, "Enable Emission", nameof(enableEmission))
.AddListenerFunction(SetEnableEmission);
var emissionIntensityInputField =
inspector.GenerateInputField(this, emissionSettings, "Emission Intensity", nameof(emissionIntensity))
.AddListenerFunction(SetEmissionIntensity);
var materialSettings = container.GenerateSubcontainer(3);
var themeBundleDropdown = inspector
.GenerateDropdown(this, materialSettings, "Theme Bundle", ThemeBundleManager.instance.selectedThemeBundleList, nameof(materialThemeBundleName))
.AddListenerFunction(() => inspectorMain.SetInspector(track));
if (materialThemeBundleName != String.Empty && ThemeBundleManager.instance.TryGetThemeBundle(materialThemeBundleName, out ThemeBundle themeBundle))
{
List<string> materialNameList = themeBundle.assetList_Material.ConvertAll(x => x.name);
var objectNameDropdown = inspector.GenerateDropdown(this, materialSettings, "Material Name", materialNameList, nameof(materialName))
.AddListenerFunction(() => inspectorMain.SetInspector(track));
}
else
{
var objectNameDropdown = inspector.GenerateDropdown(this, materialSettings, "Material Name", new List<string>(), nameof(materialName));
objectNameDropdown.dropdown.interactable = false;
}
var applyMaterialButton = inspector.GenerateButton(this, materialSettings, "Apply Material", () => { ApplyMaterial(materialThemeBundleName, materialName); });
var delete = container.GenerateSubcontainer(3);
var deleteButton = inspector.GenerateButton(this, delete, "Delete", () =>
{
Delete();
Object.Destroy(track.trackRendererSubmodule.meshGenerator);
track.trackRendererSubmodule = null;
inspectorMain.SetInspector(track);
track.Refresh();
});
}
protected void SetEnableEmission()
{
meshRenderer.material.SetInt("_Emission", enableEmission ? 1 : 0);
@@ -103,50 +147,6 @@ namespace Ichni.RhythmGame
{
matchedBM = new TrackRendererSubmoduleAutoOrient_BM(attachedGameElement, this);
}
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Track Renderer Auto Orient");
var enableEmissionToggle = inspector.GenerateToggle(this, container, "Enable Emission", nameof(enableEmission));
enableEmissionToggle.AddListenerFunction(SetEnableEmission);
var emissionIntensityInputField = inspector.GenerateInputField(this, container, "Emission Intensity", nameof(emissionIntensity));
emissionIntensityInputField.AddListenerFunction(SetEmissionIntensity);
var themeBundleDropdown = inspector.GenerateDropdown(this, container, "Theme Bundle", ThemeBundleManager.instance.selectedThemeBundleList, nameof(materialThemeBundleName));
themeBundleDropdown.AddListenerFunction(() => inspectorMain.SetInspector(track));
if (materialThemeBundleName != String.Empty && ThemeBundleManager.instance.TryGetThemeBundle(materialThemeBundleName, out ThemeBundle themeBundle))
{
List<string> materialNameList = themeBundle.assetList_Material.ConvertAll(x => x.name);
var objectNameDropdown = inspector.GenerateDropdown(this, container, "Material Name", materialNameList, nameof(materialName));
objectNameDropdown.AddListenerFunction(() => inspectorMain.SetInspector(track));
}
else
{
var objectNameDropdown = inspector.GenerateDropdown(this, container, "Material Name", new List<string>(), nameof(materialName));
objectNameDropdown.dropdown.interactable = false;
}
var applyMaterialButton = inspector.GenerateButton(this, container, "Apply Material", () =>
{
ApplyMaterial(materialThemeBundleName, materialName);
});
var deleteButton = inspector.GenerateButton(this, container, "Delete",
() =>
{
Delete();
Object.Destroy(track.trackRendererSubmodule.meshGenerator);
track.trackRendererSubmodule = null;
inspectorMain.SetInspector(track);
track.Refresh();
});
}
}
namespace Beatmap
@@ -222,50 +222,6 @@ namespace Ichni.RhythmGame
{
matchedBM = new TrackRendererSubmodulePathGenerator_BM(attachedGameElement, this);
}
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Track Renderer Path Generator");
var enableEmissionToggle = inspector.GenerateToggle(this, container, "Enable Emission", nameof(enableEmission));
enableEmissionToggle.AddListenerFunction(SetEnableEmission);
var emissionIntensityInputField = inspector.GenerateInputField(this, container, "Emission Intensity", nameof(emissionIntensity));
emissionIntensityInputField.AddListenerFunction(SetEmissionIntensity);
var themeBundleDropdown = inspector.GenerateDropdown(this, container, "Theme Bundle", ThemeBundleManager.instance.selectedThemeBundleList, nameof(materialThemeBundleName));
themeBundleDropdown.AddListenerFunction(()=>inspectorMain.SetInspector(track));
if (materialThemeBundleName != String.Empty && ThemeBundleManager.instance.TryGetThemeBundle(materialThemeBundleName, out ThemeBundle themeBundle))
{
List<string> materialNameList = themeBundle.assetList_Material.ConvertAll(x => x.name);
var objectNameDropdown = inspector.GenerateDropdown(this, container, "Material Name", materialNameList, nameof(materialName));
objectNameDropdown.AddListenerFunction(() => inspectorMain.SetInspector(track));
}
else
{
var objectNameDropdown = inspector.GenerateDropdown(this, container, "Material Name", new List<string>(), nameof(materialName));
objectNameDropdown.dropdown.interactable = false;
}
var applyMaterialButton = inspector.GenerateButton(this, container, "Apply Material", () =>
{
ApplyMaterial(materialThemeBundleName, materialName);
});
var deleteButton = inspector.GenerateButton(this, container, "Delete",
() =>
{
Delete();
Object.Destroy(track.trackRendererSubmodule.meshGenerator);
track.trackRendererSubmodule = null;
inspectorMain.SetInspector(track);
track.Refresh();
});
}
}
namespace Beatmap
@@ -327,7 +283,7 @@ namespace Ichni.RhythmGame
base(track, enableEmission, emissionIntensity)
{
this.sideCount = sideCount;
this.tubeGenerator = track.AddComponent<TubeGenerator>();
this.meshRenderer = tubeGenerator.GetComponent<MeshRenderer>();
this.meshGenerator = tubeGenerator;
@@ -340,60 +296,24 @@ namespace Ichni.RhythmGame
this.tubeGenerator.uvRotation = 90;
this.tubeGenerator.sides = sideCount;
}
public override void SaveBM()
{
matchedBM = new TrackRendererSubmoduleTubeGenerator_BM(attachedGameElement, this);
}
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Track Renderer Tube Generator");
var enableEmissionToggle = inspector.GenerateToggle(this, container, "Enable Emission", nameof(enableEmission));
enableEmissionToggle.AddListenerFunction(SetEnableEmission);
var emissionIntensityInputField = inspector.GenerateInputField(this, container, "Emission Intensity", nameof(emissionIntensity));
emissionIntensityInputField.AddListenerFunction(SetEmissionIntensity);
var themeBundleDropdown = inspector.GenerateDropdown(this, container, "Theme Bundle", ThemeBundleManager.instance.selectedThemeBundleList, nameof(materialThemeBundleName));
themeBundleDropdown.AddListenerFunction(() => inspectorMain.SetInspector(track));
var container = inspector.GenerateContainer("Tube Settings");
var tubeSettings = container.GenerateSubcontainer(3);
var sideCountInputField =
inspector.GenerateInputField(this, tubeSettings, "Side Count", nameof(sideCount))
.AddListenerFunction(() => { tubeGenerator.sides = sideCount; });
if (materialThemeBundleName != String.Empty && ThemeBundleManager.instance.TryGetThemeBundle(materialThemeBundleName, out ThemeBundle themeBundle))
{
List<string> materialNameList = themeBundle.assetList_Material.ConvertAll(x => x.name);
var objectNameDropdown = inspector.GenerateDropdown(this, container, "Material Name", materialNameList, nameof(materialName));
objectNameDropdown.AddListenerFunction(() => inspectorMain.SetInspector(track));
}
else
{
var objectNameDropdown = inspector.GenerateDropdown(this, container, "Material Name", new List<string>(), nameof(materialName));
objectNameDropdown.dropdown.interactable = false;
}
var applyMaterialButton = inspector.GenerateButton(this, container, "Apply Material", () =>
{
ApplyMaterial(materialThemeBundleName, materialName);
});
var sideCountInputField = inspector.GenerateInputField(this, container, "Side Count", nameof(sideCount));
sideCountInputField.AddListenerFunction(() =>
{
tubeGenerator.sides = sideCount;
});
var deleteButton = inspector.GenerateButton(this, container, "Delete",
() =>
{
Delete();
Object.Destroy(track.trackRendererSubmodule.meshGenerator);
track.trackRendererSubmodule = null;
inspectorMain.SetInspector(track);
track.Refresh();
});
base.SetUpInspector();
}
}
@@ -472,50 +392,6 @@ namespace Ichni.RhythmGame
{
matchedBM = new TrackRendererSubmoduleSurface_BM(attachedGameElement, this);
}
public override void SetUpInspector()
{
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Track Renderer Surface");
var enableEmissionToggle = inspector.GenerateToggle(this, container, "Enable Emission", nameof(enableEmission));
enableEmissionToggle.AddListenerFunction(SetEnableEmission);
var emissionIntensityInputField = inspector.GenerateInputField(this, container, "Emission Intensity", nameof(emissionIntensity));
emissionIntensityInputField.AddListenerFunction(SetEmissionIntensity);
var themeBundleDropdown = inspector.GenerateDropdown(this, container, "Theme Bundle", ThemeBundleManager.instance.selectedThemeBundleList, nameof(materialThemeBundleName));
themeBundleDropdown.AddListenerFunction(() => inspectorMain.SetInspector(track));
if (materialThemeBundleName != String.Empty && ThemeBundleManager.instance.TryGetThemeBundle(materialThemeBundleName, out ThemeBundle themeBundle))
{
List<string> materialNameList = themeBundle.assetList_Material.ConvertAll(x => x.name);
var objectNameDropdown = inspector.GenerateDropdown(this, container, "Material Name", materialNameList, nameof(materialName));
objectNameDropdown.AddListenerFunction(() => inspectorMain.SetInspector(track));
}
else
{
var objectNameDropdown = inspector.GenerateDropdown(this, container, "Material Name", new List<string>(), nameof(materialName));
objectNameDropdown.dropdown.interactable = false;
}
var applyMaterialButton = inspector.GenerateButton(this, container, "Apply Material", () =>
{
ApplyMaterial(materialThemeBundleName, materialName);
});
var deleteButton = inspector.GenerateButton(this, container, "Delete",
() =>
{
Delete();
Object.Destroy(track.trackRendererSubmodule.meshGenerator);
track.trackRendererSubmodule = null;
inspectorMain.SetInspector(track);
track.Refresh();
});
}
}
namespace Beatmap

View File

@@ -61,6 +61,7 @@ namespace Ichni.RhythmGame
float per = AnimationCurveEvaluator.Evaluate(animationCurveType, (songTimeInTime - trackStartTime) / trackTotalTime);
return Mathf.Clamp01(per);
}
public override void Refresh()
{
@@ -75,6 +76,7 @@ namespace Ichni.RhythmGame
}
});
}
public override void SaveBM()
{
matchedBM = new Beatmap.TrackTimeSubmoduleMovable_BM(attachedGameElement, this);
@@ -86,22 +88,18 @@ namespace Ichni.RhythmGame
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Track Time Movable");
var trackTimeSubmoduleSettings = container.GenerateSubcontainer(3);
var startTimeInputField =
inspector.GenerateInputField(this, container, "Start Time", nameof(trackStartTime));
startTimeInputField.AddListenerFunction(RefreshChildren);
var endTimeInputField = inspector.GenerateInputField(this, container, "End Time", nameof(trackEndTime));
endTimeInputField.AddListenerFunction(RefreshChildren);
inspector.GenerateInputField(this, trackTimeSubmoduleSettings, "Start Time", nameof(trackStartTime))
.AddListenerFunction(RefreshChildren);
var endTimeInputField = inspector.GenerateInputField(this, trackTimeSubmoduleSettings, "End Time", nameof(trackEndTime))
.AddListenerFunction(RefreshChildren);
var visibleTimeInputField =
inspector.GenerateInputField(this, container, "Visible Time Length", nameof(visibleTrackTimeLength));
var animationCurveDropdown = inspector.GenerateDropdown(this, container, "Animation Curve",
typeof(AnimationCurveType), nameof(animationCurveType));
animationCurveDropdown.AddListenerFunction(RefreshChildren);
var deleteButton = inspector.GenerateButton(this, container, "Delete",
() =>
inspector.GenerateInputField(this, trackTimeSubmoduleSettings, "Visible Time Length", nameof(visibleTrackTimeLength));
var animationCurveDropdown =
inspector.GenerateDropdown(this, trackTimeSubmoduleSettings, "Animation Curve", typeof(AnimationCurveType), nameof(animationCurveType))
.AddListenerFunction(RefreshChildren);
var deleteButton = inspector.GenerateButton(this, trackTimeSubmoduleSettings, "Delete", () =>
{
Delete();
track.trackTimeSubmodule = null;
@@ -176,6 +174,7 @@ namespace Ichni.RhythmGame
this.tailPercent = 1;
//timeDurationSubmodule 根据下辖Note的时间来设置
}
public override void Refresh()
{
if (track.trackRendererSubmodule != null)
@@ -191,6 +190,7 @@ namespace Ichni.RhythmGame
}
});
}
public override void SaveBM()
{
matchedBM = new Beatmap.TrackTimeSubmoduleStatic_BM(attachedGameElement, this);
@@ -202,12 +202,12 @@ namespace Ichni.RhythmGame
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Track Time Static");
var trackTimeSubmoduleSettings = container.GenerateSubcontainer(3);
var totalTimeInputField =
inspector.GenerateInputField(this, container, "Total Time", nameof(trackTotalTime));
var animationCurveDropdown = inspector.GenerateDropdown(this, container, "Animation Curve",
typeof(AnimationCurveType), nameof(animationCurveType));
var deleteButton = inspector.GenerateButton(this, container, "Delete",
() =>
inspector.GenerateInputField(this, trackTimeSubmoduleSettings, "Total Time", nameof(trackTotalTime));
var animationCurveDropdown =
inspector.GenerateDropdown(this, trackTimeSubmoduleSettings, "Animation Curve", typeof(AnimationCurveType), nameof(animationCurveType));
var deleteButton = inspector.GenerateButton(this, trackTimeSubmoduleSettings, "Delete", () =>
{
Delete();
track.trackTimeSubmodule = null;

View File

@@ -63,17 +63,20 @@ namespace Ichni.RhythmGame
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Trail");
var visibleTimeLengthInputField = inspector.GenerateInputField(this, container, "Visible Time Length", nameof(visibleTimeLength));
visibleTimeLengthInputField.AddListenerFunction(() => trailRenderer.time = visibleTimeLength);
var isAutoOrientToggle = inspector.GenerateToggle(this, container, "Is Auto Orient", nameof(isAutoOrient));
isAutoOrientToggle.AddListenerFunction(() => trailRenderer.alignment = isAutoOrient ? LineAlignment.View : LineAlignment.TransformZ);
var widthMultiplierInputField = inspector.GenerateInputField(this, container, "Width Multiplier", nameof(widthMultiplier));
widthMultiplierInputField.AddListenerFunction(() => trailRenderer.widthMultiplier = widthMultiplier);
var widthCurveButton = inspector.GenerateButton(this, container, "Width Curve", () =>
var trailSettings = container.GenerateSubcontainer(3);
var visibleTimeLengthInputField =
inspector.GenerateInputField(this, trailSettings, "Visible Time Length", nameof(visibleTimeLength))
.AddListenerFunction(() => trailRenderer.time = visibleTimeLength);
var isAutoOrientToggle =
inspector.GenerateToggle(this, trailSettings, "Is Auto Orient", nameof(isAutoOrient))
.AddListenerFunction(() => trailRenderer.alignment = isAutoOrient ? LineAlignment.View : LineAlignment.TransformZ);
var widthMultiplierInputField =
inspector.GenerateInputField(this, trailSettings, "Width Multiplier", nameof(widthMultiplier))
.AddListenerFunction(() => trailRenderer.widthMultiplier = widthMultiplier);
var widthCurveButton = inspector.GenerateButton(this, trailSettings, "Width Curve", () =>
{
var widthCurveWindow = inspector.GenerateCompositeParameterWindow(this, "Width Curve", nameof(widthCurve));
widthCurveWindow.SetAsCustomCurve();