Unity勉強 第8回 「シーンの切り替え」

木内智史之介(シャッチョー)
ミンカさんけっこんしてくださいおねがいします(ズザー
SEGAさん、DIVAの筐体ください(ズザー

前回のおさらい&今回の目標

おはようございます。深キョンが好きなのか、はたまたミンカが好きなのか…どちらかを決めきれない罪な漢(おとこ)、智史之介です。
今日も元気にUnityに関する勉強を行おうと思います。

前回は「Android向けのビルド」を試してみました。 迂闊なAndroidSDKのバージョンアップで痛い目を見たのはいい思い出です。
(どうやらUnityのアップデート(ver4.1.4)が入り、この問題は解消されたみたいですね!)

今日は「シーンの切り替え」に関してちょっと試してみようかななんて思っています。

シーンの切り替えとは?

例えば、そうですね、ドラクエで言えば「街から出てフィールドに入る」とか「フィールドで敵に遭遇する」とかでしょうか?
画面が、バーッってまったく別の描画系統で表示されるやつです。

フィールドから戦闘画面へ

そうそう。こんな感じの切り替えに関してです。 こういったシーンの切り替えに関して、そもそもの必須要件がいくつかあるかと思います。

  • 独立した描画スペース
  • 独立した変数領域
  • 独立したプログラム領域

などがシーン使い分けの必須条件ではないかなと思われます。
Flashで言うところのムービークリップにあたるものでしょうか?

Unityにおいて、それに該当するものがないか探したいと思います。

ずばり、それって「Scene」でしょ?

そんな決めつけで作業開始です。

さくっと「scene1」と「scene2」を用意します。 sceneの作成は「Cmd+n」で可能です。

scene作成

あと、以前から不思議だったのですが「cmd+s」でsceneの保存になります。

あれ?けど、これってつまり「Unityではsceneこそもっとも重要で、最も保存を行う対象」ということですよね?

不思議だったんですよ、これ。
自分にとってFlashとの対比としては、

  • scene = ムービークリップ
  • プロジェクト = flaファイル

というとらえ方をしていました。
これが間違っている可能性があるということなんですよね。。
どうしよう。不安になってきてしまいました。

「プロジェクトさえ保存しておけばsceneも保存されるんでしょ?」というぬるい考えでいたことを反省しなくてはならないかもしれません。

なにはともあれ、作成した二つのsceneに異なる別々の画像を貼り付けておきます。
わかりやすく背景の色でも変えておくとよいかもしれません。
(背景の色は、hierarchy配下のmain cameraのインスペクターから変更可能です。)

この二つのシーンを利用して、

「scene1の画像をタップすると、scene2に切り替わる」

という動作を試してみることにします。

プログラムをさくっと書いてみる

さて、シーンの切り替えのためのスクリプトを記述する必要があります。
「SceneSwicher.js」というファイルを用意して、scene1の画像にアタッチします。

1
2
3
4
function OnMouseUpAsButton() {
    Debug.Log('Now scene is ' + Application.loadedLevelName);
    Application.LoadLevel('scene2');
}

これでいけるんじゃないか?なんていう甘い考えで実行してみると…

Level ‘scene2’ (-1) couldn’t be loaded because it has not been added to the build settings. To add a level to the build settings use the menu File->Build Settings…

というお叱りをいただきました。ハイ。
言われた通りに、build settingsにシーンを追加します。

build settingsに追加

これで、正常にシーンの切り替えができるようになりました。

build settingsに追加

けれども、、、、うーん。これではなんだかスイッチを切り替えるように切り替わってしまうので、イマイチ想像と違うのは否めないですね…。
本当は、もっと、こう、例えば、「上から次のシーンが落ちてくる」、というような感じの切り替えをやりたいのです。

はたしてそんな事が可能なのか?

ずいぶん長い間ググってみたのですが、どうにも難しそうですね…。
シーンをまたいだ変数の保持すら、ちょっとしたトリッキーな手法が必要そうなので、シーンの上にシーンをかぶせる(二つのシーンを同時に描画する)なんてもってのほか、という感じですかね…。
致し方無しです!今回はそれは諦めることにします。

自分がもし、こういった制限(1シーンの描画しかできない)内で、今思い描いている手法を実現するなら、うーん、そうですね…。
たとえば、こんな感じではできないでしょうか?

スクリーンショット的なものを撮り内部領域に保存する。次のシーンは内部領域に保存されたスクリーンショットをまず最初に描画し、その上にシーンの突入演出を表示する

難しいかな…?

次回に向けて

今回は、シーンの切り替えに関して試してみました。Unityはどうもこの「シーン」というものにすごく苦労しそうな印象ですね…。
エンジニアとしては多少苦労する方が楽しくていいんですけどね!

次回は、「永続データストレージ領域に保存/読み込み」というものを試して見たいと思います。
(そういう機能があるかどうかも分からないんですが…!)

シーンをまたいだ変数とかではなく、たとえばゲームを落とすなどしても次回起ち上げ時に読み出し可能なデータ、とかそういうものですね。
次回も楽しみですね〜。