fix: 火山玩法回退

This commit is contained in:
2026-08-02 13:43:06 +08:00
parent 48dcc9ec3a
commit 56337c5173
13 changed files with 49 additions and 315 deletions
@@ -133,20 +133,15 @@ namespace AibisDream.MiniGame.Language
// 跳过红色粒子
if (p1.isRed && p2.isRed) continue;
if (!p1.connections.Contains(p2))
continue;
float distance = Vector3.Distance(p1.transform.position, p2.transform.position);
if (distance < connectionDistance)
{
float alpha = Mathf.Lerp(0.7f, 0f, distance / connectionDistance) * fadeOutAlpha;
Color lineColor = nonTargetConnectionColor;
lineColor.a = alpha * nonTargetAlphaScale * nonTargetConnectionColor.a;
ResolveConnectionVisual(
p1,
p2,
out Vector3 from,
out Vector3 to,
out float proximity);
float alpha = Mathf.Lerp(0f, 0.7f, proximity) * fadeOutAlpha;
Color lineColor = nonTargetConnectionColor;
lineColor.a = alpha * nonTargetAlphaScale * nonTargetConnectionColor.a;
DrawClippedLine(from, to, lineColor);
DrawClippedLine(p1.transform.position, p2.transform.position, lineColor);
}
}
}
}
@@ -167,50 +162,23 @@ namespace AibisDream.MiniGame.Language
{
for (int j = i + 1; j < redParticles.Count; j++)
{
CandidateParticle first = redParticles[i];
CandidateParticle second = redParticles[j];
if (!first.connections.Contains(second))
continue;
float distance = Vector3.Distance(
redParticles[i].transform.position,
redParticles[j].transform.position
);
ResolveConnectionVisual(
first,
second,
out Vector3 from,
out Vector3 to,
out float proximity);
float alpha = Mathf.Lerp(0.4f, 1f, proximity);
Color lineColor = targetConnectionColor;
lineColor.a = alpha * targetAlphaScale * targetConnectionColor.a;
if (distance < connectionDistance)
{
float alpha = Mathf.Lerp(1f, 0.4f, distance / connectionDistance);
Color lineColor = targetConnectionColor;
lineColor.a = alpha * targetAlphaScale * targetConnectionColor.a;
DrawClippedLine(from, to, lineColor);
DrawClippedLine(redParticles[i].transform.position, redParticles[j].transform.position, lineColor);
}
}
}
}
private void ResolveConnectionVisual(
CandidateParticle first,
CandidateParticle second,
out Vector3 from,
out Vector3 to,
out float proximity)
{
if (manager != null &&
manager.TryGetConnectionVisual(
first,
second,
out from,
out to,
out proximity))
{
return;
}
from = first.transform.position;
to = second.transform.position;
float distance = Vector3.Distance(from, to);
proximity = 1f - Mathf.Clamp01(distance / Mathf.Max(0.0001f, connectionDistance));
}
private void DrawPropagationEffects()
{
Draw.LineGeometry = LineGeometry.Flat2D;
@@ -4,67 +4,6 @@ namespace AibisDream.MiniGame.Language
{
public static class ExpressionParticleGeometry
{
public static bool TryGetConnection(
TextParticle first,
TextParticle second,
float centerDistanceLimit,
float edgeDistanceLimit,
out Vector3 from,
out Vector3 to,
out float proximity)
{
from = first != null ? first.transform.position : Vector3.zero;
to = second != null ? second.transform.position : Vector3.zero;
proximity = 0f;
if (first == null || second == null)
return false;
float centerDistance = Vector3.Distance(
first.transform.position,
second.transform.position);
bool centerConnected =
centerDistanceLimit > 0f && centerDistance < centerDistanceLimit;
Bounds firstBounds = first.GetVisualWorldBounds();
Bounds secondBounds = second.GetVisualWorldBounds();
float edgeDistance = BoundsDistance(firstBounds, secondBounds);
bool edgeConnected =
edgeDistanceLimit > 0f && edgeDistance <= edgeDistanceLimit;
if (!centerConnected && !edgeConnected)
return false;
from = firstBounds.ClosestPoint(secondBounds.center);
to = secondBounds.ClosestPoint(firstBounds.center);
if ((to - from).sqrMagnitude < 0.000001f)
{
from = first.transform.position;
to = second.transform.position;
}
float centerProximity = centerConnected
? 1f - Mathf.Clamp01(centerDistance / centerDistanceLimit)
: 0f;
float edgeProximity = edgeConnected
? 1f - Mathf.Clamp01(edgeDistance / Mathf.Max(0.0001f, edgeDistanceLimit))
: 0f;
proximity = Mathf.Max(centerProximity, edgeProximity);
return true;
}
public static float BoundsDistance(Bounds first, Bounds second)
{
float dx = Mathf.Max(
first.min.x - second.max.x,
second.min.x - first.max.x,
0f);
float dy = Mathf.Max(
first.min.y - second.max.y,
second.min.y - first.max.y,
0f);
return Mathf.Sqrt(dx * dx + dy * dy);
}
public static bool TryGetSeparation(
Bounds first,
Bounds second,
@@ -22,7 +22,6 @@ namespace AibisDream.MiniGame.Language
[SerializeField, Min(0.1f)] private float floatingFontScale = 1f;
[SerializeField, Min(0f)] private float nonTargetCountScale = 1f;
[SerializeField, Min(0f)] private float wordSpacing = 0.18f;
[SerializeField, Min(0f)] private float visualEdgeConnectionDistance = 0f;
[SerializeField, Range(0.1f, 1f)] private float minimumReadablePhraseScale = 0.65f;
public string LocaleCode => localeCode;
@@ -32,7 +31,6 @@ namespace AibisDream.MiniGame.Language
public float FloatingFontScale => floatingFontScale;
public float NonTargetCountScale => nonTargetCountScale;
public float WordSpacing => wordSpacing;
public float VisualEdgeConnectionDistance => visualEdgeConnectionDistance;
public float MinimumReadablePhraseScale => minimumReadablePhraseScale;
public int ScaleNonTargetCount(int baseCount)
@@ -1198,12 +1198,12 @@ namespace AibisDream.MiniGame.Language
continue;
}
if (TryGetConnectionVisual(
candidateParticles[i],
candidateParticles[j],
out _,
out _,
out _))
float distance = Vector3.Distance(
candidateParticles[i].transform.position,
candidateParticles[j].transform.position
);
if (distance < connectionDistance)
{
candidateParticles[i].connections.Add(candidateParticles[j]);
candidateParticles[j].connections.Add(candidateParticles[i]);
@@ -1219,12 +1219,12 @@ namespace AibisDream.MiniGame.Language
{
for (int j = i + 1; j < candidateParticles.Count; j++)
{
if (TryGetConnectionVisual(
candidateParticles[i],
candidateParticles[j],
out _,
out _,
out _))
float distance = Vector3.Distance(
candidateParticles[i].transform.position,
candidateParticles[j].transform.position
);
if (distance < connectionDistance)
{
string key = $"{Mathf.Min(i, j)}-{Mathf.Max(i, j)}";
previousConnections[key] = true;
@@ -1241,12 +1241,12 @@ namespace AibisDream.MiniGame.Language
{
for (int j = i + 1; j < candidateParticles.Count; j++)
{
if (TryGetConnectionVisual(
candidateParticles[i],
candidateParticles[j],
out _,
out _,
out _))
float distance = Vector3.Distance(
candidateParticles[i].transform.position,
candidateParticles[j].transform.position
);
if (distance < connectionDistance)
{
string key = $"{Mathf.Min(i, j)}-{Mathf.Max(i, j)}";
currentConnections[key] = true;
@@ -1291,7 +1291,10 @@ namespace AibisDream.MiniGame.Language
{
if (other.isRed) continue;
if (red.connections.Contains(other))
float distance = Vector3.Distance(
red.transform.position,
other.transform.position);
if (distance < connectionDistance)
return false;
}
}
@@ -1299,27 +1302,6 @@ namespace AibisDream.MiniGame.Language
return true;
}
public bool TryGetConnectionVisual(
CandidateParticle first,
CandidateParticle second,
out Vector3 from,
out Vector3 to,
out float proximity)
{
float edgeDistance =
ActiveUnitMode == ExpressionParticleUnitMode.Word
? activeSnapshot?.Profile?.VisualEdgeConnectionDistance ?? 0.18f
: 0f;
return ExpressionParticleGeometry.TryGetConnection(
first,
second,
connectionDistance,
edgeDistance,
out from,
out to,
out proximity);
}
private void OnTargetsCompleted()
{
completionPhase = CompletionPhase.Completed;