diff --git a/UnitySDK/Assets/ML-Agents/Editor/Tests/RayPerceptionTests.cs b/UnitySDK/Assets/ML-Agents/Editor/Tests/RayPerceptionTests.cs index dd7ce5745f..21d82f850d 100644 --- a/UnitySDK/Assets/ML-Agents/Editor/Tests/RayPerceptionTests.cs +++ b/UnitySDK/Assets/ML-Agents/Editor/Tests/RayPerceptionTests.cs @@ -30,5 +30,11 @@ public void TestPerception2D() tags); Assert.IsTrue(result.Count == angles.Length * (tags.Length + 2)); } + + [Test] + public void TestConstants() + { + Assert.AreEqual(Physics.DefaultRaycastLayers, Physics2D.DefaultRaycastLayers); + } } } diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/RayPerceptionSensor.cs b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/RayPerceptionSensor.cs index ee41a47a58..b0a8cae92f 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/RayPerceptionSensor.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/RayPerceptionSensor.cs @@ -25,6 +25,7 @@ public enum CastType float m_CastRadius; CastType m_CastType; Transform m_Transform; + int m_LayerMask; /// /// Debug information for the raycast hits. This is used by the RayPerceptionSensorComponent. @@ -67,7 +68,8 @@ public DebugDisplayInfo debugDisplayInfo } public RayPerceptionSensor(string name, float rayDistance, List detectableObjects, float[] angles, - Transform transform, float startOffset, float endOffset, float castRadius, CastType castType) + Transform transform, float startOffset, float endOffset, float castRadius, CastType castType, + int rayLayerMask) { var numObservations = (detectableObjects.Count + 2) * angles.Length; m_Shape = new[] { numObservations }; @@ -84,6 +86,7 @@ public RayPerceptionSensor(string name, float rayDistance, List detectab m_EndOffset = endOffset; m_CastRadius = castRadius; m_CastType = castType; + m_LayerMask = rayLayerMask; if (Application.isEditor) { @@ -97,7 +100,8 @@ public int Write(WriteAdapter adapter) { PerceiveStatic( m_RayDistance, m_Angles, m_DetectableObjects, m_StartOffset, m_EndOffset, - m_CastRadius, m_Transform, m_CastType, m_Observations, false, m_DebugDisplayInfo + m_CastRadius, m_Transform, m_CastType, m_Observations, false, m_LayerMask, + m_DebugDisplayInfo ); adapter.AddRange(m_Observations); } @@ -164,6 +168,7 @@ public static void PerceiveStatic(float rayLength, float startOffset, float endOffset, float castRadius, Transform transform, CastType castType, float[] perceptionBuffer, bool legacyHitFractionBehavior = false, + int layerMask = Physics.DefaultRaycastLayers, DebugDisplayInfo debugInfo = null) { Array.Clear(perceptionBuffer, 0, perceptionBuffer.Length); @@ -221,11 +226,13 @@ public static void PerceiveStatic(float rayLength, RaycastHit rayHit; if (castRadius > 0f) { - castHit = Physics.SphereCast(startPositionWorld, castRadius, rayDirection, out rayHit, rayLength); + castHit = Physics.SphereCast(startPositionWorld, castRadius, rayDirection, out rayHit, + rayLength, layerMask); } else { - castHit = Physics.Raycast(startPositionWorld, rayDirection, out rayHit, rayLength); + castHit = Physics.Raycast(startPositionWorld, rayDirection, out rayHit, + rayLength, layerMask); } hitFraction = castHit ? rayHit.distance / rayLength : 1.0f; @@ -236,11 +243,12 @@ public static void PerceiveStatic(float rayLength, RaycastHit2D rayHit; if (castRadius > 0f) { - rayHit = Physics2D.CircleCast(startPositionWorld, castRadius, rayDirection, rayLength); + rayHit = Physics2D.CircleCast(startPositionWorld, castRadius, rayDirection, + rayLength, layerMask); } else { - rayHit = Physics2D.Raycast(startPositionWorld, rayDirection, rayLength); + rayHit = Physics2D.Raycast(startPositionWorld, rayDirection, rayLength, layerMask); } castHit = rayHit; diff --git a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/RayPerceptionSensorComponentBase.cs b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/RayPerceptionSensorComponentBase.cs index 7ae5392d0a..669b69d4d6 100644 --- a/UnitySDK/Assets/ML-Agents/Scripts/Sensor/RayPerceptionSensorComponentBase.cs +++ b/UnitySDK/Assets/ML-Agents/Scripts/Sensor/RayPerceptionSensorComponentBase.cs @@ -27,6 +27,9 @@ public abstract class RayPerceptionSensorComponentBase : SensorComponent [Tooltip("Length of the rays to cast.")] public float rayLength = 20f; + [Tooltip("Controls which layers the rays can hit.")] + public LayerMask rayLayerMask = Physics.DefaultRaycastLayers; + [Range(1, 50)] [Tooltip("Whether to stack previous observations. Using 1 means no previous observations.")] public int observationStacks = 1; @@ -57,7 +60,8 @@ public override ISensor CreateSensor() { var rayAngles = GetRayAngles(raysPerDirection, maxRayDegrees); m_RaySensor = new RayPerceptionSensor(sensorName, rayLength, detectableTags, rayAngles, - transform, GetStartVerticalOffset(), GetEndVerticalOffset(), sphereCastRadius, GetCastType() + transform, GetStartVerticalOffset(), GetEndVerticalOffset(), sphereCastRadius, GetCastType(), + rayLayerMask ); if (observationStacks != 1) diff --git a/UnitySDK/ProjectSettings/ProjectVersion.txt b/UnitySDK/ProjectSettings/ProjectVersion.txt index f65e6b3943..2e959fabcf 100755 --- a/UnitySDK/ProjectSettings/ProjectVersion.txt +++ b/UnitySDK/ProjectSettings/ProjectVersion.txt @@ -1 +1 @@ -m_EditorVersion: 2017.4.32f1 +m_EditorVersion: 2017.4.33f1