Ejemplo n.º 1
0
    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);
    }
Ejemplo n.º 2
0
    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_);
        })));
    }
Ejemplo n.º 3
0
 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
             );
     }
 }
Ejemplo n.º 4
0
    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]);
    }
Ejemplo n.º 5
0
    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)));
    }
Ejemplo n.º 6
0
    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)));
    }
Ejemplo n.º 7
0
    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);
    }
Ejemplo n.º 8
0
    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;
        }
    }
Ejemplo n.º 9
0
 public FezUnityLevel()
 {
     Current = this;
 }