From 7d911a9c2e086a955c773f58a5a6b3eaf2e9179e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A3=AE2003?= <2384017988@qq.com> Date: Sat, 15 Aug 2026 21:53:24 +0800 Subject: [PATCH] 1 --- .../Scripts/Manager/CreateFishManager.cs | 3 + .../HeiDongFeiChuan/HeiDongFeiChuanEvent.cs | 102 ++++++++++++------ .../XJMH/Boss/XingYunLun/GameObject.prefab | 2 +- .../XJMH/Boss/XingYunLun/XingYunLunEvent.cs | 16 ++- 4 files changed, 88 insertions(+), 35 deletions(-) diff --git a/Assets/MyGame/Scripts/Manager/CreateFishManager.cs b/Assets/MyGame/Scripts/Manager/CreateFishManager.cs index a57dfa123..7d7d0f2fc 100644 --- a/Assets/MyGame/Scripts/Manager/CreateFishManager.cs +++ b/Assets/MyGame/Scripts/Manager/CreateFishManager.cs @@ -1560,6 +1560,9 @@ public class CreateFishManager : MonoSingleton $"fishNumber={monster.monsterData?.fishTypeConfig?.fishNumber} isyz={monster.isyz} yzID={monster.yzID} dictCount={fishDatas_hashCodekey.Count}", monster.GetInstanceID()); + // 👁 调试:记录每架掉金币飞机的实际坐标,便于对比"其他位置掉金币"来源 + Debug.Log($"[掉金币坐标] fishId={fishId} 飞机坐标={monster.transform.position} 金币飞向={v3Point} isLocal={isLocal} 调用栈={System.Environment.StackTrace}"); + if (false) { AudioManager.Instance.PlayerFX(60004); diff --git a/Assets/MyGame/aa/Game/XJMH/Boss/HeiDongFeiChuan/HeiDongFeiChuanEvent.cs b/Assets/MyGame/aa/Game/XJMH/Boss/HeiDongFeiChuan/HeiDongFeiChuanEvent.cs index e47cb3cfe..43e3548d2 100644 --- a/Assets/MyGame/aa/Game/XJMH/Boss/HeiDongFeiChuan/HeiDongFeiChuanEvent.cs +++ b/Assets/MyGame/aa/Game/XJMH/Boss/HeiDongFeiChuan/HeiDongFeiChuanEvent.cs @@ -49,6 +49,8 @@ public class HeiDongFeiChuanEvent : BJEventBase // 运行时状态 private int _absorbedCount = 0; // 已吸收飞机数 private readonly HashSet _absorbingGuids = new HashSet(); // 正在吸收中的鱼 guid + private int _displayScore = 0; // 面板当前显示分(持续滚动逼近 currScore) + private Coroutine _rollRoutine; // 持续滚动加分协程 public override void Init(long goldCount, int posID, long paobei, long fishScore, int beishu, Action action, Action action1 = null) @@ -58,6 +60,7 @@ public class HeiDongFeiChuanEvent : BJEventBase // 重置子类运行时状态(对象池复用安全) _absorbedCount = 0; _absorbingGuids.Clear(); + _displayScore = 0; // ApplySeatOffset 已重写为空,恢复到 Boss 传入的爆炸中心(死亡位置) transform.position = explosionCenter; @@ -190,11 +193,9 @@ public class HeiDongFeiChuanEvent : BJEventBase EndBlackhole(); } - /// 检测范围内普通鱼,批量触发吸收(一次吸所有在范围内的鱼) + /// 检测范围内普通鱼,批量触发吸收(黑洞持续期间不断处理范围内新进入的鱼) private void CheckAbsorb() { - if (_absorbedCount + _absorbingGuids.Count >= absorbTargetCount) return; - var hits = Physics2D.OverlapCircleAll(transform.position, absorbRadius, fishLayer); foreach (var hit in hits) { @@ -209,7 +210,7 @@ public class HeiDongFeiChuanEvent : BJEventBase } } - /// 螺旋吸收飞机:停移动 → 螺旋到中心 → 加分 → 回收 + /// 螺旋吸收飞机:停移动 → 螺旋到中心 → 爆炸炸掉 → 加分 private IEnumerator AbsorbFish(MonsterContral fish) { // 停止鱼的移动 @@ -241,51 +242,90 @@ public class HeiDongFeiChuanEvent : BJEventBase _absorbedCount++; _absorbingGuids.Remove(fish.guid); - // 通过红包算法加一点点分(从 maxScore 中分一份) - AbsorbAddScore(); - - // 回收鱼(不播死亡特效) - if (fish != null && fish.gameObject != null) - { - CreateFishManager.Instance.Id_DieFish_NotFX(fish.guid); - } + // 掉金币 + 累加分数(吸一条加一分),最后补齐剩余 + AbsorbDropCoin(fish); } - /// 每吸收一条飞机,从红包分层池取一份加到 currScore - private void AbsorbAddScore() + /// 被吸飞机掉金币 + 累加分数(吸一条加一分) + /// + /// ⭐ 必须用 BossGlodCoinNotFish 分包(不关联场上鱼), + /// 不能用 BossGlodCoinRandrom——它会从场上随机选普通鱼在各自位置掉金币, + /// 导致"其他飞机爆奖"。这里只让被吸的那条真实飞机掉金币。 + /// + private void AbsorbDropCoin(MonsterContral fish) { if (layeredPool == null) layeredPool = new LayeredPool(maxScore, absorbTargetCount > 0 ? absorbTargetCount : 1); - // 每次取 1 个红包 - var records = layeredPool.BossGlodCoinRandrom(transform.position, 1, 1, posID); + // 每次取 1 个红包作为该飞机掉的金币(只分包,不随机选场上鱼) + var records = layeredPool.BossGlodCoinNotFish(1); if (records != null && records.Count > 0) { - foreach (var r in records) - { - currScore += (int)r.Amount; - if (tMP_Score != null) - tMP_Score.text = currScore.ToString(); - } - Debug.Log($"[HeiDongFeiChuan] 吸收第 {_absorbedCount} 条 加分={records[0].Amount} currScore={currScore}/{maxScore}"); + // ⭐ 累加目标分,面板通过持续滚动协程连续逼近(好看) + currScore += (int)records[0].Amount; + EnsureRollRoutine(); + + // 让真实飞机掉金币飞向炮台(金/银按 isSelf 区分),飞行动画会一并回收该飞机 + Vector3 turretPos = GetSeatPosition(); + Debug.Log($"[HeiDongFeiChuan] 吸收第 {_absorbedCount} 条 掉金币={records[0].Amount} currScore={currScore} 飞机坐标={fish.transform.position} 黑洞中心={transform.position} 炮台={turretPos}"); + CreateFishManager.Instance.Id_DieFish_FX(fish.guid, records[0], turretPos, isSelf); + } + else + { + // 红包已分完,静默回收该飞机 + if (fish != null && fish.gameObject != null) + CreateFishManager.Instance.Id_DieFish_NotFX(fish.guid); } } - /// 黑洞结束:确保最终分数 = maxScore,进入结束流程 + /// 确保持续滚动加分协程在运行(面板连续趋近目标分) + private void EnsureRollRoutine() + { + if (_rollRoutine != null) return; + _rollRoutine = StartCoroutine(RollScoreRoutine()); + } + + /// 持续滚动加分:显示分每帧向目标分 currScore 逼近 + private IEnumerator RollScoreRoutine() + { + while (_displayScore < currScore) + { + // 每次跳约剩余差额的 35%,最小一步 10,滚动平滑且不突兀 + int remain = currScore - _displayScore; + int step = Mathf.CeilToInt(Mathf.Max(10f, remain * 0.35f)); + _displayScore += Mathf.Min(step, remain); + if (tMP_Score != null) + tMP_Score.text = _displayScore.ToString(); + yield return null; + } + _rollRoutine = null; + } + + /// 黑洞结束:逐条加分已把目标分累满;补齐剩余后等滚动显示完再进入结束流程 private void EndBlackhole() { - // 红包可能没全部分完,剩余的一次性加上 + // 红包可能没全部分完,剩余的一次性补到目标分 if (currScore < maxScore) { - int remain = maxScore - currScore; currScore = maxScore; - if (tMP_Score != null) - tMP_Score.text = maxScore.ToString(); - Debug.Log($"[HeiDongFeiChuan] 补齐剩余分数 remain={remain} final={currScore}"); + Debug.Log($"[HeiDongFeiChuan] 补齐剩余分数 final={currScore}/{maxScore}"); } - // 进入加分滚动 → MoveToSit(重写为原地停留)→ OnScoreEnd → die - StartAddScore(); + // 等持续滚动把显示分滚到最终分,再停留进入结束 + StartCoroutine(FinishAfterRoll()); + } + + private IEnumerator FinishAfterRoll() + { + // 等滚动显示完 + while (_rollRoutine != null) + yield return null; + if (tMP_Score != null) + tMP_Score.text = currScore.ToString(); + + // 停留让玩家看清最终分数 → MoveToSit(重写为原地停留)→ OnScoreEnd → die + yield return new WaitForSeconds(0.5f); + MoveToSit(); } /// 回收爆奖预制体到对象池 diff --git a/Assets/MyGame/aa/Game/XJMH/Boss/XingYunLun/GameObject.prefab b/Assets/MyGame/aa/Game/XJMH/Boss/XingYunLun/GameObject.prefab index 1f627ccd1..ab085dc64 100644 --- a/Assets/MyGame/aa/Game/XJMH/Boss/XingYunLun/GameObject.prefab +++ b/Assets/MyGame/aa/Game/XJMH/Boss/XingYunLun/GameObject.prefab @@ -89,5 +89,5 @@ MonoBehaviour: explosionCenter: {x: 0, y: 0, z: 0} seatUpOffset: 10 worldUpOffset: 16 - scorePanelOffset: {x: 0, y: 0} + scorePanelOffset: {x: -100, y: -50} flyDuration: 0.8 diff --git a/Assets/MyGame/aa/Game/XJMH/Boss/XingYunLun/XingYunLunEvent.cs b/Assets/MyGame/aa/Game/XJMH/Boss/XingYunLun/XingYunLunEvent.cs index aa9f118a2..a09548f59 100644 --- a/Assets/MyGame/aa/Game/XJMH/Boss/XingYunLun/XingYunLunEvent.cs +++ b/Assets/MyGame/aa/Game/XJMH/Boss/XingYunLun/XingYunLunEvent.cs @@ -443,7 +443,10 @@ public class XingYunLunEvent : BJEventBase if (CreateFishManager.Instance == null || CreateFishManager.Instance.currGameType == null) return; - var parent = CreateFishManager.Instance.currGameType.subPanelParent; + // ⭐ 与其他 Boss(小丑扑克/黑洞/普通鱼爆奖)保持一致: + // 分数面板挂在 subPanelParent.parent 下,坐标以 uiRoot Canvas 为基准, + // 否则 subPanelParent 与 Canvas 坐标系不一致会导致 scorePanelOffset 偏移不生效。 + var parent = CreateFishManager.Instance.currGameType.subPanelParent?.parent; if (parent == null) return; var board = Instantiate(scorePanelPrefab, parent); @@ -467,13 +470,20 @@ public class XingYunLunEvent : BJEventBase Vector3 lastItemPos = _items.Count > 0 ? _items[_items.Count - 1].transform.position : transform.position; Vector3 worldTarget = lastItemPos + Vector3.up * worldUpOffset; - Canvas canvas = parent.GetComponentInParent(); + // ⭐ 与 GetUiCanvas() 同源:以 UIManager.uiRoot 的 Canvas 为转换基准 + Canvas canvas = UIManager.Instance != null && UIManager.Instance.uiRoot != null + ? UIManager.Instance.uiRoot.GetComponent() + : parent.GetComponentInParent(); + if (canvas == null) return; Vector2 canvasPos = CoordinateTransformation.WorldPos_ToCanvas(worldTarget, canvas); + Vector2 canvasPosBeforeOffset = canvasPos; // 记录加偏移前的坐标 canvasPos += scorePanelOffset; RectTransform rt = board.GetComponent(); rt.anchoredPosition = canvasPos; - Debug.Log($"[XingYunLun] 分数面板创建 总分={totalScore} worldPos={worldTarget} canvasPos={canvasPos}"); + Debug.Log($"[XingYunLun] 分数面板创建 总分={totalScore} worldPos={worldTarget} " + + $"加偏移前={canvasPosBeforeOffset} scorePanelOffset={scorePanelOffset} 加偏移后={canvasPos} " + + $"父节点={board.transform.parent.name}"); } ///