目录
1.3.1 public override void Initialize()
1.3.2 SoccerEnvController envController = GetComponentInParent()
1.3.4 m_BehaviorParameters = gameObject.GetComponent()
1.3.5 m_BehaviorParameters.TeamId == (int)Team.Blue
1.3.6 m_SoccerSettings = FindObjectOfType()
1.3.7 m_ResetParams = Academy.Instance.EnvironmentParameters
1.4.1 public void MoveAgent(ActionSegment act)
1.4.2 var forwardAxis = act[0];
1.4.6 transform.Rotate(rotateDir, Time.deltaTime * 100f);
1.5.1 public override void OnActionReceived(ActionBuffers actionBuffers)
1.5.2 AddReward(m_Existential)
1.5.3 MoveAgent(actionBuffers.DiscreteActions)
1.6.1 public override void Heuristic(in ActionBuffers actionsOut)
1.6.2 var discreteActionsOut = actionsOut.DiscreteActions
1.6.4 discreteActionsOut[0] = 1
1.7.2 var force = k_Power * m_KickPower
1.7.3 position == Position.Goalie
1.7.4 c.gameObject.CompareTag("ball")
1.7.5 var dir = c.contacts[0].point - transform.position
1.7.7 c.gameObject.GetComponent().AddForce(dir * force)
1.8.2 m_BallTouch = m_ResetParams.GetWithDefault("ball_touch", 0)
1. AgentSoccer.cs
1.1 导入命名空间
using UnityEngine;
using Unity.MLAgents;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Policies;
public enum Team
{
Blue = 0,
Purple = 1
}
这段代码是用于导入Unity ML-Agents的相关类库,包括ML-Agents的核心库以及行为决策相关的库。其中包括:
- UnityEngine:Unity引擎的核心类库。
- Unity.MLAgents:Unity ML-Agents的核心类库。
- Unity.MLAgents.Actuators:定义了Agent的动作类型,例如连续、离散等。
- Unity.MLAgents.Policies:定义了训练Agent的决策策略,例如随机策略、行为树策略等。
这段代码定义了一个枚举类型Team,枚举值为Blue和Purple,用于表示环境中的两个队伍。在Unity ML-Agents中,代理(Agent)之间通常被分成不同的队伍,例如在足球场景中,有蓝队和紫队。使用Team枚举类型来指定队伍,便于对代理进行分类和管理。
1.2 AgentSoccer类
public class AgentSoccer : Agent
{
// Note that that the detectable tags are different for the blue and purple teams. The order is
// * ball
// * own goal
// * opposing goal
// * wall
// * own teammate
// * opposing player
public enum Position
{
Striker,
Goalie,
Generic
}
[HideInInspector]
public Team team;
float m_KickPower;
// The coefficient for the reward for colliding with a ball. Set using curriculum.
float m_BallTouch;
public Position position;
const float k_Power = 2000f;
float m_Existential;
float m_LateralSpeed;
float m_ForwardSpeed;
[HideInInspector]
public Rigidbody agentRb;
SoccerSettings m_SoccerSettings;
BehaviorParameters m_BehaviorParameters;
public Vector3 initialPos;
public float rotSign;
EnvironmentParameters m_ResetParams;
......
}
这部分代码定义了一个叫做 AgentSoccer 的类,并声明了其中的一些变量和枚举类型。
team 变量是一个枚举类型 Team,枚举成员包括 Blue 和 Purple,用于表示代理所在的队伍。
m_KickPower 和 m_BallTouch 变量是 float 类型,分别用于表示代理的踢球力量和碰到球的次数(球被踢的次数)。m_BallTouch 变量的值可以通过课程设定进行修改。
position 变量是一个枚举类型 Position,枚举成员包括 Striker、Goalie 和 Generic,用于表示代理的位置。前锋(Striker)、门将(Goalie)或者普通(Generic)。
[HideInInspector]是一个用于Unity的C#脚本的属性修饰符。它的作用是隐藏Unity编辑器面板上的公共变量。在脚本中使用[HideInInspector]修饰的变量仍然可以在代码中进行访问和修改,但是在编辑器中将不会显示该变量。这通常用于保护变量不被其他脚本修改,同时又不想让该变量在编辑器中显示出来。
k_Power常量是float类型,其值为2000.0f。在代码中,常量使用const关键字来声明,一旦声明并赋值后,在程序执行期间不会改变。
m_Existential、m_LateralSpeed 和 m_ForwardSpeed 变量是 float 类型,分别用于表示代理获得的奖励、横向速度和前向速度。
agentRb 变量是一个 Rigidbody 类型,用于表示代理的物理属性。
m_SoccerSettings 变量是一个 SoccerSettings 类型,用于存储足球比赛的相关设置信息。
m_BehaviorParameters 变量是一个 BehaviorParameters 类型,用于表示代理的行为参数,例如它所使用的神经网络模型。
initialPos 变量是一个 Vector3 类型,表示代理的初始位置。
rotSign 变量是一个 float 类型,用于控制代理的旋转方向。
m_ResetParams 变量是一个 EnvironmentParameters 类型,用于存储重置环境的参数。
1.3 Initialize()
public override void Initialize()
{
// 获取环境控制器,计算当前代理在环境中的存在时间比例
SoccerEnvController envController = GetComponentInParent<SoccerEnvController>();
if (envController != null)
{
m_Existential = 1f / envController.MaxEnvironmentSteps;
}
else
{
m_Existential = 1f / MaxStep;
}
// 获取代理的BehaviorParameters组件,判断代理所在的队伍和初始位置
m_BehaviorParameters = gameObject.GetComponent<BehaviorParameters>();
if (m_BehaviorParameters.TeamId == (int)Team.Blue)
{
team = Team.Blue;
initialPos = new Vector3(transform.position.x - 5f, .5f, transform.position.z);
rotSign = 1f;
}
else
{
team = Team.Purple;
initialPos = new Vector3(transform.position.x + 5f, .5f, transform.position.z);
rotSign = -1f;
}
// 根据代理的位置属性设置代理的运动速度
if (position == Position.Goalie)
{
m_LateralSpeed = 1.0f;
m_ForwardSpeed = 1.0f;
}
else if (position == Position.Striker)
{
m_LateralSpeed = 0.3f;
m_ForwardSpeed = 1.3f;
}
else
{
m_LateralSpeed = 0.3f;
m_ForwardSpeed = 1.0f;
}
// 获取SoccerSettings对象和代理的刚体组件,并设置初始角速度和最大角速度
m_SoccerSettings = FindObjectOfType<SoccerSettings>();
agentRb = GetComponent<Rigidbody>();
agentRb.maxAngularVelocity = 500;
// 获取环境的重置参数对象
m_ResetParams = Academy.Instance.EnvironmentParameters;
}
在这段代码中,首先通过 GetComponentInParent<SoccerEnvController>() 获取当前 Agent 所在的 SoccerEnvController 组件,然后根据获取到的 SoccerEnvController 组件来设置 m_Existential 变量。如果获取不到 SoccerEnvController 组件,则直接使用 MaxStep(即训练步数)来设置 m_Existential 变量。
接下来,根据 BehaviorParameters 中设置的 TeamId 来确定 Agent 的队伍和初始位置。如果 TeamId 为 0,则为蓝队,初始位置在当前位置左边 5 个单位;如果 TeamId 为 1,则为紫队,初始位置在当前位置右边 5 个单位。同时,rotSign 变量也被设定为 1 或 -1,用于在训练中控制 Agent 的旋转方向。
然后根据 Agent 的位置属性来设定其速度属性。如果 Agent 是守门员,则设定其横向和纵向速度都为 1.0;如果是前锋,则横向速度为 0.3,纵向速度为 1.3;否则(位置为 Generic),则横向速度为 0.3,纵向速度为 1.0。
接下来,通过 FindObjectOfType<SoccerSettings>() 获取 SoccerSettings 组件,并将 agentRb 设定为当前 Agent 的 Rigidbody 组件。此外,还将 agentRb 的 maxAngularVelocity 设定为 500。
最后,使用 Academy.Instance.EnvironmentParameters 获取环境参数,并将其设定为 m_ResetParams。
1.3.1 public override void Initialize()
Initialize() 是 Agent 类中的一个虚函数,需要被重写。在该函数中,可以进行一些初始化的工作,比如初始化 Agent 的状态、设定 Agent 的动作空间和观察空间等。
1.3.2 SoccerEnvController envController = GetComponentInParent<SoccerEnvController>()
SoccerEnvController envController = GetComponentInParent<SoccerEnvController>();
这行代码的作用是获取当前Agent所在的父物体(Parent),并获取其上挂载的SoccerEnvController组件的引用,以便在后续的代码中获取该环境的最大步数。GetComponentInParent方法会在当前GameObject的父物体上查找该类型的组件。如果没有找到,则会继续在父物体上查找,直到找到该组件或者查找到达根节点为止。
1.3.3 envController != null
if (envController != null)
{
m_Existential = 1f / envController.MaxEnvironmentSteps;
}
else
{
m_Existential = 1f / MaxStep;
}
这段代码的作用是获取Agent所在的Soccer环境控制器(SoccerEnvController)的组件,判断其是否为空。如果不为空,则将m_Existential设置为1除以Soccer环境控制器的最大步数(MaxEnvironmentSteps);否则将m_Existential设置为1除以Agent的最大步数(MaxStep)。
如果envController不为空,说明Agent是被包含在SoccerEnvController中的一个子GameObject中,这时可以从父级对象中获取到环境控制器的组件。如果envController为空,说明Agent并不在SoccerEnvController中,而是单独作为一个对象存在,此时需要使用Agent自身的最大步数。
1.3.4 m_BehaviorParameters = gameObject.GetComponent<BehaviorParameters>()
m_BehaviorParameters = gameObject.GetComponent<BehaviorParameters>();
这一行代码是获取当前游戏对象(agent)上的BehaviorParameters组件,该组件包含了一些特定的行为参数和策略。这些参数和策略可以影响agent的决策和行为。在Unity ML-Agents中,BehaviorParameters组件是在训练开始时指定的。

文章详细解析了UnityML-Agents框架中的AgentSoccer类,包括初始化过程、移动代理的MoveAgent函数、启发式控制方法Heuristic,以及处理碰撞的OnCollisionEnter方法。内容涵盖了团队归属、行为参数、环境参数和奖励机制等关键概念。
最低0.47元/天 解锁文章
5644





