小更新

This commit is contained in:
SoulliesOfficial
2025-08-22 12:05:09 -04:00
parent 2e4398b9c1
commit e119b32655
63 changed files with 463740 additions and 28841 deletions

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -88,6 +88,8 @@ MonoBehaviour:
type: 3}
defaultParticleMaterial: {fileID: 2100000, guid: 0c2e5326662881541bddd8e8d8ad9f9a,
type: 2}
particleEmitter: {fileID: 7924065371675278968, guid: 1de0703393b069442b17032f251dab6a,
type: 3}
bloomEffect: {fileID: 845605030242152257, guid: 1ea739ef6f1bf4e87835b0f554587451,
type: 3}
cameraZoomEffect: {fileID: 5030288017655597913, guid: 7c3a6fcb4e240d446875f716d08b279b,

View File

@@ -194,7 +194,7 @@ ParticleSystem:
emitterVelocityMode: 1
looping: 1
prewarm: 0
playOnAwake: 1
playOnAwake: 0
useUnscaledTime: 0
autoRandomSeed: 1
startDelay:
@@ -313,7 +313,7 @@ ParticleSystem:
startSpeed:
serializedVersion: 2
minMaxState: 0
scalar: 5
scalar: 0
minScalar: 5
maxCurve:
serializedVersion: 2
@@ -895,7 +895,7 @@ ParticleSystem:
sphericalDirectionAmount: 0
randomPositionAmount: 0
radius:
value: 1.96
value: 1
mode: 1
spread: 0
speed:

View File

@@ -8,22 +8,21 @@ Material:
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_Name: TrackDisplayer
m_Shader: {fileID: 211, guid: 0000000000000000f000000000000000, type: 0}
m_Shader: {fileID: 4800000, guid: 8516d7a69675844a7a0b7095af7c46af, type: 3}
m_Parent: {fileID: 0}
m_ModifiedSerializedProperties: 0
m_ValidKeywords:
- _ALPHAPREMULTIPLY_ON
- _EMISSION
- _RECEIVE_SHADOWS_OFF
m_InvalidKeywords:
- _FLIPBOOKBLENDING_OFF
- _RECEIVE_SHADOWS_OFF
m_LightmapFlags: 0
m_EnableInstancingVariants: 0
m_DoubleSidedGI: 1
m_CustomRenderQueue: 3000
m_CustomRenderQueue: 2010
stringTagMap:
RenderType: Transparent
disabledShaderPasses:
- GRABPASS
RenderType: Opaque
disabledShaderPasses: []
m_LockedProperties:
m_SavedProperties:
serializedVersion: 3
@@ -118,7 +117,7 @@ Material:
- _DistortionEnabled: 0
- _DistortionStrength: 1
- _DistortionStrengthScaled: 0.1
- _DstBlend: 10
- _DstBlend: 0
- _DstBlendAlpha: 0
- _EmissionEnabled: 0
- _EnableExternalAlpha: 0
@@ -156,7 +155,7 @@ Material:
- _UseNormalMap: 0
- _UseRoughnessMap: 0
- _WorkflowMode: 1
- _ZWrite: 0
- _ZWrite: 1
m_Colors:
- _BaseColor: {r: 1, g: 1, b: 1, a: 1}
- _BaseColorAddSubDiff: {r: 0, g: 0, b: 0, a: 0}

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -75,7 +75,12 @@ namespace Ichni.RhythmGame
var timeEffectsCollectionButton = inspector.GenerateButton(this, generateEnvironment, "Time Effects Collection",
() => TimeEffectsCollection.GenerateElement("New Time Effects Collection", Guid.NewGuid(),
new List<string>(), true, this, 0));
var generateParticleEmitterButton = inspector.GenerateButton(this, generateEnvironment, "Generate Particle Emitter", () =>
{
ParticleEmitter.GenerateElement("New Particle Emitter", Guid.NewGuid(), new List<string>(), true,
this, "", "",false,0, 1, ParticleSystemSimulationSpace.World,
10, 5, 1, 1 ,true, Vector3.zero);
});
}
}

View File

@@ -11,7 +11,7 @@ namespace Ichni.RhythmGame
public partial class EnvironmentObject : SubstantialObject
{
public bool isStatic;
public static EnvironmentObject GenerateElement(string elementName, Guid id, List<string> tags,
bool isFirstGenerated, string themeBundleName, string objectName, GameElement parentElement, bool isStatic)
{

View File

@@ -0,0 +1,360 @@
using System;
using System.Collections.Generic;
using Ichni.RhythmGame.Beatmap;
using Ichni.Editor;
using UnityEngine;
using Object = UnityEngine.Object;
namespace Ichni.RhythmGame
{
public partial class ParticleEmitter : GameElement, IHaveParticles, IHaveTimeDurationSubmodule, IHaveTransformSubmodule, IHaveColorSubmodule
{
public ParticleSystem particle { get; set; }
private IHaveParticles particlesContainer => this;
public TimeDurationSubmodule timeDurationSubmodule { get; set; }
public TransformSubmodule transformSubmodule { get; set; }
public ColorSubmodule colorSubmodule { get; set; }
public bool haveBaseColor => true;
public bool haveEmissionColor => true;
private List<string> themeBundleList;
private List<string> materialNameList;
public string themeBundleName;
public string materialName;
public bool prewarm;
public float playTime;
public float stopTime;
public ParticleSystemSimulationSpace simulationSpace;
public float density;
public float lifeTime;
public float speed;
public float radius;
public bool isAutoOrient;
public Vector3 particleRotation;
public static ParticleEmitter GenerateElement(string elementName, Guid id, List<string> tags,
bool isFirstGenerated, GameElement parentElement, string themeBundleName, string materialName,
bool prewarm, float playTime, float stopTime, ParticleSystemSimulationSpace simulationSpace,
float density, float lifeTime, float speed, float radius,
bool isAutoOrient, Vector3 particleRotation)
{
ParticleEmitter particleEmitter = Instantiate(EditorManager.instance.basePrefabs.particleEmitter, parentElement.transform)
.GetComponent<ParticleEmitter>();
particleEmitter.particle = particleEmitter.GetComponent<ParticleSystem>();
particleEmitter.Initialize(elementName, id, tags, isFirstGenerated, parentElement);
particleEmitter.playTime = playTime;
particleEmitter.stopTime = stopTime;
particleEmitter.themeBundleList = ThemeBundleManager.instance.loadedThemeBundleList.ConvertAll(x => x.themeBundleName);
particleEmitter.materialNameList = new List<string>();
particleEmitter.themeBundleName = themeBundleName;
particleEmitter.materialName = materialName;
particleEmitter.particlesContainer.SetParticleMaterial(themeBundleName, materialName);
particleEmitter.SetParticleSettings(prewarm, simulationSpace, density, lifeTime, speed, radius, isAutoOrient, particleRotation, false);
return particleEmitter;
}
public void SetParticleSettings(bool prewarm, ParticleSystemSimulationSpace simulationSpace,
float density, float lifeTime, float speed, float radius, bool isAutoOrient, Vector3 particleRotation, bool mark)
{
//这个Mark没有任何作用只是为了让解释器把interface中的函数和这个函数区分开。否则会Stackoverflow。
this.prewarm = prewarm;
this.simulationSpace = simulationSpace;
this.density = density;
this.lifeTime = lifeTime;
this.speed = speed;
this.radius = radius;
this.isAutoOrient = isAutoOrient;
this.particleRotation = particleRotation;
(this as IHaveParticles).SetParticleSettings(prewarm, simulationSpace, density, lifeTime, speed, radius, isAutoOrient, particleRotation);
}
public override void SetDefaultSubmodules()
{
timeDurationSubmodule = new TimeDurationSubmodule(this);
transformSubmodule = new TransformSubmodule(this);
colorSubmodule = new ColorSubmodule(this, Color.white, true, Color.white, 0);
}
}
public partial class ParticleEmitter
{
private void Update()
{
float songTime = EditorManager.instance.songInformation.songTime;
if (playTime > songTime || stopTime < songTime)
{
if (particle.isPlaying || particle.isPaused)
{
particle.Stop();
if (songTime < playTime) { particle.Clear(); }
}
}
else
{
if (!EditorManager.instance.musicPlayer.isPlaying)
{
particle.Pause();
}
else if (!particle.isPlaying)
{
particle.Play();
}
}
}
public override void Refresh()
{
base.Refresh();
ParticleSystemRenderer particleSystemRenderer = particle.GetComponent<ParticleSystemRenderer>();
particleSystemRenderer.material.SetColor("_BaseColor", colorSubmodule.currentBaseColor);
if (colorSubmodule.emissionEnabled)
{
particleSystemRenderer.material.EnableKeyword("_EMISSION_ON");
particleSystemRenderer.material.SetColor("_EmissionColor", colorSubmodule.GetCurrentEmissionColor());
}
else
{
particleSystemRenderer.material.DisableKeyword("_EMISSION_ON");
}
}
}
public partial class ParticleEmitter
{
public override void SetUpInspector()
{
base.SetUpInspector();
IHaveInspection inspector = EditorManager.instance.uiManager.inspector;
Inspector inspectorMain = EditorManager.instance.uiManager.inspector;
var container = inspector.GenerateContainer("Particle Tracker");
// 确保 themeBundleList 初始化
if (themeBundleList == null)
themeBundleList = ThemeBundleManager.instance.loadedThemeBundleList.ConvertAll(x => x.themeBundleName);
DynamicUISubcontainer particleSettings0 = container.GenerateSubcontainer(3);
inspector.GenerateToggle(this, particleSettings0, "Prewarm", nameof(prewarm))
.AddListenerFunction(() => particlesContainer.SetPrewarm(prewarm));
inspector.GenerateInputField(this, particleSettings0, "Play Time", nameof(playTime));
inspector.GenerateInputField(this, particleSettings0, "Stop Time", nameof(stopTime));
DynamicUISubcontainer particleSettings2 = container.GenerateSubcontainer(3);
inspector.GenerateDropdown(this, particleSettings2, "Simulation Space", typeof(ParticleSystemSimulationSpace), nameof(simulationSpace))
.AddListenerFunction(() => particlesContainer.SetSimulationSpace(simulationSpace));
inspector.GenerateInputField(this, particleSettings2, "Density", nameof(density))
.AddListenerFunction(()=>particlesContainer.SetDensity(density));
inspector.GenerateInputField(this, particleSettings2, "Life Time", nameof(lifeTime))
.AddListenerFunction(()=>particlesContainer.SetLifeTime(lifeTime));
inspector.GenerateInputField(this, particleSettings2, "Speed", nameof(speed))
.AddListenerFunction(()=>particlesContainer.SetSpeed(speed));
inspector.GenerateInputField(this, particleSettings2, "Radius", nameof(radius))
.AddListenerFunction(()=>particlesContainer.SetRadius(radius));
DynamicUISubcontainer particleSettings3_0 = container.GenerateSubcontainer(3);
inspector.GenerateToggle(this, particleSettings3_0, "Is Auto Orient", nameof(isAutoOrient))
.AddListenerFunction(()=>particlesContainer.SetAlignment(isAutoOrient, particleRotation));
DynamicUISubcontainer particleSettings3_1 = container.GenerateSubcontainer(1);
inspector.GenerateVector3InputField(this, particleSettings3_1, "Particle Rotation", nameof(particleRotation))
.AddListenerFunction(()=>particlesContainer.SetParticleRotation(particleRotation));
DynamicUISubcontainer materialSettings = container.GenerateSubcontainer(3);
var themeBundleDropdown =
inspector.GenerateDropdown(this, materialSettings, "Theme Bundle", themeBundleList, nameof(themeBundleName))
.AddListenerFunction(() => inspectorMain.SetInspector(this));
if (themeBundleName != String.Empty && ThemeBundleManager.instance.TryGetThemeBundle(themeBundleName, out ThemeBundle themeBundle))
{
materialNameList = themeBundle.assetList_Material.ConvertAll(x => x.name);
var objectNameDropdown =
inspector.GenerateDropdown(this, materialSettings, "Material Name", materialNameList, nameof(materialName))
.AddListenerFunction(() => inspectorMain.SetInspector(this));
}
else
{
materialNameList = new List<string>(); // 防止为null
var objectNameDropdown =
inspector.GenerateDropdown(this, materialSettings, "Material Name", materialNameList, nameof(materialName));
objectNameDropdown.dropdown.interactable = false;
} // 如果没有选择主题包,则材质名称下拉框不可用
var setMaterialButton = inspector.GenerateButton(this, materialSettings, "Set Material", () =>
{
particlesContainer.SetParticleMaterial(themeBundleName, materialName);
});
if (themeBundleName == String.Empty || materialName == String.Empty)
{
setMaterialButton.button.interactable = false;
}
}
public override void SaveBM()
{
matchedBM = new ParticleEmitter_BM(elementName, elementGuid, tags, parentElement.matchedBM as GameElement_BM,
prewarm, playTime, stopTime, simulationSpace, density, lifeTime, speed, radius,
isAutoOrient, particleRotation, themeBundleName, materialName);
}
}
namespace Beatmap
{
public class ParticleEmitter_BM : GameElement_BM
{
public bool prewarm = false;
public float playTime = 0f;
public float stopTime = 1f;
public ParticleSystemSimulationSpace simulationSpace;
public float density = 10;
public float lifeTime = 5;
public float speed;
public float radius;
public bool isAutoOrient = true;
public Vector3 particleRotation = Vector3.zero;
public string materialThemeBundleName = string.Empty;
public string materialName = string.Empty;
public ParticleEmitter_BM()
{
}
public ParticleEmitter_BM(string elementName, Guid elementGuid, List<string> tags, GameElement_BM attachedElement,
bool prewarm, float playTime, float stopTime, ParticleSystemSimulationSpace simulationSpace,
float density, float lifeTime, float speed, float radius, bool isAutoOrient, Vector3 particleRotation,
string materialThemeBundleName, string materialName) :
base(elementName, elementGuid, tags, attachedElement)
{
this.prewarm = prewarm;
this.playTime = playTime;
this.stopTime = stopTime;
this.simulationSpace = simulationSpace;
this.density = density;
this.lifeTime = lifeTime;
this.speed = speed;
this.radius = radius;
this.isAutoOrient = isAutoOrient;
this.particleRotation = particleRotation;
this.materialThemeBundleName = materialThemeBundleName;
this.materialName = materialName;
}
public override void ExecuteBM()
{
matchedElement = ParticleEmitter.GenerateElement(elementName, elementGuid, tags, false,
GetElement(attachedElementGuid), materialThemeBundleName, materialName,
prewarm, playTime, stopTime, simulationSpace, density, lifeTime, speed, radius,
isAutoOrient, particleRotation);
}
public override GameElement DuplicateBM(GameElement attached)
{
return ParticleEmitter.GenerateElement(elementName, Guid.NewGuid(), tags, false,
attached, materialThemeBundleName, materialName,
prewarm, playTime, stopTime, simulationSpace, density, lifeTime, speed, radius,
isAutoOrient, particleRotation);
}
}
}
public interface IHaveParticles
{
public ParticleSystem particle { get; set; }
public virtual void SetParticleMaterial(string themeBundleName, string materialName)
{
Material material = ThemeBundleManager.instance.GetObject<Material>(themeBundleName, materialName);
if (material == null)
{
material = ThemeBundleManager.instance.GetObject<Material>("basic", "Basic_Track_Default");
}
Renderer particleRenderer = particle.GetComponent<Renderer>();
particleRenderer.material = Object.Instantiate(material);
particleRenderer.InitializeShader();
}
public virtual void SetParticleSettings(bool prewarm, ParticleSystemSimulationSpace simulationSpace, float density, float lifeTime,
float speed, float radius, bool isAutoOrient, Vector3 particleRotation)
{
SetPrewarm(prewarm);
SetSimulationSpace(simulationSpace);
SetDensity(density);
SetLifeTime(lifeTime);
SetSpeed(speed);
SetRadius(radius);
SetAlignment(isAutoOrient, particleRotation);
}
public void SetPrewarm(bool prewarm)
{
var mainModule = particle.main;
mainModule.prewarm = prewarm;
}
public void SetSimulationSpace(ParticleSystemSimulationSpace simulationSpace)
{
var mainModule = particle.main;
mainModule.simulationSpace = simulationSpace;
}
public void SetDensity(float density)
{
var emission = particle.emission;
emission.rateOverTime = density;
}
public void SetLifeTime(float lifeTime)
{
var mainModule = particle.main;
mainModule.startLifetime = lifeTime;
}
public void SetSpeed(float speed)
{
var mainModule = particle.main;
mainModule.startSpeed = speed;
}
public void SetRadius(float radius)
{
var shapeModule = particle.shape;
shapeModule.radius = radius;
}
public void SetAlignment(bool isAutoOrient, Vector3 particleRotation = default)
{
ParticleSystemRenderer particleSystemRenderer = particle.GetComponent<ParticleSystemRenderer>();
var mainModule = particle.main;
if (isAutoOrient)
{
particleSystemRenderer.alignment = ParticleSystemRenderSpace.View;
mainModule.startRotation3D = false; // 禁用3D旋转
}
else
{
particleSystemRenderer.alignment = ParticleSystemRenderSpace.Local;
mainModule.startRotation3D = true; // 启用3D旋转
SetParticleRotation(particleRotation);
}
}
public void SetParticleRotation(Vector3 particleRotation)
{
Vector3 vector3Rotation = particleRotation * Mathf.Deg2Rad;
var mainModule = particle.main;
mainModule.startRotationX = vector3Rotation.x;
mainModule.startRotationY = vector3Rotation.y;
mainModule.startRotationZ = vector3Rotation.z;
}
}
}

View File

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

View File

@@ -13,6 +13,7 @@ namespace Ichni.RhythmGame
public TransformSubmodule transformSubmodule { get; set; }
public TimeDurationSubmodule timeDurationSubmodule { get; set; }
public ColorSubmodule colorSubmodule { get; set; }
public virtual bool haveBaseColor => true;
public virtual bool haveEmissionColor => false;
public static SubstantialObject GenerateElement(string elementName, Guid id, List<string> tags, bool isFirstGenerated,

View File

@@ -9,15 +9,18 @@ using UnityEngine.Serialization;
namespace Ichni.RhythmGame
{
public partial class ParticleTracker : GameElement, IHaveColorSubmodule
public partial class ParticleTracker : GameElement, IHaveParticles, IHaveColorSubmodule
{
public Track track;
public ParticleController particleController;
public ParticleSystem particle;
private IHaveParticles particlesContainer => this;
public ParticleSystem particle { get; set; }
public ColorSubmodule colorSubmodule { get; set; }
public bool haveBaseColor => true;
public bool haveEmissionColor => true;
private List<string> themeBundleList;
private List<string> materialNameList;
public string themeBundleName;
public string materialName;
@@ -45,6 +48,7 @@ namespace Ichni.RhythmGame
{
ParticleTracker particleTracker = Instantiate(EditorManager.instance.basePrefabs.particleTracker, track.transform)
.GetComponent<ParticleTracker>();
particleTracker.particle = particleTracker.GetComponent<ParticleSystem>();
particleTracker.Initialize(elementName, id, tags, isFirstGenerated, track);
particleTracker.track = track;
particleTracker.particleController.spline = track.trackPathSubmodule.path;
@@ -54,7 +58,7 @@ namespace Ichni.RhythmGame
particleTracker.materialNameList = new List<string>();
particleTracker.themeBundleName = themeBundleName;
particleTracker.materialName = materialName;
particleTracker.SetParticleMaterial(themeBundleName, materialName);
particleTracker.particlesContainer.SetParticleMaterial(themeBundleName, materialName);
particleTracker.SetParticleSettings(prewarm, is3D, width, extendDirection, density, lifeTime, isAutoOrient, particleRotation);
return particleTracker;
}
@@ -64,25 +68,9 @@ namespace Ichni.RhythmGame
colorSubmodule = new ColorSubmodule(this, Color.white, true, Color.white, 0);
}
public void SetParticleMaterial(string themeBundleName, string materialName)
{
Material material = ThemeBundleManager.instance.GetObject<Material>(themeBundleName, materialName);
if (material == null)
{
print("Material not found: " + themeBundleName + ", " + materialName);
material = ThemeBundleManager.instance.GetObject<Material>("basic", "Basic_Track_Default");
}
Renderer particleRenderer = particle.GetComponent<Renderer>();
particleRenderer.material = Instantiate(material);
particleRenderer.InitializeShader();
}
public void SetParticleSettings(bool prewarm,
bool is3D, float width, Vector3 extendDirection,
float density, float lifeTime,
bool isAutoOrient, Vector3 particleRotation)
public void SetParticleSettings(bool prewarm, bool is3D, float width, Vector3 extendDirection,
float density, float lifeTime, bool isAutoOrient, Vector3 particleRotation)
{
this.prewarm = prewarm;
this.is3D = is3D;
@@ -93,12 +81,9 @@ namespace Ichni.RhythmGame
this.prewarm = prewarm;
this.isAutoOrient = isAutoOrient;
this.particleRotation = particleRotation;
SetPrewarm();
particlesContainer.SetParticleSettings(prewarm, ParticleSystemSimulationSpace.Local, density,
lifeTime, 0, 1, isAutoOrient, particleRotation);
SetShape();
SetDensity();
SetLifeTime();
SetAlignment();
}
}
@@ -139,9 +124,6 @@ namespace Ichni.RhythmGame
themeBundleName, materialName);
}
private List<string> themeBundleList;
private List<string> materialNameList;
public override void SetUpInspector()
{
base.SetUpInspector();
@@ -155,24 +137,32 @@ namespace Ichni.RhythmGame
themeBundleList = ThemeBundleManager.instance.loadedThemeBundleList.ConvertAll(x => x.themeBundleName);
DynamicUISubcontainer particleSettings0 = container.GenerateSubcontainer(3);
inspector.GenerateToggle(this, particleSettings0, "Prewarm", nameof(prewarm)).AddListenerFunction(SetPrewarm);
inspector.GenerateToggle(this, particleSettings0, "Prewarm", nameof(prewarm))
.AddListenerFunction(() => particlesContainer.SetPrewarm(prewarm));
inspector.GenerateInputField(this, particleSettings0, "Play Time", nameof(playTime));
inspector.GenerateInputField(this, particleSettings0, "Stop Time", nameof(stopTime));
DynamicUISubcontainer particleSettings1_0 = container.GenerateSubcontainer(3);
inspector.GenerateToggle(this, particleSettings1_0, "Is 3D", nameof(is3D)).AddListenerFunction(SetShape);
inspector.GenerateInputField(this, particleSettings1_0, "Width", nameof(width)).AddListenerFunction(SetShape);
inspector.GenerateToggle(this, particleSettings1_0, "Is 3D", nameof(is3D))
.AddListenerFunction(SetShape);
inspector.GenerateInputField(this, particleSettings1_0, "Width", nameof(width))
.AddListenerFunction(SetShape);
DynamicUISubcontainer particleSettings1_1 = container.GenerateSubcontainer(1);
inspector.GenerateVector3InputField(this, particleSettings1_1, "Extend Direction", nameof(extendDirection)).AddListenerFunction(SetShape);
inspector.GenerateVector3InputField(this, particleSettings1_1, "Extend Direction", nameof(extendDirection))
.AddListenerFunction(SetShape);
DynamicUISubcontainer particleSettings2 = container.GenerateSubcontainer(3);
inspector.GenerateInputField(this, particleSettings2, "Density", nameof(density)).AddListenerFunction(SetDensity);
inspector.GenerateInputField(this, particleSettings2, "Life Time", nameof(lifeTime)).AddListenerFunction(SetLifeTime);
inspector.GenerateInputField(this, particleSettings2, "Density", nameof(density))
.AddListenerFunction(()=>particlesContainer.SetDensity(density));
inspector.GenerateInputField(this, particleSettings2, "Life Time", nameof(lifeTime))
.AddListenerFunction(()=>particlesContainer.SetLifeTime(lifeTime));
DynamicUISubcontainer particleSettings3_0 = container.GenerateSubcontainer(3);
inspector.GenerateToggle(this, particleSettings3_0, "Is Auto Orient", nameof(isAutoOrient)).AddListenerFunction(SetAlignment);
inspector.GenerateToggle(this, particleSettings3_0, "Is Auto Orient", nameof(isAutoOrient))
.AddListenerFunction(()=>particlesContainer.SetAlignment(isAutoOrient, particleRotation));
DynamicUISubcontainer particleSettings3_1 = container.GenerateSubcontainer(1);
inspector.GenerateVector3InputField(this, particleSettings3_1, "Particle Rotation", nameof(particleRotation)).AddListenerFunction(SetParticleRotation);
inspector.GenerateVector3InputField(this, particleSettings3_1, "Particle Rotation", nameof(particleRotation))
.AddListenerFunction(()=>particlesContainer.SetParticleRotation(particleRotation));
DynamicUISubcontainer materialSettings = container.GenerateSubcontainer(3);
var themeBundleDropdown =
@@ -195,7 +185,7 @@ namespace Ichni.RhythmGame
var setMaterialButton = inspector.GenerateButton(this, materialSettings, "Set Material", () =>
{
SetParticleMaterial(themeBundleName, materialName);
particlesContainer.SetParticleMaterial(themeBundleName, materialName);
});
if (themeBundleName == String.Empty || materialName == String.Empty)
@@ -215,50 +205,6 @@ namespace Ichni.RhythmGame
particleController.Rebuild();
}
private void SetDensity()
{
var emission = particle.emission;
emission.rateOverTime = density;
}
private void SetLifeTime()
{
var mainModule = particle.main;
mainModule.startLifetime = lifeTime;
}
private void SetPrewarm()
{
var mainModule = particle.main;
mainModule.prewarm = prewarm;
}
private void SetAlignment()
{
ParticleSystemRenderer particleSystemRenderer = particle.GetComponent<ParticleSystemRenderer>();
var mainModule = particle.main;
if (isAutoOrient)
{
particleSystemRenderer.alignment = ParticleSystemRenderSpace.View;
mainModule.startRotation3D = false; // 禁用3D旋转
}
else
{
particleSystemRenderer.alignment = ParticleSystemRenderSpace.Local;
mainModule.startRotation3D = true; // 启用3D旋转
SetParticleRotation();
}
}
private void SetParticleRotation()
{
Vector3 vector3Rotation = particleRotation * Mathf.Deg2Rad;
var mainModule = particle.main;
mainModule.startRotationX = vector3Rotation.x;
mainModule.startRotationY = vector3Rotation.y;
mainModule.startRotationZ = vector3Rotation.z;
}
public override void Refresh()
{
base.Refresh();

View File

@@ -128,6 +128,12 @@ namespace Ichni.RhythmGame
var environmentObjectButton = inspector.GenerateButton(this, generation, "Environment Object",
() => TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(),
true, this));
var generateParticleEmitterButton = inspector.GenerateButton(this, generation, "Generate Particle Emitter", () =>
{
ParticleEmitter.GenerateElement("New Particle Emitter", Guid.NewGuid(), new List<string>(), true,
this, "", "",false,0, 1, ParticleSystemSimulationSpace.World,
10, 5, 1, 1 ,true, Vector3.zero);
});
}
public override void Refresh()

View File

@@ -86,6 +86,12 @@ namespace Ichni.RhythmGame
var environmentObjectButton = inspector.GenerateButton(this, generation, "Environment Object",
() => TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(),
true, this));
var generateParticleEmitterButton = inspector.GenerateButton(this, generation, "Generate Particle Emitter", () =>
{
ParticleEmitter.GenerateElement("New Particle Emitter", Guid.NewGuid(), new List<string>(), true,
this, "", "",false,0, 1, ParticleSystemSimulationSpace.World,
10, 5, 1, 1 ,true, Vector3.zero);
});
}
}

View File

@@ -115,6 +115,12 @@ namespace Ichni.RhythmGame
var environmentObjectButton = inspector.GenerateButton(this, generation, "Environment Object",
() => TemporaryObject.GenerateElement("New Environment Object", Guid.NewGuid(), new List<string>(),
true, this));
var generateParticleEmitterButton = inspector.GenerateButton(this, generation, "Generate Particle Emitter", () =>
{
ParticleEmitter.GenerateElement("New Particle Emitter", Guid.NewGuid(), new List<string>(), true,
this, "", "",false,0, 1, ParticleSystemSimulationSpace.World,
10, 5, 1, 1 ,true, Vector3.zero);
});
}
public override void Refresh()

View File

@@ -35,6 +35,7 @@ namespace Ichni.RhythmGame
public GameObject triggerHint;
[Title("Effect相关")] public Material defaultParticleMaterial;
public GameObject particleEmitter;
public GameObject bloomEffect;
public GameObject cameraZoomEffect;
public GameObject cameraShakeEffect;

View File

@@ -97,5 +97,5 @@ Material:
- _Color: {r: 0, g: 0, b: 0, a: 0}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _Tint: {r: 0.5, g: 0.5, b: 0.5, a: 0.5}
- _Tint2: {r: 0, g: 0, b: 0, a: 0.5}
- _Tint2: {r: 0.5, g: 0.5, b: 0.5, a: 0.5}
m_BuildTextureStacks: []

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 3f85d2b6703d7644bb36ee4814c36f5b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 5b0c28a9a3a4665449562bf151644ca6
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

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

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: b7c01dc82ca9bb54c82ff9e0e7924008
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

Binary file not shown.

View File

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

View File

@@ -0,0 +1,2 @@
§vϦ
½ŠVòÇ~~ù]@Ÿ{Ó“U†…_cW¾ —NóI-M|ãw ¾ù­ý÷U†€ò°º˜iÕ®<C395>¹Ëñi³B,é0!Qʳâ°€L0¸¾µ|ìL~<päsxúÛ°3è gè"à\W¬ý èÂÍ”ºéjjJwtγù¥<C3B9>M{¸7ÁI¤E°Í!¥àÁ°µ¯Ayªsù àBëñ¯Î¥XΔœEnKD±—Ùå¿´QÛOÕp:ì<>s

View File

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

Binary file not shown.

View File

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

Binary file not shown.

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 876ff5d46bbf2254d87c7878f07c96fe
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 93e3c4a3a3e107245be89e837bac8dba
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 70234191c4201d74cb627a7bf5c4b5fd
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 32f8bccb6f8c938458d81f2ab86b314e
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 8e90f9552aff91b4f9cbeee2c21462c4
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: ad55b2428574dab4691c30b85edf12a4
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -0,0 +1,13 @@
{
"CommandScripts" : {
"__type" : "Ichni.RhythmGame.Beatmap.CommandScripts_BM,Assembly-CSharp",
"value" : {
"commandList" : [
],
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
}
}
}

View File

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

View File

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

View File

@@ -0,0 +1,18 @@
{
"ProjectInformation" : {
"__type" : "Ichni.RhythmGame.Beatmap.ProjectInformation_BM,Assembly-CSharp",
"value" : {
"projectName" : "DIAM",
"creatorName" : "FE",
"editorVersion" : "0.1.0",
"createTime" : "2025\/8\/17 18:38:15",
"lastSaveTime" : "2025\/8\/17 18:38:15",
"selectedThemeBundleList" : [
"basic","departure_to_multiverse"
],
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
}
}
}

View File

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

View File

@@ -0,0 +1,14 @@
{
"SongInformation" : {
"__type" : "Ichni.RhythmGame.Beatmap.SongInformation_BM,Assembly-CSharp",
"value" : {
"songName" : "Drowning in a Momentichni Original.wav",
"bpm" : 100,
"delay" : 0,
"offset" : 0,
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}
}
}
}

View File

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

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: e69bf85699b46c44daf4158b7beae42b
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
fileFormatVersion: 2
guid: 6b9501c65efaad74392f86934d338547
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

File diff suppressed because it is too large Load Diff

View File

@@ -5,7 +5,7 @@
"songName" : "Pof.wav",
"bpm" : 165,
"delay" : 0,
"offset" : 0,
"offset" : 0.182,
"attachedElementGuid" : {
"value" : "00000000-0000-0000-0000-000000000000"
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,8 @@
fileFormatVersion: 2
guid: 7568607a19987cb48b6977c3df67a165
folderAsset: yes
DefaultImporter:
externalObjects: {}
userData:
assetBundleName:
assetBundleVariant:

View File

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

File diff suppressed because one or more lines are too long