news 2026/6/2 17:37:43

基于unity ml-agents 去训练一个小游戏 ---智能体吃球

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于unity ml-agents 去训练一个小游戏 ---智能体吃球

1.在unity里面创建游戏环境

创建scripts->c#脚本 编写#代码

针智能体以及操作对象:创建Materials->{materials,physice materisls} 另外add components 添加rigidbody

创建Prefabs(预制体) 可以直接鼠标拖着dongame到这个文件下 作用:Prefabs允许你创建一个包含多个组件的对象,并在多个场景中重复使用这个对象,而无需每次都重新设置这些组件

2.编写C#脚本

代码里面不能有任何报错 否则训练不能正常运行

using UnityEngine; using Unity.MLAgents; using Unity.MLAgents.Sensors; using Unity.MLAgents.Actuators; //智能体(狗)吃target(球)的实验 public class DogAgent : Agent { //目标坐标(Goal)的Transform public Transform target; //智能体(狗)的刚体 Rigidbody rBody; public float speed = 50; public override void Initialize() { base.Initialize(); rBody = GetComponent<Rigidbody>(); // 确保刚体不会进入睡眠状态,以响应物理力 rBody.WakeUp(); } //进入新的一轮调用的函数 public override void OnEpisodeBegin() { //UnityEngine.Debug.Log("DogAgent Start"); //base.OnEpisodeBegin(); //只有当智能体(狗)掉落的时候才去重置智能体的位置(目的是让智能体一直可以吃到小球) if(this.transform.position.y < 0) { //重新开始,设置智能体(狗)的初始位置 this.transform.position = new Vector3(3.5f, 0.5f, 0); //智能体(狗)的速度与旋转 this.rBody.velocity = Vector3.zero; this.rBody.angularVelocity = Vector3.zero; } //随机Target的位置 target.position = new Vector3(UnityEngine.Random.value * 8 - 4, 0.5f, UnityEngine.Random.value * 8 - 4); } //搜集观察的结果 public override void CollectObservations(VectorSensor sensor) { // 收集目标位置 sensor.AddObservation(target.position); // 收集智能体当前位置 sensor.AddObservation(this.transform.position); // 收集智能体在x轴和z轴方向上的速度 sensor.AddObservation(rBody.velocity.x); sensor.AddObservation(rBody.velocity.z); } // 应用力到球上的函数 //接收动作 是否给予奖励 public override void OnActionReceived(ActionBuffers actions) { //base.OnActionReceived(actions); //拿到水平和垂直的输入 float horizontal = actions.ContinuousActions[0]; float vertical = actions.ContinuousActions[1]; //Debug.Log("Horizontal: " + horizontal); //根据输入的值来移动 Vector3 movement = new(horizontal, 0, vertical); // // 根据动作计算要施加的力 rBody.AddForce(movement * speed); //智能体出界了 使用y坐标来判断 if (this.transform.position.y < 0) { SetReward(-1.0f); //结束这一轮的测试 EndEpisode(); } //狗子吃到了东西 _ = Vector3.Distance(this.transform.position, target.position); if (Vector3.Distance(this.transform.position, target.position) < 1.42f) { SetReward(1.0f); EndEpisode(); } } //手动操作智能体 public override void Heuristic(in ActionBuffers actionsOut) { //base.Heuristic(actionsOut); //拿到水平和垂直的输入 var continuousActionsOut = actionsOut.ContinuousActions; continuousActionsOut[0] = Input.GetAxis("Horizontal"); continuousActionsOut[1] = Input.GetAxis("Vertical"); // 打印动作输出,以便于调试 //Debug.Log("Heuristic - Horizontal: " + continuousActionsOut[0]); //Debug.Log("Heuristic - Vertical: " + continuousActionsOut[1]); } }

3.在ml-agents环境下训练

4.注意事项

参考文件:CSDN编程社区

其中在Behavior Parameters中,Behavior Name中的名字必须要和第二行的那个名字一致,如果想设置不同的智能体使用不同的配置同时进行训练,只需要在下面加上不同名字的配置,然后再相应的智能体的Behavior Name中使用那个名字即可。

训练时文件路径要写对:

mlagents-learn config/ppo/3DBall.yaml --run-id=3DBallTest --force

加force是强制执行 防止当前文件夹有同名的 覆盖之前的数据

登录后复制

如果想继续上次的训练:

mlagents-learn config/ppo/3DBall.yaml --run-id=3DBallTest --rusume

登录后复制TensorBoard的使用

在上面的控制台环境下输入下列命令(训练过程中可以另外开一个Anaconda Prompt):

tensorboard --logdir .\results\ --port 6006

登录后复制

在浏览器中的网址栏输入localhost:6006,就可以看到tensorboard的界面了。这样就能把数据进行可视化。奖励和Loss的变化一清二楚。

加速训练

在编辑器中的训练是需要消耗非常多性能的,因此我们需要先把它打包成exe文件,具体操作是File–>Build Settings–>Build。

打包好后,把配置文件yaml文件也放入文件夹中。cd到该文件夹中,输入以下命令:

mlagents-learn 配置文件名.yaml --run-id=自己随意起名 --env=执行文件名.exe --num-envs=9 --force

参考文档的链接:

https://www.bilibili.com/video/BV1Yu4y1D7n7/

https://yebd1h.smartapps.cn/pages/blog/index?blogId=121115480&_swebfr=1&_swebFromHost=bdlite

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/2 17:33:01

【RT-DETR实战】114、MNN框架部署与优化:从踩坑到丝滑推理的实战笔记

一、深夜的推理异常 上周三凌晨两点,我在嵌入式设备上跑RT-DETR的MNN模型时遇到了诡异现象: 同一张测试图片,在PC端推理结果正常,到了ARM板子上却输出一堆乱框。量化参数没对齐?输入尺寸没匹配?还是内存越界了?这种跨平台部署的“玄学问题”正是MNN部署中最磨人的部分…

作者头像 李华
网站建设 2026/6/2 17:30:36

DFlash背后的数学原理:块扩散模型在语言生成中的应用

DFlash背后的数学原理&#xff1a;块扩散模型在语言生成中的应用 【免费下载链接】Qwen3.6-35B-A3B-DFlash 项目地址: https://ai.gitcode.com/hf_mirrors/z-lab/Qwen3.6-35B-A3B-DFlash DFlash是一种基于块扩散模型的高效语言生成加速技术&#xff0c;作为Qwen3.6-35B…

作者头像 李华
网站建设 2026/6/2 17:23:21

MobaXterm中文版:5个专业级远程终端管理技巧提升工作效率

MobaXterm中文版&#xff1a;5个专业级远程终端管理技巧提升工作效率 【免费下载链接】Mobaxterm-Chinese Mobaxterm simplified Chinese version. Mobaxterm 的简体中文版. 项目地址: https://gitcode.com/gh_mirrors/mo/Mobaxterm-Chinese MobaXterm中文版是一款功能强…

作者头像 李华