始めに
複数人でunityっているとsceneがどうしても衝突してしまいます。できるだけ衝突しないように開発はするのですがどうしても被ってしまう.そんな可能性を少しでも減らすためにsceneを分割したくなりました。
ということでどのようにすればプレーヤにイライラを与えないように分割できるのかを考えたのがこの記事です。そしてできるだけ開発する側も楽ができるように頑張ります。
もっといい方法があればぜひ教えてください!
シーン構成
- root_scene:カメラ、ステータス画面やプレーヤなど全体で使用するものを置く
- room1:フィールド/敵キャラなどそのシーンに紐づくもの
- room2
- …
このようにシーンを分割することで、ステータス画面の修正とフィールド作成が被っても修正が競合しないため、マージ不要となります。
root_sceneだけzがずれており,charaに付随して動きます。charaがload pointに到達したらroom2をロードします。load pointはカメラの視界的に次シーンが見えるぎりぎりに置くことでシーンがないことをプレーヤに悟られなくなります。
こんな感じです。
シーン読み込み/廃棄コード
読み込み側は単純でSceneManagerを使用します。
引数にLoadSceneModeのAdditiveを渡せば読み込まれます。
簡単ですね。注意すべきはシーンごとの座標が違うと困ったことになる点なのでそこはちゃんと管理して作らなくてはいけない事でしょうか。
またシーン重複に関しては
UnityのSceneManagerで、シーンが存在するか確認する を参照して作成しました。
サンプルコード
1public static class Scene
2{
3 /// <summary>
4 /// 重複を考慮してロードします
5 /// (既に読み込まれている場合はロードしません)
6 /// </summary>
7 /// <param name="name">シーン名称</param>
8 public static void LoadScene(string name)
9 {
10 if (ContainsScene(name) == false)
11 {
12 SceneManager.LoadSceneAsync(name, LoadSceneMode.Additive);
13 }
14 }
15
16 /// <summary>
17 /// シーンを開放します
18 /// </summary>
19 /// <param name="name">シーン名称</param>
20 public static void UnLoadScene(string name)
21 {
22 if (ContainsScene(name) == true)
23 {
24 SceneManager.UnloadSceneAsync(name);
25 }
26 }
27
28 /// <summary>
29 /// シーンがロードされているかどうかを調べます
30 /// </summary>
31 /// <param name="name">調べたいシーン名</param>
32 /// <returns>ロードされている場合がtrue</returns>
33 private static bool ContainsScene(string name)
34 {
35 bool result = false;
36 for (int i = 0; i < SceneManager.sceneCount; i++)
37 {
38 if (SceneManager.GetSceneAt(i).name.Equals(name) == true)
39 {
40 result = true;
41 break;
42 }
43 }
44 return result;
45 }
46}
47
48public class SceneTransPoint : MonoBehaviour
49{
50 [SerializeField] string scene_name;
51
52 void OnTriggerEnter2D(Collider2D other)
53 {
54 //なにか触れたら読み込むという想定
55 SceneFacade.LoadScene(scene_name);
56 }
57}