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


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


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

※使用しているUnityのバージョンは5.5.2f1です。

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


ワールド座標系のゲームオブジェクトが、画面から外に出たことを検出するためには、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 {
	
	// 背景の枚数
	private int bgCount = 3;

	private Transform bgTfm;
	private SpriteRenderer mySpriteRndr;
	private float width;

	void Start () {
		bgTfm = transform;
		mySpriteRndr = GetComponent<SpriteRenderer>();
		width = mySpriteRndr.bounds.size.x;
		float bgWidth = mySpriteRndr.bounds.size.x;
	}
	
	void Update () {
		Vector3 myViewport = Camera.main.WorldToViewportPoint(bgTfm.position);
		
		// 背景の回り込み(X軸プラス方向に移動時)
		if (myViewport.x < -1.0f) { bgTfm.position += Vector3.right * (width * bgCount); } // 背景の回り込み(X軸マイナス方向に移動時) else if (myViewport.x > 2.1f) {
			bgTfm.position -= Vector3.right * (width * bgCount);
		}
	}
}

回り込みの判定に使っている値は、どちらかに少し遊びを持たせます。
回り込みが起きる境界付近の座標で動作を安定させるためです。

以上です。

最近よく読まれている記事

【認定試験対策予想問題】Unity 練習問題 9
【Unityプログラミング力向上】C# 練習問題 6
【Unityワークショップ作品紹介】Elemental Swords
【Unity2017対応】UnityのEvent Triggerの種類と用途と使い方【保存版】
Event Trigger

記事一覧にもどる

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

PAGE TOP