画面の初期化
画面初期化のタイミング
既定の設定では、カメラによって描画されるゲーム画面は毎フレームごとに背景色でクリアされます。この場合、画面は常に最後のフレーム処理で描画された絵となります。多くのゲームにとっては、この設定で問題ありませんが、画面更新が少ない静止している状態が多いゲームや、画面の初期化タイミングを制御したい場合には効率が悪い場合もあります。
フレームごとの画面の初期化は Camera クラスの clearFlags プロパティで設定できます。例えば、フレームごとに画面をクリアせず、前のフレームで描画した画面を残したまま上書きするということが可能になります。
public CameraClearFlags clearFlags { get; set; }
このプロパティは、フレームごとの初期化方法を指定する UnityEngine.CameraClearFlags 列挙型の値です。
public enum CameraClearFlags
この列挙型には、スカイボックスを使う Skybox メンバ、背景色で塗りつぶす SolidColor メンバ(同値で Color メンバも定義されている)、深度バッファのみをクリアする Depth メンバ、そしてクリアしないことを表す Nothing メンバが定義されています。
既定では Skybox メンバが設定されており、これは Skybox コンポーネントがカメラに設定されているとき、Skybox コンポーネントの設定に基づいてスカイボックスを描画します。スカイボックスについては後述しますが、その名前の通り空のような背景画像を 3D 空間上に表示する手法がスカイボックスです。Skybox メンバが設定されている場合、背景色の上にスカイボックスが表示されます。
SolidColor メンバが設定されている場合、前述した backgroundColor プロパティで設定されている色で塗りつぶします。毎フレームごとに表示されるゲーム画面は、この背景色で塗りつぶされた上に描画されます。
Depth メンバが設定されている場合、深度バッファ(カメラから見たオブジェクトまでの距離の情報)のみクリアされます。この場合、オブジェクトは深度に応じて適切な順番で描画されますが、背景に対しては上書きされます。
Nothing メンバが設定されている場合、ゲーム画面と深度バッファはクリアされることなく、常に画面に描画を重ね続けます。よって、前のフレームで描画された内容が維持され続け、深度バッファも維持されるため、手前に描かれた内容が常に残ります。より後ろにある物のピクセルが、手前にある物のピクセルを上書きすることができなくなります。
using System; using UnityEngine; public sealed class Sample : MonoBehaviour { private GameObject _cube; private Camera _camera; void Start() { _cube = GameObject.CreatePrimitive(PrimitiveType.Cube); GameObject obj = new GameObject(); obj.transform.Translate(0, 0, -5); _camera = obj.AddComponent<Camera>(); } private double t; void Update() { t += Math.PI / 60; var x = Math.Sin(t) * 5; _cube.transform.position = new Vector3((float)x, 0, 0); if (t > Math.PI*2) { _camera.clearFlags = _camera.clearFlags == CameraClearFlags.Nothing ? CameraClearFlags.SolidColor : CameraClearFlags.Nothing; t = 0; Debug.Log("ClearFlag: " + _camera.clearFlags); } } }
コード1は、常に左右に移動し続ける立方体オブジェクトを、clearFlags プロパティを切り替えながら描画するプログラムです。clearFlags プロパティが SolidColor の状態であれば、常に背景色でクリアされるため正しく立方体がゲーム画面に表示されますが、Nothing に設定されると、前の描画が残った状態で重ねて立方体を描画するため、上の実行結果のように左右に伸びるように表示されます。