强化学习入门:Unity ML-Agents 训练一个“会躲子弹”的怪
2026-01-07 15:27:36
文章摘要
文章介绍了利用UnityML-Agents进行强化学习,训练“会躲子弹”的怪的方法。先配置Python和Unity环境,添加RayPerceptionSensor3D组件让怪感知子弹;设计奖励函数引导行为、界定红线;通过命令开始训练,用TensorBoard判断训练效果。训练好后导入.onnx模型,该AI具有“拟人”特点,能提供不确定性游戏体验。

前言:别再用 if-else 写 AI 了

哈喽兄弟们,在传统游戏开发里,我们要写一个“会躲子弹”的怪,通常是怎么做的?

算向量点积、预测子弹轨迹、写一堆 if (distance < 5) 的判断逻辑... 写到最后,这个怪要么笨得要死,要么因为预判太准被玩家骂“作弊”。今天我们换个赛道。我们不教 AI “怎么躲”,我们给 AI 一个惩罚,让它自己在几百万次死亡中“悟”出走位。

这就是 Unity ML-Agents(强化学习)的魅力。我们将利用 Python 和 PyTorch,训练一个神经网络大脑(Brain),让它像《黑客帝国》里的 Neo 一样,学会自动规避弹幕。


01. 健身房搭建:Python 环境配置

ML-Agents 的原理是:Unity 作为环境(健身房),Python 作为教练(训练网络),两者通过 Socket 通信。

很多兄弟卡在第一步,是因为版本不匹配。记住小招这个稳如老狗的组合(截至 2025 年):

  • Unity 版本:2022.3 LTS 或更高
  • Python 版本:3.9 或 3.10 (不要用 3.11+,有些库还没跟上)
  • ML-Agents Package:2.0+

极速配置命令

别去折腾原生 Python 环境,直接上 Anaconda 虚拟环境,隔离又干净:

# 1. 创建虚拟环境
conda create -n mlagents python=3.9
conda activate mlagents

2. 安装 PyTorch (根据你的显卡去官网找对应命令,这里是 CPU 版示例)

pip install torch torchvision

3. 安装 ML-Agents 核心库

pip install mlagents

当你在终端输入 mlagents-learn --help 看到大大的 Unity Logo 时,恭喜你,入场券拿到了。


02. 感知系统:给怪装上“激光眼”

AI 不是神,它需要眼睛。在 RL(强化学习)中,这叫 Observations(观测值)

在 Unity 场景里,我们创建一个 Agent(怪)和一个 Spawner(发射子弹的炮塔)。 为了让怪能看到子弹,我们需要添加 Ray Perception Sensor 3D 组件。

  • Rays Per Direction: 设置为 3-5 根。
  • Max Ray Degrees: 设为 90 度(前方扇形视野)。
  • Detectable Tags: 加上 Bullet(子弹)和 Wall(墙)。

这就好比给怪装了一组激光雷达,它现在能感知到:“前方 3 米处有一个 Tag 为 Bullet 的物体正在高速靠近”。


03. 灵魂注入:设计 Reward Function (奖励函数)

这是本篇最硬核的部分。奖励函数设计得好坏,决定了你的 AI 是天才还是智障。

强化学习的逻辑很简单:做对了给糖(+Reward),做错了挨打(-Reward)。

常见的错误设计:

  • 只给“存活奖励”:AI 可能会发现“只要我原地不动或者卡在墙角,活得最久”,于是它变成了一个不动如山的傻子。
  • 奖励给太大:AI 容易产生 Reward Hacking(奖励以此),为了贪分不顾任务目标。

推荐的“躲避流”奖励公式:

在 Agent 脚本的 OnActionReceived 方法中写入:

public override void OnActionReceived(ActionBuffers actions)
{
    // 1. 每一帧存活,给一点点甜头(鼓励活下去)
    AddReward(0.01f);
// 2. 如果被子弹击中(在 OnCollisionEnter 中调用)
// 惩罚要重!直接扣大分,并结束本次训练 (EndEpisode)
// AddReward(-1.0f); EndEpisode();

// 3. 掉出地图边缘
// 也要惩罚,防止它为了躲子弹跳崖
// AddReward(-0.5f); EndEpisode();

// 4. (进阶) 距离奖励
// 如果离目标点太远,给予微小惩罚,防止它一直在这个角落苟着

}

心法:这叫 Reward Shaping (奖励塑形)。通过密集的微小奖励引导行为,通过稀疏的巨大惩罚界定红线。


04. 炼丹开始:训练与 TensorBoard 可视化

一切准备就绪,开始炼丹。

  1. 在 Python 终端输入: mlagents-learn config/trainer_config.yaml --run-id=DodgeMaster01
  2. 回到 Unity,点击 Play 按钮。

接下来就是见证奇迹的时刻:

  • 前 5 分钟:怪像无头苍蝇一样乱撞,疯狂掉血。
  • 10 分钟后:怪开始偶尔能躲过一两发子弹。
  • 1 小时后:怪学会了“秦王绕柱”,甚至学会了“微操”——子弹擦着头皮飞过去它都不眨眼。

如何判断训练好了? 打开 TensorBoardtensorboard --logdir results。 看 Cumulative Reward (累计奖励) 曲线。如果曲线一路震荡上扬并最终趋于平稳,说明模型收敛了(Converged)。


05. 毕业上岗:导入 .onnx 模型

训练结束后,你会在 results 文件夹里找到一个 .onnx 文件。这就是怪的**“大脑”**。

  1. .onnx 拖入 Unity 项目。
  2. 找到怪身上的 Behavior Parameters 组件。
  3. .onnx 拖给 Model 属性。
  4. Inference Device 设为 CPUBurst(推荐 Burst,性能更好)。

现在,删掉所有的 Python 连接,点击运行。你会发现,这个怪已经不再需要任何脚本控制,它凭借着神经网络的直觉,在弹幕中翩翩起舞。


小招总结

用 ML-Agents 做的 AI,最大的特点就是“拟人”。 它会有反应延迟,会偶尔失误,也会在绝境中通过神操作反杀。这种“不确定性”,恰恰是现代游戏最稀缺的体验。


Tags: #Unity #ML-Agents #强化学习 #游戏AI #PyTorch #技术教程

声明:该内容由作者自行发布,观点内容仅供参考,不代表平台立场;如有侵权,请联系平台删除。
标签:
强化学习(RL)
PyTorch
模型训练
模型部署