zoukankan      html  css  js  c++  java
  • 异步加载场景

    Unity版本 5.2.2

    当我们执行场景跳转的时候,经常会出现游戏顿的情况,为了过度掉这段卡顿的情况,我们可以在创建一个新的场景,专门用来加载将要跳转的下一个场景。

    通常情况下这个新创建的场景是用来加载下一个即将跳转的场景的,一般使用异步加载。

    异步加载需要用到协同加载:

    什么是协程:协同进程,在主程序运行开始时同事运行开启另一段逻辑处理,来协同当前程序的执行。但协程不是开启了另一个线程。在Unity中是不允许出现两个线程的。

    协程的开启需要到MonoBehavior.StartCoroutine方法开启一个协程;所以协程必须在MonoBehavior或继承自MonoBehavior的类中进行调用;

    StartCoroutine(String methodName)和StartCoroutine(IEnumerator Routine)都可以开启一个协程

    传参的函数一定要写 yield rerurn;

    区别在于:使用字符串作为参数时,开启线程时最多只能传递一个参数,并且性能小号会更大一点,而使用IEnumertor routine 作为参数时则没有这个限制。

    在Unity中使用StopCoroutine(String methodName)来终止一个协程,使用StopAllCoroutine来终止所有的协程;

    还有一种方法是将协程所在的gameobject对象的active属性设置为false 当再次设置active属性为true的时候,协程不会再开启;但是将协同程序所在脚本的enabled设置为false则不会生效;

    异步加载:

    第一种异步加载的方法:

      Application.LoadLevelAsync("yourScene"); 这种加载加载完这个界面后会删除上一个界面的缓存;

    第二种异步加载的方法:

      Application.LoadLevelAsync("yourScene");这种加载 加载完成后不会删除上一个界面的缓存,会对内存造成一些负担;

    这两个加载的方法的返回值是AsyncOperation对象。通过该对象能够获取到游戏加载的进度;

    using UnityEngine;
    using System.Collections;


    public class LoadingNextScene : MonoBehaviour {
    private AsyncOperation asy;
    public UIProgressBar progressB;

    void Start () {
    if(progressB)
    progressB.value = 0;
    StartCoroutine(loadScene());
    }

    void Update () {
    // asy.progress在等于0.9的时候会跳转,因此在0.9的时候进度条要走满;
    if(asy.progress< 0.9f)
    progressB.value = asy.progress;
    else
    progressB.value = 1;
    }


    IEnumerator loadScene()

    {
    asy = Application.LoadLevelAsync("Start");
    yield return asy;//;¾Đ4”yield return”下M â
    }
    }

  • 相关阅读:
    lambda表达式
    解读Raft(一 算法基础)
    译《Time, Clocks, and the Ordering of Events in a Distributed System》
    如何在MQ中实现支持任意延迟的消息?
    读Kafka Consumer源码
    2017上海QCon之旅总结(下)
    2017上海QCon之旅总结(中)
    2017上海QCon之旅总结(上)
    什么是WAL?
    Push or Pull?
  • 原文地址:https://www.cnblogs.com/FingerCaster/p/6701269.html
Copyright © 2011-2022 走看看