增加TubeGenerator,DUI架构调整

This commit is contained in:
SoulliesOfficial
2025-03-20 02:42:10 -04:00
parent 0e22f6ac21
commit 22c6ca80ca
33 changed files with 381 additions and 57 deletions

View File

@@ -91,9 +91,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));
@@ -104,7 +106,7 @@ namespace Ichni.RhythmGame
}
SetInputFieldInteractable(isOverridingDuration);
overrideToggle.AddListenerFunction(SetInputFieldInteractable);
overrideToggle.AddListenerFunction(() => SetInputFieldInteractable(isOverridingDuration));
}

View File

@@ -61,17 +61,17 @@ namespace Ichni.Editor
var backgroundSpriteField = inspector.GenerateInputField(this, container, "Background Sprite", nameof(backgroundSpriteName));
var applyButton = inspector.GenerateButton(this, container, "Apply", Refresh);
void SetFields(bool value)
void SetInputFields(bool value) // 根据是否使用Skybox设置输入框的可交互性
{
skyboxThemeBundleField.inputField.interactable = value;
skyboxMaterialNameField.inputField.interactable = value;
backgroundSpriteField.inputField.interactable = !value;
}
SetFields(useSkybox);
SetInputFields(useSkybox);
useSkyboxToggle.AddListenerFunction(value => EditorManager.instance.backgroundController.EnableBackground(!value));
useSkyboxToggle.AddListenerFunction(SetFields);
useSkyboxToggle.AddListenerFunction(() => EditorManager.instance.backgroundController.EnableBackground(!useSkybox));
useSkyboxToggle.AddListenerFunction(() => SetInputFields(useSkybox));
}
public override void Refresh()

View File

@@ -37,27 +37,34 @@ namespace Ichni.RhythmGame
public override void SetUpInspector()
{
base.SetUpInspector();
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Generate");
var environmentObjectButton = inspector.GenerateButton(this, container, "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);
isStaticToggle.AddListenerFunction(() => gameObject.isStatic = isStatic);
var generateContainer = inspector.GenerateContainer("Generate");
var generateDisplacementButton = inspector.GenerateButton(this, generateContainer, "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",
() => Swirl.GenerateElement("New Swirl", Guid.NewGuid(), new List<string>(), true,
this, new FlexibleFloat(), new FlexibleFloat(), new FlexibleFloat()));
var generateScaleButton = inspector.GenerateButton(this, generateContainer, "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",
() => 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",

View File

@@ -161,7 +161,8 @@ namespace Ichni.RhythmGame
submodule.SetUpInspector();
}
}
/// <summary>
/// 获取所有子GameElement
/// </summary>

View File

@@ -34,7 +34,8 @@ namespace Ichni.RhythmGame
var container = inspector.GenerateContainer("Full Screen Near Time Judge Unit");
var isShowingJudgeField = inspector.GenerateToggle(this, container, "Is Showing Judge", nameof(isShowingJudge));
isShowingJudgeField.AddListenerFunction((isOn) => SetShowingJudge(isShowingJudge));
isShowingJudgeField.AddListenerFunction(() => SetShowingJudge(isShowingJudge));
var removeButton = inspector.GenerateButton(this, container, "Remove", () =>
{

View File

@@ -39,7 +39,7 @@ namespace Ichni.RhythmGame
var container = inspector.GenerateContainer("Touch Area Judge Unit");
var isShowingJudgeField = inspector.GenerateToggle(this, container, "Is Showing Judge", nameof(isShowingJudge));
isShowingJudgeField.AddListenerFunction((isOn) => SetShowingJudge(isShowingJudge));
isShowingJudgeField.AddListenerFunction(() => SetShowingJudge(isShowingJudge));
var effectTimeField = inspector.GenerateInputField(this, container, "Area Radius", nameof(areaRadius));

View File

@@ -93,7 +93,14 @@ namespace Ichni.RhythmGame
var container = inspector.GenerateContainer("Hold");
var holdEndTimeInputField = inspector.GenerateInputField(this, container, "holdEndTime", nameof(holdEndTime));
holdEndTimeInputField.AddListenerFunction(_ =>
holdEndTimeInputField.AddListenerFunction(() =>
{
noteVisual?.effectSubmodule.effectCollection["Holding"].ForEach(effect =>
{
effect.effectTime = holdEndTime - exactJudgeTime;
});
});
inspector.MarkedElements["ExactJudgeTime"].AddListenerFunction(() =>
{
noteVisual?.effectSubmodule.effectCollection["Holding"].ForEach(effect =>
{

View File

@@ -150,9 +150,11 @@ namespace Ichni.RhythmGame
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Note Info");
var exactJudgeTimeInputField =
inspector.GenerateInputField(this, container, "exactJudgeTime", nameof(exactJudgeTime));
exactJudgeTimeInputField.AddListenerFunction(_ => UpdateNoteInTrack());
exactJudgeTimeInputField.AddListenerFunction(UpdateNoteInTrack);
exactJudgeTimeInputField.Mark(inspector, "ExactJudgeTime");
var noteScreenPositionText = inspector.GenerateHintText(this, container, () => "Note Screen Position: " + noteScreenPosition);
}

View File

@@ -33,14 +33,14 @@ namespace Ichni.RhythmGame
var themeBundleDropdown = inspector.GenerateDropdown(this, container, "Theme Bundle",
themeBundleList, nameof(themeBundleName));
themeBundleDropdown.AddListenerFunction(_ => inspectorMain.SetInspector(this));
themeBundleDropdown.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));
objectNameDropdown.AddListenerFunction(() => inspectorMain.SetInspector(this));
}
else
{

View File

@@ -98,7 +98,7 @@ namespace Ichni.RhythmGame
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);
isShowingSphereToggle.AddListenerFunction(() => SetPathNodeSphere(isShowingSphere));
}
}

View File

@@ -118,6 +118,14 @@ namespace Ichni.RhythmGame
trackRendererSubmodule = new TrackRendererSubmodulePathGenerator(this, false, 0);
inspectorMain.SetInspector(this);
});
var trackRenderTubeGeneratorButton = inspector.GenerateButton(this, trackSubmodulesContainer,
"Track Renderer Tube Generator",
() =>
{
trackRendererSubmodule = new TrackRendererSubmoduleTubeGenerator(this, false, 0, 4);
inspectorMain.SetInspector(this);
});
var trackRendererSurfaceButton = inspector.GenerateButton(this, trackSubmodulesContainer, "Track Renderer Surface",
() =>
@@ -207,6 +215,8 @@ namespace Ichni.RhythmGame
{
trackRendererAutoOrientButton.button.interactable = false;
trackRendererPathGeneratorButton.button.interactable = false;
trackRenderTubeGeneratorButton.button.interactable = false;
trackRendererSurfaceButton.button.interactable = false;
}
var toolsContainerTrack = inspector.GenerateContainer("Track Tools"); //轨道(整体)快捷工具

View File

@@ -97,20 +97,24 @@ namespace Ichni.RhythmGame
{
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));
var trackSamplingDropdown =
inspector.GenerateDropdown(this, container, "Sampling Type", typeof(Track.TrackSamplingType), nameof(trackSamplingType));
var isClosedToggle =
inspector.GenerateToggle(this, container, "Is Closed", nameof(isClosed));
isClosedToggle.AddListenerFunction(_ => ClosePath());
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));
showDisplayToggle.AddListenerFunction(() => SetDisplay(isShowingDisplay));
}
}

View File

@@ -111,19 +111,19 @@ namespace Ichni.RhythmGame
var container = inspector.GenerateContainer("Track Renderer Auto Orient");
var enableEmissionToggle = inspector.GenerateToggle(this, container, "Enable Emission", nameof(enableEmission));
enableEmissionToggle.AddListenerFunction(_ => SetEnableEmission());
enableEmissionToggle.AddListenerFunction(SetEnableEmission);
var emissionIntensityInputField = inspector.GenerateInputField(this, container, "Emission Intensity", nameof(emissionIntensity));
emissionIntensityInputField.AddListenerFunction(_ => SetEmissionIntensity());
emissionIntensityInputField.AddListenerFunction(SetEmissionIntensity);
var themeBundleDropdown = inspector.GenerateDropdown(this, container, "Theme Bundle", ThemeBundleManager.instance.selectedThemeBundleList, nameof(materialThemeBundleName));
themeBundleDropdown.AddListenerFunction(_ => inspectorMain.SetInspector(track));
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));
objectNameDropdown.AddListenerFunction(() => inspectorMain.SetInspector(track));
}
else
{
@@ -229,19 +229,19 @@ namespace Ichni.RhythmGame
var container = inspector.GenerateContainer("Track Renderer Path Generator");
var enableEmissionToggle = inspector.GenerateToggle(this, container, "Enable Emission", nameof(enableEmission));
enableEmissionToggle.AddListenerFunction(_ => SetEnableEmission());
enableEmissionToggle.AddListenerFunction(SetEnableEmission);
var emissionIntensityInputField = inspector.GenerateInputField(this, container, "Emission Intensity", nameof(emissionIntensity));
emissionIntensityInputField.AddListenerFunction(_ => SetEmissionIntensity());
emissionIntensityInputField.AddListenerFunction(SetEmissionIntensity);
var themeBundleDropdown = inspector.GenerateDropdown(this, container, "Theme Bundle", ThemeBundleManager.instance.selectedThemeBundleList, nameof(materialThemeBundleName));
themeBundleDropdown.AddListenerFunction(_ => inspectorMain.SetInspector(track));
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));
objectNameDropdown.AddListenerFunction(() => inspectorMain.SetInspector(track));
}
else
{
@@ -313,6 +313,136 @@ namespace Ichni.RhythmGame
#endregion
#region TubeGenerator
public class TrackRendererSubmoduleTubeGenerator : TrackRendererSubmodule
{
public TubeGenerator tubeGenerator;
public int sideCount;
public TrackRendererSubmoduleTubeGenerator(Track track, bool enableEmission, float emissionIntensity, int sideCount, Material material = null) :
base(track, enableEmission, emissionIntensity)
{
this.sideCount = sideCount;
this.tubeGenerator = track.AddComponent<TubeGenerator>();
this.meshRenderer = tubeGenerator.GetComponent<MeshRenderer>();
this.meshGenerator = tubeGenerator;
this.renderMaterial = material == null ? EditorManager.instance.basePrefabs.defaultTrackMaterial : material;
this.tubeGenerator.spline = track.trackPathSubmodule.path;
this.tubeGenerator.clipFrom = 0;
this.tubeGenerator.clipTo = 1;
this.meshRenderer.material = renderMaterial;
this.tubeGenerator.color = Color.white;
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));
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();
track.trackRendererSubmodule = null;
inspectorMain.SetInspector(track);
track.Refresh();
});
}
}
namespace Beatmap
{
public class TrackRendererSubmoduleTubeGenerator_BM : Submodule_BM
{
public string materialThemeBundleName;
public string materialName;
public bool enableEmission;
public float emissionIntensity;
public int sideCount;
public TrackRendererSubmoduleTubeGenerator_BM()
{
}
public TrackRendererSubmoduleTubeGenerator_BM(GameElement attachedElement,
TrackRendererSubmoduleTubeGenerator trackRendererSubmodule) : base(attachedElement)
{
materialThemeBundleName = trackRendererSubmodule.materialThemeBundleName;
materialName = trackRendererSubmodule.materialName;
enableEmission = trackRendererSubmodule.enableEmission;
emissionIntensity = trackRendererSubmodule.emissionIntensity;
sideCount = trackRendererSubmodule.sideCount;
}
public override void ExecuteBM()
{
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Track track = attachedElement as Track;
track.trackRendererSubmodule = new TrackRendererSubmoduleTubeGenerator(track, enableEmission, emissionIntensity, sideCount);
if (materialName.Trim() != String.Empty)
{
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
}
}
public override void DuplicateBM(GameElement attached)
{
Track track = attached as Track;
track.trackRendererSubmodule = new TrackRendererSubmoduleTubeGenerator(track, enableEmission, emissionIntensity, sideCount);
if (materialName.Trim() != String.Empty)
{
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
}
}
}
}
#endregion
#region Surface
public class TrackRendererSubmoduleSurface : TrackRendererSubmodule
@@ -347,19 +477,19 @@ namespace Ichni.RhythmGame
var container = inspector.GenerateContainer("Track Renderer Surface");
var enableEmissionToggle = inspector.GenerateToggle(this, container, "Enable Emission", nameof(enableEmission));
enableEmissionToggle.AddListenerFunction(_ => SetEnableEmission());
enableEmissionToggle.AddListenerFunction(SetEnableEmission);
var emissionIntensityInputField = inspector.GenerateInputField(this, container, "Emission Intensity", nameof(emissionIntensity));
emissionIntensityInputField.AddListenerFunction(_ => SetEmissionIntensity());
emissionIntensityInputField.AddListenerFunction(SetEmissionIntensity);
var themeBundleDropdown = inspector.GenerateDropdown(this, container, "Theme Bundle", ThemeBundleManager.instance.selectedThemeBundleList, nameof(materialThemeBundleName));
themeBundleDropdown.AddListenerFunction(_ => inspectorMain.SetInspector(track));
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));
objectNameDropdown.AddListenerFunction(() => inspectorMain.SetInspector(track));
}
else
{

View File

@@ -75,17 +75,17 @@ namespace Ichni.RhythmGame
var container = inspector.GenerateContainer("Track Time Movable");
var startTimeInputField =
inspector.GenerateInputField(this, container, "Start Time", nameof(trackStartTime));
startTimeInputField.AddListenerFunction(_ => RefreshChildren());
startTimeInputField.AddListenerFunction(RefreshChildren);
var endTimeInputField = inspector.GenerateInputField(this, container, "End Time", nameof(trackEndTime));
endTimeInputField.AddListenerFunction(_ => RefreshChildren());
endTimeInputField.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());
animationCurveDropdown.AddListenerFunction(RefreshChildren);
var deleteButton = inspector.GenerateButton(this, container, "Delete",
() =>

View File

@@ -65,13 +65,13 @@ namespace Ichni.RhythmGame
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);
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);
isAutoOrientToggle.AddListenerFunction(() => trailRenderer.alignment = isAutoOrient ? LineAlignment.View : LineAlignment.TransformZ);
var widthMultiplierInputField = inspector.GenerateInputField(this, container, "Width Multiplier", nameof(widthMultiplier));
widthMultiplierInputField.AddListenerFunction(_ => trailRenderer.widthMultiplier = widthMultiplier);
widthMultiplierInputField.AddListenerFunction(() => trailRenderer.widthMultiplier = widthMultiplier);
var widthCurveButton = inspector.GenerateButton(this, container, "Width Curve", () =>
{