同じような処理を重複して書かないようにする方法はいろいろあると思いますが、一例として。
例にもあがっていますが、私は、シーンをロード・アンロードする処理は一つのクラスでのみ行うようにしています。
C#
1using UnityEngine;
2using UnityEngine.SceneManagement;
3using System.Collections;
4
5public class SceneLoader : MonoBehaviour {
6 public void AdditiveScene(string sceneName) {
7 if (!SceneManager.GetSceneByName(sceneName).isLoaded) {
8 SceneManager.LoadScene(sceneName, LoadSceneMode.Additive);
9 }
10 }
11
12 public void UnloadScene(string sceneName) {
13 SceneManager.UnloadScene(sceneName);
14 }
15}
同様の処理をするときは、外部のクラスからこのメソッドを呼び出します。
C#
1using UnityEngine;
2using System.Collections;
3
4public class TestClass : MonoBehaviour {
5 void Start () {
6 SceneLoader sceneLoader = GameObject.FindObjectWithTag("SceneLoader").GetComponent<SceneLoader>();
7 sceneLoader.AdditiveScene("Main");
8 }
9}
シンプルにするとこんな感じです。
利用する側のスクリプトからは、メソッドの引数にシーン名を渡すだけでシーンを操作できます。
これだけの処理だと毎回書いた場合とコード量は大して変わりませんが、処理を追加・変更する場合は、全てのスクリプトで同様の処理を書き換える必要がなく、このコードを書き換えるだけで修正できるのでとても楽です。
実際は、シーンローダーが複数インスタンス化できないようにシングルトンを使ったり(シーンローダーが2つも3つもあるとおかしいですよね。)、シーン名を手打ちして間違えないように列挙型をメソッドの引数にしています。もちろんSceneLoader
クラスのメソッドはこれだけではなく、シーン操作は全てこのクラスで行うようにしています。
他にも、UIのCanvasGroupのフェード処理なども頻繁に使うので、一つのクラスに処理をまとめておいて、利用するときはそのメソッドを呼び出しています。こちらはケースによって、フェードの長さなどを変えられるようにフェードにかける時間をfloat型の引数にしています。