背景をスクロールさせて、移動しているように見せる方法

シューティングゲームや、キャラがひたすら走るようなゲームにおいて、背景(マップ)を作り込むのはけっこうしんどいですし現実的ではないと思います。

そういったゲームの場合、基本的に背景は変えずにプレイヤーをその場で移動させているように見せることが主流なんじゃないかと。(特に、カジュアルゲーム

ちょうど自分もいまそのような仕組みでゲームを作成していたので、整理がてら書いていきます。

背景をスクロールさせる

これに尽きます。というより、これしかありません。

背景をスクロールさせる」ことに、プレイヤーがその場に留まっていても移動している雰囲気を出すことが出来るようになります。いわゆる錯覚ですね。それで、プレイヤーにモーションを適用させてあげれば、あたかもそのマップを走り抜けているように見えると思います。

後は、どのように実装するかになりますが、Scriptで対応するのが簡単です。では、具体的にどんな実装になるかというと、下記の感じになります。

using UnityEngine;
using System.Collections;

[RequireComponent(typeof(MeshRenderer))]
public class UVScroller : MonoBehaviour {

    public float ScrollSpeed = 2f;
    private MeshRenderer mr;

    float offset = 0f;

    // Use this for initialization
    void Start () {
        mr = GetComponent<MeshRenderer> ();
    }

    // Update is called once per frame
    void Update () {
        offset = Mathf.Repeat (Time.time * ScrollSpeed, 1f);
        // offset = 1f - offset; //逆向きに動かしたい場合
        mr.material.SetTextureOffset ("_MainTex", new Vector2 (0f, offset));
    }
}

このScriptをスクロールさせたい背景にアタッチしてあげれば大丈夫です。

そしたら、ちょっとだけ解説をば・・

  • Time.time(ゲーム開始からの時間(秒))に指定スピードを掛けてあげたのを、Mathf.Repeatの第一引数(計算元)に指定する
  • Mathf.Repeatの第二引数(レングス(イメージ的にはレンジかな・・?))を設定して、第一引数から第二引数で割った余りを「移動量」として設定する
  • SetTextureOffsetに、"_MainTex"を指定して、移動させる x, y の値に上記で算出した「移動量」を設定する

あとは適当に試してみてもらえれば良いかと。

ちなみに、背景をスクロールさせる方法として他にもシェーダーを頑張ることも出来ますが、特別な要件等がなければこの内容で問題ないかと思われます。