fix: 火山玩法回退
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user