From 74fbc76d230be2d906b9ee70892df2d5756e7bf3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A3=AE2003?= <2384017988@qq.com> Date: Thu, 1 Oct 2026 17:02:05 +0800 Subject: [PATCH] 1 --- .../Characters/Monster/MonsterContral.cs | 16 +++ .../Scripts/Manager/CreateFishManager.cs | 32 ++--- .../aa/UI/Game/XJMH/GameMainPanelXJMH.prefab | 126 +----------------- 3 files changed, 40 insertions(+), 134 deletions(-) diff --git a/Assets/MyGame/Scripts/Characters/Monster/MonsterContral.cs b/Assets/MyGame/Scripts/Characters/Monster/MonsterContral.cs index 35ea47fc7..89c4bb3db 100644 --- a/Assets/MyGame/Scripts/Characters/Monster/MonsterContral.cs +++ b/Assets/MyGame/Scripts/Characters/Monster/MonsterContral.cs @@ -228,6 +228,9 @@ public class MonsterContral : MonoBehaviour /// 扇形(700)/圈(701)分布角方向:Init时按轴读生成姿态前方的XY投影,每条鱼各自不同 private Vector2 _yzMoveDir = Vector2.zero; + /// 阵鱼定位数值是否已打日志(一次性诊断用,池复用重置) + private bool _yzPosLogged; + /// /// yzID 前3字符前缀缓存(Init 时 Substring 一次)。 /// 避免 UpdateYZMovement 每帧每鱼 yzID.Substring(0,3) 产生字符串 GC 分配。 @@ -405,6 +408,7 @@ public class MonsterContral : MonoBehaviour mainCamera = Camera.main; moveTime = 0f; yzGroupTimeOffset = 0f; // 池复用清掉上次的阵鱼创建偏移 + _yzPosLogged = false; // 池复用重置一次性定位日志 // ⭐ 重置创建视频状态:池回收的鱼 _isPlayingCreateVideo 可能残留 true, // 重新生成时重置,由 Init 决定是否重新播放 _createVideoDuration = 0f; @@ -731,6 +735,18 @@ public class MonsterContral : MonoBehaviour // ⭐ 加上创建时刻偏移:先创建的组已经游出去,后创建的从出生点出发,避免重合在同一点 Vector2 pos = (Vector2)_yzStartWorld + lineDir * (moveTime + yzGroupTimeOffset) * monsterData.moveLine.moveTime; + // ⭐ 一次性诊断日志:输出阵鱼定位的各项数值(排查"偏移距离太小") + if (!_yzPosLogged) + { + _yzPosLogged = true; + var cam = mainCamera != null ? mainCamera : Camera.main; + float worldW = cam != null ? cam.orthographicSize * 2f * cam.aspect : 0f; + Debug.Log($"[阵鱼定位] guid={guid} yzID={yzID} prefix={_yzPrefix} " + + $"start={_yzStartWorld.ToString("F2")} dir={_yzMoveDir.ToString("F3")} " + + $"moveTime={moveTime:F3} offset={yzGroupTimeOffset:F3} speed={monsterData.moveLine.moveTime:F2} " + + $"pos={pos.ToString("F2")} 屏幕世界宽={worldW:F2} isMove={isMove} isyz={isyz}"); + } + // ⭐ 朝向保持生成姿态(分布角)不转——不调 ApplyFacingDirection: // 它会覆盖根的分布角,把扇形/圈抹成一列竖队 // ⭐ 保留根节点当前 z(2D 小鱼 z 一直为 0,行为不变) diff --git a/Assets/MyGame/Scripts/Manager/CreateFishManager.cs b/Assets/MyGame/Scripts/Manager/CreateFishManager.cs index baabf3f2c..901951e66 100644 --- a/Assets/MyGame/Scripts/Manager/CreateFishManager.cs +++ b/Assets/MyGame/Scripts/Manager/CreateFishManager.cs @@ -222,9 +222,11 @@ public class CreateFishManager : MonoSingleton // fangzhu 字段已删除:鱼创建改由服务端 OnFishSpawn 统一下发,客户端无需房主出鱼 public bool isResources = false; - [Header("扇形阵(700)")] - [Tooltip("同一扇内相邻两条鱼之间的生成间隔(秒),避免17条鱼同帧出生叠在一起")] - public float shanXingFishInterval = 0.05f; + [Header("鱼阵(700/701)组偏移")] + [Tooltip("每组(每条线)相对上一组多走的秒数。屏幕上组间距 ≈(该值 - 每组出鱼间隔)×moveLine.moveTime。\n" + + "扇形每组间隔 1 秒,所以该值必须>1 才拉得开(如 3 → 组间距≈(3-1)×15=30 世界单位);\n" + + "圈没有间隔,组间距≈该值×15")] + public float yzGroupStaggerTime = 3f; [Header("鱼阵路线撞车")] [Tooltip("同一条路线被鱼阵占用后,其他鱼阵再用到同一条线需要等待的秒数(避免同一出生点同帧重叠)")] @@ -1208,7 +1210,8 @@ public class CreateFishManager : MonoSingleton } // ⭐ 同线撞车:这条线刚被别的鱼阵用过时先等一会,避免同一出生点同帧叠一起 yield return WaitLineFree(pathList[lineIndex]); - yield return ShanXing(createFishData, yz, pos, prefab, pathList[lineIndex], count, time, arraySeq, lineIndex); + // ⭐ 一扇内部一次性全部创建(不再逐条延迟);组与组之间靠 1s 等待 + 创建时间偏移拉开 + ShanXing(createFishData, yz, pos, prefab, pathList[lineIndex], count, time, arraySeq, lineIndex); yield return new WaitForSeconds(1f); } } @@ -1230,8 +1233,8 @@ public class CreateFishManager : MonoSingleton _lineBusyTime[pathId] = Time.time; } - /// 扇形阵:一条线的17条鱼按 shanXingFishInterval 逐条延迟生成(避免同帧出生叠在一起)。 - private IEnumerator ShanXing(FrameData_CreateFish createFishData, FishArrayConfig yz, + /// 扇形阵:一条线(一扇)的17条鱼一次性全部创建,不再逐条延迟。 + private void ShanXing(FrameData_CreateFish createFishData, FishArrayConfig yz, Vector3 pos, GameObject prefab, int pathId, int count, long time, int arraySeq, int lineIndex) { var cfg = spawnDic[createFishData.fishNumber]; @@ -1265,20 +1268,18 @@ public class CreateFishManager : MonoSingleton mc.guid = createFishData.guid + "_" + arraySeq + "_" + lineIndex + "_" + i; RegisterFishInstance(mc, FishDatas[yz.fishNumber].fishType); - // ⭐ moveTime 归零(存活时长从本条鱼自己出生算起), - // "创建时刻偏移"单独放进 yzGroupTimeOffset:它只进位移公式, - // 让先出的那一组已经沿分布方向游出去、后出的从出生点出发,避免整组重叠在同一点 + // ⭐ 创建时间偏移:每往下一组(每条线)+yzGroupStaggerTime 秒, + // 位移公式用 (moveTime + yzGroupTimeOffset) 定位,把各组沿分布方向拉开、不再重合。 + // 注意:偏移必须大于"每组出鱼间隔(1s)",否则会精确抵消(半径完全相同,看着还是重合) + // moveTime 本身保持 0:存活时长仍从本条鱼自己出生算起,不受偏移影响 mc.moveTime = 0f; - mc.yzGroupTimeOffset = (BeijingTimeManager.Instance.CurrentTimestampMs - time) / 1000f; + mc.yzGroupTimeOffset = lineIndex * yzGroupStaggerTime; mc.Init(pathId.ToString(), cfg.times, true, yz.arrayNumber); // ⭐ 鱼阵调试日志:输出每条子鱼生成后的旋转与缩放(排查"有的正有的反") Debug.Log($"[鱼阵调试] 阵={yz.arrayNumber}(扇形700) pathId={pathId} 第{i}/{16}条 guid={mc.guid} " + $"rotation={fish.transform.eulerAngles.ToString("F1")} localScale={fish.transform.localScale.ToString("F3")}"); - - // ⭐ 同一扇内逐条延迟:避免17条鱼同帧出生全叠在出生点 - yield return new WaitForSeconds(shanXingFishInterval); } } @@ -1331,9 +1332,10 @@ public class CreateFishManager : MonoSingleton mc.guid = createFishData.guid + "_" + arraySeq + "_" + lineIndex + "_" + i; RegisterFishInstance(mc, FishDatas[yz.fishNumber].fishType); - // ⭐ moveTime 归零 + 创建时刻偏移进 yzGroupTimeOffset(说明同扇形) + // ⭐ 创建时间偏移:每往下一组(每条线)+yzGroupStaggerTime 秒,位移定位用 (moveTime + yzGroupTimeOffset) + // (说明同扇形;圈本身同帧出,靠这个偏移把各圈沿分布方向拉开,不必加延迟) mc.moveTime = 0f; - mc.yzGroupTimeOffset = (BeijingTimeManager.Instance.CurrentTimestampMs - time) / 1000f; + mc.yzGroupTimeOffset = lineIndex * yzGroupStaggerTime; mc.Init(pathId.ToString(), cfg.times, true, yz.arrayNumber); diff --git a/Assets/MyGame/aa/UI/Game/XJMH/GameMainPanelXJMH.prefab b/Assets/MyGame/aa/UI/Game/XJMH/GameMainPanelXJMH.prefab index 9597df7c0..8b7219798 100644 --- a/Assets/MyGame/aa/UI/Game/XJMH/GameMainPanelXJMH.prefab +++ b/Assets/MyGame/aa/UI/Game/XJMH/GameMainPanelXJMH.prefab @@ -3181,7 +3181,7 @@ MonoBehaviour: unlockLevel: 0 uiIconSprite: {fileID: 0} description: - skeletonAnimation: {fileID: 0} + skeletonAnimation: {fileID: 5979669743258872926} old_CurrAnimation: {fileID: 0} new_CurrAnimation: {fileID: 0} currTurretType: 1 @@ -5257,7 +5257,6 @@ GameObject: - component: {fileID: 5781209983944085165} - component: {fileID: 4035888545790914838} - component: {fileID: 5984365130024130571} - - component: {fileID: 5722126414559939294} - component: {fileID: 3682759961943257957} m_Layer: 0 m_Name: SkeletonGraphic_VIP @@ -5265,7 +5264,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &5781209983944085165 RectTransform: m_ObjectHideFlags: 0 @@ -5343,61 +5342,6 @@ MonoBehaviour: calculateTangents: 0 addNormals: 0 immutableTriangles: 0 ---- !u!114 &5722126414559939294 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 3712232115700564997} - m_Enabled: 0 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e2fbda49303fb1543a68b553ec721872, type: 3} - m_Name: - m_EditorClassIdentifier: - turretID: - setPosData: {fileID: 0} - tra_BulletStartPosition: {fileID: 490001299791756420} - tra_RotationPivot: {fileID: 2752274170600578251} - bulletPrefab_Two: {fileID: 0} - bulletPrefab: {fileID: 0} - laserPrefab: {fileID: 0} - laserWidth: 0.3 - laserColor: {r: 1, g: 0.3, b: 0.3, a: 0.9} - laserLengthCorrect: 1 - turretNumber: 0 - turretType: 1 - displayName: - quality: 1 - unlockLevel: 0 - uiIconSprite: {fileID: 0} - description: - skeletonAnimation: {fileID: 3094521970018869135} - old_CurrAnimation: {fileID: 0} - new_CurrAnimation: {fileID: 0} - currTurretType: 1 - isFrenzy: 0 - idleAnim: - attackAnim: - frenzyAttackAnim: - laserStartAnim: - laserLoopAnim: - laserEndAnim: - playFireParam: PlayFire - fireIndexParam: FireIndex - idleIndexParam: IdleIndex - fireIndex: 0 - idleIndex: 0 - obj_Add: {fileID: 0} - obj_Down: {fileID: 0} - takeoffAnim: - flyLoopAnim: - flyDuration: 0.6 - flySmooth: 1 - edgePadding: 60 - upFireInterval: 0.4 - upFireDuration: 0 - upFireDelay: 0 --- !u!114 &3682759961943257957 MonoBehaviour: m_ObjectHideFlags: 0 @@ -8325,7 +8269,6 @@ GameObject: - component: {fileID: 2487576147542109954} - component: {fileID: 2841934294963690504} - component: {fileID: 1256237870015243263} - - component: {fileID: 8670772098217126294} - component: {fileID: 8318936997404565909} m_Layer: 0 m_Name: SkeletonGraphic_VIP @@ -8333,7 +8276,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &2487576147542109954 RectTransform: m_ObjectHideFlags: 0 @@ -8411,61 +8354,6 @@ MonoBehaviour: calculateTangents: 0 addNormals: 0 immutableTriangles: 0 ---- !u!114 &8670772098217126294 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 5593299514457064019} - m_Enabled: 0 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e2fbda49303fb1543a68b553ec721872, type: 3} - m_Name: - m_EditorClassIdentifier: - turretID: - setPosData: {fileID: 0} - tra_BulletStartPosition: {fileID: 9009901755340094101} - tra_RotationPivot: {fileID: 8321069818987252954} - bulletPrefab_Two: {fileID: 0} - bulletPrefab: {fileID: 0} - laserPrefab: {fileID: 0} - laserWidth: 0.3 - laserColor: {r: 1, g: 0.3, b: 0.3, a: 0.9} - laserLengthCorrect: 1 - turretNumber: 0 - turretType: 1 - displayName: - quality: 1 - unlockLevel: 0 - uiIconSprite: {fileID: 0} - description: - skeletonAnimation: {fileID: 1255232164285835782} - old_CurrAnimation: {fileID: 0} - new_CurrAnimation: {fileID: 0} - currTurretType: 1 - isFrenzy: 0 - idleAnim: - attackAnim: - frenzyAttackAnim: - laserStartAnim: - laserLoopAnim: - laserEndAnim: - playFireParam: PlayFire - fireIndexParam: FireIndex - idleIndexParam: IdleIndex - fireIndex: 0 - idleIndex: 0 - obj_Add: {fileID: 0} - obj_Down: {fileID: 0} - takeoffAnim: - flyLoopAnim: - flyDuration: 0.6 - flySmooth: 1 - edgePadding: 60 - upFireInterval: 0.4 - upFireDuration: 0 - upFireDelay: 0 --- !u!114 &8318936997404565909 MonoBehaviour: m_ObjectHideFlags: 0 @@ -9089,7 +8977,7 @@ MonoBehaviour: - {fileID: 4968694161106350648} - {fileID: 5064756052779050165} - {fileID: 8295326240447925651} - - {fileID: 5722126414559939294} + - {fileID: 3682759961943257957} tra_CurrTurret: {fileID: 0} currentAngle: 0 maxRotationAngle: 90 @@ -11004,7 +10892,7 @@ MonoBehaviour: unlockLevel: 0 uiIconSprite: {fileID: 0} description: - skeletonAnimation: {fileID: 0} + skeletonAnimation: {fileID: 6874186973720068549} old_CurrAnimation: {fileID: 0} new_CurrAnimation: {fileID: 0} currTurretType: 1 @@ -11610,7 +11498,7 @@ MonoBehaviour: - {fileID: 4071441852994240012} - {fileID: 5991888581254097079} - {fileID: 5374006129012476344} - - {fileID: 8670772098217126294} + - {fileID: 8318936997404565909} tra_CurrTurret: {fileID: 0} currentAngle: 0 maxRotationAngle: 90 @@ -16056,7 +15944,7 @@ PrefabInstance: - target: {fileID: 224430927734448352, guid: 66ad8d1d353b35646b885106f966f9bb, type: 3} propertyPath: m_AnchoredPosition.x - value: 6.2788 + value: 6.2788086 objectReference: {fileID: 0} - target: {fileID: 224430927734448352, guid: 66ad8d1d353b35646b885106f966f9bb, type: 3}