您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
131 行
3.9 KiB
131 行
3.9 KiB
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine.Perception.Randomization.Parameters.Abstractions;
|
|
using UnityEngine.Perception.Randomization.Scenarios.Abstractions;
|
|
using UnityEngine;
|
|
using UnityEngine.Perception.Randomization.Scenarios;
|
|
|
|
namespace UnityEngine.Perception.Randomization.Parameters.MonoBehaviours
|
|
{
|
|
public class ParameterConfiguration : MonoBehaviour
|
|
{
|
|
public List<ParameterBase> parameters = new List<ParameterBase>();
|
|
public Scenario scenario;
|
|
|
|
int m_GlobalIterationIndex;
|
|
int[] m_IterationState;
|
|
bool m_HasScenario;
|
|
|
|
public int GlobalIterationIndex => m_GlobalIterationIndex;
|
|
|
|
public int TotalIterationCount
|
|
{
|
|
get
|
|
{
|
|
if (parameters.Count == 0) return 0;
|
|
var totalIterationCount = 1;
|
|
foreach (var param in parameters)
|
|
{
|
|
totalIterationCount *= param.sampler.SampleCount;
|
|
}
|
|
return totalIterationCount;
|
|
}
|
|
}
|
|
|
|
public int TotalFrameCount
|
|
{
|
|
get
|
|
{
|
|
var totalFrameCount = TotalIterationCount;
|
|
if (scenario != null)
|
|
totalFrameCount *= scenario.FrameCount;
|
|
return totalFrameCount;
|
|
}
|
|
}
|
|
|
|
public bool FinishedIterating => m_IterationState[0] >= parameters[0].sampler.SampleCount;
|
|
|
|
public void Awake()
|
|
{
|
|
if (parameters.Count == 0)
|
|
{
|
|
StopExecution();
|
|
enabled = false;
|
|
return;
|
|
}
|
|
m_IterationState = new int[parameters.Count];
|
|
if (scenario == null)
|
|
scenario = gameObject.AddComponent<EmptyScenario>();
|
|
scenario.parameterConfiguration = this;
|
|
}
|
|
|
|
void Start()
|
|
{
|
|
StartCoroutine(UpdateLoop());
|
|
}
|
|
|
|
IEnumerator UpdateLoop()
|
|
{
|
|
yield return new WaitForSeconds(1f);
|
|
while (!FinishedIterating)
|
|
{
|
|
ApplyIterationDataToParameters();
|
|
scenario.Setup();
|
|
for (var i = 0; i < scenario.FrameCount; i++)
|
|
yield return null;
|
|
scenario.Teardown();
|
|
Iterate();
|
|
}
|
|
StopExecution();
|
|
}
|
|
|
|
static void StopExecution()
|
|
{
|
|
#if UNITY_EDITOR
|
|
UnityEditor.EditorApplication.isPlaying = false;
|
|
#else
|
|
Application.Quit();
|
|
#endif
|
|
}
|
|
|
|
void ApplyIterationDataToParameters()
|
|
{
|
|
for (var i = 0; i < parameters.Count; i++)
|
|
{
|
|
var param = parameters[i];
|
|
var currentIteration = m_IterationState[i];
|
|
param.Apply(new IterationData {
|
|
localSampleIndex = currentIteration,
|
|
globalSampleIndex = m_GlobalIterationIndex
|
|
});
|
|
}
|
|
}
|
|
|
|
void Iterate()
|
|
{
|
|
var samplerIndex = m_IterationState.Length - 1;
|
|
m_IterationState[samplerIndex]++;
|
|
|
|
while (samplerIndex > 0 && m_IterationState[samplerIndex] == parameters[samplerIndex].sampler.SampleCount)
|
|
{
|
|
m_IterationState[samplerIndex--] = 0;
|
|
m_IterationState[samplerIndex]++;
|
|
}
|
|
|
|
m_GlobalIterationIndex++;
|
|
}
|
|
|
|
public Parameter<T> GetParameter<T>(string parameterName)
|
|
{
|
|
foreach (var parameter in parameters)
|
|
{
|
|
if (parameter.parameterName == parameterName && parameter.SampleType() == typeof(T))
|
|
{
|
|
return (Parameter<T>)parameter;
|
|
}
|
|
}
|
|
Debug.LogError($"Parameter {parameterName} not found");
|
|
return null;
|
|
}
|
|
}
|
|
}
|