2026-07-05 16:07:22 +08:00
|
|
|
using System;
|
|
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 机器人AI配置 — 本地测试用 Inspector 调节,后续从后端 GameConfig / RoomChangeResponse 下发
|
|
|
|
|
/// </summary>
|
2026-07-14 02:48:54 +08:00
|
|
|
[Serializable]
|
2026-07-05 16:07:22 +08:00
|
|
|
public class BotConfig
|
|
|
|
|
{
|
|
|
|
|
[Header("全局")]
|
|
|
|
|
[Tooltip("机器人总开关")]
|
|
|
|
|
public bool enabled = true;
|
|
|
|
|
|
|
|
|
|
[Tooltip("AI状态: active=正常 | idle=待机 | aggressive=激进")]
|
|
|
|
|
public string aiState = "active";
|
|
|
|
|
|
|
|
|
|
[Tooltip("爆率因子: 1.0=正常, >1容易杀, <1难杀")]
|
|
|
|
|
public float luckFactor = 1f;
|
|
|
|
|
|
|
|
|
|
[Tooltip("状态刷新间隔(秒), 0=不自动刷新")]
|
|
|
|
|
public float stateRefreshInterval;
|
|
|
|
|
|
|
|
|
|
[Header("技能配置")]
|
2026-07-05 17:39:30 +08:00
|
|
|
public BotSkillConfig skills = new BotSkillConfig();
|
2026-07-05 16:07:22 +08:00
|
|
|
|
|
|
|
|
[Header("active 状态参数")]
|
2026-07-05 17:39:30 +08:00
|
|
|
public BotBehaviorConfig activeBehavior = new BotBehaviorConfig();
|
2026-07-05 16:07:22 +08:00
|
|
|
|
|
|
|
|
[Header("idle 状态参数")]
|
2026-07-05 17:39:30 +08:00
|
|
|
public BotBehaviorConfig idleBehavior = new BotBehaviorConfig();
|
2026-07-05 16:07:22 +08:00
|
|
|
|
|
|
|
|
[Header("aggressive 状态参数")]
|
2026-07-05 17:39:30 +08:00
|
|
|
public BotBehaviorConfig aggressiveBehavior = new BotBehaviorConfig();
|
2026-07-11 17:07:32 +08:00
|
|
|
|
|
|
|
|
[Header("倍数策略")]
|
|
|
|
|
public BotMultiplierConfig multiplier = new BotMultiplierConfig();
|
|
|
|
|
|
|
|
|
|
[Header("Boss策略")]
|
|
|
|
|
public BotBossStrategyConfig bossStrategy = new BotBossStrategyConfig();
|
|
|
|
|
|
|
|
|
|
[Header("退出条件")]
|
|
|
|
|
public BotExitConfig exitCondition = new BotExitConfig();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>机器人倍数(炮台档位)策略配置</summary>
|
|
|
|
|
[Serializable]
|
|
|
|
|
public class BotMultiplierConfig
|
|
|
|
|
{
|
|
|
|
|
[Tooltip("进场初始炮台档位索引(对应 paoBeiList 的下标, 0=最低档)")]
|
|
|
|
|
public int initialLevelIndex = 0;
|
|
|
|
|
|
|
|
|
|
[Tooltip("低于此倍数(当前金币/进场金币) → 降档")]
|
|
|
|
|
public float decreaseThreshold = 0.5f;
|
|
|
|
|
|
|
|
|
|
[Tooltip("高于此倍数(当前金币/进场金币) → 升档")]
|
|
|
|
|
public float increaseThreshold = 1.5f;
|
|
|
|
|
|
|
|
|
|
[Tooltip("每次调整的档位数")]
|
|
|
|
|
public int step = 1;
|
|
|
|
|
|
|
|
|
|
[Tooltip("倍数检查间隔(秒)")]
|
|
|
|
|
public float checkInterval = 3f;
|
|
|
|
|
|
|
|
|
|
[Tooltip("最低保持档位索引(不会降到低于此值)")]
|
|
|
|
|
public int minLevelIndex = 0;
|
|
|
|
|
|
|
|
|
|
[Tooltip("最高保持档位索引(不会升到高于此值), -1=不限制")]
|
|
|
|
|
public int maxLevelIndex = -1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>机器人Boss策略配置</summary>
|
|
|
|
|
[Serializable]
|
|
|
|
|
public class BotBossStrategyConfig
|
|
|
|
|
{
|
|
|
|
|
[Tooltip("视为Boss的鱼类型 (按 FishTypeEnum 的int值)")]
|
|
|
|
|
public int[] bossFishTypes = { 2, 5 }; // Boss鱼=2, 特殊Boss=5
|
|
|
|
|
|
|
|
|
|
[Tooltip("无Boss时启用散射乱射模式")]
|
|
|
|
|
public bool scatterWhenNoBoss = true;
|
|
|
|
|
|
|
|
|
|
[Tooltip("无Boss时定点三发概率(0~1), 否则单射")]
|
|
|
|
|
[Range(0f, 1f)] public float tripleShotProb = 0.5f;
|
|
|
|
|
|
|
|
|
|
[Tooltip("有Boss时优先锁定最大倍率(赔率)的Boss")]
|
|
|
|
|
public bool preferMaxMultiplierBoss = true;
|
|
|
|
|
|
|
|
|
|
[Tooltip("Boss数量超过此值 → 开启散射模式")]
|
|
|
|
|
public int scatterModeThreshold = 3;
|
|
|
|
|
|
|
|
|
|
[Tooltip("Boss数量<=此值时随机狂暴技能概率(0~1)")]
|
|
|
|
|
[Range(0f, 1f)] public float frenzyProb = 0.6f;
|
|
|
|
|
|
|
|
|
|
[Tooltip("狂暴持续时间下限(秒)")]
|
|
|
|
|
public float frenzyMinTime = 3f;
|
|
|
|
|
|
|
|
|
|
[Tooltip("狂暴持续时间上限(秒)")]
|
|
|
|
|
public float frenzyMaxTime = 8f;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>机器人退出条件配置</summary>
|
|
|
|
|
[Serializable]
|
|
|
|
|
public class BotExitConfig
|
|
|
|
|
{
|
|
|
|
|
[Tooltip("金币超过此值时退出(盈利离场), 0=不检测")]
|
|
|
|
|
public long exitWhenGoldAbove = 0;
|
|
|
|
|
|
|
|
|
|
[Tooltip("金币低于此值时退出(输完离场)")]
|
|
|
|
|
public long exitWhenGoldBelow = 100;
|
|
|
|
|
|
|
|
|
|
[Tooltip("退出检查间隔(秒)")]
|
|
|
|
|
public float checkInterval = 5f;
|
|
|
|
|
|
|
|
|
|
[Tooltip("退出时是否发送离房网络消息")]
|
|
|
|
|
public bool sendLeaveRoom = true;
|
|
|
|
|
|
|
|
|
|
[Tooltip("退出后座位是否显示等待状态(等待下一个机器人)")]
|
|
|
|
|
public bool showWaitingAfterExit = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>机器人当前行为模式</summary>
|
|
|
|
|
public enum BotBehaviorMode
|
|
|
|
|
{
|
|
|
|
|
Idle, // 待机(未开始)
|
|
|
|
|
ScatterRandom, // 散射乱射(无Boss): 随机定点三发或单射
|
|
|
|
|
LockBoss, // 锁定Boss
|
|
|
|
|
ScatterMode, // 散射模式(Boss数量>3)
|
|
|
|
|
RandomFrenzy, // 随机狂暴(Boss数量<=3)
|
2026-07-22 17:46:15 +08:00
|
|
|
RandomSweep, // 随机扫射:瞬间指向随机位置/左右摆动,10-15秒切换一次
|
2026-07-11 17:07:32 +08:00
|
|
|
Exited // 已退出
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>每个 bot 座位的运行时状态(进场金币/倍数/模式/退出)</summary>
|
|
|
|
|
public class BotRuntimeState
|
|
|
|
|
{
|
|
|
|
|
// ===== 进场 =====
|
|
|
|
|
[Tooltip("进场时的金币(基准)")]
|
|
|
|
|
public long entryGold;
|
|
|
|
|
|
|
|
|
|
[Tooltip("进场时间")]
|
|
|
|
|
public float entryTime;
|
|
|
|
|
|
|
|
|
|
// ===== 倍数 =====
|
|
|
|
|
[Tooltip("当前炮台档位索引")]
|
|
|
|
|
public int currentLevelIndex;
|
|
|
|
|
|
|
|
|
|
[Tooltip("下次倍数检查时间")]
|
|
|
|
|
public float nextMultiplierCheckTime;
|
|
|
|
|
|
|
|
|
|
// ===== 行为模式 =====
|
|
|
|
|
[Tooltip("当前行为模式")]
|
|
|
|
|
public BotBehaviorMode currentMode = BotBehaviorMode.Idle;
|
|
|
|
|
|
|
|
|
|
[Tooltip("上次Boss检测时间")]
|
|
|
|
|
public float lastBossCheckTime;
|
|
|
|
|
|
|
|
|
|
// ===== 狂暴(Boss<=3时随机) =====
|
|
|
|
|
[Tooltip("狂暴是否激活")]
|
|
|
|
|
public bool frenzyActive;
|
|
|
|
|
|
|
|
|
|
[Tooltip("狂暴结束时间")]
|
|
|
|
|
public float frenzyEndTime;
|
|
|
|
|
|
2026-07-22 17:46:15 +08:00
|
|
|
// ===== 随机扫射模式(10-15秒切换一次) =====
|
|
|
|
|
[Tooltip("下次随机扫射模式切换时间")]
|
|
|
|
|
public float nextSweepSwitchTime;
|
|
|
|
|
|
|
|
|
|
[Tooltip("随机扫射子模式: true=锁定一条目标鱼跟随, false=瞬间随机点")]
|
|
|
|
|
public bool sweepIsLockFollow;
|
|
|
|
|
|
|
|
|
|
[Tooltip("扫射摆动当前角度(摆动扫射子模式用,当前禁用)")]
|
|
|
|
|
public float sweepAngle;
|
|
|
|
|
|
|
|
|
|
[Tooltip("扫射摆动方向(1/-1,摆动扫射子模式用,当前禁用)")]
|
|
|
|
|
public int sweepDir = 1;
|
|
|
|
|
|
2026-07-11 17:07:32 +08:00
|
|
|
// ===== 退出 =====
|
|
|
|
|
[Tooltip("下次退出检查时间")]
|
|
|
|
|
public float nextExitCheckTime;
|
|
|
|
|
|
|
|
|
|
[Tooltip("是否已退出")]
|
|
|
|
|
public bool hasExited;
|
|
|
|
|
|
|
|
|
|
/// <summary>当前金币相对进场金币的倍数</summary>
|
|
|
|
|
public float GetGoldRatio(long currentGold)
|
|
|
|
|
{
|
|
|
|
|
return entryGold > 0 ? (float)currentGold / entryGold : 0f;
|
|
|
|
|
}
|
2026-07-05 16:07:22 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 技能概率配置 — 每种技能独立随机,可以同时开多种
|
|
|
|
|
/// </summary>
|
2026-07-14 02:48:54 +08:00
|
|
|
[Serializable]
|
2026-07-05 16:07:22 +08:00
|
|
|
public class BotSkillConfig
|
|
|
|
|
{
|
|
|
|
|
[Header("刷新")]
|
|
|
|
|
[Tooltip("每隔多少秒重新掷骰子决定技能组合")]
|
2026-07-06 22:18:28 +08:00
|
|
|
public float skillRefreshInterval = 10f;
|
2026-07-05 16:07:22 +08:00
|
|
|
|
|
|
|
|
[Space]
|
|
|
|
|
[Header("锁定 - 自动瞄准最近鱼")]
|
2026-07-08 20:49:22 +08:00
|
|
|
[Range(0f, 1f)] public float lockProb = 0f;
|
2026-07-05 16:07:22 +08:00
|
|
|
public float lockMinTime = 5f;
|
|
|
|
|
public float lockMaxTime = 20f;
|
|
|
|
|
|
|
|
|
|
[Space]
|
|
|
|
|
[Header("狂暴 - 开火速度翻倍")]
|
2026-07-06 22:18:28 +08:00
|
|
|
[Range(0f, 1f)] public float frenzyProb = 0.3f;
|
2026-07-05 16:07:22 +08:00
|
|
|
public float frenzyMinTime = 3f;
|
|
|
|
|
public float frenzyMaxTime = 8f;
|
|
|
|
|
|
|
|
|
|
[Space]
|
|
|
|
|
[Header("三发散弹 - 一次3发")]
|
2026-07-06 22:18:28 +08:00
|
|
|
[Range(0f, 1f)] public float tripleProb = 0.5f;
|
2026-07-05 16:07:22 +08:00
|
|
|
public float tripleMinTime = 4f;
|
|
|
|
|
public float tripleMaxTime = 12f;
|
|
|
|
|
|
|
|
|
|
[Space]
|
|
|
|
|
[Header("双倍炮 - 消耗翻倍")]
|
2026-07-05 18:52:09 +08:00
|
|
|
[Range(0f, 1f)] public float doubleProb = 0f;
|
2026-07-05 16:07:22 +08:00
|
|
|
public float doubleMinTime = 3f;
|
|
|
|
|
public float doubleMaxTime = 6f;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 行为参数 — 每个 aiState 一组
|
|
|
|
|
/// </summary>
|
2026-07-14 02:48:54 +08:00
|
|
|
[Serializable]
|
2026-07-05 16:07:22 +08:00
|
|
|
public class BotBehaviorConfig
|
|
|
|
|
{
|
|
|
|
|
[Header("开火")]
|
|
|
|
|
[Tooltip("开火间隔下限(秒)")]
|
|
|
|
|
public float fireIntervalMin = 0.3f;
|
|
|
|
|
[Tooltip("开火间隔上限(秒)")]
|
|
|
|
|
public float fireIntervalMax = 1.2f;
|
|
|
|
|
[Tooltip("开火概率(0~1): 每个 interval 触发开火的概率,0.9=经常开火偶尔停顿")]
|
|
|
|
|
[Range(0f, 1f)] public float fireProb = 0.9f;
|
|
|
|
|
|
|
|
|
|
[Header("旋转")]
|
|
|
|
|
[Tooltip("炮台旋转速度(度/秒)")]
|
2026-07-05 17:39:30 +08:00
|
|
|
public float rotateSpeed = 80f;
|
2026-07-05 16:07:22 +08:00
|
|
|
|
|
|
|
|
[Header("目标")]
|
|
|
|
|
[Tooltip("锁定保持时间下限(秒)")]
|
|
|
|
|
public float targetHoldTimeMin = 2f;
|
|
|
|
|
[Tooltip("锁定保持时间上限(秒)")]
|
|
|
|
|
public float targetHoldTimeMax = 5f;
|
|
|
|
|
[Tooltip("超时后切换目标的概率(0~1)")]
|
|
|
|
|
[Range(0f, 1f)] public float targetSwitchChance = 0.7f;
|
|
|
|
|
[Tooltip("优先高分鱼: 0=纯距离, 1=纯分数")]
|
|
|
|
|
[Range(0f, 1f)] public float targetPreferHighScore;
|
|
|
|
|
[Tooltip("允许打Boss")]
|
|
|
|
|
public bool canTargetBoss = true;
|
|
|
|
|
[Tooltip("允许打特殊鱼")]
|
|
|
|
|
public bool canTargetSpecial = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 每个 bot 座位的技能运行时状态
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class BotSkillRuntime
|
|
|
|
|
{
|
|
|
|
|
public bool lockActive;
|
|
|
|
|
public float lockEndTime;
|
|
|
|
|
|
|
|
|
|
public bool frenzyActive;
|
|
|
|
|
public float frenzyEndTime;
|
|
|
|
|
|
|
|
|
|
public bool tripleActive;
|
|
|
|
|
public float tripleEndTime;
|
|
|
|
|
|
|
|
|
|
public bool doubleActive;
|
|
|
|
|
public float doubleEndTime;
|
|
|
|
|
|
|
|
|
|
public float nextRefreshTime;
|
|
|
|
|
|
|
|
|
|
public bool HasAnySkill => lockActive || frenzyActive || tripleActive || doubleActive;
|
|
|
|
|
}
|