using System.Collections.Generic;
using UnityEngine;
namespace MSCO
{
///
/// Gemeinsame Liste aller PlayMaker-FSMs der Szene. FindObjectsOfType ist teuer (tausende FSMs in MSC);
/// statt dass Türen-, Fahrzeug-, Wetter- und Montage-Sync jeweils selbst suchen, wird einmal gesucht
/// und das Ergebnis eine Weile geteilt.
///
public static class SceneCache
{
static PlayMakerFSM[] fsms = new PlayMakerFSM[0];
static float builtAt = -1000f;
static int builtForLevel = -1;
static Rigidbody[] bodies = new Rigidbody[0];
static float bodiesAt = -1000f;
static int bodiesForLevel = -1;
///
/// Alle Rigidbodies; höchstens maxAge Sekunden alt (Objekt-Sync und Verkehr teilen sich die teure Suche).
/// Einträge können inzwischen zerstört sein (== null prüfen).
///
public static Rigidbody[] Rigidbodies(float maxAge)
{
if (Time.realtimeSinceStartup - bodiesAt > maxAge || bodiesForLevel != Application.loadedLevel)
{
Object[] found = Object.FindObjectsOfType(typeof(Rigidbody));
bodies = new Rigidbody[found.Length];
for (int i = 0; i < found.Length; i++) bodies[i] = (Rigidbody)found[i];
bodiesAt = Time.realtimeSinceStartup;
bodiesForLevel = Application.loadedLevel;
}
return bodies;
}
/// Alle FSMs; höchstens maxAge Sekunden alt. Einträge können inzwischen zerstört sein (== null prüfen).
public static PlayMakerFSM[] Fsms(float maxAge)
{
if (Time.realtimeSinceStartup - builtAt > maxAge || builtForLevel != Application.loadedLevel)
{
Object[] found = Object.FindObjectsOfType(typeof(PlayMakerFSM));
var list = new List(found.Length);
foreach (Object o in found) list.Add((PlayMakerFSM)o);
fsms = list.ToArray();
builtAt = Time.realtimeSinceStartup;
builtForLevel = Application.loadedLevel;
}
return fsms;
}
}
}