您的位置:首页 > 移动开发 > Unity3D

unity3d异步加载场景

2016-06-24 09:27 555 查看
根据宣雨松前辈的教程来做的,因为我用到的场景不是在游戏里的那种(本人做增强现实的,完全把unity拿来做应用了=。=),所以这里的方法不是很全面,原文戳这里:点击打开链接

异步加载流程:

    lovdlevel                  异步读取

A---------------> B ------------------------>C

                                 播放加载动画

示例背景介绍:A场景是一个菜单,鼠标选中其中一项,则跳转到相应场景(C场景),B场景为加载动画播放场景

A场景:摄像机添加menu.cs

B场景:绑定loading.cs,把loading图片附到loading.cs

menu.cs:

[csharp] view
plain copy

 





using UnityEngine;  

using System.Collections;  

  

public class Globe{  

         //在这里记录当前切换场景的名称  

     public static string loadName;  

}  

public class menu : MonoBehaviour {  

  

    // Use this for initialization  

    void Start ()   

    {  

          

    }  

      

    // Update is called once per frame  

    void Update ()   

    {  

        if (Input.GetKey(KeyCode.Escape))  

            Application.Quit();  

        Camera cam = Camera.mainCamera;  

        if (Input.GetMouseButtonDown(0))  

        {   

            Ray ray = cam.ScreenPointToRay(Input.mousePosition);  

            RaycastHit hit;  

            if (Physics.Raycast(ray, out hit) )  

            {  

                switch (hit.collider.name)  

                {  

                      

                    case "***":  

                        Globe.loadName = "C";  

            Application.LoadLevel ("B");      

                        break;  

                    case "***":  

            Globe.loadName = "CCC";  

            Application.LoadLevel ("B");  

            break;    

                  

                }                  

            }  

        }         

    }  

}  

loading.cs

[csharp] view
plain copy

 





using UnityEngine;  

using System.Collections;  

  

public class loading : MonoBehaviour {  

  

    private float fps = 1000.0f;  

    private float time;  

    //一组动画的贴图,在编辑器中赋值。  

    public Texture2D[] animations;  

    private int nowFram;  

    //异步对象  

    AsyncOperation async;  

  

    //读取场景的进度,它的取值范围在0 - 1 之间。  

    int progress = 1;  

  

    void Start()  

    {  

        //在这里开启一个异步任务,  

        //进入loadScene方法。  

        StartCoroutine(loadScene());  

    }  

  

    //注意这里返回值一定是 IEnumerator  

    IEnumerator loadScene()  

    {  

        //异步读取场景。  

        //Globe.loadName 就是A场景中需要读取的C场景名称。  

        async = Application.LoadLevelAsync(Globe.loadName);  

  

        //读取完毕后返回, 系统会自动进入C场景  

        yield return async;  

  

    }  

  

    void OnGUI()  

    {  

        //因为在异步读取场景,  

        //所以这里我们可以刷新UI  

        DrawAnimation(animations);  

  

    }  

  

    void Update()  

    {  

  

        //在这里计算读取的进度,  

        //progress 的取值范围在0.1 - 1之间, 但是它不会等于1  

        //也就是说progress可能是0.9的时候就直接进入新场景了  

        //所以在写进度条的时候需要注意一下。  

        //为了计算百分比 所以直接乘以100即可  

        progress =  (int)(async.progress *100);  

  

        //有了读取进度的数值,大家可以自行制作进度条啦。  

        Debug.Log(progress);  

  

    }  

    //简单绘制2D动画  

    void  DrawAnimation(Texture2D[] tex)  

    {  

  

        time += Time.deltaTime;  

  

         if(time >= 1.0 / fps){  

  

             nowFram++;  

  

             time = 0;  

  

             if(nowFram >= tex.Length)  

             {  

                nowFram = 0;  

             }  

        }  

          

        GUI.DrawTexture(new Rect( (Screen.width-60)*0.5f,(Screen.height-60)*0.5f,60,60) ,tex[nowFram] );  

                //在这里显示读取的进度。  

        GUI.Label(new Rect( (Screen.width-100)*0.5f,(Screen.height-60)*0.5f+100,100,60), "LOADING..." + progress+"%");  

  

    }  

  

}  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: