Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
ai.fluctio.fluctio-sim / Core / Components / GlobalSceneSettings / MujocoSceneRecreator.cs
Size: Mime:
using Fluctio.FluctioSim.Utils.General;
using MoreLinq;
using Mujoco;
using Unity.MLAgents;
using UnityEngine;
using Object = UnityEngine.Object;
using Timer = System.Timers.Timer;

namespace Fluctio.FluctioSim.Core.Components.GlobalSceneSettings
{
	public static class MujocoSceneRecreator
	{
		private static Timer _timer;

		private static MujocoResettingSettings Settings => SceneSettings.Instance.PhysicsResetSettings;
		
		[RuntimeInitializeOnLoadMethod]
		private static void ConnectTimer()
		{
			if (Settings.ResettingMode != MujocoResettingMode.WithFixedInterval)
			{
				return;
			}
			
			_timer = new Timer();
			_timer.Interval = Settings.ResetInterval.TimeSpan.TotalMilliseconds;
			_timer.Elapsed += (_, _) =>
			{
				Util.ExecuteOnMainThread(RecreateMujocoScene);
			};
			_timer.AutoReset = true;
			Application.quitting += _timer.Stop;
			_timer.Start();
		}

		private static void RecreateMujocoScene()
		{
			MjScene.Instance.RecreateScene();
			if (Settings.EndEpisodesAfterReset)
			{
				EndAllEpisodes();
			}
		}

		private static void EndAllEpisodes()
		{
			var agents = Object.FindObjectsByType<Agent>(FindObjectsInactive.Exclude, FindObjectsSortMode.None);
			agents.ForEach(agent => agent.EndEpisode());
		}
	}
}