Storyline+Dialog初步
This commit is contained in:
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 2cc178b2441bca14eb1321c83761ab6f
|
||||
Reference in New Issue
Block a user