public IEnumerator LoadLevelCoroutine(string name, bool multithreaded, System.Action <FezUnityLevel> cb) { GameObject levelObj = new GameObject(""); levelObj.SetActive(false); FezUnityLevel level = levelObj.AddComponent <FezUnityLevel>(); using (BinaryReader reader = ReadFromPack("levels/" + name)) { System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); Level levelRaw = null; if (!multithreaded) { sw.Start(); levelRaw = FmbUtil.ReadObject(reader) as Level; sw.Stop(); yield return(null); } else { Thread thread = new Thread(delegate() { sw.Start(); levelRaw = FmbUtil.ReadObject(reader) as Level; sw.Stop(); }); thread.Name = "FezUnity load raw level " + name; thread.IsBackground = true; thread.Start(); while (thread.IsAlive) { yield return(null); } } Debug.Log("Level " + levelRaw.Name + " loaded in " + sw.ElapsedMilliseconds + " ms"); long timeLoad = sw.ElapsedMilliseconds; sw.Start(); IEnumerator fillc = level.FillCoroutine(levelRaw); while (fillc.MoveNext()) { yield return(fillc.Current); } sw.Stop(); long timeFill = sw.ElapsedMilliseconds; Debug.Log("Level " + levelRaw.Name + " filled in " + sw.ElapsedMilliseconds + " ms"); Debug.Log("Level " + levelRaw.Name + " loaded and filled in " + (timeLoad + timeFill) + " ms"); } levelObj.SetActive(true); yield return(level); cb(level); }
public Coroutine LoadLevelAsync(string name, System.Action <FezUnityLevel> cb, bool unload = true) { FezUnityLevel previous = FezUnityLevel.Current; return(StartCoroutine(LoadLevelCoroutine(name, true, delegate(FezUnityLevel level_) { if (unload) { UnloadLevel(previous); } LoadLevelCoroutinePost(level_); cb(level_); }))); }
void LoadLevelCoroutinePost(FezUnityLevel level) { if (Player == null) { Player = transform; } if (level.Level.StartingPosition != null) { Player.position = level.Level.StartingPosition.Id.ToVector() + Vector3.up * 2f + FezHelper.TrileOffset; Player.position = new Vector3( Player.position.x, Player.position.y, -Player.position.z ); } }
public static Mesh GetUnityMesh(this Trile trile) { FezUnityTrileSet trileSet; FezUnityLevel level = FezUnityLevel.Current; // Microoptimization: TrileSet.TrileSet - direct access if (level != null && level.TrileSet != null && level.TrileSet.TrileSet.Name == trile.TrileSet.Name) { trileSet = level.TrileSet; } else { // Automatically generates if required trileSet = FezManager.Instance.GetUnityTrileSet(trile.TrileSet.Name); } return(trileSet.Triles[trile.Id]); }
public FezUnityTrileSet GetUnityTrileSet(string name) { FezUnityLevel level = FezUnityLevel.Current; // Microoptimization: TrileSet.TrileSet - direct access if (level != null && level.TrileSet != null && level.TrileSet.TrileSet.Name == name) { return(level.TrileSet); } FezUnityTrileSet uts; if (UnityTrileSets.TryGetValue(name, out uts)) { return(uts); } return(UnityTrileSets[name] = new FezUnityTrileSet(GetFezTrileSet(name))); }
public FezUnitySky GetUnitySky(string name) { FezUnityLevel level = FezUnityLevel.Current; // Microoptimization: Sky.Sky - direct access if (level != null && level.Sky != null && level.Sky.Sky != null && level.Sky.Sky.Name == name) { return(level.Sky); } FezUnitySky uSky; if (UnitySkies.TryGetValue(name, out uSky)) { return(uSky); } return(UnitySkies[name] = new FezUnitySky(GetFezSky(name))); }
public FezUnityLevel LoadLevel(string name, bool unload = true) { if (unload) { UnloadLevel(FezUnityLevel.Current); } FezUnityLevel level = null; IEnumerator loadc = LoadLevelCoroutine(name, false, LoadLevelCoroutinePost); while (loadc.MoveNext()) { object item = loadc.Current; if (item is FezUnityLevel) { level = (FezUnityLevel)item; } } return(level); }
public void UnloadLevel(FezUnityLevel level = null) { bool nullifyCurrent = false; if (level == null) { level = FezUnityLevel.Current; nullifyCurrent = true; } if (level == null) { return; } // TODO Destroy(level.gameObject); if (nullifyCurrent) { FezUnityLevel.Current = null; } }
public FezUnityLevel() { Current = this; }