いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

ゲームでステージが変わるとき、暗転する方法

ぼくはUnityで何かゲームを書くとき、「シーンの変更」というのをやったことがありません。実験で何回か試したことはありますが、実際のプログラムではステージの進行に伴うオブジェクトの処理(削除、新しいオブジェクトの生成など)など、全部自前です(要するに昔通りのやり方!)。しかしステージ1からステージ2に進むとき、丸見えの状態で舞台を組み立て直すのは見苦しいかも知れません。演劇みたいに舞台を暗転して、その間にオブジェクトを配置し直すなどすればよいでしょう。今回はその暗転の方法の説明です。

 

暗転のためのパネル(UIオブジェクト)を用意します。これでゲームの画面を覆っておきます。パネルはインスペクタで色を真っ黒に、そしてα値を0にしておきます。α値を0にするとパネルが完全に透けて向こうのゲーム画面が見え、α値を255にするとパネルは真っ黒ですからゲーム画面は見えなくなります。そこで、α値を0~255に連続的に変化させればパネルの向こうのゲーム画面がジワッと見えなくなり、続いて255~0に変化させれば徐々に見えるようになるわけです。パネルのRaycastTargetはチェックを外しておきます。そうしないとマウスなどの入力がパネルに取られてしまい、ボタンなどを押せなくなるからです。

パネルのゲームオブジェクトをあらかじめ取得しておきます。次の関数は、パネルのゲームオブジェクトをgoとして、パネルの持っているImageコンポーネントのα値をaにセットする働きを持ちます。

//--------------------------------------

using UnityEngine.UI;//Imageを扱うためにこれが必要

……

 

void setAlpha(GameObject go, float a) {
    Image img = go.GetComponent<Image>();
    Color c = img.color;
    c.a = a;
    go.GetComponent<Image>().color = c;
}

//--------------------------------------

これを用い、徐々にα値を変化させるだけです。

(注意:a = 0fでα値=0、a = 1fでα値=255となる)

実際にはぼくは次のようなコルーチンでやっています。

//-----------------------------------------
//t秒でα値を目標の値、alphaに徐々に変更
//
IEnumerator changeAlpha(GameObject go, float t, float alpha) {
    Image img = go.GetComponent<Image>();
    Color c = img.color;
    float dt = 0.05f;//dt秒毎にα値を変化させる
    int k = (int)(t / dt);
    float da = (alpha - c.a) / k;
    for (int i = 0; i < k; i++) {
        yield return new WaitForSeconds(dt);;
        c.a += da;
        setAlpha(go, c.a);
    }
    yield break;
}
//-------------------------------

例えば

StartCoroutine(changeAlpha(go, 0.5f, 1f))

で、0.5秒でα値を現在の値から255に変化させることになります(0.5秒で真っ暗になる)

 

久しぶりに3Dのゲームを書いています。とりあえずまあまあ順調。充実しています。ひと月くらいで公開まで持って行きたいです。