This commit is contained in:
SoulliesOfficial
2025-07-15 05:00:31 -04:00
parent d2e981b826
commit 4708da8318
12 changed files with 1613 additions and 107 deletions

View File

@@ -0,0 +1,106 @@
using System.Collections;
using System.Collections.Generic;
using Ichni.RhythmGame;
using TMPro;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
namespace Ichni.Editor
{
public class DynamicUIVector2InputField : DynamicUIElement, IHaveAutoUpdate
{
public TMP_InputField inputFieldX;
public TMP_InputField inputFieldY;
public bool isAutoUpdate { get; set; }
public bool isReceiving { get; set; }
public override void Initialize(IBaseElement baseElement, string title, string parameterName)
{
base.Initialize(baseElement, title, parameterName);
if (parameterName != string.Empty)
{
ApplyContent();
inputFieldX.onEndEdit.AddListener(_ => ApplyParameters());
inputFieldY.onEndEdit.AddListener(_ => ApplyParameters());
}
}
private void Update()
{
(this as IHaveAutoUpdate).UpdateContent();
// 检测鼠标是否在 inputFieldX、inputFieldY 或 inputFieldZ 上
var selectedGameObject = EventSystem.current.currentSelectedGameObject;
bool[] isMouseOverText = new[]
{
selectedGameObject==inputFieldX.gameObject,
selectedGameObject==inputFieldY.gameObject,
};
if (Mouse.current.scroll.ReadValue().y != 0) // 检测鼠标滚轮
{
float scrollDelta = Mouse.current.scroll.ReadValue().y > 0 ? 0.1f : -0.1f; // 根据滚轮方向设置增量
if (isMouseOverText[0]) // 鼠标在 inputFieldX 上
{
float currentValue = float.Parse(inputFieldX.text);
inputFieldX.text = (currentValue + scrollDelta).ToString();
ApplyParameters();
}
else if (isMouseOverText[1]) // 鼠标在 inputFieldY 上
{
float currentValue = float.Parse(inputFieldY.text);
inputFieldY.text = (currentValue + scrollDelta).ToString();
ApplyParameters();
}
}
}
public void SetDefaultValue(Vector2 value)
{
inputFieldX.text = value.x.ToString();
inputFieldY.text = value.y.ToString();
}
public Vector2 GetValue()
{
return new Vector2(float.Parse(inputFieldX.text), float.Parse(inputFieldY.text));
}
public void SetAutoUpdate(bool enable)
{
isAutoUpdate = enable;
isReceiving = true;
inputFieldX.onSelect.AddListener(_ => isReceiving = false);
inputFieldY.onSelect.AddListener(_ => isReceiving = false);
inputFieldX.onDeselect.AddListener(_ => isReceiving = true);
inputFieldY.onDeselect.AddListener(_ => isReceiving = true);
}
public void ApplyContent()
{
Vector2 pos = (Vector2)connectedBaseElement.GetType().GetField(parameterName).GetValue(connectedBaseElement); //获取对应变量的值
inputFieldX.text = pos.x.ToString();
inputFieldY.text = pos.y.ToString();
}
private void ApplyParameters()
{
Vector2 newValue = new Vector2(float.Parse(inputFieldX.text), float.Parse(inputFieldY.text));
connectedBaseElement.GetType().GetField(parameterName).SetValue(connectedBaseElement, newValue);
connectedBaseElement.Refresh();
}
public override DynamicUIElement AddListenerFunction(UnityAction action)
{
inputFieldX.onEndEdit.AddListener(_ => action());
inputFieldY.onEndEdit.AddListener(_ => action());
return this;
}
}
}

View File

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

View File

@@ -8,8 +8,6 @@ using UnityEngine;
using UnityEngine.Events;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.Serialization;
using UnityEngine.UIElements.Experimental;
namespace Ichni.Editor
{

View File

@@ -130,6 +130,18 @@ namespace Ichni.Editor
subcontainer.dynamicUIElements.Add(vector3InputField);
return vector3InputField;
}
public DynamicUIVector2InputField GenerateVector2InputField(IBaseElement baseElement,
DynamicUISubcontainer subcontainer, string title, string parameterName, bool isAutoUpdate = false)
{
DynamicUIVector2InputField vector2InputField =
Object.Instantiate(EditorManager.instance.basePrefabs.vector2InputField, subcontainer.rect)
.GetComponent<DynamicUIVector2InputField>();
vector2InputField.Initialize(baseElement, title, parameterName);
vector2InputField.SetAutoUpdate(isAutoUpdate);
subcontainer.dynamicUIElements.Add(vector2InputField);
return vector2InputField;
}
public DynamicUIBaseColorPicker GenerateBaseColorPicker(IBaseElement baseElement, DynamicUISubcontainer subcontainer,
string title, string parameterName)

View File

@@ -115,25 +115,29 @@ namespace Ichni.RhythmGame
var trackRendererAutoOrientButton =
inspector.GenerateButton(this, trackRendererSubcontainer, "Track Renderer Auto Orient", () =>
{
trackRendererSubmodule = new TrackRendererSubmoduleAutoOrient(this, false, 0, true);
trackRendererSubmodule =
new TrackRendererSubmoduleAutoOrient(this, false, 0, true, Vector2.one, Vector2.zero);
inspectorMain.SetInspector(this);
});
var trackRendererPathGeneratorButton =
inspector.GenerateButton(this, trackRendererSubcontainer, "Track Renderer Path Generator", () =>
{
trackRendererSubmodule = new TrackRendererSubmodulePathGenerator(this, false, 0, true);
trackRendererSubmodule =
new TrackRendererSubmodulePathGenerator(this, false, 0, true, Vector2.one, Vector2.zero);
inspectorMain.SetInspector(this);
});
var trackRenderTubeGeneratorButton =
inspector.GenerateButton(this, trackRendererSubcontainer, "Track Renderer Tube Generator", () =>
{
trackRendererSubmodule = new TrackRendererSubmoduleTubeGenerator(this, false, 0, true, 4);
trackRendererSubmodule =
new TrackRendererSubmoduleTubeGenerator(this, false, 0, true, 4, Vector2.one, Vector2.zero);
inspectorMain.SetInspector(this);
});
var trackRendererSurfaceButton =
inspector.GenerateButton(this, trackRendererSubcontainer, "Track Renderer Surface", () =>
{
trackRendererSubmodule = new TrackRendererSubmoduleSurface(this, false, 0, true);
trackRendererSubmodule =
new TrackRendererSubmoduleSurface(this, false, 0, true, Vector2.one, Vector2.zero);
inspectorMain.SetInspector(this);
});

View File

@@ -24,15 +24,20 @@ namespace Ichni.RhythmGame
public bool enableEmission;
public float emissionIntensity;
public bool zWrite;
public Vector2 uvScale;
public Vector2 uvOffset;
public TrackRendererSubmodule(Track track, bool enableEmission, float emissionIntensity, bool zWrite) : base(track)
public TrackRendererSubmodule(Track track, bool enableEmission, float emissionIntensity, bool zWrite,
Vector2 uvScale, Vector2 uvOffset) : base(track)
{
this.enableEmission = enableEmission;
this.emissionIntensity = emissionIntensity;
this.materialThemeBundleName = String.Empty;
this.materialName = String.Empty;
this.zWrite = zWrite;
this.uvScale = uvScale;
this.uvOffset = uvOffset;
if (!HaveSameSubmodule)
{
this.track.trackRendererSubmodule = this;
@@ -58,6 +63,7 @@ namespace Ichni.RhythmGame
SetEnableZWrite();
SetEnableEmission();
SetEmissionIntensity();
SetUV();
if (track.trackTimeSubmodule is TrackTimeSubmoduleMovable)
{
@@ -92,9 +98,7 @@ namespace Ichni.RhythmGame
var container = inspector.GenerateContainer("Track Renderer " + submoduleName[submoduleNameIndex]);
var zWriteSettings = container.GenerateSubcontainer(3);
var zWriteToggle =
inspector.GenerateToggle(this, zWriteSettings, "Enable ZWrite", nameof(zWrite))
.AddListenerFunction(SetEnableZWrite);
@@ -105,6 +109,14 @@ namespace Ichni.RhythmGame
var emissionIntensityInputField =
inspector.GenerateInputField(this, emissionSettings, "Emission Intensity", nameof(emissionIntensity))
.AddListenerFunction(SetEmissionIntensity);
var uvSettings = container.GenerateSubcontainer(1);
var uvScaleInputField =
inspector.GenerateVector2InputField(this, uvSettings, "UV Scale", nameof(uvScale))
.AddListenerFunction(SetUV);
var uvOffsetInputField =
inspector.GenerateVector2InputField(this, uvSettings, "UV Offset", nameof(uvOffset))
.AddListenerFunction(SetUV);
var materialSettings = container.GenerateSubcontainer(3);
var themeBundleDropdown = inspector
@@ -155,6 +167,12 @@ namespace Ichni.RhythmGame
{
meshRenderer.material.SetColor("_EmissionColor", Color.white * Mathf.Pow(2, emissionIntensity));
}
protected void SetUV()
{
meshGenerator.uvScale = uvScale;
meshGenerator.uvOffset = uvOffset;
}
}
#region AutoOrient
@@ -163,8 +181,9 @@ namespace Ichni.RhythmGame
{
public SplineRenderer splineRenderer;
public TrackRendererSubmoduleAutoOrient(Track track, bool enableEmission, float emissionIntensity, bool zWrite, Material material = null) :
base(track, enableEmission, emissionIntensity, zWrite)
public TrackRendererSubmoduleAutoOrient(Track track, bool enableEmission, float emissionIntensity, bool zWrite,
Vector2 uvScale, Vector2 uvOffset, Material material = null) :
base(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset)
{
this.splineRenderer = track.AddComponent<SplineRenderer>();
this.meshRenderer = splineRenderer.GetComponent<MeshRenderer>();
@@ -197,6 +216,8 @@ namespace Ichni.RhythmGame
public bool enableEmission;
public float emissionIntensity;
public bool zWrite; // 新增
public Vector2 uvScale = Vector2.one;
public Vector2 uvOffset = Vector2.zero;
public TrackRendererSubmoduleAutoOrient_BM()
{
@@ -211,13 +232,16 @@ namespace Ichni.RhythmGame
enableEmission = trackRendererSubmodule.enableEmission;
emissionIntensity = trackRendererSubmodule.emissionIntensity;
zWrite = trackRendererSubmodule.zWrite; // 新增
uvScale = trackRendererSubmodule.uvScale;
uvOffset = trackRendererSubmodule.uvOffset;
}
public override void ExecuteBM()
{
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Track track = attachedElement as Track;
track.trackRendererSubmodule = new TrackRendererSubmoduleAutoOrient(track, enableEmission, emissionIntensity, zWrite);
track.trackRendererSubmodule =
new TrackRendererSubmoduleAutoOrient(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
if (materialName.Trim() != String.Empty)
{
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
@@ -227,7 +251,8 @@ namespace Ichni.RhythmGame
public override void DuplicateBM(GameElement attached)
{
Track track = attached as Track;
track.trackRendererSubmodule = new TrackRendererSubmoduleAutoOrient(track, enableEmission, emissionIntensity, zWrite);
track.trackRendererSubmodule =
new TrackRendererSubmoduleAutoOrient(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
if (materialName.Trim() != String.Empty)
{
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
@@ -244,8 +269,9 @@ namespace Ichni.RhythmGame
{
public PathGenerator pathGenerator;
public TrackRendererSubmodulePathGenerator(Track track, bool enableEmission, float emissionIntensity, bool zWrite, Material material = null) :
base(track, enableEmission, emissionIntensity, zWrite)
public TrackRendererSubmodulePathGenerator(Track track, bool enableEmission, float emissionIntensity, bool zWrite,
Vector2 uvScale, Vector2 uvOffset, Material material = null) :
base(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset)
{
this.pathGenerator = track.AddComponent<PathGenerator>();
this.meshRenderer = pathGenerator.GetComponent<MeshRenderer>();
@@ -278,6 +304,8 @@ namespace Ichni.RhythmGame
public bool enableEmission;
public float emissionIntensity;
public bool zWrite; // 新增
public Vector2 uvScale = Vector2.one;
public Vector2 uvOffset = Vector2.zero;
public TrackRendererSubmodulePathGenerator_BM()
{
@@ -292,13 +320,16 @@ namespace Ichni.RhythmGame
enableEmission = trackRendererSubmodule.enableEmission;
emissionIntensity = trackRendererSubmodule.emissionIntensity;
zWrite = trackRendererSubmodule.zWrite; // 新增
uvScale = trackRendererSubmodule.uvScale;
uvOffset = trackRendererSubmodule.uvOffset;
}
public override void ExecuteBM()
{
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Track track = attachedElement as Track;
track.trackRendererSubmodule = new TrackRendererSubmodulePathGenerator(track, enableEmission, emissionIntensity, zWrite);
track.trackRendererSubmodule =
new TrackRendererSubmodulePathGenerator(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
if (materialName.Trim() != String.Empty)
{
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
@@ -308,7 +339,8 @@ namespace Ichni.RhythmGame
public override void DuplicateBM(GameElement attached)
{
Track track = attached as Track;
track.trackRendererSubmodule = new TrackRendererSubmodulePathGenerator(track, enableEmission, emissionIntensity, zWrite);
track.trackRendererSubmodule =
new TrackRendererSubmodulePathGenerator(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
if (materialName.Trim() != String.Empty)
{
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
@@ -327,8 +359,8 @@ namespace Ichni.RhythmGame
public int sideCount;
public TrackRendererSubmoduleTubeGenerator(Track track, bool enableEmission, float emissionIntensity, bool zWrite,
int sideCount, Material material = null) :
base(track, enableEmission, emissionIntensity, zWrite)
int sideCount, Vector2 uvScale, Vector2 uvOffset, Material material = null) :
base(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset)
{
this.sideCount = sideCount;
@@ -379,7 +411,9 @@ namespace Ichni.RhythmGame
public bool enableEmission;
public float emissionIntensity;
public bool zWrite; // 新增
public int sideCount;
public int sideCount;
public Vector2 uvScale = Vector2.one;
public Vector2 uvOffset = Vector2.zero;
public TrackRendererSubmoduleTubeGenerator_BM()
{
@@ -395,13 +429,16 @@ namespace Ichni.RhythmGame
emissionIntensity = trackRendererSubmodule.emissionIntensity;
zWrite = trackRendererSubmodule.zWrite; // 新增
sideCount = trackRendererSubmodule.sideCount;
uvScale = trackRendererSubmodule.uvScale;
uvOffset = trackRendererSubmodule.uvOffset;
}
public override void ExecuteBM()
{
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Track track = attachedElement as Track;
track.trackRendererSubmodule = new TrackRendererSubmoduleTubeGenerator(track, enableEmission, emissionIntensity, zWrite, sideCount);
track.trackRendererSubmodule =
new TrackRendererSubmoduleTubeGenerator(track, enableEmission, emissionIntensity, zWrite, sideCount, uvScale, uvOffset);
if (materialName.Trim() != String.Empty)
{
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
@@ -411,7 +448,8 @@ namespace Ichni.RhythmGame
public override void DuplicateBM(GameElement attached)
{
Track track = attached as Track;
track.trackRendererSubmodule = new TrackRendererSubmoduleTubeGenerator(track, enableEmission, emissionIntensity, zWrite, sideCount);
track.trackRendererSubmodule =
new TrackRendererSubmoduleTubeGenerator(track, enableEmission, emissionIntensity, zWrite, sideCount, uvScale, uvOffset);
if (materialName.Trim() != String.Empty)
{
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
@@ -428,8 +466,9 @@ namespace Ichni.RhythmGame
{
public SurfaceGenerator surface;
public TrackRendererSubmoduleSurface(Track track, bool enableEmission, float emissionIntensity, bool zWrite, Material material = null) :
base(track, enableEmission, emissionIntensity, zWrite)
public TrackRendererSubmoduleSurface(Track track, bool enableEmission, float emissionIntensity, bool zWrite,
Vector2 uvScale, Vector2 uvOffset, Material material = null) :
base(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset)
{
this.surface = track.AddComponent<SurfaceGenerator>();
this.meshRenderer = surface.GetComponent<MeshRenderer>();
@@ -462,6 +501,8 @@ namespace Ichni.RhythmGame
public bool enableEmission;
public float emissionIntensity;
public bool zWrite; // 新增
public Vector2 uvScale = Vector2.one;
public Vector2 uvOffset = Vector2.zero;
public TrackRendererSubmoduleSurface_BM()
{
@@ -476,13 +517,16 @@ namespace Ichni.RhythmGame
enableEmission = trackRendererSubmodule.enableEmission;
emissionIntensity = trackRendererSubmodule.emissionIntensity;
zWrite = trackRendererSubmodule.zWrite; // 新增
uvScale = trackRendererSubmodule.uvScale;
uvOffset = trackRendererSubmodule.uvOffset;
}
public override void ExecuteBM()
{
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
Track track = attachedElement as Track;
track.trackRendererSubmodule = new TrackRendererSubmoduleSurface(track, enableEmission, emissionIntensity, zWrite);
track.trackRendererSubmodule =
new TrackRendererSubmoduleSurface(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
if (materialName.Trim() != String.Empty)
{
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
@@ -492,7 +536,8 @@ namespace Ichni.RhythmGame
public override void DuplicateBM(GameElement attached)
{
Track track = attached as Track;
track.trackRendererSubmodule = new TrackRendererSubmoduleSurface(track, enableEmission, emissionIntensity, zWrite);
track.trackRendererSubmodule =
new TrackRendererSubmoduleSurface(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
if (materialName.Trim() != String.Empty)
{
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);

View File

@@ -48,6 +48,7 @@ namespace Ichni.RhythmGame
[Title("DynamicUI相关-Simple")] public GameObject dynamicUIContainer;
public GameObject dynamicUISubcontainer;
public GameObject inputField;
public GameObject vector2InputField;
public GameObject vector3InputField;
public GameObject parameterText;
public GameObject hintText;