@Scene

2022-10-12
简介 Overview
说明
.场景管理 SceneManager需要引入SceneManagement包
.用到的场景必须在Build Setting中指定
语法
SceneManager.LoadScene( 场景索引 | 场景名字 [,加载模式] );
.根据场景索引/buildIndex加载
.根据场景名字/name加载
[用法1]切换场景后销毁前场景
SceneManager.LoadScene(0);
SceneManager.LoadScene("Main");
[用法2]切换场景后不销毁前场景
SceneManager.LoadScene(0, LoadSceneMode.Additive);
SceneManager.LoadScene("Main", LoadSceneMode.Additive);
[用法3]获取当前加载场景信息
name=GetActiveScene().name;
ind=GetActiveScene().buildIndex;
. 更多使用细节,请查阅API
硬转 Direct
[说明]场景切换瞬间完成,没有过渡
1.创建多个场景,如s0、s1、s2
2.在File->Build Setting...中把用到的场景都拖入;每个场景有自己的索引index,从0开始
添加场景
3.选择场景s0:
.创建一个空对象SM[使用场景现有的对象也可以,如相机、画布、按钮,仅仅需要一个脚本的载体]
.创建脚本SM.cs,声明场景跳转函数,并挂载到对象SM
.创建1个UI按钮,采用场景索引跳转到s1,增加按钮点击事件,分配函数LoadSceneByIndex()
.创建1个UI按钮,采用场景名字跳转到s2:增加按钮点击事件,分配函数LoadSceneByName()
  using System.Collections;
  using System.Collections.Generic;
  using UnityEngine;
  using UnityEngine.SceneManagement;

  public class SM : MonoBehaviour
  {
      public void LoadSceneByIndex(int ind)
      {
          SceneManager.LoadScene(ind);
      }    
      public void LoadSceneByName(string str)
      {
          SceneManager.LoadScene(str);
      }    
      public void onQuitGame()
      {
          Application.Quit();
      }
  }
分配函数
分配函数
4. 运行游戏,查看场景跳转效果
[拓展练习]在s1、s2场景中分别创建按钮、对象,复用SM.cs脚本,实现返回场景s0
[]如果没有在发布设置Build Setting中添加场景,将会告警
未添加场景
淡入淡出 Fade in-out
说明
. 淡入fadeIn:进场;场景画面由黑暗模糊逐渐变得清晰明亮、完全进入/显现。表示新的情节的开始。从无→有
. 淡出fadeOut:退场;场景画面由清晰明亮逐渐变得模糊暗淡,以至完全出去/消失。表示剧情一个段落的结束。从有→无
思路
.结束时,先播放过场动画,再开始加载新场景
.切换到新场景时,先播放动画,再加载
.使用协程实现场景的延时加载
转场思路
示例1:使用动画状态转换实现延迟转场
1.准备2个场景:S0、S1;在S0中完成:
2.创建画布Canvas
3.创建图像Image:
.铺满画布,填充黑色,透明度为0;取消Raycast Target;如果画布中有更多元素,请确保图像Image位于最上面,以便覆盖在所有元素之上
.创建从透明度0到不透明度255的过渡动画;取消动画循环Loop
.打开动画状态机,创建1个空状态Null,并设置为默认状态;创建Null状态和动画状态的过渡,条件设置为Bool:isOn;取消过渡等属性
动画状态机
4.创建脚本Demo.cs,指定图像Image的动画状态机,实现状态转换和协程加载;协程延迟时间应该略短于动画时间;挂载到画布Canvas
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Demo : MonoBehaviour
{
    public Animator animator;
    public void setAni()
    {
        StartCoroutine(loadSceneByName());
    }
    IEnumerator loadSceneByName()
    {
        animator.SetBool("isOn", true);
        yield return new WaitForSeconds(1);
        SceneManager.LoadScene("s1");
    }
}
5.创建按钮Button,指定脚本事件setAni()
6.运行游戏,查看转场过渡效果
示例2:使用动画事件实现延迟转场
[核心]在图像Image过渡动画结束前若干帧处,添加动画事件,指定为脚本中的loadSceneByName()方法;保留系统自动为对象添加的动画控制器组件Animator;为过渡图像Image指定animator变量;其它设置同上例
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Demo : MonoBehaviour
{
    public Animator animator;
    public void setAni()
    {
        animator.SetBool("isOn", true);
    }
    public void loadSceneByName(string str)
    {
        SceneManager.LoadScene(str);
    }
}
示例3:使用Animation组件转场
[核心]给画布Canvas添加动画Animation组件,控制它播放动画;动画快结束时,触发动画事件,加载场景;其它设置同前例
Animation组件设置
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;

public class Demo : MonoBehaviour
{
    public Animation ani;
    public void playAni()
    {
        ani.Play();
    }
    public void loadSceneByName(string str)
    {
        SceneManager.LoadScene(str);
    }
}
拓展 Extension
. Unity 如何制作转场动画
. 制作场景切换过度效果