| | using System.Collections.Generic; |
| | using UnityEngine; |
| | using System.Linq; |
| | using Unity.MLAgents; |
| | using UnityEngine.Serialization; |
| |
|
| |
|
| | public class GridArea : MonoBehaviour |
| | { |
| | [HideInInspector] |
| | public List<GameObject> 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<Camera>(); |
| |
|
| | actorObjs = new List<GameObject>(); |
| |
|
| | 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<int>(); |
| |
|
| | 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<int>(); |
| | 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); |
| | } |
| | } |
| |
|