using System;
using System.Collections.Generic;
using UnityEngine;
using MLAgents.Sensor;
namespace MLAgents
{
///
/// Ray perception component. Attach this to agents to enable "local perception"
/// via the use of ray casts directed outward from the agent.
///
[Obsolete("The RayPerception MonoBehaviour is deprecated. Use the RayPerceptionSensorComponent instead")]
public class RayPerception3D : RayPerception
{
///
/// Creates perception vector to be used as part of an observation of an agent.
/// Each ray in the rayAngles array adds a sublist of data to the observation.
/// The sublist contains the observation data for a single ray. The list is composed of the following:
/// 1. A one-hot encoding for detectable objects. For example, if detectableObjects.Length = n, the
/// first n elements of the sublist will be a one-hot encoding of the detectableObject that was hit, or
/// all zeroes otherwise.
/// 2. The 'length' element of the sublist will be 1 if the ray missed everything, or 0 if it hit
/// something (detectable or not).
/// 3. The 'length+1' element of the sublist will contain the normalised distance to the object hit.
/// NOTE: Only objects with tags in the detectableObjects array will have a distance set.
///
/// The partial vector observation corresponding to the set of rays
/// Radius of rays
/// Angles of rays (starting from (1,0) on unit circle).
/// List of tags which correspond to object types agent can see
/// Starting height offset of ray from center of agent.
/// Ending height offset of ray from center of agent.
public override IList Perceive(float rayDistance,
float[] rayAngles, string[] detectableObjects,
float startOffset=0.0f, float endOffset=0.0f)
{
var perceptionSize = (detectableObjects.Length + 2) * rayAngles.Length;
if (m_PerceptionBuffer == null || m_PerceptionBuffer.Length != perceptionSize)
{
m_PerceptionBuffer = new float[perceptionSize];
}
const float castRadius = 0.5f;
const bool legacyHitFractionBehavior = true;
RayPerceptionSensor.PerceiveStatic(
rayDistance, rayAngles, detectableObjects, startOffset, endOffset, castRadius,
transform, RayPerceptionSensor.CastType.Cast3D, m_PerceptionBuffer, legacyHitFractionBehavior
);
return m_PerceptionBuffer;
}
}
}