トーフメモ

主にゲーム制作

【Unity】画面を超高速で切り替えて二重スクロールを作る

はじめに

みなさんは、「地球解放軍ジアース」というゲームをご存知でしょうか?
ゲームボーイの残像を利用して二重スクロールを作ったゲームとして有名です。
でも、あくまでゲームボーイの特性を利用したものなので、「地球解放軍ジアース」はスーパーゲームボーイ等でプレイすると画面がちらつきます。
では、「普通に画面を重ねる」ことなく二重スクロールを実現するには、人間の目に認識できないほど高速に画面切り替えすればいけるのではとかんがえました。

仮現運動

人間の目は、セルを並べて点滅させる時間を変えると、セルが動いているように見えたり見えなかったりします。
隣接したセルの点滅切り替えの早さが60ms程度でその効果が起こるらしいです(ファイ運動)。
30ms以下になると同時に点滅しているように見えるらしいので、それ以下の速さで画面切り替えを行えばもしかしたら同時に画面出力しているようにみえるかも・・・?
1秒60フレームの時には1フレーム約16.7msなので、一回描画するごとに画面を切り替えれば二重スクロールになると予想します。

では、作っていきます!

二重に映るカレー屋

youtu.be

一応1000FPSで動作させています。
もしうまくいけば顔が重なって新しい顔になるはずでした。
うーん、微妙・・・

ScreenChanger.cs

using UnityEngine;

public class ScreenChanger : MonoBehaviour {
    //=============================================================
    [SerializeField]
    private GameObject canvas1;

    [SerializeField]
    private GameObject canvas2;

    private int screenNum = 0;
    private int limitScreenNum = 2;

    //=============================================================
    private void Awake () {
        QualitySettings.vSyncCount = 0; //ディスプレイの描画速度との同期を切る
        Application.targetFrameRate = 1000; //1000FPSにする
    }

    private void Update () {
        switch(screenNum) {
            case 0:
            canvas1.SetActive(true);
            canvas2.SetActive(false);
            break;

            case 1:
            canvas1.SetActive(false);
            canvas2.SetActive(true);
            break;
        }
        CountScreenNum();
    }

    private void CountScreenNum () {
        screenNum++;
        if(screenNum >= limitScreenNum) {
            screenNum = 0;
        }
    }
}

このスクリプトで、1フレームごとに描画するCanvasを変えます。

そもそもの問題

モニターごとに画面の描画速度が決まっているので、いくらUnity側で描画速度を上げてもモニターの描画速度が実質の限界です。(僕の使っているモニターは60Hzでした)
120Hzのモニターもあるらしいのでそれだともう少しちらつきもなくなるかもしれません。そういったモニターを使う機会があれば試してみたいと思います。