优化hierarchyab和consolemethod,然后是粒子追踪
Signed-off-by: TRADER_FOER <lhf190@outlook.com>
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
38793
Assets/FR2_Cache.asset
38793
Assets/FR2_Cache.asset
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -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
|
||||
|
||||
@@ -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>
|
||||
/// 删除父元素下所有与当前选中元素类型相同的其他元素,最后删除当前选中元素
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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", () =>
|
||||
{
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
290
Assets/StreamingAssets/Clips/New Track.json
Normal file
290
Assets/StreamingAssets/Clips/New Track.json
Normal 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"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
@@ -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" : {
|
||||
|
||||
@@ -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"
|
||||
],
|
||||
|
||||
Reference in New Issue
Block a user