1111111
This commit is contained in:
@@ -194,6 +194,14 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
|
||||
public Toggle toggle_Three;
|
||||
public Toggle toggle_Shuang;
|
||||
|
||||
[Header("锁定路径进度阈值(0~1,面板可调)")]
|
||||
[Tooltip("自动锁定/三发锁定/bot 的路径进度下限:鱼刚出生(进度<此值)不作为锁定目标。玩家手动锁定不受此限制")]
|
||||
[Range(0f, 1f)]
|
||||
public float lockPathMin = 0.1f;
|
||||
[Tooltip("自动锁定/三发锁定/bot 的路径进度上限:鱼即将离场(进度>此值)不作为锁定目标。玩家手动锁定不受此限制")]
|
||||
[Range(0f, 1f)]
|
||||
public float lockPathMax = 0.9f;
|
||||
|
||||
|
||||
// ⭐ 双倍开火:toggle_Shuang 开启后计时 shuangDuration 秒自动关闭(DaoJiShi 驱动),
|
||||
// child0 的 Image(Filled 360°) 做环形倒计时显示(GetShuangFillImage 懒获取)
|
||||
@@ -959,6 +967,14 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
|
||||
WebSocketSendList.SyncGameData(sgd);
|
||||
}
|
||||
});
|
||||
|
||||
// ⭐ 长按锁定 toggle(0.6秒) → 打开单独锁定面板(SuoDing):只打开界面,短按仍是正常开关锁定
|
||||
var lockLongPress = toggle_Lock.gameObject.GetComponent<ToggleLongPress>();
|
||||
if (lockLongPress == null) lockLongPress = toggle_Lock.gameObject.AddComponent<ToggleLongPress>();
|
||||
lockLongPress.onLongPress += () =>
|
||||
{
|
||||
subUIManager.ShowAsync(UIPanel.GameSuoDing);
|
||||
};
|
||||
}
|
||||
toggle_BaoZou.onValueChanged.AddListener(on =>
|
||||
{
|
||||
@@ -1847,7 +1863,8 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
|
||||
|
||||
var matched = GetMatchedTwoProps(cfg.propType);
|
||||
|
||||
// ⭐ 该类型只配了 1 个二级道具且拥有数量 > 0:不用弹二层,直接触发使用效果(一层直达不冷却)
|
||||
// ⭐ 该类型在道具表里只有 1 个道具(如刮刮卡/召唤卡):不用弹二层,直接触发使用效果
|
||||
// (数量不足时同样直达并提示,不弹只有一个"数量0"的二层;一层直达不冷却)
|
||||
if (matched.Count == 1)
|
||||
{
|
||||
var single = FindBackendProp(matched[0]);
|
||||
@@ -1858,6 +1875,11 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
|
||||
RefreshPropCounts(); // ⭐ 使用后拉最新背包,刷新所有道具数量显示
|
||||
return;
|
||||
}
|
||||
// 没拥有/数量为 0:同样不弹二层,直接提示数量不足
|
||||
ClosePropTwo();
|
||||
var n = !string.IsNullOrEmpty(matched[0].name) ? matched[0].name : "道具";
|
||||
UIManager.Instance.ShowBoardError($"[{n}] 数量不足,暂无法使用");
|
||||
return;
|
||||
}
|
||||
|
||||
// ⭐ 再点一下同一个一级项:关闭二层(点不同的一级项则切换内容)
|
||||
@@ -3224,10 +3246,7 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
|
||||
|
||||
#region 路径进度过滤(锁定范围控制)
|
||||
|
||||
/// <summary>bot/玩家锁定时,鱼路径进度下限:小于此值表示鱼刚出生,不锁定</summary>
|
||||
private const float BotLockPathMin = 0.1f;
|
||||
/// <summary>bot/玩家锁定时,鱼路径进度上限:大于此值表示鱼即将离场,不锁定</summary>
|
||||
private const float BotLockPathMax = 0.9f;
|
||||
// ⭐ 原 BotLockPathMin/BotLockPathMax 常量已改为面板字段 lockPathMin/lockPathMax(Inspector 可调)
|
||||
|
||||
/// <summary>
|
||||
/// 计算鱼在路径上的进度 [0, 1]。
|
||||
@@ -3247,15 +3266,15 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 判断鱼的路径进度是否在可锁定范围内 [BotLockPathMin, BotLockPathMax]
|
||||
/// 刚出生(< 0.1)或即将离场(> 0.9)的鱼不能锁定,避免锁定后立即丢失目标
|
||||
/// 判断鱼的路径进度是否在可锁定范围内 [lockPathMin, lockPathMax](面板字段,Inspector 可调)
|
||||
/// 刚出生或即将离场的鱼不能锁定,避免锁定后立即丢失目标
|
||||
/// ⭐ 注意:本函数仅用于自动锁定/bot/三发查找;玩家手动锁定不调用此函数
|
||||
/// </summary>
|
||||
private bool IsFishPathLockable(MonsterContral m)
|
||||
{
|
||||
if (m == null) return false;
|
||||
float progress = GetFishPathProgress(m);
|
||||
return progress >= BotLockPathMin && progress <= BotLockPathMax;
|
||||
return progress >= lockPathMin && progress <= lockPathMax;
|
||||
}
|
||||
|
||||
#endregion
|
||||
@@ -3321,6 +3340,8 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
|
||||
MonsterContral m = kv.Value;
|
||||
if (m == null || !m.gameObject.activeInHierarchy) continue;
|
||||
if (selected.Contains(m.guid)) continue; // 跳过已选中的
|
||||
// ⭐ 单独锁定白名单(SuoDing):面板勾选了鱼时,三发目标也只从选中的鱼里补
|
||||
if (!IsFishAllowedBySuoDing(m)) continue;
|
||||
// ⭐ 路径进度过滤:刚出生(< 0.1)或即将离场(> 0.9)的鱼不作为目标
|
||||
if (!IsFishPathLockable(m)) continue;
|
||||
// ⭐ 可锁定过滤:出场效果期间/needLockEvent 鱼未就绪 → 跳过换下一条
|
||||
@@ -3570,6 +3591,43 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ⭐ 单独锁定白名单(SuoDingPanel):是否允许自动锁定这条鱼。
|
||||
/// - 面板从未打开过(不存在) 或 一个都没勾 → 不限制(走原有优先级规则)
|
||||
/// - 勾选了至少一条 → 只允许锁定勾选的鱼(固定锁定这几个选中的鱼)
|
||||
/// 手动锁定(玩家点击选鱼)不受此限制。
|
||||
/// </summary>
|
||||
private bool IsFishAllowedBySuoDing(MonsterContral m)
|
||||
{
|
||||
if (m == null) return false;
|
||||
var panel = subUIManager.Get<SuoDingPanel>(UIPanel.GameSuoDing);
|
||||
if (panel == null || !panel.HasSelection) return true;
|
||||
return panel.IsFishSelected(m.monsterData?.fishTypeConfig?.fishNumber);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ⭐ SuoDing 面板关闭时应用勾选结果(由 SuoDingPanel.OnHide 回调):
|
||||
/// 1. 打开锁定开关(toggle_Lock)
|
||||
/// 2. 直接激活自动锁定(跳过"先手动锁定一条鱼"的前提)
|
||||
/// 3. 当前手动锁定的目标转为自动锁定 → 立即受白名单约束
|
||||
/// 白名单(selectedSet)由面板 Toggle 实时同步;之后的自动锁定仍按原有优先级
|
||||
/// (特殊Boss > Boss鱼 > 特殊鱼 > 黄金鱼)只从选中的鱼里选目标,选中的鱼死光则不锁定。
|
||||
/// </summary>
|
||||
public void ApplySuoDingSelection()
|
||||
{
|
||||
// 打开锁定开关(已打开则不变;关闭时 onValueChanged 的重置逻辑只在 !on 分支,不受影响)
|
||||
if (toggle_Lock != null && !toggle_Lock.isOn)
|
||||
toggle_Lock.isOn = true;
|
||||
|
||||
// ⭐ 面板选完即应用:自动锁定立即开始找目标
|
||||
_autoLockActivated = true;
|
||||
|
||||
// ⭐ 当前若是手动锁定 → 转为自动锁定:
|
||||
// 在勾选白名单里 → 继续锁(无缝);不在白名单/即将离场 → HandleAutoLock 立即换白名单里的目标
|
||||
if (currSitData != null && currSitData.isManualLock)
|
||||
currSitData.isManualLock = false;
|
||||
}
|
||||
|
||||
private void HandleAutoLock()
|
||||
{
|
||||
// ⭐ 退出倒计时期间屏蔽本地玩家自动锁定,其他玩家和机器人不受影响
|
||||
@@ -3594,15 +3652,16 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
|
||||
currSitData.monCotl_Lock != null &&
|
||||
currSitData.monCotl_Lock.gameObject.activeInHierarchy)
|
||||
{
|
||||
// 手动锁定:死了才转换
|
||||
// 手动锁定:死了才转换(玩家自己点的鱼,不受白名单限制)
|
||||
if (currSitData.isManualLock) return;
|
||||
|
||||
if (IsFishPathLockable(currSitData.monCotl_Lock))
|
||||
if (IsFishPathLockable(currSitData.monCotl_Lock)
|
||||
&& IsFishAllowedBySuoDing(currSitData.monCotl_Lock))
|
||||
{
|
||||
// 当前目标仍有效 → 没有更高优先级目标就保持锁定,有就落到下面切换
|
||||
// 当前目标仍有效且在白名单内 → 没有更高优先级目标就保持锁定,有就落到下面切换
|
||||
if (!HasHigherPriorityTarget(currSitData.monCotl_Lock)) return;
|
||||
}
|
||||
// 当前目标离场(超出 0.1~0.9) → 落到下面重新找目标
|
||||
// 当前目标离场(超出 0.1~0.9) 或 被取消勾选(不在白名单) → 落到下面重新找目标
|
||||
}
|
||||
|
||||
// 当前锁定目标已死亡/失效 → 自动找下一个目标
|
||||
@@ -3669,6 +3728,8 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
|
||||
{
|
||||
MonsterContral m = kv.Value;
|
||||
if (m == null || !m.gameObject.activeInHierarchy) continue;
|
||||
// ⭐ 单独锁定白名单(SuoDing):面板勾选了鱼时只从选中的鱼里选目标
|
||||
if (!IsFishAllowedBySuoDing(m)) continue;
|
||||
// ⭐ 路径进度过滤:刚出生(< 0.1)或即将离场(> 0.9)的鱼不作为自动锁定目标
|
||||
if (!IsFishPathLockable(m)) continue;
|
||||
// ⭐ 可锁定过滤:出场效果期间/needLockEvent 鱼未就绪 → 跳过换下一条
|
||||
@@ -3714,7 +3775,7 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
|
||||
|
||||
/// <summary>
|
||||
/// ⭐ 检查场上是否存在比 current 优先级严格更高的可锁定目标(自动锁定升级用)。
|
||||
/// 与 FindAutoLockTarget 使用完全相同的过滤条件(活跃/路径进度/可锁定)。
|
||||
/// 与 FindAutoLockTarget 使用完全相同的过滤条件(活跃/白名单/路径进度/可锁定)。
|
||||
/// 同优先级不算更高 —— 避免同层"距离最近"目标来回切换导致锁定图标抖动。
|
||||
/// </summary>
|
||||
private bool HasHigherPriorityTarget(MonsterContral current)
|
||||
@@ -3729,6 +3790,8 @@ public class GameMainPanel_FishBase : GameMainPanel_Base
|
||||
{
|
||||
MonsterContral m = kv.Value;
|
||||
if (m == null || m == current || !m.gameObject.activeInHierarchy) continue;
|
||||
// ⭐ 单独锁定白名单(SuoDing):只认选中的鱼,未选中的高优先级鱼不触发升级
|
||||
if (!IsFishAllowedBySuoDing(m)) continue;
|
||||
if (!IsFishPathLockable(m)) continue;
|
||||
if (!IsMonsterLockable(m)) continue;
|
||||
if (GetFishLockPriority(m) > currentPri) return true;
|
||||
|
||||
Reference in New Issue
Block a user