Storyline+Dialog初步

This commit is contained in:
SoulliesOfficial
2026-07-05 16:08:23 -04:00
parent afa8a56e1d
commit d031afd075
464 changed files with 25716 additions and 4209 deletions

View File

@@ -0,0 +1,170 @@
using System;
using System.Collections.Generic;
using UnityEngine;
namespace Ichni.RhythmGame.ThemeBundles.DepartureToMultiverse
{
/// <summary>
/// 圆形轨迹流星环境物体。单个 ParticleSystem粒子沿 Velocity over Lifetime 的 Orbital Z 轨道旋转,
/// 并借助 Trail 模块拖出圆形轨迹。颜色由 Gradient 随机取色,发光强度以 HDR 倍率应用到粒子材质。
/// </summary>
public partial class DTMCircleSpinTrails : EnvironmentObject
{
#region [] Constants
private const string EnableEmissionProperty = "_EnableEmission";
private const string EmissionColorProperty = "_EmissionColor";
private const int DefaultParticleCount = 20;
private const float DefaultParticleLifetime = 5f;
private const float DefaultOrbitalZSpeed = 1f;
private const float DefaultEmissionIntensity = 2f;
private const float MinLifetime = 0.01f;
#endregion
#region [] Exposed Fields
[Header("Core References")]
[Tooltip("流星效果所使用的粒子系统")]
public ParticleSystem trailParticleSystem;
[Header("Circle Spin Trails Settings")]
[Tooltip("同时存在的流星(粒子)数量")]
public int particleCount = DefaultParticleCount;
[Tooltip("单个粒子的存活时间(秒)")]
public float particleLifetime = DefaultParticleLifetime;
[Tooltip("粒子随机取色所使用的渐变")]
public Gradient colorGradient;
[Tooltip("轨道旋转速度Velocity over Lifetime 的 Orbital Z")]
public float orbitalZSpeed = DefaultOrbitalZSpeed;
[Tooltip("发光强度HDR 倍率,应用到粒子材质的 _EmissionColor")]
public float emissionIntensity = DefaultEmissionIntensity;
#endregion
#region [] Runtime Cache
private ParticleSystemRenderer particleRenderer;
#endregion
#region [] Default Helpers
/// <summary>返回默认的多彩渐变(青 → 品红 → 黄),用于流星随机取色。</summary>
private static Gradient DefaultColorGradient()
{
Gradient gradient = new Gradient();
gradient.SetKeys(
new GradientColorKey[]
{
new GradientColorKey(Color.cyan, 0f),
new GradientColorKey(Color.magenta, 0.5f),
new GradientColorKey(Color.yellow, 1f)
},
new GradientAlphaKey[]
{
new GradientAlphaKey(1f, 0f),
new GradientAlphaKey(1f, 1f)
});
return gradient;
}
#endregion
#region [] Lifecycle & Factory
/// <summary>从 BeatmapManager 调用的工厂方法,实例化 prefab 并写入配置字段。</summary>
public static DTMCircleSpinTrails GenerateElement(
string elementName, Guid id, List<string> tags,
bool isFirstGenerated, string themeBundleName, string objectName,
GameElement parentElement, bool isStatic,
int particleCount, float particleLifetime, Gradient colorGradient,
float orbitalZSpeed, float emissionIntensity)
{
DTMCircleSpinTrails spinTrails = EnvironmentObject.GenerateElement(
elementName, id, tags, isFirstGenerated,
themeBundleName, objectName, parentElement, isStatic)
.GetComponent<DTMCircleSpinTrails>();
spinTrails.particleCount = particleCount;
spinTrails.particleLifetime = particleLifetime;
spinTrails.colorGradient = colorGradient ?? DefaultColorGradient();
spinTrails.orbitalZSpeed = orbitalZSpeed;
spinTrails.emissionIntensity = emissionIntensity;
return spinTrails;
}
public override void FirstSetUpObject(bool isFirstGenerated)
{
if (trailParticleSystem == null)
trailParticleSystem = GetComponent<ParticleSystem>();
particleRenderer = trailParticleSystem != null
? trailParticleSystem.GetComponent<ParticleSystemRenderer>()
: null;
// 兼容旧存档中未序列化的渐变字段
if (colorGradient == null) colorGradient = DefaultColorGradient();
// 实例化材质,避免污染共享资源(从 AssetBundle 加载后必须重新初始化 Shader
if (particleRenderer != null) particleRenderer.InitializeShader();
ApplyParticleSettings();
}
public override void AfterInitialize()
{
base.AfterInitialize();
ApplyParticleSettings();
}
public override void Refresh()
{
base.Refresh();
ApplyParticleSettings();
}
public override void OnDirtyRefresh(Dictionary<string, bool> flags)
{
ApplyParticleSettings();
}
#endregion
#region [] Particle Settings
/// <summary>
/// 将当前字段配置写入粒子系统与材质:数量、存活时间、随机颜色、轨道旋转与发光强度。
/// </summary>
public void ApplyParticleSettings()
{
if (trailParticleSystem == null) return;
float safeLifetime = Mathf.Max(particleLifetime, MinLifetime);
int safeCount = Mathf.Max(particleCount, 0);
// 数量与存活时间:以 rateOverTime = count / lifetime 维持稳态粒子数量maxParticles 作为硬上限
ParticleSystem.MainModule main = trailParticleSystem.main;
main.startLifetime = safeLifetime;
main.maxParticles = safeCount;
main.startColor = new ParticleSystem.MinMaxGradient(colorGradient)
{
mode = ParticleSystemGradientMode.RandomColor
};
ParticleSystem.EmissionModule emission = trailParticleSystem.emission;
emission.enabled = true;
emission.rateOverTime = new ParticleSystem.MinMaxCurve(safeCount / safeLifetime);
// 轨道旋转Velocity over Lifetime 的 Orbital Z
ParticleSystem.VelocityOverLifetimeModule velocity = trailParticleSystem.velocityOverLifetime;
velocity.enabled = true;
velocity.orbitalZ = new ParticleSystem.MinMaxCurve(orbitalZSpeed);
// 发光强度HDR 倍率写入材质 _EmissionColor逐粒子随机色由顶点色再相乘着色
if (particleRenderer != null && particleRenderer.material != null)
{
float hdrScale = Mathf.Pow(2f, emissionIntensity);
Color emissionColor = Color.white * hdrScale;
emissionColor.a = 1f;
particleRenderer.material.SetFloat(EnableEmissionProperty, 1f);
particleRenderer.material.SetColor(EmissionColorProperty, emissionColor);
}
}
#endregion
}
}

View File

@@ -0,0 +1,2 @@
fileFormatVersion: 2
guid: 2cc178b2441bca14eb1321c83761ab6f