UnityML-Agents合作学习与相机传感器应用指南
立即解锁
发布时间: 2025-09-05 02:06:12 阅读量: 476 订阅数: 29 AIGC 

### Unity ML-Agents 合作学习与相机传感器应用指南
#### 合作学习环境搭建
在构建合作学习环境时,我们需要完成一系列的代码编写和配置工作。首先是环境管理器脚本部分,它的主要功能是重置定时器、旋转整个区域、为代理和方块分配随机位置和旋转,并将方块设置为活动状态。以下是相关代码:
```csharp
item.BlockTransform.transform.SetPositionAndRotation(pos,rot);
item.RigidBody.velocity = Vector3.zero;
item.RigidBody.angularVelocity = Vector3.zero;
item.BlockTransform.gameObject.SetActive(true);
}
blocksLeft = ListOfBlocks.Count;
}
```
该函数的具体操作流程如下:
1. 将重置定时器归零。
2. 旋转整个区域,使目标位置不固定在同一侧。
3. 遍历代理列表,为每个代理分配随机位置和旋转,并将其速度和角速度归零。
4. 遍历方块列表,为每个方块分配随机位置和旋转,将其速度和角速度归零,并将其设置为活动状态。
接下来是方块的编码工作,具体步骤如下:
1. 在项目面板中创建一个新的 C# 脚本资产,命名为 “GoalScore” 或类似名称。
2. 在代码编辑器中打开脚本,删除模板代码。
3. 添加必要的导入:
```csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
```
4. 实现一个名为 GoalScore 的类,继承自 Unity 的默认 MonoBehaviour:
```csharp
public class GoalScore : MonoBehaviour
{
}
```
5. 在类中添加成员变量,用于存储要检测的特定 Unity 标签、推动方块进入目标的价值以及方块的碰撞器:
```csharp
public string tagToDetect = "goal"; //collider tag to detect
public float GoalValue = 1;
private Collider blockCollider;
```
6. 在 GoalScore 类中实现 TriggerEvent 类:
```csharp
[System.Serializable]
public class TriggerEvent : UnityEvent<Collider, float>
{
}
```
7. 在 TriggerEvent 类之后,添加以下触发回调:
```csharp
[Header("Trigger Callbacks")]
public TriggerEvent onTriggerEnterEvent = new TriggerEvent();
public TriggerEvent onTriggerStayEvent = new TriggerEvent();
public TriggerEvent onTriggerExitEvent = new TriggerEvent();
```
8. 创建相应的触发函数:
```csharp
private void OnTriggerEnter(Collider col)
{
if (col.CompareTag(tagToDetect))
{
onTriggerEnterEvent.Invoke(blockCollider, GoalValue);
}
}
private void OnTriggerStay(Collider col)
{
if (col.CompareTag(tagToDetect))
{
onTriggerStayEvent.Invoke(blockCollider, GoalValue);
}
}
private void OnTriggerExit(Collider col)
{
if (col.CompareTag(tagToDetect))
{
onTriggerExitEvent.Invoke(blockCollider, GoalValue);
}
}
```
完成代码编写后,我们需要将三个脚本连接起来并进行配置。具体操作如下:
1. 将代理脚本从项目面板拖到层次结构中的每个代理上(共三个代理)。
2. 将环境脚本从项目面板拖到层次结构中的环境(父对象)上。
3. 将 GoalScore 脚本从项目面板拖到层次结构中的每个方块上(共六个方块)。
接下来是对代理、方块和环境父对象的配置:
- **代理配置**:
1. 选择代理,使用检查器添加 Behavior Parameters 组件,并进行相应配置。
2. 添加 Decision Requester 组件,保持默认设置。
3. 添加 Rigidbody Sensor 组件,将根体设置为代理的 Rigidbody 组件,虚拟根设置为代理本身。
4. 在层次结构中为代理添加一个空的子对象,命名为 “Grid Sensor” 或类似名称。
5. 选择该子对象,使用检查器添加 Grid Sensor 组件并进行配置。
- **方块配置**:
1. 选择方块,使用检查器将 Goal Score 组件设置为检测标签为 “goal” 的对象。
2. 根据方块大小设置适当的目标值:小方块为 1,中方块为 2,大方块为 3。
3. 点击 Trigger Callbacks 部分下方的 + 按钮,将下拉菜单设置为 Runtime Only。
4. 将环境对象从层次结构拖到 Runtime Only 下方的字段中,然后将右侧的下拉菜单设置为指向之前创建的环境脚本中的 Scored() 方法。
- **环境父对象配置**:
1. 选择环境父对象,在检查器中设置 Max Environment Steps 为 5000。
2. 将地板、环境父对象和目标拖到相应的字段
0
0
复制全文
相关推荐










