feat(language): 非目标粒子干扰效果与火山释放 log 淡出
CandidateParticle 添加干扰抖动;LanguageParticleManager 完成时淡出 panel、button、releaseLog 界面。 Made-with: Cursor
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user