using System.Collections.Generic; using UnityEngine; using System.Linq; using Unity.MLAgents; using UnityEngine.Serialization; public class GridArea : MonoBehaviour { [HideInInspector] public List actorObjs; [HideInInspector] public int[] players; public GameObject trueAgent; Camera m_AgentCam; [FormerlySerializedAs("PlusPref")] public GameObject GreenPlusPrefab; [FormerlySerializedAs("ExPref")] public GameObject RedExPrefab; GameObject[] m_Objects; public int numberOfPlus = 1; public int numberOfEx = 1; GameObject m_Plane; GameObject m_Sn; GameObject m_Ss; GameObject m_Se; GameObject m_Sw; Vector3 m_InitialPosition; EnvironmentParameters m_ResetParams; public void Start() { m_ResetParams = Academy.Instance.EnvironmentParameters; m_Objects = new[] { GreenPlusPrefab, RedExPrefab }; m_AgentCam = transform.Find("agentCam").GetComponent(); actorObjs = new List(); var sceneTransform = transform.Find("scene"); m_Plane = sceneTransform.Find("Plane").gameObject; m_Sn = sceneTransform.Find("sN").gameObject; m_Ss = sceneTransform.Find("sS").gameObject; m_Sw = sceneTransform.Find("sW").gameObject; m_Se = sceneTransform.Find("sE").gameObject; m_InitialPosition = transform.position; } void SetEnvironment() { transform.position = m_InitialPosition * (m_ResetParams.GetWithDefault("gridSize", 5f) + 1); var playersList = new List(); for (var i = 0; i < (int)m_ResetParams.GetWithDefault("numPlusGoals", numberOfPlus); i++) { playersList.Add(0); } for (var i = 0; i < (int)m_ResetParams.GetWithDefault("numExGoals", numberOfEx); i++) { playersList.Add(1); } players = playersList.ToArray(); var gridSize = (int)m_ResetParams.GetWithDefault("gridSize", 5f); m_Plane.transform.localScale = new Vector3(gridSize / 10.0f, 1f, gridSize / 10.0f); m_Plane.transform.localPosition = new Vector3((gridSize - 1) / 2f, -0.5f, (gridSize - 1) / 2f); m_Sn.transform.localScale = new Vector3(1, 1, gridSize + 2); m_Ss.transform.localScale = new Vector3(1, 1, gridSize + 2); m_Sn.transform.localPosition = new Vector3((gridSize - 1) / 2f, 0.0f, gridSize); m_Ss.transform.localPosition = new Vector3((gridSize - 1) / 2f, 0.0f, -1); m_Se.transform.localScale = new Vector3(1, 1, gridSize + 2); m_Sw.transform.localScale = new Vector3(1, 1, gridSize + 2); m_Se.transform.localPosition = new Vector3(gridSize, 0.0f, (gridSize - 1) / 2f); m_Sw.transform.localPosition = new Vector3(-1, 0.0f, (gridSize - 1) / 2f); m_AgentCam.orthographicSize = (gridSize) / 2f; m_AgentCam.transform.localPosition = new Vector3((gridSize - 1) / 2f, gridSize + 1f, (gridSize - 1) / 2f); } public void AreaReset() { var gridSize = (int)m_ResetParams.GetWithDefault("gridSize", 5f); foreach (var actor in actorObjs) { DestroyImmediate(actor); } SetEnvironment(); actorObjs.Clear(); var numbers = new HashSet(); while (numbers.Count < players.Length + 1) { numbers.Add(Random.Range(0, gridSize * gridSize)); } var numbersA = numbers.ToArray(); for (var i = 0; i < players.Length; i++) { var x = (numbersA[i]) / gridSize; var y = (numbersA[i]) % gridSize; var actorObj = Instantiate(m_Objects[players[i]], transform); actorObj.transform.localPosition = new Vector3(x, -0.25f, y); actorObjs.Add(actorObj); } var xA = (numbersA[players.Length]) / gridSize; var yA = (numbersA[players.Length]) % gridSize; trueAgent.transform.localPosition = new Vector3(xA, -0.25f, yA); } }