Unityの撮影画像がゲームビューと違う原因と解決方法|画面が逆さま・遠い・別視点になる時の確認ポイント

C言語関連

Unityでカメラ撮影を行っていると、ゲームビューでは正常に表示されているのに、保存された画像だけが違う状態になることがあります。例えば、天地が逆になる、遠く離れた場所が写る、後ろ姿だけが撮影される、設定した枚数分の処理が正常に進まないといった問題です。

この記事では、Unityで撮影結果がプレビュー画面と一致しない場合に確認すべき原因と、カメラ設定・レンダリング処理・スクリプト周辺のチェック方法について解説します。

Unityのゲームビューと保存画像が違う主な原因

Unityでは、画面に表示されているカメラと実際に画像保存に利用しているカメラが一致していない場合があります。

特に以下のような原因で、見た目と保存結果が大きく異なることがあります。

  • 別のCameraが有効になっている
  • 撮影用カメラのTransformが変更されている
  • RenderTextureの設定が違う
  • 画像取得タイミングがずれている
  • 画面座標とカメラ座標の扱いが異なる

「設定を変えていないのに急におかしくなった」という場合でも、シーン内のオブジェクト状態や実行中のスクリプトによってカメラ状態が変化している可能性があります。

まず確認するべきCamera設定

Unityで撮影処理を行う場合、最初に確認したいのがCameraコンポーネントです。

確認する項目は以下になります。

  • CameraがEnabledになっているか
  • TagがMainCameraになっているか
  • ProjectionがOrthographicやPerspectiveで意図した設定になっているか
  • Culling Maskが正しいか
  • TransformのPositionとRotationが正しいか

例えば、ゲームビューではMain Cameraを見ているつもりでも、画像保存処理のスクリプトが別のCameraを参照している場合、保存画像だけ別視点になります。

また、CameraのRotationが180度変わっていると、天地が逆さまになったような画像になることがあります。

保存画像だけ上下反転する場合の原因

Unityの画像保存では、RenderTextureやTexture2Dへ変換する処理を行うことがあります。この時、画像の座標系の違いによって上下反転が発生する場合があります。

特にGPU側のテクスチャ座標とCPU側で扱う画像座標は向きが異なることがあり、ReadPixelsを使用した画像取得では注意が必要です。

例えば以下のような処理を行っている場合、取得後の画像反転処理が必要になることがあります。

RenderTexture.active = renderTexture;
texture.ReadPixels(new Rect(0,0,width,height),0,0);
texture.Apply();

このような処理で保存した画像だけが逆になる場合は、Camera設定ではなく画像変換処理側を確認する必要があります。

撮影した画像が遠く離れた場所になる場合

保存された画像が「対象が小さく遠く見える」「全く違う場所が写る」という場合、撮影に使用しているカメラが別物になっている可能性があります。

例えば、以下のようなケースがあります。

  • プレイヤー用Cameraと撮影用Cameraが存在する
  • Prefab内のCameraを誤って参照している
  • DontDestroyOnLoadで古いCameraが残っている
  • スクリプトでCamera.mainを取得しているが対象が変わっている

Camera.mainはTagがMainCameraのものを取得します。そのため、シーン内にMainCameraタグ付きCameraが複数存在すると、意図しないCameraを取得することがあります。

撮影処理が1枚ごとに停止する原因

以前は連続撮影できていたのに、急に1枚撮影するたびにPlayが終了するような場合、撮影処理を行うスクリプト内でエラーが発生している可能性があります。

Unityでは実行中にエラーが発生すると、処理が途中で止まることがあります。

まずConsoleウィンドウを確認し、赤いエラーが表示されていないか確認してください。特に以下のようなエラーは撮影処理を停止させる原因になります。

  • NullReferenceException
  • MissingReferenceException
  • RenderTexture関連のエラー
  • メモリ不足によるエラー

撮影前後のタイミングを確認する

Unityでは、オブジェクトの移動やアニメーション更新のタイミングによって、取得する画像がゲームビューとずれる場合があります。

例えば、Update内でカメラ位置を変更している場合、撮影処理を実行するタイミングによっては移動前または移動後の状態が保存されます。

安定した撮影を行う場合は、LateUpdate後やWaitForEndOfFrameを利用して、画面描画が完了したタイミングで画像取得を行う方法が一般的です。

設定を変えていないのに突然壊れた時の確認手順

Unityでは、直接設定を変更していなくても、スクリプトやシーン状態によって動作が変わることがあります。

以下の順番で確認すると原因を特定しやすくなります。

  1. Consoleのエラーを確認する
  2. Cameraが複数存在しないか確認する
  3. 撮影用CameraのTransformを確認する
  4. 保存処理で参照しているCameraを確認する
  5. RenderTextureや画像変換処理を確認する

特に「数時間前までは動いていた」という場合、コード変更だけでなく、Inspector上の値が変更されていないかも確認することが重要です。

まとめ:Unityの撮影結果が違う時はCameraと取得処理を確認する

Unityで調整した画面と保存された画像が大きく異なる場合、単純なアスペクト比だけではなく、Cameraの参照先、Transform、RenderTexture、画像取得タイミングなど複数の原因が考えられます。

天地が逆になる場合は画像変換処理、遠くの別視点になる場合はCamera設定、撮影が止まる場合はConsoleエラーを確認すると原因を見つけやすくなります。

Unityの撮影処理はゲームビューと完全に同じ状態を保存しているとは限らないため、どのCameraがどのタイミングで画像取得に使われているかを確認することが、問題解決への近道です。

コメント

タイトルとURLをコピーしました