シーン遷移

■概要

ゲームはタイトルやステージ、リザルトなどの数多くのシーンがあります。
Unityではシーンを「.unityファイル」として管理しており、
1つのプロジェクトに複数のシーンを作成し、それを切り替えることでゲームを実行しています。
シーンファイルは複数作成できますが、シーンの編集は1つしかできないので注意して下さい。
	
●リソースについて
	シーン自体は「unity」のファイルで分けますが、
	シーンで作成したプレハブ化したゲームオブジェクトやテクスチャ、3Dモデルなどの
	リソースはプロジェクトで共有して使用することが可能です。

	unity_0039

■シーンの新規作成方法

シーンは作成方法は主に二つあります。
「メニューから追加」と「ショートカットキー使用」です。

	①.メニューから追加
		メニューからの追加は上段メニューのFile => NewSceneで追加可能です。

	②.ショートカットキー使用
		シーン作成のショートカットキーは「Ctr + N」となっており、
		このショートカットを使用することで新しいシーンを作成できます。

どちらの手法で新しいシーンを作成する場合やシーンを切り替える場合
現在のシーンが修正中なら、保存の確認ウィンドウが表示されますので
保存、キャンセル、保存せずにコマンド(シーン作成 or 切り替え)の実行から選択します。

unity_0040

■シーンの複製

シーンを複製したい方法もシーンの新規作成と同じで
「メニューから追加」「ショートカットキー使用」の二つです。

	①.メニューから追加
		1-1.複製したいシーンファイルをクリックして選択状態にする
			
		1-2.上段メニューのEdit => Duplicateを選択する

	②.ショートカットキー使用
		2-1.複製したいシーンファイルをクリックして選択状態にする

		2-2.「ctr + D」を押す

■シーン遷移

シーンの遷移はスクリプトを使用して行います。

●手順
	①.プロジェクトを作成する

	②.「Ctr + S」を押して「Scene01.unity」として保存する

	③.Cubeオブジェクトを作成する。

	④.空のゲームオブジェクトを作成する

	⑤.スクリプトScene01を作成する

	⑥.以下のコードを記述する
		using UnityEngine;
		using System.Collections;
		using UnityEngine.SceneManagement;

		public class Scene01 : MonoBehaviour {
			// Use this for initialization
			void Start () {
			
			}
				
			// Update is called once per frame
			void Update () {
				// マウスを左クリックした瞬間
				if (Input.GetMouseButtonDown (0) == true) {
					// Unityバージョン 5.3以降
					// SceneManager.LoadScene ("Scene02");
				}
			}
		}

	⑦.新しいシーンを作成する

	⑧.「Ctr + S」を押して「Scene02.unity」として保存する

	⑨.Sphereオブジェクトを作成する

	⑩.空のゲームオブジェクトを作成する

	⑪.スクリプトScene02を作成する

	⑫.以下のコードを記述する
		using UnityEngine;
		using System.Collections;
		using UnityEngine.SceneManagement; // 追加

		public class Scene02 : MonoBehaviour {

			// Use this for initialization
			void Start () {
					
			}
					
			// Update is called once per frame
			void Update () {
				// マウスを左クリックした瞬間
				if (Input.GetMouseButtonDown (0) == true) {
					// Unityバージョン 5.3以降
					// SceneManager.LoadScene ("Scene01");
				}
			}
		}

	⑬.上段メニューのFile => BuildSettingsをクリックして
	  BuildSettingsウィンドウを開く
	
		unity_0041

	⑭.Scene01.unityファイルをBuildSettingsウィンドウにD&Dする

	⑮.Scene02.unityファイルをBuildSettingsウィンドウにD&Dする

	⑯.Build&Settingsの「Scenes In Build」の内容が
	  以下のSSと同じになっているかを確認する

		unity_0042

	⑰.Build&Settingsウィンドウを閉じる

	⑱.実行する
	  マウスの左クリックでScene01とScene02が切り替わる

●シーン切り替え関数
	シーン切り替え関数にはLoadScene関数を使用します。

	・LoadScene関数
		戻り値:
			なし
		
		引数:
			その1:
				第一引数:
					シーンファイル名
			
				第二引数:
					切り替え方式(デフォルト引数 => Single)
		
			その2:
				第一引数:
					シーンインデックス番号
			
				第二引数:
					切り替え方式(デフォルト引数 => Single)
			
		内容:
			Unity5.3以降のバージョンで推奨されている
			シーン遷移用関数で、シーンファイル名またはBuildSettingsで設定した
			シーンのインデックス番号を使用してシーンを遷移させる
			この時に第二引数に切り替えの方法を指定できる
	
			※SceneManagerクラスを使用する場合以下の一文を
			 ソースファイルに追加して下さい。
			
				using UnityEngine.SceneManagement; // 追加
				
	・シーンの切り替え方式
		・Single
			現在のシーンを閉じてからシーンを読み込む

		・Additive
			現在のシーンに新たなシーンを追加する

		・SingleとAdditiveの違い
			Singleは現状のシーンを全て閉じて新しくシーンを開きますが、
			Additiveは現状のシーンを残したまま新しいシーンを開きます。
			ゲームにおいてメニュー画面やステータス画面などのような
			一時的に画面に表示する画面に対して有効な手法です。

	・シーンを閉じる
		Additiveを使用したシーンの読み込みの場合、
		どちらかのシーンを閉じる処理が必要になる時があります。
		例えばメニューシーンをAdditiveで読み込んだあとに
		メニューを閉じる処理を行ったらメニューシーンは閉じる必要があります。
		そのような時はUnloadScene関数を使用します。

		UnloadScene:
			戻り値:
				なし
		
			引数:
				その1:
					第一引数:
						シーンファイル名
			
				その2:
					第一引数:
						シーンインデックス番号
			
			内容:
				引数で指定されたシーンを閉じる

●Scenes In Buildへの追加
	シーン遷移を行うにはUnityにどのようなシーンを用意しているかを
	伝えて管理してもらう必要があります。
	その伝達方法として用意されているのが「Scenes In Build」です。
	Scenes In Buildへシーンファイルを追加することで
	Unityが追加されたシーンを管理してくれて、
	LoadLevelやLoadScene関数を使用できるようになります。
	「Scenes In Build」へ通知を行っていないシーンへの遷移はできませんので
	注意をして下さい。
	また、「Scenes In Build」のシーン番号「0」番はゲーム起動時に
	最初に起動されるシーンとなりますので「0」番のシーンの指定には気をつけてください。

■非同期

通常のLoadSceneは同期読み込みなので、次のシーンファイルのサイズが大きいと
読み込みに時間がかかり、その間画面がフリーズしたようになるので
ロード前にローディング画面を描画するなどしてフリーズでないことを
ユーザーに伝える必要があります。
非同期ではシーンが切り替わる準備ができるまで、処理が止まることはないので、
読み込みが完了するまで現在のシーンを表示したり、アニメーション付きの
ローディング画面を出したりと切り替え時の演出を追加することが可能です。

●非同期メソッド
	シーンの非同期読み込みはLoadSceneAsyncを使用します。
	引数などはLoadSceneと同じですが戻り値がAsyncOperation型となっています。
	このAsyncOperation型はこれはコルーチンで使用します。
	※コルーチンを使用しなくともUpdateなどの通常メソッドでも使用可能です。

	例1:
		次の例は単純に切り替えを待つ処理になります。
		この例では切り替えの前後で何もしていないので通常時にLoadSceneAsyncを
		呼び出すことと変わりません。

		IEnumerator SceneChange()
		{
			yield return
				 SceneManager.LoadSceneAsync("Scene02", LoadSceneMode.Additive);

		}

	例2:
		前提:
			operation.allowSceneActivation  => 
							自動切り替えを行うかどうかのフラグ
								true => 切り替えON
								false => 切り替えOFF

			operation.progress => 切り替えの進捗 (0.0 ~ 1.0fまで)


		以下の例ではシーン切り替えは終了しても自動で行わないようにして
		切り替えの進捗を表示しています。
		例のように切り替えを使った演出を実装することも可能です。

		IEnumerator SceneChange()
		{
			AsyncOperation operation = 
				SceneManager.LoadSceneAsync("Scene02", LoadSceneMode.Additive);

			// 自動で切り替わらないようにする
			operation.allowSceneActivation = false;

			while (operation.progress < 1.0f)
			{
				Debug.Log(operation.progress + "%読み込み完了");
				yield return null;
			}

			// 切り替えON
			operation.allowSceneActivation = true;
		}