Gestor de Escenas en Unity3D

Evaluando lo necesario para el TFG, vi que requeríamos de un gestor de escenas, en la que se pudiera cambiar de escena, desde el editor y en runtime con variaciones.

Variaciones

Editor -> cambiar generalmente de forma rápida y precisa.

Runtime -> cambiar entre cargar escena completa y cargar mediante Sync.

Por ello propuse un Gestor de Escenas en la que uno mismo podría cambiar siempre de escena en cualquier lado.

El sistema es llamado  Proteo que hace honor a una criatura mitología que podía asumir cualquier forma que no fuera inmóvil.

/img/c/gesesceunity.gif
.

En la escena de test, quería sacar 3 funcionalidades.

  • Cambiar de forma normal la escena.
  • Cambiar de forma Asyncrona la escena.
  • Descargar alguna escena anterior.

Bien ahora empezare por el sistema runtime.

Al estar con Unity5 hay que agregar la using UnityEngine.SceneManagement; Si no, no podrás acceder a los métodos de unity. Al sumar escenas hay un método llamado LoadSceneMode.Additive que seria sumar la nueva escena a la actual.

Bueno y después de esto ->


//                                  ┌∩┐(◣_◢)┌∩┐
//																
// SProteo.cs (15/03/2017)										
// Autor: Antonio Mateo (Moon Pincho) 						       
// Descripcion:		Sistema que gestiona el cambio de escenas.		
// Fecha Mod:		15/03/2017									
// Ultima Mod:		Version Inicial								
//****************************************************************\\

#region Librerias
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.SceneManagement;
#endregion

namespace MoonPincho
{
	/// <summary>
	/// <para>Sistema que gestiona el cambio de escenas</para>
	/// </summary>
	[AddComponentMenu("Moon Pincho/Sistemas/SProteo")]
	public class SProteo : MonoBehaviour 
	{
		#region Variables Publicas
		/// <summary>
		/// <para>NGUI progress bar para la carga.</para>
		/// </summary>
		public UISlider progressBar;
		#endregion

		#region API
		/// <summary>
		/// <para>Carga la escena dada en modo Additive.</para>
		/// </summary>
		/// <param name="nombre">Nombre de la escena.</param>
		public void LoadScene(string nombre)
		{
			SceneManager.LoadScene(nombre, LoadSceneMode.Additive);
		}

		/// <summary>
		/// <para>Descarga la escena dada.</para>
		/// </summary>
		/// <param name="nombre">Nombre de la escena.</param>
		public void UnLoadScene(string nombre)
		{
			SceneManager.UnloadSceneAsync(nombre);
		}

		/// <summary>
		/// <para>Carga la escena dada asyncronamente.</para>
		/// </summary>
		/// <param name="nombre">Nombre de la escena.</param>
		public void LoadSceneAsyc(string nombre)
		{
			StartCoroutine(UpdateProgress(nombre));
		}

		/// <summary>
		/// <para>Descarga la escena actual.</para>
		/// </summary>
		public void UnLoadActual()
		{
			SceneManager.UnloadSceneAsync(SceneManager.GetActiveScene().name);
		}
		#endregion

		#region Funcionalidad
		/// <summary>
		/// <para>Actualiza el progress bar mientras carga la escena Asyncronamente.</para>
		/// </summary>
		/// <param name="nombre">Nombre de la escena.</param>
		/// <returns>Null</returns>
		public IEnumerator UpdateProgress(string nombre)la escena Asyncronamente
		{
			AsyncOperation cargando = SceneManager.LoadSceneAsync(nombre);

			while (!cargando.isDone)
			{
				this.progressBar.value = cargando.progress;
				Debug.Log(cargando.progress);
				yield return null;
			}
		}
		#endregion
	}
}

GitHub
/img/ref.png
.