更新
This commit is contained in:
36664
Assets/FR2_Cache.asset
36664
Assets/FR2_Cache.asset
File diff suppressed because it is too large
Load Diff
@@ -17,6 +17,9 @@ namespace Ichni.Editor
|
||||
|
||||
public override void Initialize(IBaseElement baseElement, string title, string parameterName)
|
||||
{
|
||||
// 精确重置可交互状态,防止从对象池取回到被禁用的废弃输入框
|
||||
if (inputField != null) inputField.interactable = true;
|
||||
|
||||
// [对象池安全]
|
||||
inputField.onEndEdit.RemoveListener(OnEndEditNode);
|
||||
inputField.onSelect.RemoveListener(OnSelectNode);
|
||||
|
||||
@@ -20,6 +20,10 @@ namespace Ichni.Editor
|
||||
|
||||
public override void Initialize(IBaseElement baseElement, string title, string parameterName)
|
||||
{
|
||||
// 精确重置可交互状态
|
||||
if (inputFieldX != null) inputFieldX.interactable = true;
|
||||
if (inputFieldY != null) inputFieldY.interactable = true;
|
||||
|
||||
base.Initialize(baseElement, title, parameterName);
|
||||
if (parameterName != string.Empty)
|
||||
{
|
||||
|
||||
@@ -23,6 +23,11 @@ namespace Ichni.Editor
|
||||
|
||||
public override void Initialize(IBaseElement baseElement, string title, string parameterName)
|
||||
{
|
||||
// 精确重置可交互状态
|
||||
if (inputFieldX != null) inputFieldX.interactable = true;
|
||||
if (inputFieldY != null) inputFieldY.interactable = true;
|
||||
if (inputFieldZ != null) inputFieldZ.interactable = true;
|
||||
|
||||
base.Initialize(baseElement, title, parameterName);
|
||||
if (parameterName != string.Empty)
|
||||
{
|
||||
|
||||
@@ -61,5 +61,15 @@ namespace Ichni.Editor
|
||||
subcontainer.dynamicUIElements.Add(button);
|
||||
return button;
|
||||
}
|
||||
|
||||
public DynamicUIToggle GenerateToggle(DynamicUISubcontainer subcontainer, string title, bool defaultState = false)
|
||||
{
|
||||
DynamicUIToggle toggle = Instantiate(EditorManager.instance.basePrefabs.toggle, subcontainer.rect)
|
||||
.GetComponent<DynamicUIToggle>();
|
||||
toggle.Initialize(null, title, string.Empty);
|
||||
toggle.toggle.isOn = defaultState;
|
||||
subcontainer.dynamicUIElements.Add(toggle);
|
||||
return toggle;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,6 +9,7 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
public Track.TrackSamplingType trackSamplingType;
|
||||
public bool isClosed;
|
||||
public bool isShowingDisplay;
|
||||
public int sampleRate = 8;
|
||||
|
||||
public TrackPathSubmodule_BM()
|
||||
{
|
||||
@@ -23,20 +24,21 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
this.trackSamplingType = trackPathSubmodule.trackSamplingType;
|
||||
this.isClosed = trackPathSubmodule.isClosed;
|
||||
this.isShowingDisplay = trackPathSubmodule.isShowingDisplay;
|
||||
this.sampleRate = trackPathSubmodule.sampleRate;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
{
|
||||
attachedElement = GameElement_BM.GetElement(attachedElementGuid);
|
||||
Track track = attachedElement as Track;
|
||||
track.trackPathSubmodule = new TrackPathSubmodule(track, trackSpaceType, trackSamplingType, isClosed, isShowingDisplay);
|
||||
track.trackPathSubmodule = new TrackPathSubmodule(track, trackSpaceType, trackSamplingType, isClosed, isShowingDisplay, sampleRate);
|
||||
}
|
||||
|
||||
#region [Editor 独有接口] Editor Interfaces
|
||||
public override void DuplicateBM(GameElement attached)
|
||||
{
|
||||
Track track = attached as Track;
|
||||
track.trackPathSubmodule = new TrackPathSubmodule(track, trackSpaceType, trackSamplingType, isClosed, isShowingDisplay);
|
||||
track.trackPathSubmodule = new TrackPathSubmodule(track, trackSpaceType, trackSamplingType, isClosed, isShowingDisplay, sampleRate);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -14,6 +14,11 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
public bool zWrite; // 新增
|
||||
public Vector2 uvScale = Vector2.one;
|
||||
public Vector2 uvOffset = Vector2.zero;
|
||||
public string customTextureThemeBundleName = "None";
|
||||
public string customTextureName = "None";
|
||||
public Dreamteck.Splines.MeshGenerator.UVMode uvMode = Dreamteck.Splines.MeshGenerator.UVMode.UniformClip;
|
||||
public float uvRotation = 0f;
|
||||
public float size = 1f;
|
||||
|
||||
public TrackRendererSubmoduleAutoOrient_BM()
|
||||
{
|
||||
@@ -30,6 +35,11 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
zWrite = trackRendererSubmodule.zWrite; // 新增
|
||||
uvScale = trackRendererSubmodule.uvScale;
|
||||
uvOffset = trackRendererSubmodule.uvOffset;
|
||||
customTextureThemeBundleName = trackRendererSubmodule.customTextureThemeBundleName;
|
||||
customTextureName = trackRendererSubmodule.customTextureName;
|
||||
uvMode = trackRendererSubmodule.uvMode;
|
||||
uvRotation = trackRendererSubmodule.uvRotation;
|
||||
size = trackRendererSubmodule.size;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
@@ -38,6 +48,11 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
Track track = attachedElement as Track;
|
||||
track.trackRendererSubmodule =
|
||||
new TrackRendererSubmoduleAutoOrient(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
|
||||
track.trackRendererSubmodule.customTextureThemeBundleName = customTextureThemeBundleName;
|
||||
track.trackRendererSubmodule.customTextureName = customTextureName;
|
||||
track.trackRendererSubmodule.uvMode = uvMode;
|
||||
track.trackRendererSubmodule.uvRotation = uvRotation;
|
||||
track.trackRendererSubmodule.size = size;
|
||||
if (materialName.Trim() != String.Empty)
|
||||
{
|
||||
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
|
||||
@@ -50,6 +65,11 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
Track track = attached as Track;
|
||||
track.trackRendererSubmodule =
|
||||
new TrackRendererSubmoduleAutoOrient(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
|
||||
track.trackRendererSubmodule.customTextureThemeBundleName = customTextureThemeBundleName;
|
||||
track.trackRendererSubmodule.customTextureName = customTextureName;
|
||||
track.trackRendererSubmodule.uvMode = uvMode;
|
||||
track.trackRendererSubmodule.uvRotation = uvRotation;
|
||||
track.trackRendererSubmodule.size = size;
|
||||
if (materialName.Trim() != String.Empty)
|
||||
{
|
||||
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
|
||||
@@ -68,6 +88,11 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
public bool zWrite; // 新增
|
||||
public Vector2 uvScale = Vector2.one;
|
||||
public Vector2 uvOffset = Vector2.zero;
|
||||
public string customTextureThemeBundleName = "None";
|
||||
public string customTextureName = "None";
|
||||
public Dreamteck.Splines.MeshGenerator.UVMode uvMode = Dreamteck.Splines.MeshGenerator.UVMode.UniformClip;
|
||||
public float uvRotation = 90f;
|
||||
public float size = 1f;
|
||||
|
||||
public TrackRendererSubmodulePathGenerator_BM()
|
||||
{
|
||||
@@ -84,6 +109,11 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
zWrite = trackRendererSubmodule.zWrite; // 新增
|
||||
uvScale = trackRendererSubmodule.uvScale;
|
||||
uvOffset = trackRendererSubmodule.uvOffset;
|
||||
customTextureThemeBundleName = trackRendererSubmodule.customTextureThemeBundleName;
|
||||
customTextureName = trackRendererSubmodule.customTextureName;
|
||||
uvMode = trackRendererSubmodule.uvMode;
|
||||
uvRotation = trackRendererSubmodule.uvRotation;
|
||||
size = trackRendererSubmodule.size;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
@@ -92,6 +122,11 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
Track track = attachedElement as Track;
|
||||
track.trackRendererSubmodule =
|
||||
new TrackRendererSubmodulePathGenerator(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
|
||||
track.trackRendererSubmodule.customTextureThemeBundleName = customTextureThemeBundleName;
|
||||
track.trackRendererSubmodule.customTextureName = customTextureName;
|
||||
track.trackRendererSubmodule.uvMode = uvMode;
|
||||
track.trackRendererSubmodule.uvRotation = uvRotation;
|
||||
track.trackRendererSubmodule.size = size;
|
||||
if (materialName.Trim() != String.Empty)
|
||||
{
|
||||
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
|
||||
@@ -104,6 +139,11 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
Track track = attached as Track;
|
||||
track.trackRendererSubmodule =
|
||||
new TrackRendererSubmodulePathGenerator(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
|
||||
track.trackRendererSubmodule.customTextureThemeBundleName = customTextureThemeBundleName;
|
||||
track.trackRendererSubmodule.customTextureName = customTextureName;
|
||||
track.trackRendererSubmodule.uvMode = uvMode;
|
||||
track.trackRendererSubmodule.uvRotation = uvRotation;
|
||||
track.trackRendererSubmodule.size = size;
|
||||
if (materialName.Trim() != String.Empty)
|
||||
{
|
||||
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
|
||||
@@ -124,6 +164,9 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
public int sideCount;
|
||||
public Vector2 uvScale = Vector2.one;
|
||||
public Vector2 uvOffset = Vector2.zero;
|
||||
public Dreamteck.Splines.MeshGenerator.UVMode uvMode = Dreamteck.Splines.MeshGenerator.UVMode.UniformClip;
|
||||
public float uvRotation = 0f;
|
||||
public float size = 1f;
|
||||
|
||||
public TrackRendererSubmoduleTubeGenerator_BM()
|
||||
{
|
||||
@@ -141,6 +184,9 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
sideCount = trackRendererSubmodule.sideCount;
|
||||
uvScale = trackRendererSubmodule.uvScale;
|
||||
uvOffset = trackRendererSubmodule.uvOffset;
|
||||
uvMode = trackRendererSubmodule.uvMode;
|
||||
uvRotation = trackRendererSubmodule.uvRotation;
|
||||
size = trackRendererSubmodule.size;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
@@ -149,6 +195,9 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
Track track = attachedElement as Track;
|
||||
track.trackRendererSubmodule =
|
||||
new TrackRendererSubmoduleTubeGenerator(track, enableEmission, emissionIntensity, zWrite, sideCount, uvScale, uvOffset);
|
||||
track.trackRendererSubmodule.uvMode = uvMode;
|
||||
track.trackRendererSubmodule.uvRotation = uvRotation;
|
||||
track.trackRendererSubmodule.size = size;
|
||||
if (materialName.Trim() != String.Empty)
|
||||
{
|
||||
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
|
||||
@@ -161,6 +210,9 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
Track track = attached as Track;
|
||||
track.trackRendererSubmodule =
|
||||
new TrackRendererSubmoduleTubeGenerator(track, enableEmission, emissionIntensity, zWrite, sideCount, uvScale, uvOffset);
|
||||
track.trackRendererSubmodule.uvMode = uvMode;
|
||||
track.trackRendererSubmodule.uvRotation = uvRotation;
|
||||
track.trackRendererSubmodule.size = size;
|
||||
if (materialName.Trim() != String.Empty)
|
||||
{
|
||||
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
|
||||
@@ -179,6 +231,9 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
public bool zWrite; // 新增
|
||||
public Vector2 uvScale = Vector2.one;
|
||||
public Vector2 uvOffset = Vector2.zero;
|
||||
public Dreamteck.Splines.MeshGenerator.UVMode uvMode = Dreamteck.Splines.MeshGenerator.UVMode.UniformClip;
|
||||
public float uvRotation = 0f;
|
||||
public float size = 1f;
|
||||
|
||||
public TrackRendererSubmoduleSurface_BM()
|
||||
{
|
||||
@@ -195,6 +250,9 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
zWrite = trackRendererSubmodule.zWrite; // 新增
|
||||
uvScale = trackRendererSubmodule.uvScale;
|
||||
uvOffset = trackRendererSubmodule.uvOffset;
|
||||
uvMode = trackRendererSubmodule.uvMode;
|
||||
uvRotation = trackRendererSubmodule.uvRotation;
|
||||
size = trackRendererSubmodule.size;
|
||||
}
|
||||
|
||||
public override void ExecuteBM()
|
||||
@@ -203,6 +261,9 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
Track track = attachedElement as Track;
|
||||
track.trackRendererSubmodule =
|
||||
new TrackRendererSubmoduleSurface(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
|
||||
track.trackRendererSubmodule.uvMode = uvMode;
|
||||
track.trackRendererSubmodule.uvRotation = uvRotation;
|
||||
track.trackRendererSubmodule.size = size;
|
||||
if (materialName.Trim() != String.Empty)
|
||||
{
|
||||
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
|
||||
@@ -215,6 +276,9 @@ namespace Ichni.RhythmGame.Beatmap
|
||||
Track track = attached as Track;
|
||||
track.trackRendererSubmodule =
|
||||
new TrackRendererSubmoduleSurface(track, enableEmission, emissionIntensity, zWrite, uvScale, uvOffset);
|
||||
track.trackRendererSubmodule.uvMode = uvMode;
|
||||
track.trackRendererSubmodule.uvRotation = uvRotation;
|
||||
track.trackRendererSubmodule.size = size;
|
||||
if (materialName.Trim() != String.Empty)
|
||||
{
|
||||
track.trackRendererSubmodule.ApplyMaterial(materialThemeBundleName, materialName);
|
||||
|
||||
@@ -63,6 +63,41 @@ namespace Ichni.RhythmGame
|
||||
this, "", "", false, 0, 1, ParticleSystemSimulationSpace.World,
|
||||
10, 5, 1, 1, true, Vector3.zero);
|
||||
});
|
||||
|
||||
var generateTools = container.GenerateSubcontainer(1);
|
||||
inspector.GenerateButton(this, generateTools, "Time Shift Tool", () =>
|
||||
{
|
||||
GeneralSecondaryWindow timeShiftWindow = UnityEngine.Object.Instantiate(
|
||||
EditorManager.instance.basePrefabs.generalSecondaryWindow,
|
||||
EditorManager.instance.uiManager.WindowsCanvas.GetComponent<RectTransform>())
|
||||
.GetComponent<GeneralSecondaryWindow>();
|
||||
|
||||
timeShiftWindow.Initialize("Time Shift Tool");
|
||||
var windowContainer = timeShiftWindow.GenerateContainer("Settings");
|
||||
|
||||
var subBase = windowContainer.GenerateSubcontainer(3);
|
||||
var affectNoteToggle = timeShiftWindow.GenerateToggle(subBase, "Affect Notes", true);
|
||||
var offsetInput = timeShiftWindow.GenerateInputField(subBase, "Time Offset (seconds)", "0");
|
||||
|
||||
var btnBase = windowContainer.GenerateSubcontainer(2);
|
||||
timeShiftWindow.GenerateButton(btnBase, "Apply", () =>
|
||||
{
|
||||
if (float.TryParse(offsetInput.inputField.text, out float offset))
|
||||
{
|
||||
ApplyTimeShiftRecursive(affectNoteToggle.toggle.isOn, offset);
|
||||
UnityEngine.Object.Destroy(timeShiftWindow.gameObject);
|
||||
LogWindow.Log($"Time shifted by {offset}.", Color.green);
|
||||
}
|
||||
else
|
||||
{
|
||||
LogWindow.Log("Invalid number format!", Color.red);
|
||||
}
|
||||
});
|
||||
timeShiftWindow.GenerateButton(btnBase, "Cancel", () =>
|
||||
{
|
||||
UnityEngine.Object.Destroy(timeShiftWindow.gameObject);
|
||||
});
|
||||
});
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -86,6 +121,41 @@ namespace Ichni.RhythmGame
|
||||
|
||||
return notes;
|
||||
}
|
||||
|
||||
public void ApplyTimeShiftRecursive(bool affectNotes, float offset)
|
||||
{
|
||||
ApplyTimeShiftToElement(this, affectNotes, offset);
|
||||
}
|
||||
|
||||
private void ApplyTimeShiftToElement(GameElement element, bool affectNotes, float offset)
|
||||
{
|
||||
if (element is AnimationBase anim)
|
||||
{
|
||||
anim.ApplyTimeOffset(offset);
|
||||
anim.Refresh();
|
||||
}
|
||||
else if (element is NoteBase note && affectNotes)
|
||||
{
|
||||
note.exactJudgeTime += offset;
|
||||
if (note is Hold hold)
|
||||
{
|
||||
hold.holdEndTime += offset;
|
||||
}
|
||||
|
||||
note.UpdateNoteInTrack(EditorManager.instance.songInformation.songTime);
|
||||
note.AddinNoteManager(false);
|
||||
note.Refresh();
|
||||
}
|
||||
|
||||
// GameElement 本身具有层级结构,所有的 GameElement 都可能会携带子物体(如 EnvironmentObject,Track 等等)
|
||||
if (element.childElementList != null && element.childElementList.Count > 0)
|
||||
{
|
||||
foreach (var child in element.childElementList)
|
||||
{
|
||||
ApplyTimeShiftToElement(child, affectNotes, offset);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,9 @@ namespace Ichni.RhythmGame
|
||||
inspector.GenerateDropdown(this, trackPathSubmoduleSettings, "Space Type", typeof(Track.TrackSpaceType), nameof(trackSpaceType));
|
||||
var trackSamplingDropdown =
|
||||
inspector.GenerateDropdown(this, trackPathSubmoduleSettings, "Sampling Type", typeof(Track.TrackSamplingType), nameof(trackSamplingType));
|
||||
var trackSampleRateInput =
|
||||
inspector.GenerateInputField(this, trackPathSubmoduleSettings, "Sample Rate", nameof(sampleRate))
|
||||
.AddListenerFunction(() => { path.sampleRate = sampleRate; Refresh(); });
|
||||
var isClosedToggle =
|
||||
inspector.GenerateToggle(this, trackPathSubmoduleSettings, "Is Closed", nameof(isClosed))
|
||||
.AddListenerFunction(ClosePath);
|
||||
|
||||
@@ -2,6 +2,7 @@ using System;
|
||||
using System.Collections.Generic;
|
||||
using Ichni.Editor;
|
||||
using Ichni.RhythmGame.Beatmap;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Ichni.RhythmGame
|
||||
{
|
||||
@@ -35,6 +36,14 @@ namespace Ichni.RhythmGame
|
||||
inspector.GenerateVector2InputField(this, uvSettings, "UV Offset", nameof(uvOffset))
|
||||
.AddListenerFunction(SetUV);
|
||||
|
||||
var meshSettings = container.GenerateSubcontainer(3);
|
||||
inspector.GenerateDropdown(this, meshSettings, "UV Mode", typeof(Dreamteck.Splines.MeshGenerator.UVMode), nameof(uvMode))
|
||||
.AddListenerFunction(SetUV);
|
||||
inspector.GenerateInputField(this, meshSettings, "UV Rotation", nameof(uvRotation))
|
||||
.AddListenerFunction(SetUV);
|
||||
inspector.GenerateInputField(this, meshSettings, "Size", nameof(size))
|
||||
.AddListenerFunction(SetUV);
|
||||
|
||||
var materialSettings = container.GenerateSubcontainer(3);
|
||||
var themeBundleDropdown = inspector
|
||||
.GenerateDropdown(this, materialSettings, "Theme Bundle", ThemeBundleManager.instance.selectedThemeBundleList, nameof(materialThemeBundleName))
|
||||
@@ -53,6 +62,33 @@ namespace Ichni.RhythmGame
|
||||
|
||||
var applyMaterialButton = inspector.GenerateButton(this, materialSettings, "Apply Material", () => { ApplyMaterial(materialThemeBundleName, materialName); });
|
||||
|
||||
var textureSettings = container.GenerateSubcontainer(3);
|
||||
var textureThemeBundleDropdown = inspector
|
||||
.GenerateDropdown(this, textureSettings, "Tex Bundle", ThemeBundleManager.instance.selectedThemeBundleList, nameof(customTextureThemeBundleName))
|
||||
.AddListenerFunction(() => inspectorMain.SetInspector(track));
|
||||
|
||||
if (customTextureThemeBundleName != String.Empty && ThemeBundleManager.instance.TryGetThemeBundle(customTextureThemeBundleName, out ThemeBundle texThemeBundle))
|
||||
{
|
||||
List<string> texNameList = new List<string>();
|
||||
texNameList.Add("None");
|
||||
var textureNames = new List<string>();
|
||||
if (texThemeBundle.assetList_Texture != null) textureNames.AddRange(texThemeBundle.assetList_Texture.ConvertAll(x => x.name));
|
||||
if (texThemeBundle.assetList_Other != null) textureNames.AddRange(texThemeBundle.assetList_Other.FindAll(x => x is Sprite).ConvertAll(x => x.name));
|
||||
|
||||
// Remove duplicates
|
||||
texNameList.AddRange(new HashSet<string>(textureNames));
|
||||
|
||||
var textureNameDropdown = inspector.GenerateDropdown(this, textureSettings, "Texture Name", texNameList, nameof(customTextureName))
|
||||
.AddListenerFunction(() => inspectorMain.SetInspector(track));
|
||||
}
|
||||
else
|
||||
{
|
||||
var textureNameDropdown = inspector.GenerateDropdown(this, textureSettings, "Texture Name", new List<string>() { "None" }, nameof(customTextureName));
|
||||
textureNameDropdown.dropdown.interactable = false;
|
||||
}
|
||||
|
||||
var applyTextureButton = inspector.GenerateButton(this, textureSettings, "Apply Texture", () => { Refresh(); });
|
||||
|
||||
var delete = container.GenerateSubcontainer(3);
|
||||
var deleteButton = inspector.GenerateButton(this, delete, "Delete", () =>
|
||||
{
|
||||
@@ -111,6 +147,9 @@ namespace Ichni.RhythmGame
|
||||
{
|
||||
meshGenerator.uvScale = uvScale;
|
||||
meshGenerator.uvOffset = uvOffset;
|
||||
meshGenerator.uvRotation = uvRotation;
|
||||
meshGenerator.uvMode = uvMode;
|
||||
meshGenerator.size = size;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
@@ -13,6 +13,7 @@ namespace Ichni.RhythmGame
|
||||
public FlexibleReturnType animationReturnType;
|
||||
|
||||
public TimeDurationSubmodule timeDurationSubmodule { get; set; }
|
||||
|
||||
#endregion
|
||||
|
||||
#region [生命周期与初始化] Initialization
|
||||
@@ -34,6 +35,11 @@ namespace Ichni.RhythmGame
|
||||
// 向 AnimationManager 注册,通过中废集权 Update 驱动,替代 MonoBehaviour.Update()
|
||||
AnimationManager.instance.RegisterAnimation(this);
|
||||
}
|
||||
|
||||
public virtual void OnDirtyRefresh(Dictionary<string, bool> flags)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void OnDelete()
|
||||
{
|
||||
|
||||
@@ -19,11 +19,12 @@ namespace Ichni.RhythmGame
|
||||
public bool isClosed;
|
||||
|
||||
public bool isShowingDisplay;
|
||||
public int sampleRate = 8;
|
||||
#endregion
|
||||
|
||||
#region [生命周期与构造] Initialization
|
||||
public TrackPathSubmodule(Track track, Track.TrackSpaceType trackSpaceType,
|
||||
Track.TrackSamplingType trackSamplingType, bool isClosed, bool isShowingDisplay) : base(track)
|
||||
Track.TrackSamplingType trackSamplingType, bool isClosed, bool isShowingDisplay, int sampleRate = 8) : base(track)
|
||||
{
|
||||
this.path = track.AddComponent<SplineComputer>();
|
||||
|
||||
@@ -32,7 +33,8 @@ namespace Ichni.RhythmGame
|
||||
this.trackSamplingType = trackSamplingType;
|
||||
this.isClosed = isClosed;
|
||||
|
||||
this.path.sampleRate = 8;
|
||||
this.sampleRate = sampleRate;
|
||||
this.path.sampleRate = sampleRate;
|
||||
this.path.updateMode = SplineComputer.UpdateMode.LateUpdate;
|
||||
SetUpSplineComputer(this.trackSpaceType, this.trackSamplingType);
|
||||
|
||||
@@ -54,6 +56,7 @@ namespace Ichni.RhythmGame
|
||||
path.type = (Spline.Type)trackSpaceType;
|
||||
path.sampleMode = (SplineComputer.SampleMode)(int)trackSamplingType;
|
||||
path.space = SplineComputer.Space.Local;
|
||||
path.sampleRate = sampleRate;
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
@@ -18,6 +18,11 @@ namespace Ichni.RhythmGame
|
||||
|
||||
public string materialThemeBundleName;
|
||||
public string materialName;
|
||||
public string customTextureThemeBundleName = "None";
|
||||
public string customTextureName = "None";
|
||||
public MeshGenerator.UVMode uvMode = MeshGenerator.UVMode.UniformClip;
|
||||
public float uvRotation = 0f;
|
||||
public float size = 1f;
|
||||
public bool enableEmission;
|
||||
public float emissionIntensity;
|
||||
public bool zWrite;
|
||||
@@ -87,6 +92,23 @@ namespace Ichni.RhythmGame
|
||||
var block = new MaterialPropertyBlock();
|
||||
meshRenderer.GetPropertyBlock(block);
|
||||
|
||||
if (!string.IsNullOrEmpty(customTextureName) && customTextureName != "None")
|
||||
{
|
||||
if (renderMaterial != null && (renderMaterial.name.Contains("DefaultTrackMaterial") || renderMaterial.shader.name == "Soullies/TrackShader" || renderMaterial.shader.name == "TrackShader"))
|
||||
{
|
||||
Texture2D tex = ThemeBundleManager.instance.GetObject<Texture2D>(customTextureThemeBundleName, customTextureName);
|
||||
if (tex == null)
|
||||
{
|
||||
Sprite sp = ThemeBundleManager.instance.GetObject<Sprite>(customTextureThemeBundleName, customTextureName);
|
||||
if (sp != null) tex = sp.texture;
|
||||
}
|
||||
if (tex != null)
|
||||
{
|
||||
block.SetTexture("_MainTexture", tex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ZWrite
|
||||
block.SetFloat("_ZWrite", zWrite ? 1f : 0f);
|
||||
|
||||
@@ -105,6 +127,9 @@ namespace Ichni.RhythmGame
|
||||
// UV(仍然直接设置到 meshGenerator)
|
||||
meshGenerator.uvScale = uvScale;
|
||||
meshGenerator.uvOffset = uvOffset;
|
||||
meshGenerator.uvRotation = uvRotation;
|
||||
meshGenerator.uvMode = uvMode;
|
||||
meshGenerator.size = size;
|
||||
|
||||
meshRenderer.SetPropertyBlock(block);
|
||||
|
||||
|
||||
@@ -34,8 +34,8 @@ namespace Ichni.RhythmGame
|
||||
this.splineRenderer.updateMethod = SplineUser.UpdateMethod.Update;
|
||||
this.meshRenderer.material = renderMaterial;
|
||||
this.splineRenderer.color = Color.white;
|
||||
this.splineRenderer.uvRotation = 90;
|
||||
this.splineRenderer.uvMode = MeshGenerator.UVMode.UniformClip;
|
||||
this.uvRotation = 0f;
|
||||
this.uvMode = MeshGenerator.UVMode.UniformClip;
|
||||
this.submoduleNameIndex = 0; // Auto Orient is the first submodule
|
||||
}
|
||||
|
||||
|
||||
@@ -31,8 +31,8 @@ namespace Ichni.RhythmGame
|
||||
this.pathGenerator.updateMethod = SplineUser.UpdateMethod.Update;
|
||||
this.meshRenderer.material = renderMaterial;
|
||||
this.pathGenerator.color = Color.white;
|
||||
this.pathGenerator.uvRotation = 90;
|
||||
this.pathGenerator.uvMode = MeshGenerator.UVMode.UniformClip;
|
||||
this.uvRotation = 90f;
|
||||
this.uvMode = MeshGenerator.UVMode.UniformClip;
|
||||
this.submoduleNameIndex = 1; // Path Generator is the second submodule
|
||||
}
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,7 @@
|
||||
"creatorName" : "mora",
|
||||
"editorVersion" : "0.1.0",
|
||||
"createTime" : "2025\/6\/21 20:53:45",
|
||||
"lastSaveTime" : "3\/26\/2026 1:41:09 PM",
|
||||
"lastSaveTime" : "3\/28\/2026 6:05:42 AM",
|
||||
"selectedThemeBundleList" : [
|
||||
"basic","departure_to_multiverse","shapes"
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user