| | using System; |
| | using Unity.Mathematics; |
| | using UnityEngine; |
| |
|
| | namespace Unity.MLAgents.Areas |
| | { |
| | |
| | |
| | |
| | [DefaultExecutionOrder(-5)] |
| | public class TrainingAreaReplicator : MonoBehaviour |
| | { |
| | |
| | |
| | |
| | public GameObject baseArea; |
| |
|
| | |
| | |
| | |
| | public int numAreas = 1; |
| |
|
| | |
| | |
| | |
| | public float separation = 10f; |
| |
|
| | |
| | |
| | |
| | public bool buildOnly = true; |
| |
|
| | int3 m_GridSize = new(1, 1, 1); |
| | int m_AreaCount; |
| | string m_TrainingAreaName; |
| |
|
| | |
| | |
| | |
| | public int3 GridSize => m_GridSize; |
| |
|
| | |
| | |
| | |
| | public string TrainingAreaName => m_TrainingAreaName; |
| |
|
| | |
| | |
| | |
| | |
| | public void Awake() |
| | { |
| | |
| | ComputeGridSize(); |
| | |
| | m_TrainingAreaName = baseArea.name; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | public void OnEnable() |
| | { |
| | |
| | if (buildOnly) |
| | { |
| | #if UNITY_STANDALONE && !UNITY_EDITOR |
| | AddEnvironments(); |
| | #endif |
| | return; |
| | } |
| | AddEnvironments(); |
| | } |
| |
|
| | |
| | |
| | |
| | void ComputeGridSize() |
| | { |
| | |
| | |
| | if (Academy.Instance.Communicator != null) |
| | numAreas = Academy.Instance.NumAreas; |
| |
|
| | var rootNumAreas = Mathf.Pow(numAreas, 1.0f / 3.0f); |
| | m_GridSize.x = Mathf.CeilToInt(rootNumAreas); |
| | m_GridSize.y = Mathf.CeilToInt(rootNumAreas); |
| | var zSize = Mathf.CeilToInt((float)numAreas / (m_GridSize.x * m_GridSize.y)); |
| | m_GridSize.z = zSize == 0 ? 1 : zSize; |
| | } |
| |
|
| | |
| | |
| | |
| | |
| | void AddEnvironments() |
| | { |
| | if (numAreas > m_GridSize.x * m_GridSize.y * m_GridSize.z) |
| | { |
| | throw new UnityAgentsException("The number of training areas that you have specified exceeds the size of the grid."); |
| | } |
| |
|
| | for (int z = 0; z < m_GridSize.z; z++) |
| | { |
| | for (int y = 0; y < m_GridSize.y; y++) |
| | { |
| | for (int x = 0; x < m_GridSize.x; x++) |
| | { |
| | if (m_AreaCount == 0) |
| | { |
| | |
| | m_AreaCount = 1; |
| | } |
| | else if (m_AreaCount < numAreas) |
| | { |
| | m_AreaCount++; |
| | var area = Instantiate(baseArea, new Vector3(x * separation, y * separation, z * separation), Quaternion.identity); |
| | area.name = m_TrainingAreaName; |
| | } |
| | } |
| | } |
| | } |
| | } |
| | } |
| | } |
| |
|