This commit is contained in:
2025-07-15 17:08:48 +08:00
12 changed files with 17472 additions and 15979 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -77,6 +77,8 @@ MonoBehaviour:
type: 3}
inputField: {fileID: 2642348292953561022, guid: 94ed5dfb5df8c408faa267d2915aaeeb,
type: 3}
vector2InputField: {fileID: 8936320662031972394, guid: a6abc70beebfa934a9c5ef5b2b8ec115,
type: 3}
vector3InputField: {fileID: 8936320662031972394, guid: 9e72408c17dfe4740b0e9060d6b3fafa,
type: 3}
parameterText: {fileID: 2642348292953561022, guid: 4b0098f7176cb49d6ac968b7d3ca4c51,

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: a6abc70beebfa934a9c5ef5b2b8ec115
PrefabImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

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;