using System.Collections ;
using System.Collections.Generic ;
using UnityEngine ;
using UnityEngine.UI ;
using Newtonsoft.Json ;
using System.Collections.Generic ;
using UnityEngine ;
/ * * The type of monitor the information must be displayed in .
* < slider > corresponds to a slingle rectangle which width is given
* by a float between - 1 and 1. ( green is positive , red is negative )
* < hist > corresponds to n vertical sliders .
* < text > is a text field .
* < bar > is a rectangle of fixed length to represent the proportions
* of a list of floats .
* /
using Newtonsoft.Json ;
/// <summary>
/// The type of monitor the information must be displayed in.
/// <slider> corresponds to a single rectangle whose width is given
/// by a float between -1 and 1. (green is positive, red is negative)
/// <hist> corresponds to n vertical sliders.
/// <text> is a text field.
/// <bar> is a rectangle of fixed length to represent the proportions
/// of a list of floats.
/// </summary>
public enum MonitorType
{
slider ,
}
/ * * Monitor is used to display information . Use the log function to add
* information to your monitor .
* /
/// <summary>
/// Monitor is used to display information about the Agent within the Unity
/// scene. Use the log function to add information to your monitor.
/// </summary>
/// <summary>
/// Represents how high above the target the monitors will be.
/// </summary>
[HideInInspector]
static public float verticalOffset = 3f ;
static bool isInstanciated ;
static bool isInstantiated ;
static Dictionary < Transform , Dictionary < string , DisplayValue > > displayTransformValues ;
static Color [ ] barColors ;
private struct DisplayValue
struct DisplayValue
static Dictionary < Transform , Dictionary < string , DisplayValue > > displayTransformValues ;
static private Color [ ] barColors ;
[HideInInspector]
static public float verticalOffset = 3f ;
/**< \brief This float represents how high above the target the monitors will be. */
static GUIStyle keyStyle ;
static GUIStyle valueStyle ;
static bool initialized ;
/ * * Use the Monitor . Log static function to attach information to a transform .
* If displayType is < text > , value can be any object .
* If sidplayType is < slider > , value must be a float .
* If sidplayType is < hist > , value must be a List or Array of floats .
* If sidplayType is < bar > , value must be a list or Array of positive floats .
* Note that < slider > and < hist > caps values between - 1 and 1.
* @param key The name of the information you wish to Log .
* @param value The value you want to display .
* @param displayType The type of display .
* @param target The transform you want to attach the information to .
* /
/// <summary>
/// Use the Monitor.Log static function to attach information to a transform.
/// If displayType is <text>, value can be any object.
/// If sidplayType is <slider>, value must be a float.
/// If sidplayType is <hist>, value must be a List or Array of floats.
/// If sidplayType is <bar>, value must be a list or Array of positive floats.
/// Note that <slider> and<hist> caps values between -1 and 1.
/// </summary>
/// <returns>The log.</returns>
/// <param name="key">The name of the information you wish to Log.</param>
/// <param name="value">The value you want to display.</param>
/// <param name="displayType">The type of display.</param>
/// <param name="target">
/// The transform you want to attach the information to.
/// </param>
public static void Log (
string key ,
object value ,
if ( ! isInstanciated )
if ( ! isInstantiated )
InstanciateCanvas ( ) ;
isInstanciated = true ;
InstantiateCanvas ( ) ;
isInstantiated = true ;
}
}
}
/ * * Remove a value from a monitor
* @param target The transform to which the information is attached
* @param key The key of the information you want to remove
* /
/// <summary>
/// Remove a value from a monitor.
/// </summary>
/// <param name="target">
/// The transform to which the information is attached.
/// </param>
/// <param name="key">The key of the information you want to remove.</param>
public static void RemoveValue ( Transform target , string key )
{
if ( target = = null )
}
/ * * Remove all information from a monitor
* @param target The transform to which the information is attached
* /
/// <summary>
/// Remove all information from a monitor.
/// </summary>
/// <param name="target">
/// The transform to which the information is attached.
/// </param>
public static void RemoveAllValues ( Transform target )
{
if ( target = = null )
{
displayTransformValues . Remove ( target ) ;
}
/ * * Use SetActive to enable or disable the Monitor via script
* @param active Set the Monitor ' s status to the value of active
* /
public static void SetActive ( bool active ) {
if ( ! isInstanciated )
/// <summary>
/// Use SetActive to enable or disable the Monitor via script
/// </summary>
/// <param name="active">Value to set the Monitor's status to.</param>
public static void SetActive ( bool active )
{
if ( ! isInstantiated )
InstanciateCanvas ( ) ;
isInstanciated = true ;
InstantiateCanvas ( ) ;
isInstantiated = true ;
}
if ( canvas ! = null )
}
private static void InstanciateCanvas ( )
/// Initializes the canvas.
static void InstantiateCanvas ( )
{
canvas = GameObject . Find ( "AgentMonitorCanvas" ) ;
if ( canvas = = null )
canvas . AddComponent < Monitor > ( ) ;
}
displayTransformValues = new Dictionary < Transform , Dictionary < string , DisplayValue > > ( ) ;
displayTransformValues = new Dictionary < Transform , Dictionary < string , DisplayValue > > ( ) ;
/// Convert the input object to a float array. Returns a float[0] if the
/// conversion process fails.
float [ ] ToFloatArray ( object input )
{
try
}
catch
{
}
try
{
}
catch
{
/// <summary> <inheritdoc/> </summary>
void OnGUI ( )
{
if ( ! initialized )
displayTransformValues . Remove ( target ) ;
continue ;
}
float widthScaler = ( Screen . width / 1 0 0 0f ) ;
float keyPixelWidth = 1 0 0 * widthScaler ;
float keyPixelHeight = 2 0 * widthScaler ;
{
continue ;
}
Dictionary < string , DisplayValue > displayValues = displayTransformValues [ target ] ;
valueStyle . alignment = TextAnchor . MiddleLeft ;
GUI . Label ( new Rect (
origin . x + paddingwidth + keyPixelWidth ,
origin . y - ( index + 1 ) * keyPixelHeight ,
keyPixelWidth , keyPixelHeight ) ,
origin . y - ( index + 1 ) * keyPixelHeight ,
keyPixelWidth , keyPixelHeight ) ,
JsonConvert . SerializeObject ( displayValues [ key ] . value , Formatting . None ) , valueStyle ) ;
}
if ( displayValues [ key ] . value . GetType ( ) = = typeof ( float ) )
if ( displayValues [ key ] . value is float )
{
sliderValue = ( float ) displayValues [ key ] . value ;
}
}
GUI . Box ( new Rect (
origin . x + paddingwidth + keyPixelWidth ,
origin . y - ( index + 0.9f ) * keyPixelHeight ,
keyPixelWidth * sliderValue , keyPixelHeight * 0.8f ) ,
origin . y - ( index + 0.9f ) * keyPixelHeight ,
keyPixelWidth * sliderValue , keyPixelHeight * 0.8f ) ,
GUIContent . none , s ) ;
}
}
GUI . Box ( new Rect (
origin . x + paddingwidth + keyPixelWidth + ( keyPixelWidth * histWidth + paddingwidth / 2 ) * i ,
origin . y - ( index + 0.1f ) * keyPixelHeight ,
keyPixelWidth * histWidth , - keyPixelHeight * value ) ,
origin . y - ( index + 0.1f ) * keyPixelHeight ,
keyPixelWidth * histWidth , - keyPixelHeight * value ) ,
GUIContent . none , s ) ;
}
{
float [ ] vals = ToFloatArray ( displayValues [ key ] . value ) ;
float valsSum = 0f ;
float valsCum = 0f ;
float valsCum = 0f ;
foreach ( float f in vals )
{
valsSum + = Mathf . Max ( f , 0 ) ;
float value = Mathf . Max ( vals [ i ] , 0 ) / valsSum ;
GUI . Box ( new Rect (
origin . x + paddingwidth + keyPixelWidth + keyPixelWidth * valsCum ,
origin . y - ( index + 0.9f ) * keyPixelHeight ,
keyPixelWidth * value , keyPixelHeight * 0.8f ) ,
origin . y - ( index + 0.9f ) * keyPixelHeight ,
keyPixelWidth * value , keyPixelHeight * 0.8f ) ,
GUIContent . none , colorStyle [ i % colorStyle . Length ] ) ;
valsCum + = value ;
}
}
/// Helper method used to initialize the GUI. Called once.
void Initialize ( )
{
keyStyle = GUI . skin . label ;
barColors = new Color [ 6 ] { Color . magenta , Color . blue , Color . cyan , Color . green , Color . yellow , Color . red } ;
barColors = new Color [ 6 ] { Color . magenta , Color . blue , Color . cyan , Color . green , Color . yellow , Color . red } ;
colorStyle = new GUIStyle [ barColors . Length ] ;
for ( int i = 0 ; i < barColors . Length ; i + + )
{