This commit is contained in:
2026-10-06 23:36:39 +08:00
parent 8592b9366c
commit 499eea39aa
10 changed files with 1445 additions and 1062 deletions
@@ -294,6 +294,14 @@ public class MonsterContral : MonoBehaviour
}
}
/// <summary>
/// ⭐ 是否延迟注册入鱼列表(子类控制,默认false=OnlyFish 创建时立即注册,现有鱼零影响)。
/// true=CreateFishManager.OnlyFish 跳过 RegisterFishInstance,
/// 由子类的激活方法(如 StealthBossControl.ActivateBoss)显式补注册。
/// 潜行Boss用:激活前不入鱼列表 → 自动锁定枚举/技能选鱼/服务端击杀通知全部找不到它。
/// </summary>
public virtual bool DeferFishRegister => false;
/// <summary>
/// 切换锁定点(不切换锁定对象)。
/// ⭐ 用于小白龙等切换模型/动画片段后锁定点也随之变化的情况:
@@ -105,8 +105,12 @@ public class MonsterControl_BossBase : MonsterContral
isLocalCoin = false;
killerSitPos = -1;
var res = FishResourcesData.fishResourcesDatasDic[fishTypeID];
if (res.showAudio != null && res.showAudio.Count > 0)
// ⭐ TryGetValue 判空:fishTypeID 未配置的 Boss(如 7005 预制体 fishTypeID=0)直接索引会抛
// KeyNotFoundException——OnEnable 是 Unity 生命周期回调,异常会中断整条 base 调用链,
// 子类(如 StealthBossControl)在 base.OnEnable() 之后的潜行初始化会全部跳过,潜行失效。
// 查不到时仅跳过出场音效,不影响其他逻辑
if (FishResourcesData.fishResourcesDatasDic.TryGetValue(fishTypeID, out var res)
&& res.showAudio != null && res.showAudio.Count > 0)
AudioManager.Instance.PlayerFX(res.showAudio[Random.Range(0, res.showAudio.Count)]);
}
@@ -1039,8 +1039,10 @@ public class CreateFishManager : MonoSingleton<CreateFishManager>
}
mc.fishenum = (FishTypeEnum)fishType.fishType;
// 按鱼类型放入对应字典
RegisterFishInstance(mc, fishType.fishType);
// ⭐ 潜行Boss(DeferFishRegister=true)跳过注册:等子类 ActivateBoss() 激活时再入列表。
// 激活前不在鱼列表 → 自动锁定枚举/技能选鱼/服务端击杀通知全部找不到此Boss
if (!mc.DeferFishRegister)
RegisterFishInstance(mc, fishType.fishType);
mc.Init(createFishData.moveLineId, spawnDic[createFishData.fishNumber].times);
@@ -1055,8 +1057,11 @@ public class CreateFishManager : MonoSingleton<CreateFishManager>
return true;
}
/// <summary>将鱼实例注册到全局字典及对应分类字典。</summary>
private void RegisterFishInstance(MonsterContral mc, int fishTypeId)
/// <summary>
/// 将鱼实例注册到全局字典及对应分类字典。
/// ⭐ public:潜行Boss(DeferFishRegister=true)由子类 ActivateBoss() 激活时显式调用补注册。
/// </summary>
public void RegisterFishInstance(MonsterContral mc, int fishTypeId)
{
// ⭐ 检测 guid 冲突:如果 guid 已存在,说明有重复出鱼(可能是 sync 模式重发),
// 旧鱼会被覆盖变成野鱼(无法通过 Id_DieFish_NotFX 销毁)
@@ -1809,6 +1814,11 @@ public class CreateFishManager : MonoSingleton<CreateFishManager>
// ⭐ 清除座位锁定引用:炮台不再对着死亡的鱼
ClearLockOnFish(fishId);
// ⭐ 死亡优先于冰冻:见 Ws_DieFish 里的同名说明,否则冰冻期间被打死的鱼
// 动画流程被 speed=0/时间轴定格卡住,可能不消失
if (isFrozen)
currGameType?.UnfreezeFishAnimations(monster);
// 👁 调试:记录每架掉金币飞机的实际坐标,便于对比"其他位置掉金币"来源
Debug.Log($"[掉金币坐标] fishId={fishId} 飞机坐标={monster.transform.position} 金币飞向={v3Point} isLocal={isLocal} 调用栈={System.Environment.StackTrace}");
@@ -2339,6 +2349,14 @@ public class CreateFishManager : MonoSingleton<CreateFishManager>
if (!dieFishCalled)
monster.DieFish(killFish);
// ⭐ 冰冻中被打死的鱼必须脱离冰冻定格(死亡优先于冰冻):
// 冰冻是把动画停住(Animator.speed=0 / Timeline 定格 / Spine timeScale=0),
// 而不少鱼的"消失"依赖动画流程推进,例如雷皇龙/金龙靠 FLZY_BOSS_AnimatorLeave
// 的 Animator 状态退出回调回池 → 不停下来状态机永不退出 → 鱼打死了也不消失。
// 放在 DieFish 之后:要覆盖掉个别 Boss 在自己的 DieFish 里设置的 animator.speed=0。
if (isFrozen)
currGameType?.UnfreezeFishAnimations(monster);
MonsterDieList.Instance.SmallHuangYiHuang(
monster.transform.position,
monster.monsterData.fishTypeConfig.fishNumber, 1000);