优化hierarchyab和consolemethod,然后是粒子追踪

Signed-off-by: TRADER_FOER <lhf190@outlook.com>
This commit is contained in:
2026-07-29 22:27:21 +08:00
parent d662f2fa95
commit ab5465bab0
14 changed files with 21084 additions and 18871 deletions

View File

@@ -3,6 +3,7 @@ namespace Dreamteck.Splines
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Unity.Profiling;
[ExecuteInEditMode]
[AddComponentMenu("Dreamteck/Splines/Users/Particle Controller")]
@@ -21,10 +22,11 @@ namespace Dreamteck.Splines
[SerializeField]
[HideInInspector]
private ParticleSystem _particleSystem;
private ParticleSystemRenderer _renderer;
public enum EmitPoint { Beginning, Ending, Random, Ordered }
public enum MotionType { None, UseParticleSystem, FollowForward, FollowBackward, ByNormal, ByNormalRandomized }
public enum Wrap { Default, Loop }
private ParticleSystemRenderer _renderer;
public enum EmitPoint { Beginning, Ending, Random, Ordered }
public enum MotionType { None, UseParticleSystem, FollowForward, FollowBackward, ByNormal, ByNormalRandomized }
public enum Wrap { Default, Loop }
public enum PathNodeSizeMode { LegacyOffset, ApplyPathNodeSize }
public bool is3D;
public float width = 10f;
@@ -50,8 +52,10 @@ namespace Dreamteck.Splines
public Wrap wrapMode = Wrap.Default;
[HideInInspector]
public float minCycles = 1f;
[HideInInspector]
public float maxCycles = 1f;
[HideInInspector]
public float maxCycles = 1f;
[HideInInspector]
public PathNodeSizeMode pathNodeSizeMode = PathNodeSizeMode.LegacyOffset;
private Dictionary<uint, Particle> _particleDataMap = new Dictionary<uint, Particle>();
private ParticleSystem.Particle[] _particles = new ParticleSystem.Particle[0];
@@ -59,72 +63,80 @@ namespace Dreamteck.Splines
//private Particle[] _controllers = new Particle[0];
private int _particleCount = 0;
private int _birthIndex = 0;
private int _particleDataFrame = 0;
private List<Vector4> _customParticleData = new List<Vector4>();
private readonly List<uint> _keysToRemove = new List<uint>();
private readonly Stack<Particle> _particleDataPool = new Stack<Particle>();
private static readonly ProfilerMarker ParticleControllerLateRunMarker = new ProfilerMarker("ParticleController.LateRun");
protected override void LateRun()
{
if (_particleSystem == null) return;
if (pauseWhenNotVisible)
using (ParticleControllerLateRunMarker.Auto())
{
if (_renderer == null)
if (pauseWhenNotVisible)
{
_renderer = _particleSystem.GetComponent<ParticleSystemRenderer>();
if (_renderer == null)
{
_renderer = _particleSystem.GetComponent<ParticleSystemRenderer>();
}
if (!_renderer.isVisible) return;
}
if (!_renderer.isVisible) return;
int maxParticles = _particleSystem.main.maxParticles;
if (_particles.Length != maxParticles)
{
_particles = new ParticleSystem.Particle[maxParticles];
if (maxParticles > _particleDataMap.Count)
{
_particleDataMap = new Dictionary<uint, Particle>(maxParticles);
}
}
_particleCount = _particleSystem.GetParticles(_particles);
_particleSystem.GetCustomParticleData(_customParticleData, ParticleSystemCustomData.Custom1);
_particleDataFrame++;
bool isLocal = _particleSystem.main.simulationSpace == ParticleSystemSimulationSpace.Local;
Transform particleSystemTransform = _particleSystem.transform;
for (int i = 0; i < _particleCount; i++)
{
uint seed = _particles[i].randomSeed; // 获取粒子的唯一ID
if (isLocal) TransformParticle(ref _particles[i], particleSystemTransform);
// 使用字典来检查粒子是否是新生儿这是100%可靠的
if (!_particleDataMap.TryGetValue(seed, out Particle particleData))
{
particleData = OnParticleBorn(i, seed);
}
particleData.lastSeenFrame = _particleDataFrame;
HandleParticle(i, particleData);
if (isLocal) InverseTransformParticle(ref _particles[i], particleSystemTransform);
}
// 清理字典中已经死亡的粒子数据,防止内存无限增长
if (_particleCount < _particleDataMap.Count)
{
_keysToRemove.Clear();
foreach (var pair in _particleDataMap)
{
if (pair.Value.lastSeenFrame != _particleDataFrame) _keysToRemove.Add(pair.Key);
}
foreach (var key in _keysToRemove)
{
_particleDataPool.Push(_particleDataMap[key]);
_particleDataMap.Remove(key);
}
}
_particleSystem.SetCustomParticleData(_customParticleData, ParticleSystemCustomData.Custom1);
_particleSystem.SetParticles(_particles, _particleCount);
}
int maxParticles = _particleSystem.main.maxParticles;
if (_particles.Length != maxParticles)
{
_particles = new ParticleSystem.Particle[maxParticles];
if (maxParticles > _particleDataMap.Count)
{
_particleDataMap = new Dictionary<uint, Particle>(maxParticles);
}
}
_particleCount = _particleSystem.GetParticles(_particles);
_particleSystem.GetCustomParticleData(_customParticleData, ParticleSystemCustomData.Custom1);
HashSet<uint> activeSeeds = new HashSet<uint>();
bool isLocal = _particleSystem.main.simulationSpace == ParticleSystemSimulationSpace.Local;
Transform particleSystemTransform = _particleSystem.transform;
for (int i = 0; i < _particleCount; i++)
{
uint seed = _particles[i].randomSeed; // 获取粒子的唯一ID
activeSeeds.Add(seed); // 记录存活的粒子
if (isLocal) TransformParticle(ref _particles[i], particleSystemTransform);
// 使用字典来检查粒子是否是新生儿这是100%可靠的
if (!_particleDataMap.ContainsKey(seed))
{
OnParticleBorn(i, seed);
}
HandleParticle(i, seed);
if (isLocal) InverseTransformParticle(ref _particles[i], particleSystemTransform);
}
// 清理字典中已经死亡的粒子数据,防止内存无限增长
if (activeSeeds.Count < _particleDataMap.Count)
{
List<uint> keysToRemove = new List<uint>();
foreach (var key in _particleDataMap.Keys)
{
if (!activeSeeds.Contains(key)) keysToRemove.Add(key);
}
foreach (var key in keysToRemove)
{
_particleDataMap.Remove(key);
}
}
_particleSystem.SetCustomParticleData(_customParticleData, ParticleSystemCustomData.Custom1);
_particleSystem.SetParticles(_particles, _particleCount);
}
void TransformParticle(ref ParticleSystem.Particle particle, Transform trs)
@@ -152,23 +164,21 @@ namespace Dreamteck.Splines
if (_particleSystem == null) _particleSystem = GetComponent<ParticleSystem>();
}
void HandleParticle(int index, uint seed)
void HandleParticle(int index, Particle particleData)
{
if (!_particleDataMap.TryGetValue(seed, out Particle particleData)) return; // 安全检查
float lifePercent = _particles[index].remainingLifetime / _particles[index].startLifetime;
if (motionType == MotionType.FollowBackward || motionType == MotionType.FollowForward || motionType == MotionType.None)
{
Evaluate(particleData.GetSplinePercent(wrapMode, _particles[index], motionType), ref evalResult);
Vector3 resultRight = evalResult.right;
if (!is3D)
{
_particles[index].position = evalResult.position + extendDirection * particleData.initialOffset;
}
else
{
_particles[index].position = evalResult.position + particleData.threeDOffset;
}
Evaluate(particleData.GetSplinePercent(wrapMode, _particles[index], motionType), ref evalResult);
if (!is3D)
{
Vector3 initialOffset = extendDirection * particleData.initialOffset;
_particles[index].position = evalResult.position + GetInitialOffset(evalResult, initialOffset);
}
else
{
_particles[index].position = evalResult.position + GetInitialOffset(evalResult, particleData.threeDOffset);
}
if (apply3DRotation)
{
@@ -189,16 +199,37 @@ namespace Dreamteck.Splines
finalOffset += particleData.startOffset;
}
}
_particles[index].position += resultRight * (finalOffset.x * evalResult.size)
+ evalResult.up * (finalOffset.y * evalResult.size);
if (finalOffset != Vector2.zero)
{
_particles[index].position += GetSamplePlaneOffset(evalResult, finalOffset);
}
_particles[index].velocity = evalResult.forward;
_particles[index].startColor = particleData.startColor * evalResult.color;
}
}
private void OnParticleBorn(int index, uint seed)
private static Vector3 GetSampleSpaceOffset(SplineSample sample, Vector3 offset)
{
return sample.right * (offset.x * sample.size)
+ sample.up * (offset.y * sample.size)
+ sample.forward * (offset.z * sample.size);
}
private Vector3 GetInitialOffset(SplineSample sample, Vector3 offset)
{
return pathNodeSizeMode == PathNodeSizeMode.ApplyPathNodeSize
? GetSampleSpaceOffset(sample, offset)
: offset;
}
private static Vector3 GetSamplePlaneOffset(SplineSample sample, Vector2 offset)
{
Particle newParticleData = new Particle();
return sample.right * (offset.x * sample.size) + sample.up * (offset.y * sample.size);
}
private Particle OnParticleBorn(int index, uint seed)
{
Particle newParticleData = _particleDataPool.Count > 0 ? _particleDataPool.Pop() : new Particle();
Vector4 custom = _customParticleData[index];
custom.w = 1;
@@ -234,11 +265,13 @@ namespace Dreamteck.Splines
if (!is3D)
{
newParticleData.initialOffset = Random.Range(-width, width);
newParticleData.threeDOffset = Vector3.zero;
}
else
{
newParticleData.initialOffset = 0f;
newParticleData.threeDOffset = new Vector3(
Random.Range(-width, width) * extendDirection.x,
Random.Range(-width, width) * extendDirection.x,
Random.Range(-width, width) * extendDirection.y,
Random.Range(-width, width) * extendDirection.z);
}
@@ -249,10 +282,8 @@ namespace Dreamteck.Splines
if (!(motionType == MotionType.FollowForward || motionType == MotionType.FollowBackward))
{
Vector3 right = Vector3.Cross(evalResult.forward, evalResult.up);
_particles[index].position = evalResult.position +
right * newParticleData.startOffset.x * evalResult.size * scale.x +
evalResult.up * newParticleData.startOffset.y * evalResult.size * scale.y;
Vector2 scaledStartOffset = new Vector2(newParticleData.startOffset.x * scale.x, newParticleData.startOffset.y * scale.y);
_particles[index].position = evalResult.position + GetSamplePlaneOffset(evalResult, scaledStartOffset);
}
float forceX = _particleSystem.forceOverLifetime.x.constantMax;
@@ -284,6 +315,7 @@ namespace Dreamteck.Splines
_particles[index].velocity = normal * startSpeed + new Vector3(forceX, forceY, forceZ) * time;
}
//HandleParticle(index);
return newParticleData;
}
public class Particle
@@ -295,6 +327,7 @@ namespace Dreamteck.Splines
internal float cycleSpeed = 0f;
internal Color startColor = Color.white;
internal double startPercent = 0.0;
internal int lastSeenFrame = 0;
internal double GetSplinePercent(Wrap wrap, ParticleSystem.Particle particle, MotionType motionType)
{

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -277,20 +277,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -394,7 +397,7 @@ GameObject:
- component: {fileID: 5427638583437016685}
- component: {fileID: 8557913501037026989}
- component: {fileID: 1918472174654462383}
- component: {fileID: 2984872097914611565}
- component: {fileID: 8151665925194930948}
m_Layer: 5
m_Name: GameElementButton
m_TagString: Untagged
@@ -460,7 +463,7 @@ MonoBehaviour:
m_FillOrigin: 0
m_UseSpriteMesh: 0
m_PixelsPerUnitMultiplier: 1
--- !u!114 &2984872097914611565
--- !u!114 &8151665925194930948
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
@@ -471,7 +474,7 @@ MonoBehaviour:
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3}
m_Name:
m_EditorClassIdentifier:
m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button
m_Navigation:
m_Mode: 3
m_WrapAround: 0
@@ -479,7 +482,7 @@ MonoBehaviour:
m_SelectOnDown: {fileID: 0}
m_SelectOnLeft: {fileID: 0}
m_SelectOnRight: {fileID: 0}
m_Transition: 1
m_Transition: 0
m_Colors:
m_NormalColor: {r: 1, g: 1, b: 1, a: 1}
m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
@@ -487,7 +490,7 @@ MonoBehaviour:
m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1}
m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608}
m_ColorMultiplier: 1
m_FadeDuration: 0
m_FadeDuration: 0.1
m_SpriteState:
m_HighlightedSprite: {fileID: 0}
m_PressedSprite: {fileID: 0}
@@ -608,20 +611,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0
@@ -702,10 +708,11 @@ MonoBehaviour:
tabRect: {fileID: 5040017337088069702}
layoutElement: {fileID: -1606289094185495319}
tabMainRect: {fileID: 4977671911614392296}
tabButton: {fileID: 2984872097914611565}
tabButton: {fileID: 8151665925194930948}
expandButton: {fileID: 2749324553351544168}
deleteButton: {fileID: 6485919050370088522}
tabButtonText: {fileID: 2880005684537739809}
isExpandDone: 1
--- !u!114 &-1606289094185495319
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -830,20 +837,23 @@ MonoBehaviour:
m_VerticalAlignment: 512
m_textAlignment: 65535
m_characterSpacing: 0
m_characterHorizontalScale: 1
m_wordSpacing: 0
m_lineSpacing: 0
m_lineSpacingMax: 0
m_paragraphSpacing: 0
m_charWidthMaxAdj: 0
m_enableWordWrapping: 1
m_TextWrappingMode: 1
m_wordWrappingRatios: 0.4
m_overflowMode: 0
m_linkedTextComponent: {fileID: 0}
parentLinkedComponent: {fileID: 0}
m_enableKerning: 1
m_ActiveFontFeatures: 6e72656b
m_enableExtraPadding: 0
checkPaddingRequired: 0
m_isRichText: 1
m_EmojiFallbackSupport: 1
m_parseCtrlCharacters: 1
m_isOrthographic: 1
m_isCullingEnabled: 0

View File

@@ -48,21 +48,14 @@ namespace Ichni.Editor
}
}
/// <summary>
/// 重命名选中元素
/// </summary>
public static void ReName(string message)
{
inspector.connectedGameElement.elementName = message;
inspector.connectedGameElement.Refresh();
}
#endregion
#region PathNode Generation ()
/// <summary>
/// 直线路径节点生成 (Line PathNode Generator)
/// </summary>
public static void Lgp(int loop, Vector3 start, Vector3 end, bool Clear = false, bool offsetOrigin = false)
public static void Lgp(int loop, Vector3 start, Vector3 end, bool Clear = false)
{
if (inspector.connectedGameElement == null || inspector.connectedGameElement.GetType() != typeof(Track))
{
@@ -80,17 +73,10 @@ namespace Ichni.Editor
// 如果 Clear 且有旧节点,迁移变换
if (Clear)
{
if (offsetOrigin && oldNodes.Count > 0 && newNodes.Count > 0)
{
AdjustPathNodesToNearest(track, newNodes, oldNodes);
}
// 清除之前的PathNode
foreach (var node in oldNodes)
{
EditorManager.instance.operationManager.CopyPasteDeleteModule.DeleteElement(node);
}
}
for (int i = 0; i < loop; i++)
{
float t = (float)i / (loop - 1); // 修正插值
@@ -186,33 +172,7 @@ namespace Ichni.Editor
#region PathNode/Track Utilities (/)
/// <summary>
/// 将原有 PathNode 的变换(位置、旋转、缩放)迁移到新生成的最近 PathNode 上
/// </summary>
public static bool AdjustPathNodesToNearest(Track track, List<PathNode> newNodes, List<PathNode> oldNodes)
{
foreach (var oldNode in oldNodes)
{
// 找到距离 oldNode 最近的新节点
PathNode nearest = newNodes
.OrderBy(n => Vector3.Distance(n.transformSubmodule.originalPosition, oldNode.transformSubmodule.originalPosition))
.FirstOrDefault();
if (nearest != null)
{
// 计算 oldNode 的变换(直接用欧拉角,不用四元数)
Vector3 deltaPos = oldNode.transformSubmodule.originalPosition - oldNode.transformSubmodule.originalPosition;
Vector3 deltaEuler = oldNode.transformSubmodule.originalEulerAngles - oldNode.transformSubmodule.originalEulerAngles;
Vector3 deltaScale = oldNode.transformSubmodule.originalScale - oldNode.transformSubmodule.originalScale;
// 将变换应用到新节点
nearest.transformSubmodule.originalPosition += deltaPos;
nearest.transformSubmodule.originalEulerAngles += deltaEuler;
nearest.transformSubmodule.originalScale += deltaScale;
}
}
return true;
}
/// <summary>
/// 删除父元素下所有与当前选中元素类型相同的其他元素,最后删除当前选中元素

View File

@@ -57,7 +57,7 @@ namespace Ichni.Editor
this.isSelected = false;
if (BgImage != null)
{
BgImage.color = new Color(0.5f, 0.5f, 0.5f, 0);
BgImage.color = new Color(0, 0, 0, 0);
}
this.childTabList = new List<HierarchyTab>();
@@ -157,17 +157,17 @@ namespace Ichni.Editor
}
}
public void SelectGameElement()
{
if (Keyboard.current.shiftKey.isPressed)
{
EditorManager.instance.operationManager.AddSelectRangeToElement(connectedGameElement);
}
else if (Keyboard.current.leftCtrlKey.isPressed)
{
if (!isSelected)
{
EditorManager.instance.operationManager.AddSelectElement(connectedGameElement);
public void SelectGameElement()
{
if (Keyboard.current.shiftKey.isPressed)
{
EditorManager.instance.operationManager.AddSelectRangeToElement(connectedGameElement);
}
else if (Keyboard.current.leftCtrlKey.isPressed)
{
if (!isSelected)
{
EditorManager.instance.operationManager.AddSelectElement(connectedGameElement);
}
else
{

View File

@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using Dreamteck.Splines;
using UnityEngine;
namespace Ichni.RhythmGame.Beatmap
@@ -22,6 +23,7 @@ namespace Ichni.RhythmGame.Beatmap
public string materialThemeBundleName = string.Empty;
public string materialName = string.Empty;
public ParticleController.PathNodeSizeMode pathNodeSizeMode = ParticleController.PathNodeSizeMode.LegacyOffset;
public ParticleTracker_BM()
{
@@ -33,7 +35,8 @@ namespace Ichni.RhythmGame.Beatmap
bool is3D, float width, Vector3 extendDirection,
float density, float lifeTime,
bool isAutoOrient, Vector3 particleRotation,
string materialThemeBundleName, string materialName) : base(elementName, elementGuid, tags, attachedElement)
string materialThemeBundleName, string materialName,
ParticleController.PathNodeSizeMode pathNodeSizeMode = ParticleController.PathNodeSizeMode.LegacyOffset) : base(elementName, elementGuid, tags, attachedElement)
{
this.prewarm = prewarm;
this.playTime = playTime;
@@ -48,6 +51,7 @@ namespace Ichni.RhythmGame.Beatmap
this.materialThemeBundleName = materialThemeBundleName;
this.materialName = materialName;
this.pathNodeSizeMode = pathNodeSizeMode;
}
public override void ExecuteBM()
@@ -55,7 +59,8 @@ namespace Ichni.RhythmGame.Beatmap
matchedElement = ParticleTracker.GenerateElement(
elementName, elementGuid, tags, false,
GetElement(attachedElementGuid) as Track, materialThemeBundleName, materialName,
prewarm, playTime, stopTime, is3D, width, extendDirection, density, lifeTime, isAutoOrient, particleRotation);
prewarm, playTime, stopTime, is3D, width, extendDirection, density, lifeTime, isAutoOrient, particleRotation,
pathNodeSizeMode);
}
#region [Editor ] Editor Interfaces
@@ -64,7 +69,8 @@ namespace Ichni.RhythmGame.Beatmap
return ParticleTracker.GenerateElement(
elementName, Guid.NewGuid(), tags, false,
attached as Track, materialThemeBundleName, materialName,
prewarm, playTime, stopTime, is3D, width, extendDirection, density, lifeTime, isAutoOrient, particleRotation);
prewarm, playTime, stopTime, is3D, width, extendDirection, density, lifeTime, isAutoOrient, particleRotation,
pathNodeSizeMode);
}
#endregion
}

View File

@@ -110,7 +110,8 @@ namespace Ichni.RhythmGame
.Button("Particle Tracker", () =>
{
CommandManager.ExecuteCreate(() => ParticleTracker.GenerateElement("New Particle Tracker", Guid.NewGuid(), new List<string>(), true, this,
string.Empty, string.Empty, false, 0, 1, false, 10, Vector3.right, 10, 5, true, Vector3.zero));
string.Empty, string.Empty, false, 0, 1, false, 10, Vector3.right, 10, 5, true, Vector3.zero,
Dreamteck.Splines.ParticleController.PathNodeSizeMode.ApplyPathNodeSize));
})
.Button("Object Tracker", () =>
{

View File

@@ -13,7 +13,7 @@ namespace Ichni.RhythmGame
matchedBM = new ParticleTracker_BM(elementName, elementGuid, tags,
parentElement.matchedBM as GameElement_BM,
prewarm, playTime, stopTime, is3D, width, extendDirection, density, lifeTime, isAutoOrient, particleRotation,
themeBundleName, materialName);
themeBundleName, materialName, pathNodeSizeMode);
}
#endregion
@@ -45,6 +45,8 @@ namespace Ichni.RhythmGame
.OnChanged(SetShape)
.Vector3Field(nameof(extendDirection), "Extend Direction")
.OnChanged(SetShape)
.Dropdown(nameof(pathNodeSizeMode), typeof(Dreamteck.Splines.ParticleController.PathNodeSizeMode), "PathNode Size Mode")
.OnChanged(SetShape)
.Section("Emission")
.InputField(nameof(density), "Density")
.OnChanged(() => particlesContainer.SetDensity(density))

View File

@@ -35,6 +35,7 @@ namespace Ichni.RhythmGame
public bool isAutoOrient;
public Vector3 particleRotation;
public ParticleController.PathNodeSizeMode pathNodeSizeMode;
#endregion
#region [] Generation & Initialization
@@ -43,7 +44,8 @@ namespace Ichni.RhythmGame
bool prewarm, float playTime, float stopTime,
bool is3D, float width, Vector3 extendDirection,
float density, float lifeTime,
bool isAutoOrient, Vector3 particleRotation)
bool isAutoOrient, Vector3 particleRotation,
ParticleController.PathNodeSizeMode pathNodeSizeMode = ParticleController.PathNodeSizeMode.LegacyOffset)
{
ParticleTracker particleTracker = Instantiate(EditorManager.instance.basePrefabs.particleTracker, track.transform)
.GetComponent<ParticleTracker>();
@@ -57,6 +59,7 @@ namespace Ichni.RhythmGame
particleTracker.materialNameList = new List<string>();
particleTracker.themeBundleName = themeBundleName;
particleTracker.materialName = materialName;
particleTracker.pathNodeSizeMode = pathNodeSizeMode;
particleTracker.particlesContainer.SetParticleMaterial(themeBundleName, materialName);
particleTracker.SetParticleSettings(prewarm, is3D, width, extendDirection, density, lifeTime, isAutoOrient, particleRotation);
@@ -88,16 +91,17 @@ namespace Ichni.RhythmGame
this.prewarm = prewarm;
this.isAutoOrient = isAutoOrient;
this.particleRotation = particleRotation;
particlesContainer.SetParticleSettings(prewarm, ParticleSystemSimulationSpace.Local, density,
particlesContainer.SetParticleSettings(prewarm, ParticleSystemSimulationSpace.Local, density,
lifeTime, 0, 1, isAutoOrient, particleRotation);
SetShape();
}
private void SetShape()
{
particleController.is3D = is3D;
particleController.width = width;
particleController.extendDirection = extendDirection;
particleController.pathNodeSizeMode = pathNodeSizeMode;
particleController.Rebuild();
}
#endregion

View File

@@ -2,40 +2,41 @@ using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using DG.Tweening;
using Ichni.Editor.Commands;
using Ichni.RhythmGame;
using Ichni.RhythmGame.Beatmap;
using UnityEngine;
using UnityEngine.InputSystem;
namespace Ichni.Editor
{
public class OperationManager
{
public List<GameElement> currentSelectedElements { get; private set; }
public TempOutlineModule TempOutlineModule = new TempOutlineModule();
public CopyPasteDeleteModule CopyPasteDeleteModule;
public FindingModule FindingModule;
public OperationManager()
{
currentSelectedElements = new List<GameElement>();
CopyPasteDeleteModule = new CopyPasteDeleteModule();
FindingModule = new FindingModule();
}
using UnityEngine;
using UnityEngine.InputSystem;
namespace Ichni.Editor
{
public class OperationManager
{
public List<GameElement> currentSelectedElements { get; private set; }
public TempOutlineModule TempOutlineModule = new TempOutlineModule();
public CopyPasteDeleteModule CopyPasteDeleteModule;
public FindingModule FindingModule;
public OperationManager()
{
currentSelectedElements = new List<GameElement>();
CopyPasteDeleteModule = new CopyPasteDeleteModule();
FindingModule = new FindingModule();
}
public void AddSelectElement(GameElement gameElement)
{
if (gameElement == null || gameElement.connectedTab == null) return;
if (currentSelectedElements.Contains(gameElement)) return;
currentSelectedElements.Add(gameElement);
gameElement.connectedTab.isSelected = true;
if (gameElement.connectedTab.BgImage != null)
{
gameElement.connectedTab.BgImage.color = new Color(0f, 0f, 0f, 0.8f);
currentSelectedElements.Add(gameElement);
gameElement.connectedTab.isSelected = true;
if (gameElement.connectedTab.BgImage != null)
{
gameElement.connectedTab.BgImage.DOColor(new Color(0f, 0f, 0f, 0.8f), 0.2f);
}
}
@@ -93,75 +94,78 @@ namespace Ichni.Editor
public void RemoveSelectElement(GameElement gameElement)
{
if (gameElement == null) return;
currentSelectedElements.Remove(gameElement);
if (gameElement.connectedTab == null) return;
gameElement.connectedTab.isSelected = false;
if (gameElement.connectedTab.BgImage != null)
{
gameElement.connectedTab.BgImage.color = new Color(0.5f, 0.5f, 0.5f, 0);
}
}
public void ClearSelectedElements()
{
currentSelectedElements.RemoveAll(gameElement => gameElement == null);
currentSelectedElements.ForEach(gameElement =>
{
if (gameElement == null || gameElement.connectedTab == null) return;
gameElement.connectedTab.isSelected = false;
if (gameElement.connectedTab.BgImage != null)
{
gameElement.connectedTab.BgImage.color = new Color(0.5f, 0.5f, 0.5f, 0);
}
});
currentSelectedElements.Clear();
}
}
public class TempOutlineModule
{
public List<GameElement> outlinedElements;
public Material outlineMaterial => EditorManager.instance.basePrefabs.outlineShaderMaterial;
public TempOutlineModule()
{
outlinedElements = new List<GameElement>();
}
public void AddOutline(GameElement gameElement)
{
outlinedElements.Add(gameElement);
}
public void RemoveOutline(GameElement gameElement)
{
outlinedElements.Remove(gameElement);
}
public void ClearOutline()
{
outlinedElements.Clear();
}
}
public class FindingModule
{
public GameElement FindGameElementByName(string elementName)
{
foreach (GameElement element in EditorManager.instance.beatmapContainer.gameElementList)
{
if (element.elementName == elementName)
{
return element;
}
}
LogWindow.Log("Element not found: " + elementName, Color.red);
return null;
}
}
currentSelectedElements.Remove(gameElement);
if (gameElement.connectedTab == null) return;
gameElement.connectedTab.isSelected = false;
if (gameElement.connectedTab.BgImage != null)
{
gameElement.connectedTab.BgImage.DOColor(new Color(0, 0, 0, 0), 0.2f);
}
}
public void ClearSelectedElements()
{
currentSelectedElements.RemoveAll(gameElement => gameElement == null);
currentSelectedElements.ForEach(gameElement =>
{
if (gameElement == null || gameElement.connectedTab == null) return;
gameElement.connectedTab.isSelected = false;
if (gameElement.connectedTab.BgImage != null)
{
gameElement.connectedTab.BgImage.DOColor(new Color(0, 0, 0, 0), 0.2f);
}
});
currentSelectedElements.Clear();
}
}
public class TempOutlineModule
{
public List<GameElement> outlinedElements;
public Material outlineMaterial => EditorManager.instance.basePrefabs.outlineShaderMaterial;
public TempOutlineModule()
{
outlinedElements = new List<GameElement>();
}
public void AddOutline(GameElement gameElement)
{
outlinedElements.Add(gameElement);
}
public void RemoveOutline(GameElement gameElement)
{
outlinedElements.Remove(gameElement);
}
public void ClearOutline()
{
outlinedElements.Clear();
}
}
public class FindingModule
{
public GameElement FindGameElementByName(string elementName)
{
foreach (GameElement element in EditorManager.instance.beatmapContainer.gameElementList)
{
if (element.elementName == elementName)
{
return element;
}
}
LogWindow.Log("Element not found: " + elementName, Color.red);
return null;
}
}
public class CopyPasteDeleteModule
{
public GameElement copiedElement;
@@ -220,8 +224,8 @@ namespace Ichni.Editor
public void PasteElement(GameElement parentElement)
{
if (parentElement == null)
{
LogWindow.Log("No parent element selected to paste.", Color.red);
{
LogWindow.Log("No parent element selected to paste.", Color.red);
return;
}

View File

@@ -0,0 +1,290 @@
{
"Clip" : {
"__type" : "System.Collections.Generic.List`1[[Ichni.RhythmGame.Beatmap.BaseElement_BM, Assembly-CSharp, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]],mscorlib",
"value" : [
{
"__type" : "Ichni.RhythmGame.Beatmap.Track_BM,Assembly-CSharp",
"elementName" : "New Track",
"tags" : [
],
"elementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
},
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TrackPathSubmodule_BM,Assembly-CSharp",
"trackSpaceType" : 0,
"trackSamplingType" : 0,
"isClosed" : false,
"isShowingDisplay" : false,
"sampleRate" : 8,
"attachedElementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.PathNode_BM,Assembly-CSharp",
"isShowingSphere" : true,
"elementName" : "New Path Node",
"tags" : [
],
"elementGuid" : {
"value" : "d8ceae7f-714b-4c61-bcba-3601270483f6"
},
"attachedElementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "d8ceae7f-714b-4c61-bcba-3601270483f6"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "d8ceae7f-714b-4c61-bcba-3601270483f6"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 5.96046448E-08,
"g" : 1,
"b" : 0.362948924,
"a" : 1
},
"emissionEnabled" : false,
"originalEmissionColor" : {
"r" : 0,
"g" : 0,
"b" : 0,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "d8ceae7f-714b-4c61-bcba-3601270483f6"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.PathNode_BM,Assembly-CSharp",
"isShowingSphere" : true,
"elementName" : "New Path Node",
"tags" : [
],
"elementGuid" : {
"value" : "5a2619ff-e6dd-44ec-9230-792c34c8a96c"
},
"attachedElementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 50
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 45
},
"originalScale" : {
"x" : 2,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "5a2619ff-e6dd-44ec-9230-792c34c8a96c"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "5a2619ff-e6dd-44ec-9230-792c34c8a96c"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 0,
"g" : 0.7392707,
"b" : 1,
"a" : 1
},
"emissionEnabled" : false,
"originalEmissionColor" : {
"r" : 0,
"g" : 0,
"b" : 0,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "5a2619ff-e6dd-44ec-9230-792c34c8a96c"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ParticleTracker_BM,Assembly-CSharp",
"prewarm" : true,
"playTime" : 1,
"stopTime" : 999,
"is3D" : true,
"width" : 10,
"extendDirection" : {
"x" : 1,
"y" : 1,
"z" : 0
},
"density" : 15,
"lifeTime" : 5,
"isAutoOrient" : true,
"particleRotation" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"materialThemeBundleName" : "",
"materialName" : "",
"pathNodeSizeMode" : 1,
"elementName" : "New Particle Tracker",
"tags" : [
],
"elementGuid" : {
"value" : "2d595f13-a47d-49d2-bd9d-0e947484bfca"
},
"attachedElementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"emissionEnabled" : true,
"originalEmissionColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "2d595f13-a47d-49d2-bd9d-0e947484bfca"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.PathNode_BM,Assembly-CSharp",
"isShowingSphere" : true,
"elementName" : "New Path Node",
"tags" : [
],
"elementGuid" : {
"value" : "873821d4-b62d-4b65-a588-d6cdc7ad248c"
},
"attachedElementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 100
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 90
},
"originalScale" : {
"x" : 0,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "873821d4-b62d-4b65-a588-d6cdc7ad248c"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "873821d4-b62d-4b65-a588-d6cdc7ad248c"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 0,
"g" : 0.7392707,
"b" : 1,
"a" : 0
},
"emissionEnabled" : false,
"originalEmissionColor" : {
"r" : 0,
"g" : 0,
"b" : 0,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "873821d4-b62d-4b65-a588-d6cdc7ad248c"
}
}
]
}
}

View File

@@ -1382,6 +1382,328 @@
"attachedElementGuid" : {
"value" : "6aa5a5e8-f532-44d7-b2ca-965611ec9e26"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ElementFolder_BM,Assembly-CSharp",
"elementName" : "Folder",
"tags" : [
],
"elementGuid" : {
"value" : "fe5e6e08-cd30-4418-a62d-718e575ca12d"
},
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "fe5e6e08-cd30-4418-a62d-718e575ca12d"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "fe5e6e08-cd30-4418-a62d-718e575ca12d"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.Track_BM,Assembly-CSharp",
"elementName" : "New Track",
"tags" : [
],
"elementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
},
"attachedElementGuid" : {
"value" : "fe5e6e08-cd30-4418-a62d-718e575ca12d"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TrackPathSubmodule_BM,Assembly-CSharp",
"trackSpaceType" : 0,
"trackSamplingType" : 0,
"isClosed" : false,
"isShowingDisplay" : false,
"sampleRate" : 8,
"attachedElementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.PathNode_BM,Assembly-CSharp",
"isShowingSphere" : true,
"elementName" : "New Path Node",
"tags" : [
],
"elementGuid" : {
"value" : "d8ceae7f-714b-4c61-bcba-3601270483f6"
},
"attachedElementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"originalScale" : {
"x" : 1,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "d8ceae7f-714b-4c61-bcba-3601270483f6"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "d8ceae7f-714b-4c61-bcba-3601270483f6"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 5.96046448E-08,
"g" : 1,
"b" : 0.362948924,
"a" : 1
},
"emissionEnabled" : false,
"originalEmissionColor" : {
"r" : 0,
"g" : 0,
"b" : 0,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "d8ceae7f-714b-4c61-bcba-3601270483f6"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.PathNode_BM,Assembly-CSharp",
"isShowingSphere" : true,
"elementName" : "New Path Node",
"tags" : [
],
"elementGuid" : {
"value" : "5a2619ff-e6dd-44ec-9230-792c34c8a96c"
},
"attachedElementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 50
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 45
},
"originalScale" : {
"x" : 2,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "5a2619ff-e6dd-44ec-9230-792c34c8a96c"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "5a2619ff-e6dd-44ec-9230-792c34c8a96c"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 0,
"g" : 0.7392707,
"b" : 1,
"a" : 1
},
"emissionEnabled" : false,
"originalEmissionColor" : {
"r" : 0,
"g" : 0,
"b" : 0,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "5a2619ff-e6dd-44ec-9230-792c34c8a96c"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ParticleTracker_BM,Assembly-CSharp",
"prewarm" : true,
"playTime" : 1,
"stopTime" : 999,
"is3D" : true,
"width" : 10,
"extendDirection" : {
"x" : 1,
"y" : 1,
"z" : 0
},
"density" : 15,
"lifeTime" : 5,
"isAutoOrient" : true,
"particleRotation" : {
"x" : 0,
"y" : 0,
"z" : 0
},
"materialThemeBundleName" : "",
"materialName" : "",
"pathNodeSizeMode" : 1,
"elementName" : "New Particle Tracker",
"tags" : [
],
"elementGuid" : {
"value" : "2d595f13-a47d-49d2-bd9d-0e947484bfca"
},
"attachedElementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"emissionEnabled" : true,
"originalEmissionColor" : {
"r" : 1,
"g" : 1,
"b" : 1,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "2d595f13-a47d-49d2-bd9d-0e947484bfca"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.PathNode_BM,Assembly-CSharp",
"isShowingSphere" : true,
"elementName" : "New Path Node",
"tags" : [
],
"elementGuid" : {
"value" : "873821d4-b62d-4b65-a588-d6cdc7ad248c"
},
"attachedElementGuid" : {
"value" : "b3004e0f-7613-49a3-8b93-b903b6c39fb5"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TransformSubmodule_BM,Assembly-CSharp",
"originalPosition" : {
"x" : 0,
"y" : 0,
"z" : 100
},
"originalEulerAngles" : {
"x" : 0,
"y" : 0,
"z" : 90
},
"originalScale" : {
"x" : 0,
"y" : 1,
"z" : 1
},
"attachedElementGuid" : {
"value" : "873821d4-b62d-4b65-a588-d6cdc7ad248c"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.TimeDurationSubmodule_BM,Assembly-CSharp",
"isOverridingDuration" : false,
"startTime" : -32767,
"endTime" : 32767,
"attachedElementGuid" : {
"value" : "873821d4-b62d-4b65-a588-d6cdc7ad248c"
}
},{
"__type" : "Ichni.RhythmGame.Beatmap.ColorSubmodule_BM,Assembly-CSharp",
"originalBaseColor" : {
"r" : 0,
"g" : 0.7392707,
"b" : 1,
"a" : 0
},
"emissionEnabled" : false,
"originalEmissionColor" : {
"r" : 0,
"g" : 0,
"b" : 0,
"a" : 1
},
"originalEmissionIntensity" : 0,
"attachedElementGuid" : {
"value" : "873821d4-b62d-4b65-a588-d6cdc7ad248c"
}
}
],
"attachedElementGuid" : {

View File

@@ -6,7 +6,7 @@
"creatorName" : "TR",
"editorVersion" : "0.1.0",
"createTime" : "2026\/7\/22 14:02:51",
"lastSaveTime" : "2026\/7\/25 9:50:41",
"lastSaveTime" : "2026\/7\/29 22:25:34",
"selectedThemeBundleList" : [
"basic","departure_to_multiverse"
],