chrisgregan
11 years ago
4 changed files with 134 additions and 11 deletions
Binary file not shown.
@ -0,0 +1,118 @@
|
||||
using UnityEngine; |
||||
using System.Collections; |
||||
using System; |
||||
|
||||
namespace Fungus |
||||
{ |
||||
/** |
||||
* Helper component for loading a new scene. |
||||
* A fullscreen loading image is displayed while loading the new scene. |
||||
* All Rooms are destroyed and unused assets are released from memory before loading the new scene to minimize memory footprint. |
||||
* For streaming Web Player builds, the loading image will be displayed until the requested level has finished downloading. |
||||
*/ |
||||
public class SceneLoader : MonoBehaviour |
||||
{ |
||||
Texture2D loadingTexture; |
||||
string sceneToLoad; |
||||
bool displayedImage; |
||||
bool saveCheckpoint; |
||||
|
||||
/** |
||||
* Asynchronously load a new scene. |
||||
* @param _sceneToLoad The name of the scene to load. Scenes must be added in project build settings. |
||||
* @param _loadingTexture Loading image to display while loading the new scene. |
||||
* @param _saveCheckpoint Automatically save a checkpoint once the new scene has loaded. |
||||
*/ |
||||
static public void LoadScene(string _sceneToLoad, Texture2D _loadingTexture, bool _saveCheckpoint) |
||||
{ |
||||
// Unity does not provide a way to check if the named scene actually exists in the project. |
||||
GameObject go = new GameObject(); |
||||
DontDestroyOnLoad(go); |
||||
|
||||
SceneLoader sceneLoader = go.AddComponent<SceneLoader>(); |
||||
sceneLoader.sceneToLoad = _sceneToLoad; |
||||
sceneLoader.loadingTexture = _loadingTexture; |
||||
sceneLoader.saveCheckpoint = _saveCheckpoint; |
||||
} |
||||
|
||||
void Start() |
||||
{ |
||||
StartCoroutine(DoLoadSequence()); |
||||
} |
||||
|
||||
IEnumerator DoLoadSequence() |
||||
{ |
||||
// Wait until loading image has been displayed in OnGUI |
||||
while (loadingTexture != null && |
||||
!displayedImage) |
||||
{ |
||||
yield return new WaitForEndOfFrame(); |
||||
} |
||||
|
||||
// Destroy all Room objects to release references to most game assets |
||||
Room[] rooms = GameObject.FindObjectsOfType<Room>(); |
||||
foreach (Room room in rooms) |
||||
{ |
||||
Destroy(room.gameObject); |
||||
} |
||||
|
||||
yield return new WaitForEndOfFrame(); |
||||
|
||||
// Most big assets should no longer be referenced, so unload them. |
||||
Resources.UnloadUnusedAssets(); |
||||
|
||||
// Wait until scene has finished downloading (WebPlayer only) |
||||
while (!Application.CanStreamedLevelBeLoaded(sceneToLoad)) |
||||
{ |
||||
yield return new WaitForEndOfFrame(); |
||||
} |
||||
|
||||
// Load the scene (happens at end of frame) |
||||
Application.LoadLevel(sceneToLoad); |
||||
|
||||
yield return new WaitForEndOfFrame(); |
||||
|
||||
// Clean up any remaining unused assets |
||||
Resources.UnloadUnusedAssets(); |
||||
|
||||
// Save a checkpoint if required |
||||
if (saveCheckpoint) |
||||
{ |
||||
Game game = Game.GetInstance(); |
||||
if (game != null) |
||||
{ |
||||
game.SaveGame("Fungus.Save"); |
||||
} |
||||
} |
||||
|
||||
// We're now finished with the SceneLoader |
||||
Destroy(gameObject); |
||||
} |
||||
|
||||
void OnGUI() |
||||
{ |
||||
if (loadingTexture == null) |
||||
{ |
||||
return; |
||||
} |
||||
|
||||
GUI.depth = -2000; |
||||
|
||||
float h = Screen.height; |
||||
float w = (float)loadingTexture.width * (h / (float)loadingTexture.height); |
||||
|
||||
float x = Screen.width / 2 - w / 2; |
||||
float y = 0; |
||||
|
||||
Rect rect = new Rect(x, y, w, h); |
||||
|
||||
GUI.DrawTexture(rect, loadingTexture); |
||||
|
||||
if (Event.current.type == EventType.Repaint) |
||||
{ |
||||
// Flag that image is now being shown |
||||
displayedImage = true; |
||||
} |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue