【Unity】2Dゲームの背景をカメラに合わせて自動で回り込ませる方法

この記事は2017年4月18日に書かれたものです。内容が古い可能性がありますのでご注意ください。


2Dゲームの背景をカメラに合わせて自動で回り込ませる方法


今回は、2Dゲームの背景を自動で回り込ませる(ループ)方法について解説します。
これを使うと背景の画像が3枚くらいで済みます。
画面外に出たことを動的に検出するところがポイントで、応用すれば画面左から出ていったキャラが、右側から出てくる的なことにも使えそうです。

実際のところ背景に限らず、スプライトならなんでも可です。

※Unityのバージョンは2017.2で動作確認済みです。

画面外に出たことを検出する


ワールド座標系のゲームオブジェクトが、画面から外に出たことを検出するためには、CameraクラスのWorldToViewportPointメソッドを使用します。

Vector3 viewport = Camera.main.WorldToViewportPoint(transform.position);

このメソッドは、ワールド座標をビューポート座標に変換してくれるメソッドです。(※MainCameraを使用)

観測したいゲームオブジェクトのTransform.positionを引数に渡すとVector3型で値が返ります。
この戻り値のVector3のXとYが、画面に対する位置を表し、Zはカメラからの距離を表します。

例えば、Xが1を超えると、オブジェクトは画面右側より見切れます。0より小さくなれば左側へ見切れます。
(※ ピボットの位置を基準とします)

背景のサイズを自動で取得する


背景をピッタリ回り込ませるためには、背景(スプライト)のサイズ情報が必要です。
これはSpriteRendererコンポーネントのプロパティから取得できます。

float bgWidth = GetComponent<SpriteRenderer>().bounds.size.x;

サンプルスクリプト


画面外の検出と、背景サイズの自動取得を組み合わせて、3枚の背景(スプライト)がカメラの移動に対して自動的に回り込むスクリプトを作成しました。
MainCameraで描画していて、背景が3枚ともピッタリくっついて配置してあれば、それぞれの背景オブジェクトにアタッチするだけで使えます。

using UnityEngine;

/// <summary>
/// 【背景のコントロール用クラス】
///		背景は3枚、カメラから見切れたら回り込む
/// </summary>
public class BackGroundController : MonoBehaviour {
	
	// 背景の枚数
	int spriteCount = 3;
	// 背景が回り込み
	float rightOffset = 1.45f;
	float leftOffset = -0.4f;

	Transform bgTfm;
	SpriteRenderer mySpriteRndr;
	float width;

	void Start () {
		bgTfm = transform;
		mySpriteRndr = GetComponent<SpriteRenderer>();
		width = mySpriteRndr.bounds.size.x;
	}


	void Update () {
		// 座標変換
		Vector3 myViewport = Camera.main.WorldToViewportPoint(bgTfm.position);

		// 背景の回り込み(カメラがX軸プラス方向に移動時)
		if (myViewport.x < leftOffset) {
			bgTfm.position += Vector3.right * (width * spriteCount);
		}
		// 背景の回り込み(カメラがX軸マイナス方向に移動時)
		else if (myViewport.x > rightOffset) {
			bgTfm.position -= Vector3.right * (width * spriteCount);
		}
	}
}

回り込みの判定に使っているoffsetの値は、カメラサイズと画像サイズによって変わるため、実際に動かしながら調整します。多少ゆとりを持った値にすることで、回り込みが起きる境界付近の座標で動作が安定します。

以上です。

  • このエントリーをはてなブックマークに追加

PAGE TOP