Unity 机器学习代理工具包 (ML-Agents) 是一个开源项目,它使游戏和模拟能够作为训练智能代理的环境。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 
 

143 行
5.2 KiB

using System;
using System.Collections;
using System.Linq;
using NUnit.Framework;
using UnityEngine;
using UnityEngine.TestTools;
using Unity.MLAgents.Sensors;
using Unity.MLAgents.Extensions.Sensors;
using Object = UnityEngine.Object;
namespace Unity.MLAgents.Extensions.Tests.Sensors
{
public class CountingGridSensorTests
{
GameObject testGo;
GameObject boxGo;
TestCountingGridSensorComponent gridSensorComponent;
// Use built-in tags
const string k_Tag1 = "Player";
const string k_Tag2 = "Respawn";
[UnitySetUp]
public IEnumerator SetupScene()
{
testGo = new GameObject("test");
testGo.transform.position = Vector3.zero;
gridSensorComponent = testGo.AddComponent<TestCountingGridSensorComponent>();
boxGo = new GameObject("block");
boxGo.tag = k_Tag1;
boxGo.transform.position = new Vector3(3f, 0f, 3f);
boxGo.AddComponent<BoxCollider>();
yield return null;
}
[TearDown]
public void ClearScene()
{
Object.DestroyImmediate(boxGo);
Object.DestroyImmediate(testGo);
}
public class TestCountingGridSensorComponent : GridSensorComponent
{
public void SetParameters(string[] detectableTags)
{
DetectableTags = detectableTags;
CellScale = new Vector3(1, 0.01f, 1);
GridSize = new Vector3Int(10, 1, 10);
ColliderMask = LayerMask.GetMask("Default");
RotateWithAgent = false;
CompressionType = SensorCompressionType.None;
}
protected override GridSensorBase[] GetGridSensors()
{
return new GridSensorBase[] {
new CountingGridSensor(
"TestSensor",
CellScale,
GridSize,
DetectableTags,
CompressionType) };
}
}
// Copied from GridSensorTests in main package
public static float[][] DuplicateArray(float[] array, int numCopies)
{
float[][] duplicated = new float[numCopies][];
for (int i = 0; i < numCopies; i++)
{
duplicated[i] = array;
}
return duplicated;
}
// Copied from GridSensorTests in main package
public static void AssertSubarraysAtIndex(float[] total, int[] indicies, float[][] expectedArrays, float[] expectedDefaultArray)
{
int totalIndex = 0;
int subIndex = 0;
int subarrayIndex = 0;
int lenOfData = expectedDefaultArray.Length;
int numArrays = total.Length / lenOfData;
for (int i = 0; i < numArrays; i++)
{
totalIndex = i * lenOfData;
if (indicies.Contains(i))
{
subarrayIndex = Array.IndexOf(indicies, i);
for (subIndex = 0; subIndex < lenOfData; subIndex++)
{
Assert.AreEqual(expectedArrays[subarrayIndex][subIndex], total[totalIndex],
"Expected " + expectedArrays[subarrayIndex][subIndex] + " at subarray index " + totalIndex + ", index = " + subIndex + " but was " + total[totalIndex]);
totalIndex++;
}
}
else
{
for (subIndex = 0; subIndex < lenOfData; subIndex++)
{
Assert.AreEqual(expectedDefaultArray[subIndex], total[totalIndex],
"Expected default value " + expectedDefaultArray[subIndex] + " at subarray index " + totalIndex + ", index = " + subIndex + " but was " + total[totalIndex]);
totalIndex++;
}
}
}
}
[Test]
public void TestCountingSensor()
{
string[] tags = { k_Tag1, k_Tag2 };
gridSensorComponent.SetParameters(tags);
var gridSensor = (CountingGridSensor)gridSensorComponent.CreateSensors()[0];
Assert.AreEqual(gridSensor.PerceptionBuffer.Length, 10 * 10 * 2);
gridSensor.Update();
int[] subarrayIndicies = new int[] { 77, 78, 87, 88 };
float[][] expectedSubarrays = DuplicateArray(new float[] { 1, 0 }, 4);
float[] expectedDefault = new float[] { 0, 0 };
AssertSubarraysAtIndex(gridSensor.PerceptionBuffer, subarrayIndicies, expectedSubarrays, expectedDefault);
var boxGo2 = new GameObject("block");
boxGo2.tag = k_Tag1;
boxGo2.transform.position = new Vector3(3.1f, 0f, 3f);
boxGo2.AddComponent<BoxCollider>();
gridSensor.Update();
subarrayIndicies = new[] { 77, 78, 87, 88 };
expectedSubarrays = DuplicateArray(new float[] { 2, 0 }, 4);
expectedDefault = new float[] { 0, 0 };
AssertSubarraysAtIndex(gridSensor.PerceptionBuffer, subarrayIndicies, expectedSubarrays, expectedDefault);
Object.DestroyImmediate(boxGo2);
}
}
}