Files
5.24BuYu/Assets/MyGame/Scripts/Net/WebResponses/BotConfig.cs
T
2026-07-22 17:46:15 +08:00

279 lines
8.4 KiB
C#

using System;
using UnityEngine;
/// <summary>
/// 机器人AI配置 — 本地测试用 Inspector 调节,后续从后端 GameConfig / RoomChangeResponse 下发
/// </summary>
[Serializable]
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("技能配置")]
public BotSkillConfig skills = new BotSkillConfig();
[Header("active 状态参数")]
public BotBehaviorConfig activeBehavior = new BotBehaviorConfig();
[Header("idle 状态参数")]
public BotBehaviorConfig idleBehavior = new BotBehaviorConfig();
[Header("aggressive 状态参数")]
public BotBehaviorConfig aggressiveBehavior = new BotBehaviorConfig();
[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)
RandomSweep, // 随机扫射:瞬间指向随机位置/左右摆动,10-15秒切换一次
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;
// ===== 随机扫射模式(10-15秒切换一次) =====
[Tooltip("下次随机扫射模式切换时间")]
public float nextSweepSwitchTime;
[Tooltip("随机扫射子模式: true=锁定一条目标鱼跟随, false=瞬间随机点")]
public bool sweepIsLockFollow;
[Tooltip("扫射摆动当前角度(摆动扫射子模式用,当前禁用)")]
public float sweepAngle;
[Tooltip("扫射摆动方向(1/-1,摆动扫射子模式用,当前禁用)")]
public int sweepDir = 1;
// ===== 退出 =====
[Tooltip("下次退出检查时间")]
public float nextExitCheckTime;
[Tooltip("是否已退出")]
public bool hasExited;
/// <summary>当前金币相对进场金币的倍数</summary>
public float GetGoldRatio(long currentGold)
{
return entryGold > 0 ? (float)currentGold / entryGold : 0f;
}
}
/// <summary>
/// 技能概率配置 — 每种技能独立随机,可以同时开多种
/// </summary>
[Serializable]
public class BotSkillConfig
{
[Header("刷新")]
[Tooltip("每隔多少秒重新掷骰子决定技能组合")]
public float skillRefreshInterval = 10f;
[Space]
[Header("锁定 - 自动瞄准最近鱼")]
[Range(0f, 1f)] public float lockProb = 0f;
public float lockMinTime = 5f;
public float lockMaxTime = 20f;
[Space]
[Header("狂暴 - 开火速度翻倍")]
[Range(0f, 1f)] public float frenzyProb = 0.3f;
public float frenzyMinTime = 3f;
public float frenzyMaxTime = 8f;
[Space]
[Header("三发散弹 - 一次3发")]
[Range(0f, 1f)] public float tripleProb = 0.5f;
public float tripleMinTime = 4f;
public float tripleMaxTime = 12f;
[Space]
[Header("双倍炮 - 消耗翻倍")]
[Range(0f, 1f)] public float doubleProb = 0f;
public float doubleMinTime = 3f;
public float doubleMaxTime = 6f;
}
/// <summary>
/// 行为参数 — 每个 aiState 一组
/// </summary>
[Serializable]
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("炮台旋转速度(度/秒)")]
public float rotateSpeed = 80f;
[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;
}