feat(language): 非目标粒子干扰效果与火山释放 log 淡出

CandidateParticle 添加干扰抖动;LanguageParticleManager 完成时淡出 panel、button、releaseLog 界面。

Made-with: Cursor
This commit is contained in:
2026-03-12 15:26:28 +08:00
parent 17994d4b56
commit 8b16db34d8
2 changed files with 111 additions and 7 deletions
@@ -35,6 +35,15 @@ namespace AibisDream.MiniGame.Language
public Vector2 anxietyShakeOffset;
public float anxietyFloatY;
[Header("非目标干扰效果")]
public float interferenceShakeIntensity = 0f;
public float interferenceShakeSpeed = 8f;
public float interferenceFloatAmplitude = 0.015f;
private float interferenceShakePhase;
private float interferenceFloatPhase;
private Vector2 interferenceShakeOffset;
private float interferenceFloatY;
[Header("波形关联")]
public float calmProgress = 0f; // 平静进度(0-1
public float dissolveProgress = 0f; // 消散进度(0-1
@@ -63,6 +72,9 @@ namespace AibisDream.MiniGame.Language
velocity = new Vector2(Random.Range(-0.5f, 0.5f), Random.Range(-0.5f, 0.5f));
changeInterval = Random.Range(1f, 2.5f);
interferenceShakePhase = Random.Range(0f, Mathf.PI * 2f);
interferenceFloatPhase = Random.Range(0f, Mathf.PI * 2f);
if (textMesh != null)
{
textMesh.fontSize = size;
@@ -85,6 +97,12 @@ namespace AibisDream.MiniGame.Language
{
UpdateAnxietyEffect();
}
// 非目标粒子干扰抖动
if (!isRed && !isCalmed && interferenceShakeIntensity > 0)
{
UpdateInterferenceEffect();
}
}
private void UpdateEffectAnimation()
@@ -141,8 +159,9 @@ namespace AibisDream.MiniGame.Language
// 更新字体样式(大小和加粗)
UpdateFontStyle();
// 计算显示位置
Vector3 displayOffset = (Vector3)(vibrationOffset + anxietyShakeOffset) + Vector3.up * anxietyFloatY;
// 计算显示位置(叠加干扰抖动)
Vector3 displayOffset = (Vector3)(vibrationOffset + anxietyShakeOffset + interferenceShakeOffset)
+ Vector3.up * (anxietyFloatY + interferenceFloatY);
textMesh.transform.localPosition = displayOffset;
// 计算颜色和透明度
@@ -204,6 +223,33 @@ namespace AibisDream.MiniGame.Language
/// </summary>
private bool IsTarget => originalIsRed;
private void UpdateInterferenceEffect()
{
interferenceShakePhase += Time.deltaTime * interferenceShakeSpeed;
interferenceFloatPhase += Time.deltaTime * interferenceShakeSpeed * 0.3f;
float intensity = interferenceShakeIntensity;
interferenceShakeOffset = new Vector2(
Mathf.Sin(interferenceShakePhase) * intensity
+ Mathf.Sin(interferenceShakePhase * 2.3f) * intensity * 0.4f,
Mathf.Cos(interferenceShakePhase * 1.7f) * intensity * 0.7f
+ Mathf.Sin(interferenceShakePhase * 0.6f) * intensity * 0.3f
);
interferenceFloatY = Mathf.Sin(interferenceFloatPhase) * interferenceFloatAmplitude;
}
public void SetInterferenceParams(float shakeIntensity, float shakeSpeed, float changeIntv, float floatAmplitude)
{
interferenceShakeIntensity = shakeIntensity;
interferenceShakeSpeed = shakeSpeed;
interferenceFloatAmplitude = floatAmplitude;
if (!isRed)
{
changeInterval = Mathf.Max(0.05f, changeIntv * Random.Range(0.7f, 1.3f));
}
}
public void InitializeAnxietyEffect()
{
anxietyShakePhase = Random.Range(0f, Mathf.PI * 2f);