参考:Application.LoadLevelAsync 异步加载关卡
static function LoadLevelAsync (levelName : string) : AsyncOperation
http://www.ceeger.com/Script/Application/Application.LoadLevelAsync.html
建2个C#脚本:LoadingComponent.cs 和 LoadLevelOnClick.cs
LoadingComponent.cs:
using UnityEngine;
[ExecuteInEditMode]
public class LoadingComponent : MonoBehaviour
{
private AsyncOperation asy;
public Texture2D backgroundImage;
public Font fontType;
public string levelName;
public AudioClip loadingAudio;
public float loadingBarHeight = 25f;
public Texture2D loadingBarImage;
public Vector2 loadingBarPosition;
public string loadingText = "Loading Now...";
public Color loadingTextColor;
public FontStyle loadingTextFont;
public int loadingTextSize = 5;
public bool normalized;
public bool showProgressPercentage = true;
public float startDelay = 1.0f;
private GUIStyle style;
private GUIStyle textStyle;
public Texture2D emptyBarImage;
private GUIStyle emptyStyle;
private void Start()
{
if (Application.isPlaying)
{
if (loadingAudio)
{
if (!GetComponent<AudioSource>())
{
gameObject.AddComponent("AudioSource");
}
GetComponent<AudioSource>().loop = true;
GetComponent<AudioSource>().playOnAwake = false;
GetComponent<AudioSource>().clip = loadingAudio;
}
gameObject.AddComponent("GUITexture");
style = new GUIStyle();
style.normal.background = loadingBarImage;
style.alignment = TextAnchor.MiddleCenter;
style.normal.textColor = loadingTextColor;
style.fontStyle = loadingTextFont;
style.fontSize = loadingTextSize;
textStyle = new GUIStyle();
textStyle.alignment = TextAnchor.MiddleCenter;
textStyle.fontStyle = loadingTextFont;
textStyle.normal.textColor = loadingTextColor;
textStyle.fontSize = loadingTextSize;
textStyle.font = fontType;
emptyStyle = new GUIStyle();
emptyStyle.normal.background = emptyBarImage;
}
}
private void Update()
{
if (normalized)
{
loadingBarPosition.x = Mathf.Clamp(loadingBarPosition.x, 0f, 1f);
loadingBarPosition.y = Mathf.Clamp(loadingBarPosition.y, 0f, 1f);
}
}
private void LoadNextLevel()
{
transform.position = new Vector3(0, 0, 100);
transform.localScale = Vector3.zero;
guiTexture.pixelInset = new Rect(0, 0, Screen.width, Screen.height);
guiTexture.texture = backgroundImage;
if (loadingAudio)
{
audio.Play();
}
DontDestroyOnLoad(this);
asy = Application.LoadLevelAsync(levelName);
}
private void OnGUI()
{
if (asy != null)
{
if (!asy.isDone)
{
if (!normalized)
{
GUI.Label(new Rect(Screen.width/2, loadingBarPosition.y - 20, 50, 50), loadingText, textStyle);
if (showProgressPercentage)
{
GUI.Box(
new Rect(loadingBarPosition.x, loadingBarPosition.y,
Screen.width - (loadingBarPosition.x * 2),
loadingBarHeight),
"", emptyStyle);
GUI.Label(
new Rect(loadingBarPosition.x, loadingBarPosition.y,
((Screen.width - (loadingBarPosition.x*2))*(asy.progress*100f))/100f,
loadingBarHeight),
"", style);
GUI.Label(
new Rect(loadingBarPosition.x, loadingBarPosition.y,
Screen.width - (loadingBarPosition.x * 2),
loadingBarHeight),
Mathf.RoundToInt(asy.progress * 100f) + "%", emptyStyle);
}
else
{
GUI.Box(
new Rect(loadingBarPosition.x, loadingBarPosition.y,
Screen.width - (loadingBarPosition.x * 2),
loadingBarHeight),
"", emptyStyle);
GUI.Label(
new Rect(loadingBarPosition.x, loadingBarPosition.y,
((Screen.width - (loadingBarPosition.x*2))*(asy.progress*100f))/100f,
loadingBarHeight),
"", style);
}
}
else
{
GUI.Label(new Rect(Screen.width/2, (loadingBarPosition.y*Screen.height) - 50, 50, 50),
loadingText, textStyle);
if (showProgressPercentage)
{
GUI.Box(
new Rect(loadingBarPosition.x * Screen.width, loadingBarPosition.y * Screen.height,
Screen.width - (loadingBarPosition.x * Screen.width * 2),
loadingBarHeight),
"", emptyStyle);
GUI.Label(
new Rect(loadingBarPosition.x*Screen.width, loadingBarPosition.y*Screen.height,
((Screen.width - (loadingBarPosition.x*Screen.width*2))*(asy.progress*100f))/
100f,
loadingBarHeight),
"", style);
GUI.Label(
new Rect(loadingBarPosition.x * Screen.width, loadingBarPosition.y * Screen.height,
Screen.width - (loadingBarPosition.x * Screen.width * 2),
loadingBarHeight),
Mathf.RoundToInt(asy.progress * 100f) + "%", textStyle);
}
else
{
GUI.Box(
new Rect(loadingBarPosition.x * Screen.width, loadingBarPosition.y * Screen.height,
Screen.width - (loadingBarPosition.x * Screen.width * 2),
loadingBarHeight),
"", emptyStyle);
GUI.Label(
new Rect(loadingBarPosition.x*Screen.width, loadingBarPosition.y*Screen.height,
((Screen.width - (loadingBarPosition.x*Screen.width*2))*(asy.progress*100f))/
100f,
loadingBarHeight),
"", style);
}
}
}
else
{
if (!normalized)
{
GUI.Label(new Rect(Screen.width/2, loadingBarPosition.y - 50, 50, 50), loadingText, textStyle);
if (showProgressPercentage)
{
GUI.Box(
new Rect(loadingBarPosition.x, loadingBarPosition.y,
Screen.width - (loadingBarPosition.x * 2),
loadingBarHeight),
"", emptyStyle);
GUI.Label(
new Rect(loadingBarPosition.x, loadingBarPosition.y,
((Screen.width - (loadingBarPosition.x*2))*(asy.progress*100f))/100f,
loadingBarHeight),
"", style);
GUI.Label(
new Rect(loadingBarPosition.x, loadingBarPosition.y,
Screen.width - (loadingBarPosition.x * 2),
loadingBarHeight),
Mathf.RoundToInt(asy.progress * 100f) + "%", textStyle);
}
else
{
GUI.Box(
new Rect(loadingBarPosition.x, loadingBarPosition.y,
Screen.width - (loadingBarPosition.x * 2),
loadingBarHeight),
"", emptyStyle);
GUI.Label(
new Rect(loadingBarPosition.x, loadingBarPosition.y,
((Screen.width - (loadingBarPosition.x*2))*(asy.progress*100f))/100f,
loadingBarHeight),
"", style);
}
}
else
{
GUI.Label(new Rect(Screen.width/2, (loadingBarPosition.y*Screen.height) - 50, 50, 50),
loadingText, textStyle);
if (showProgressPercentage)
{
GUI.Box(
new Rect(loadingBarPosition.x * Screen.width, loadingBarPosition.y * Screen.height,
Screen.width - (loadingBarPosition.x * Screen.width * 2),
loadingBarHeight),
"", emptyStyle);
GUI.Label(
new Rect(loadingBarPosition.x*Screen.width, loadingBarPosition.y*Screen.height,
((Screen.width - loadingBarPosition.x*Screen.width*2)*(asy.progress*100f))/100f,
loadingBarHeight),
"", style);
GUI.Label(
new Rect(loadingBarPosition.x * Screen.width, loadingBarPosition.y * Screen.height,
Screen.width - (loadingBarPosition.x * Screen.width * 2),
loadingBarHeight),
Mathf.RoundToInt(asy.progress * 100f) + "%", textStyle);
}
else
{
GUI.Box(
new Rect(loadingBarPosition.x * Screen.width, loadingBarPosition.y * Screen.height,
Screen.width - (loadingBarPosition.x * Screen.width * 2),
loadingBarHeight),
"", emptyStyle);
GUI.Label(
new Rect(loadingBarPosition.x*Screen.width, loadingBarPosition.y*Screen.height,
((Screen.width - loadingBarPosition.x*Screen.width*2)*(asy.progress*100f))/100f,
loadingBarHeight),
"", style);
}
}
Destroy(gameObject, startDelay);
}
}
}
}
LoadLevelOnClick.cs
using UnityEngine;
public class LoadLevelOnClick : MonoBehaviour
{
private void Update()
{
if (Input.GetMouseButtonDown(0))
{
gameObject.SendMessage("LoadNextLevel");
}
}
}
源码下载: http://pan.baidu.com/s/1kUik3lH 密码: f5eh