精华内容
下载资源
问答
  • unity3d 切换场景

    千次阅读 2015-07-02 16:29:06
    1,我已经创建好两个场景,放在了如下目录 2,然后分别运行其场景,在运行的过程中,点击“File”->“Build Setting”; 如图所示,点击“Add Current”,场景就会自动加进去了 3,给LoginSence中的button加一...

    1,我已经创建好两个场景,放到Scene目录下


    2,然后分别运行其场景,在运行的过程中,点击“File”->“Build Setting”;

    如图所示,点击“Add Current”,场景就会自动加进去了


    3,给LoginSence中的button加一个点击事件,代码如下

    using UnityEngine;
    using UnityEngine.UI;
    using System.Collections;
    using UnityEngine.EventSystems;


    public class LoginMgr : MonoBehaviour {


    // Use this for initialization
    void Start () {
            Debug.Log("game is start");


            var LoginBtn = gameObject.GetComponent<Button>();


            if (LoginBtn.name == "Btn_Login")
            {
                LoginBtn.ButtonClickEvent = LoginMethod;
            }
    }


        public void LoginMethod(BaseEventData eventData)
        {
            Debug.Log("开始跳转场景");
            Application.LoadLevelAsync("SelectLevelSence");


            Debug.LogWarning("我成功啦");


        }




        void Awake() {
            Debug.Log(" this is LoginMgr's Awake()");
        }

    // Update is called once per frame
    void Update () {
            Debug.Log(" this is LoginMgr's Update()");
    }




     
    }

    Application.LoadLevelAsync("SelectLevelSence");和Application.LoadLevelAsync(1);这两种方法都可以.。一个是加载名“SelectLevelSence”的关卡,一个是加载索引为1的关卡


    4,运行游戏,点击按钮,就会进入下一个场景了

    展开全文
  • Unity3d 切换场景过度动画

    千次阅读 2017-12-20 10:22:03
    背景 通常游戏的主场景包含的资源较多,这会导致加载场景的时间较长。为了避免这个问题,可以首先加载Loading场景,然后再通过Loading场景来...在Unity中可以通过调用Application.LoadLevelAsync函数来异步加载游戏

    背景

    通常游戏的主场景包含的资源较多,这会导致加载场景的时间较长。为了避免这个问题,可以首先加载Loading场景,然后再通过Loading场景来加载主场景。因为Loading场景包含的资源较少,所以加载速度快。在加载主场景的时候一般会在Loading界面中显示一个进度条来告知玩家当前加载的进度。在Unity中可以通过调用Application.LoadLevelAsync函数来异步加载游戏场景,通过查询AsyncOperation.progress的值来得到场景加载的进度。

    尝试——遇到问题

    第一步当加载完Loading场景后,调用如下的LoadGame函数开始加载游戏场景,使用异步加载的方式加载场景1(Loading场景为0,主场景为1),通过Unity提供的Coroutine机制,我们可以方便的在每一帧结束后调用SetLoadingPercentage函数来更新界面中显示的进度条的数值。

    public void LoadGame() {
        StartCoroutine(StartLoading_1(1));
    }
    
    private IEnumerator StartLoading_1(int scene) {
        AsyncOperation op = Application.LoadLevelAsync(scene);
        while(!op.isDone) {            
            SetLoadingPercentage(op.progress * 100);
            yield return new WaitForEndOfFrame();
        }        
    }
    

    最后进度条的效果显示如下:

    进度条并没有连续的显示加载的进度,而是停顿一下切换一个数字,再停顿一下切换一个数子,最后在没有显示100%就情况下就切换到主场景了。究其原因在于Application.LoadLevelAsync并不是真正的后台加载,它在每一帧加载一些游戏资源,并给出一个progress值,所以在加载的时候还是会造成游戏卡顿,AsyncOperation.progress的值也不够精确。当主场景加载完毕后Unity就自动切换场景,所以上述代码中的while循环体内的代码是不会被调用的,导致进度条不会显示100%。

    修补——100%完成

    为了让进度条能显示100%,取巧一点的办法是将AsyncOperation.progress的值乘上2,这样当加载到50%的时候界面上就显示100%了。缺点是当界面上显示100%的时候,用户还要等待一段时间才会进入游戏。其实Unity提供了手动切换场景的方法,把AsyncOperation.allowSceneActivation设为false就可以禁止Unity加载完毕后自动切换场景,修改后的StartLoading_2代码如下:

    // this function is not work
    private IEnumerator StartLoading_2(int scene) {
        AsyncOperation op = Application.LoadLevelAsync(scene);
        op.allowSceneActivation = false;
        while(!op.isDone) {
            SetLoadingPercentage(op.progress * 100);
            yield return new WaitForEndOfFrame();
        }
        op.allowSceneActivation = true;   
    }
    

    我们首先将AsyncOperation.allowSceneActivation设为false,当加载完成后再设为true。代码看上去没有错,但是执行的结果是进度条最后会一直停留在90%上,场景不会切换。通过打印log发现AsyncOperation.isDone一直为falseAsyncOperation.progress的值增加到0.9后就保持不变了,也就是说场景永远不会被加载完毕。

    在这个帖子中找到了答案,原来把allowSceneActivation设置为false后,Unity就只会加载场景到90%,剩下的10%要等到allowSceneActivation设置为true后才加载,这不得不说是一个坑。所以代码改为如下。当AsyncOperation.progress到达0.9后,就直接把进度条的数值更新为100%,然后设置AsyncOperation.allowSceneActivationture,让Unity继续加载未完成的场景。

    private IEnumerator StartLoading_3(int scene) {
        AsyncOperation op = Application.LoadLevelAsync(scene);
        op.allowSceneActivation = false;
        while(op.progress < 0.9f) {
            SetLoadingPercentage(op.progress * 100);
            yield return new WaitForEndOfFrame();
        }
        SetLoadingPercentage(100);
        yield return new WaitForEndOfFrame();
        op.allowSceneActivation = true;   
    }
    

    最后的效果如下:

    打磨——增加动画

    上述的进度条虽然解决了100%显示的问题,但由于进度条的数值更新不是连续的,所以看上去不够自然和美观。为了看上去像是在连续加载,可以每一次更新进度条的时候插入过渡数值。这里我采用的策略是当获得AsyncOperation.progress的值后,不立即更新进度条的数值,而是每一帧在原有的数值上加1,这样就会产生数字不停滚动的动画效果了,迅雷中显示下载进度就用了这个方法。

    private IEnumerator StartLoading_4(int scene) {
        int displayProgress = 0;
        int toProgress = 0;
        AsyncOperation op = Application.LoadLevelAsync(scene);
        op.allowSceneActivation = false;
        while(op.progress < 0.9f) {
            toProgress = (int)op.progress * 100;
            while(displayProgress < toProgress) {
                ++displayProgress;
                SetLoadingPercentage(displayProgress);
                yield return new WaitForEndOfFrame();
            }
        }
    
        toProgress = 100;
        while(displayProgress < toProgress){
            ++displayProgress;
            SetLoadingPercentage(displayProgress);
            yield return new WaitForEndOfFrame();
        }
        op.allowSceneActivation = true;
    }
    

    displayProgress用来记录要显示在进度条上的数值,最后进度条的动画如下:

    对比第一种的进度条

    总结

    如果在加载游戏主场景之前还需要解析数据表格,生成对象池,进行网络连接等操作,那么可以给这些操作赋予一个权值,利用这些权值就可以计算加载的进度了。如果你的场景加载速度非常快,那么可以使用一个假的进度条,让玩家看上几秒钟的loading动画,然后再加载场景。总之进度条虽然小,但要做好也是不容易的。

    参考

    1. 阿高.Unity 显示Loading(加载)进度 对于网上流行的方法进行更正
    2. Unity3d官方论坛.using allowSceneActivation
    展开全文
  • unity3d 切换场景过度动画

    万次阅读 2015-11-03 16:58:38
    背景 通常游戏的主场景包含的资源较多,这会导致加载场景的时间较长。为了避免这个问题,可以首先加载Loading场景,然后再通过Loading场景来...在Unity中可以通过调用Application.LoadLevelAsync函数来异步加载游戏

    背景

    通常游戏的主场景包含的资源较多,这会导致加载场景的时间较长。为了避免这个问题,可以首先加载Loading场景,然后再通过Loading场景来加载主场景。因为Loading场景包含的资源较少,所以加载速度快。在加载主场景的时候一般会在Loading界面中显示一个进度条来告知玩家当前加载的进度。在Unity中可以通过调用Application.LoadLevelAsync函数来异步加载游戏场景,通过查询AsyncOperation.progress的值来得到场景加载的进度。

    尝试——遇到问题

    第一步当加载完Loading场景后,调用如下的LoadGame函数开始加载游戏场景,使用异步加载的方式加载场景1(Loading场景为0,主场景为1),通过Unity提供的Coroutine机制,我们可以方便的在每一帧结束后调用SetLoadingPercentage函数来更新界面中显示的进度条的数值。

    public void LoadGame() {
        StartCoroutine(StartLoading_1(1));
    }
    
    private IEnumerator StartLoading_1(int scene) {
        AsyncOperation op = Application.LoadLevelAsync(scene);
        while(!op.isDone) {            
            SetLoadingPercentage(op.progress * 100);
            yield return new WaitForEndOfFrame();
        }        
    }
    

    最后进度条的效果显示如下:

    进度条并没有连续的显示加载的进度,而是停顿一下切换一个数字,再停顿一下切换一个数子,最后在没有显示100%就情况下就切换到主场景了。究其原因在于Application.LoadLevelAsync并不是真正的后台加载,它在每一帧加载一些游戏资源,并给出一个progress值,所以在加载的时候还是会造成游戏卡顿,AsyncOperation.progress的值也不够精确。当主场景加载完毕后Unity就自动切换场景,所以上述代码中的while循环体内的代码是不会被调用的,导致进度条不会显示100%。

    修补——100%完成

    为了让进度条能显示100%,取巧一点的办法是将AsyncOperation.progress的值乘上2,这样当加载到50%的时候界面上就显示100%了。缺点是当界面上显示100%的时候,用户还要等待一段时间才会进入游戏。其实Unity提供了手动切换场景的方法,把AsyncOperation.allowSceneActivation设为false就可以禁止Unity加载完毕后自动切换场景,修改后的StartLoading_2代码如下:

    // this function is not work
    private IEnumerator StartLoading_2(int scene) {
        AsyncOperation op = Application.LoadLevelAsync(scene);
        op.allowSceneActivation = false;
        while(!op.isDone) {
            SetLoadingPercentage(op.progress * 100);
            yield return new WaitForEndOfFrame();
        }
        op.allowSceneActivation = true;   
    }
    

    我们首先将AsyncOperation.allowSceneActivation设为false,当加载完成后再设为true。代码看上去没有错,但是执行的结果是进度条最后会一直停留在90%上,场景不会切换。通过打印log发现AsyncOperation.isDone一直为falseAsyncOperation.progress的值增加到0.9后就保持不变了,也就是说场景永远不会被加载完毕。

    在这个帖子中找到了答案,原来把allowSceneActivation设置为false后,Unity就只会加载场景到90%,剩下的10%要等到allowSceneActivation设置为true后才加载,这不得不说是一个坑。所以代码改为如下。当AsyncOperation.progress到达0.9后,就直接把进度条的数值更新为100%,然后设置AsyncOperation.allowSceneActivationture,让Unity继续加载未完成的场景。

    private IEnumerator StartLoading_3(int scene) {
        AsyncOperation op = Application.LoadLevelAsync(scene);
        op.allowSceneActivation = false;
        while(op.progress < 0.9f) {
            SetLoadingPercentage(op.progress * 100);
            yield return new WaitForEndOfFrame();
        }
        SetLoadingPercentage(100);
        yield return new WaitForEndOfFrame();
        op.allowSceneActivation = true;   
    }
    

    最后的效果如下:

    打磨——增加动画

    上述的进度条虽然解决了100%显示的问题,但由于进度条的数值更新不是连续的,所以看上去不够自然和美观。为了看上去像是在连续加载,可以每一次更新进度条的时候插入过渡数值。这里我采用的策略是当获得AsyncOperation.progress的值后,不立即更新进度条的数值,而是每一帧在原有的数值上加1,这样就会产生数字不停滚动的动画效果了,迅雷中显示下载进度就用了这个方法。

    private IEnumerator StartLoading_4(int scene) {
        int displayProgress = 0;
        int toProgress = 0;
        AsyncOperation op = Application.LoadLevelAsync(scene);
        op.allowSceneActivation = false;
        while(op.progress < 0.9f) {
            toProgress = (int)op.progress * 100;
            while(displayProgress < toProgress) {
                ++displayProgress;
                SetLoadingPercentage(displayProgress);
                yield return new WaitForEndOfFrame();
            }
        }
    
        toProgress = 100;
        while(displayProgress < toProgress){
            ++displayProgress;
            SetLoadingPercentage(displayProgress);
            yield return new WaitForEndOfFrame();
        }
        op.allowSceneActivation = true;
    }
    

    displayProgress用来记录要显示在进度条上的数值,最后进度条的动画如下:

    对比第一种的进度条

    总结

    如果在加载游戏主场景之前还需要解析数据表格,生成对象池,进行网络连接等操作,那么可以给这些操作赋予一个权值,利用这些权值就可以计算加载的进度了。如果你的场景加载速度非常快,那么可以使用一个假的进度条,让玩家看上几秒钟的loading动画,然后再加载场景。总之进度条虽然小,但要做好也是不容易的。


    原文:http://blog.csdn.net/jiejieup/article/details/33392293

    展开全文
  • Unity3D切换场景保存游戏对象不销毁

    万次阅读 2018-06-21 19:44:22
    using UnityEngine.SceneManagement;public class Doo : MonoBehaviour{ public static Doo instance;... void Start() { //该单例脚本是避免跳转场景时出现多个该物体 if (instance != null) { ...
    using UnityEngine.SceneManagement;
    public class Doo : MonoBehaviour
    {
        public static Doo instance;
        int a = 0;
        void Start()
        {
          //该单例脚本是避免跳转场景时出现多个该物体
            if (instance != null)
            {
                return;
            }
            else {
               instance = this;
               //避免场景加载时该对象销毁
                DontDestroyOnLoad(gameObject);
            }
            //新的方法 利用lambda表达式代替OnLevelWasLoaded回调方法
            SceneManager.sceneLoaded += (var,var2) => {
        //根据不同场景给游戏对象变换不同位置

              if (var.buildIndex == 1)

               {
                   transform.position = new Vector3(2, 3, 4);
               }
               if (var.buildIndex == 0)
               {
                   transform.position = new Vector3(4, 4, 5);
               }
           };
        }
        //该方法只有场景跳转时回调 (即将被弃用的方法 新方法见上 SceneManager.sceneLoaded )
        private void OnLevelWasLoaded(int level)
        {

        }
        private void Update()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
               // a = ++a % 2;
                a = a == 1 ? 0 : 1;
                SceneManager.LoadScene(a);
            }
        }

    展开全文
  • 加载场景时的脚本 public static AsyncOperation async; async = Application.LoadLevelAsync("SelectCarModelScreen"); 在加载场景里写 if (MainInterfaceGUIScript.async.isDone == false)  {  //
  • DontDestroyOnLoad(gameObject); 转载于:https://www.cnblogs.com/wowanyasuo/p/5976921.html
  • 问题:切换游戏场景后当前游戏场景灯光变暗,如下: ...选择的光照若是 gi realtime 实时光照,就会出现切换场景后光照不渲染的情况 解决方法如下(选择没有成功渲染的场景进行设置):  ...
  • 我这里想讨论的是切换场景引发的对象池中对象的问题。  首先如果你什么都不处理,那么一旦你切换场景,你会发现你对象池中所有GameObject本身或者变量全部都变成了null。你下次使用这个对象就会抛出指针异常,所以...
  • 首先创建两个场景: One,Two 再创建一个空游戏对象: GameObject,并添加AudioSource组件,把要播放的音乐拖放进去 给GameObject添加脚本AlwayAudio,代码如下: 1 using UnityEngine; 2 using System.Collections...
  • unity3d无缝场景切换解决方案(1)-简单场景切换所谓无缝场景切换,无非是涉及到场景或物体的预读,复杂点涉及下场景卸载,在复杂点涉及到场景二维数组,再在复杂点涉及数据结构用二叉树实现场景资源有序的读取与卸载...
  • Unity3D无缝场景切换解决方案 - 简单场景切换
  • Unity3D 场景切换

    千次阅读 2018-09-11 10:49:16
    Unity3D中,一个场景在运行中切换到另一个场景的方法 1. 在Unity中 File-&gt;Build Settings-&gt;把要切换场景添加到Scenes In Build下面,也可以Add Open Scenes,添加完关闭这个页面,不要点 Build ...
  • Unity3D切换过度场景

    2015-03-18 22:49:57
    参考雨松博客:... A、B、C 三个场景 using UnityEngine; using System.Collections; public class B : MonoBehaviour {  //异步对象  AsyncOperation async;  //读取场景的进
  • unity3d 游戏场景切换

    千次阅读 2019-07-29 18:04:11
    LevelSelect using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; public class LevelSelect : MonoBehaviour { ... // Use this for initializati....
  • Unity3D场景切换

    2021-04-21 13:42:56
    简单切换 1.首先你要有多个场景-Scene (没有的话新建几个) 2.在上方菜单栏中选择File-Build Settings添加当前场景 上图显示的为已添加的场景列表: 可以注意到每个添加的场景都会有一个索引. 3.在脚本里调用语句 ...
  • Unity3d场景切换

    千次阅读 2016-10-21 17:12:57
    //为了方便演示,在第一个场景内设置一个按钮,点击这个按钮,触发切换场景时间 //在该场景内的按钮添加一个C#脚本组件Component //在Button控件创建的组件 //在常见组件之前,我们先创建一个...
  • Unity3D-场景切换&场景间信息传递

    千次阅读 2014-09-10 17:32:15
    我在用Unity3D做一个回合制的战斗游戏,有两个场景(小镇的场景和战斗的场景),每当角色遇到怪兽,游戏就切换到战斗场景,角色就在这里战斗,直到打败怪兽或者被击败。 问题是怎样才能在回到townScene时保持进入...
  • Unity3D 场景切换卡顿

    2016-05-31 04:24:13
    我用Unity3d做了一个虚拟工厂,但是在场景切换时,卡得厉害。比如说漫游时,选中一个 设备查看细节,这个时候卡顿得厉害,影响用户体验,请问有没有什么解决办法呢?
  • unity3d场景切换

    2018-09-03 20:12:47
    首先,新建两个场景,Scene1和Scene2.点击File——Build Setting,把两个场景都添加进去。 在Scene1中添加一个Button。在Canvas绑定如下脚本:  public Button but;  void Start ()  {  but = GameObject....
  • SceneManager.LoadSceneAsync() : 异步场景切换Unity会在后台线程中加载所有资源,并保存之前场景的游戏对象,我们在加载过程中获取到加载的进度,可以播放一个真实的进度条,来看加载进度。 注意...
  • 持久化简单的数据储存在Unity3D 中提供了一个简单有效的方法,如果之前的你做过Android的开发你会发现在Unity3D中持久化数据的储存和Android非常的想象。那么下面MOMO 将用一个简单有效的例子向大家介绍Unity3D中...
  • Unity3D 上 制作了两个场景 第一个场景为开始画面:场景中设置有两个粒子特效,Button上也设置有动画效果 第二个场景是游戏内容玩法,添加有一个第一人称视角人物,鼠标隐藏。 游戏运行过程中没有任何报错 ...
  • 因此,UGUI的事件设置也是很重要的,下面举个例子来说明,Unity3D中如何进行场景切换、UGUI组件事件、开始游戏与关闭游戏的。如下图所示: 我们将设置2个场景,其中一个场景极其简单,只有

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 398
精华内容 159
关键字:

unity3d切换场景