目录
1.目的
1.1 记录一下
2.参考
1.
3.注意
版本
- windows 10 家庭版
- Anaconda Navigator 1.9.7
- Unity 2019.3.15f1
4. 课时 7 : 104 - 创建场景
接着
快速入门Unity机器学习:一:_Smart_zy的博客-CSDN博客
俩个球给不同的材质球
AI球给RigidBody组件,使其可以碰撞
4.1 创建代码: MyRollerAgent
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;//【104创建场景:添加】
using Unity.MLAgents.Sensors;//【104创建场景:添加】
public class MyRollerAgent : Agent
{
// Start is called before the first frame update
void Start()
{
}
}
5. 课时 8 : 105 - Agent里面的四个函数
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;//【104创建场景:添加】
using Unity.MLAgents.Sensors;//【104创建场景:添加】
/// <summary>
/// 【function:球代理】【Time:2022 05 14】【104创建场景:添加】
/// </summary>
public class MyRollerAgent : Agent
{
/// <summary>目标的坐标【105Agent里面的四个函数:添加】</summary>
public Transform target;
/// <summary>rBody【105Agent里面的四个函数:添加】</summary>
private Rigidbody rBody;
void Start()
{
rBody = GetComponent<Rigidbody>();//【105Agent里面的四个函数:添加】
}
/// <summary>
/// 【function:进入新的一轮时候调用的函数】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
public override void OnEpisodeBegin()
{
base.OnEpisodeBegin();
}
/// <summary>
/// 【function:收集观察的结果】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
/// <param name="sensor"></param>
public override void CollectObservations(VectorSensor sensor)
{
base.CollectObservations(sensor);
}
/// <summary>
/// 【function:接受动作,是否给予奖励】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
/// <param name="vectorAction"></param>
public override void OnActionReceived(float[] vectorAction)
{
base.OnActionReceived(vectorAction);
}
/// <summary>
/// 【function:手动操作智能体】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
/// <param name="actionsOut"></param>
public override void Heuristic(float[] actionsOut)
{
base.Heuristic(actionsOut);
}
}
6. 课时 9 : 106 - 手动操作智能体
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;//【104创建场景:添加】
using Unity.MLAgents.Sensors;//【104创建场景:添加】
/// <summary>
/// 【function:球代理】【Time:2022 05 14】【104创建场景:添加】
/// </summary>
public class MyRollerAgent : Agent
{
/// <summary>目标的坐标【105Agent里面的四个函数:添加】</summary>
public Transform target;
/// <summary>rBody【105Agent里面的四个函数:添加】</summary>
private Rigidbody rBody;
/// <summary>rBody【106手动操作智能体:添加】</summary>
private float speed = 10;
void Start()
{
rBody = GetComponent<Rigidbody>();//【105Agent里面的四个函数:添加】
}
/// <summary>
/// 【function:进入新的一轮时候调用的函数】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
public override void OnEpisodeBegin()
{
base.OnEpisodeBegin();
}
/// <summary>
/// 【function:收集观察的结果】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
/// <param name="sensor"></param>
public override void CollectObservations(VectorSensor sensor)
{
base.CollectObservations(sensor);
}
/// <summary>
/// 【function:接受动作,是否给予奖励】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
/// <param name="vectorAction"></param>
public override void OnActionReceived(float[] vectorAction)
{
print("Horizontal:"+vectorAction[0]);//【106手动操作智能体:添加】
print("Vertical:"+vectorAction[1]);//【106手动操作智能体:添加】
Vector3 control = Vector3.zero;//【106手动操作智能体:添加】
control.x = vectorAction[0];//【106手动操作智能体:添加】
control.z = vectorAction[1];//【106手动操作智能体:添加】
rBody.AddForce(control * speed);//【106手动操作智能体:添加】
}
/// <summary>
/// 【function:手动操作智能体】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
/// <param name="actionsOut"></param>
public override void Heuristic(float[] actionsOut)
{
//拿到水平和垂直方向
actionsOut[0] = Input.GetAxis("Horizontal");//【106手动操作智能体:添加】
actionsOut[1] = Input.GetAxis("Vertical");//【106手动操作智能体:添加】
}
}
7. 课时 10 : 107 - 重置游戏的函数
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;//【104创建场景:添加】
using Unity.MLAgents.Sensors;//【104创建场景:添加】
/// <summary>
/// 【function:球代理】【Time:2022 05 14】【104创建场景:添加】
/// </summary>
public class MyRollerAgent : Agent
{
/// <summary>目标的坐标【105Agent里面的四个函数:添加】</summary>
public Transform target;
/// <summary>rBody【105Agent里面的四个函数:添加】</summary>
private Rigidbody rBody;
/// <summary>rBody【106手动操作智能体:添加】</summary>
private float speed = 10;
void Start()
{
rBody = GetComponent<Rigidbody>();//【105Agent里面的四个函数:添加】
}
/// <summary>
/// 【function:进入新的一轮时候调用的函数】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
public override void OnEpisodeBegin()
{
print("OnEpisodeBegin");
//重新开始,设置小球的初始位置
this.transform.position = new Vector3(0, 0.5f, 0);//【107重置游戏的函数:添加】
this.rBody.velocity = Vector3.zero;//速度【107重置游戏的函数:添加】
this.rBody.angularVelocity = Vector3.zero;//旋转【107重置游戏的函数:添加】
}
/// <summary>
/// 【function:收集观察的结果】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
/// <param name="sensor"></param>
public override void CollectObservations(VectorSensor sensor)
{
base.CollectObservations(sensor);
}
/// <summary>
/// 【function:接受动作,是否给予奖励】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
/// <param name="vectorAction"></param>
public override void OnActionReceived(float[] vectorAction)
{
print("Horizontal:"+vectorAction[0]);//【106手动操作智能体:添加】
print("Vertical:"+vectorAction[1]);//【106手动操作智能体:添加】
Vector3 control = Vector3.zero;//【106手动操作智能体:添加】
control.x = vectorAction[0];//【106手动操作智能体:添加】
control.z = vectorAction[1];//【106手动操作智能体:添加】
rBody.AddForce(control * speed);//【106手动操作智能体:添加】
}
/// <summary>
/// 【function:手动操作智能体】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
/// <param name="actionsOut"></param>
public override void Heuristic(float[] actionsOut)
{
//拿到水平和垂直方向
actionsOut[0] = Input.GetAxis("Horizontal");//【106手动操作智能体:添加】
actionsOut[1] = Input.GetAxis("Vertical");//【106手动操作智能体:添加】
}
}
Max Step:1秒钟,重新开始测试
8. 课时 11 : 108 - 设置智能体奖励
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.MLAgents;//【104创建场景:添加】
using Unity.MLAgents.Sensors;//【104创建场景:添加】
/// <summary>
/// 【function:球代理】【Time:2022 05 14】【104创建场景:添加】
/// </summary>
public class MyRollerAgent : Agent
{
/// <summary>目标的坐标【105Agent里面的四个函数:添加】</summary>
public Transform target;
/// <summary>rBody【105Agent里面的四个函数:添加】</summary>
private Rigidbody rBody;
/// <summary>rBody【106手动操作智能体:添加】</summary>
private float speed = 10;
void Start()
{
rBody = GetComponent<Rigidbody>();//【105Agent里面的四个函数:添加】
}
/// <summary>
/// 【function:进入新的一轮时候调用的函数】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
public override void OnEpisodeBegin()
{
print("OnEpisodeBegin");
//重新开始,设置小球的初始位置
this.transform.position = new Vector3(0, 0.5f, 0);//【107重置游戏的函数:添加】
this.rBody.velocity = Vector3.zero;//速度【107重置游戏的函数:添加】
this.rBody.angularVelocity = Vector3.zero;//旋转【107重置游戏的函数:添加】
}
/// <summary>
/// 【function:收集观察的结果】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
/// <param name="sensor"></param>
public override void CollectObservations(VectorSensor sensor)
{
base.CollectObservations(sensor);
}
/// <summary>
/// 【function:接受动作,是否给予奖励】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
/// <param name="vectorAction"></param>
public override void OnActionReceived(float[] vectorAction)
{
print("Horizontal:"+vectorAction[0]);//【106手动操作智能体:添加】
print("Vertical:"+vectorAction[1]);//【106手动操作智能体:添加】
Vector3 control = Vector3.zero;//【106手动操作智能体:添加】
control.x = vectorAction[0];//【106手动操作智能体:添加】
control.z = vectorAction[1];//【106手动操作智能体:添加】
rBody.AddForce(control * speed);//移动小球【106手动操作智能体:添加】
//狗子出界了,使用y去判断
if (this.transform.position.y<0)
{
EndEpisode();//结束这一轮的测试【108设置智能体奖励:添加】
}
//狗子吃到东西了
float distance = Vector3.Distance(this.transform.position, target.position);//给定奖励【108设置智能体奖励:添加】
if (distance<1.41f)
{
SetReward(1);//给定奖励【108设置智能体奖励:添加】
EndEpisode();//给定奖励【108设置智能体奖励:添加】
}
}
/// <summary>
/// 【function:手动操作智能体】【Time:2022 05 14】【105Agent里面的四个函数:添加】
/// </summary>
/// <param name="actionsOut"></param>
public override void Heuristic(float[] actionsOut)
{
//拿到水平和垂直方向
actionsOut[0] = Input.GetAxis("Horizontal");//【106手动操作智能体:添加】
actionsOut[1] = Input.GetAxis("Vertical");//【106手动操作智能体:添加】
}
}