mayonage-koboの日記

我ら真夜中ゲーム工房の進捗と、ゲーム開発のメモを残しておくブログ

Grow カメラの挙動がおかしい?(2015/3/13)

hisojiです。
一応Unityの記事なんですが、もしかしたら今回ほとんど関係ないかもしれませんすみません。
技術記事とかバグ見つけたとかそんなんじゃないですすみません。
一応Unity4.6.2f1です。

制作中、Unityでカメラが上手く動かないという問題がよくありました。

f:id:mayonage-kobo:20150313001219g:plain

後ろの花の挙動が少しおかしいのが分かるでしょうか。カメラとズレが発生しています。

今日解決したんですが、原因は普通です。

ソースコード内を簡略化してみると、以下のコードだと挙動がおかしくなります。

void Update(){
...
setBackObject();//背景のオブジェクトをカメラ位置に合わせて設定する

setCamera();//カメラ位置をキャラの位置に設定する。
...
}

上手く動いてくれそうな感じがするんですが、何がおかしいのでしょう。






すぐに分かってしまう方もいるので答えを。


順番が違います。

頑張って説明してみると、Update()が下のようなイメージで行われています。

backPosition = cameraPosition; // oldCharaPosition
cameraPosition = newCharaPosition;
---------------------ここで描画
backPosition = cameraPosition; // newCharaPosition
cameraPosition = newNewCharaPosition;

backPositionとcameraPositionを更新しているわけですね。(transform.positionみたいな)
で、よく見て見ると、カメラの位置は最新ですが、実は背景の位置が最新のカメラの位置で更新されていないんですね。
この状態で、キャラが移動中に止まった時、例えば上記なら
oldCharaPosition = 9;
newCharaPosition = 10;
newNewCharaPosition = 10;
とすると、上記の流れだと

backPosition = 9
cameraPosition = 10;
---------------------ここで描画
backPosition = 10
cameraPosition = 10

2つ目のUpdate()時にはbackPositionのみが変わる状況になりました。多分これが原因です。

というわけで関数の順番を変えれば上手く動きます。

void Update(){
...
setCamera();//カメラ位置をキャラの位置に設定する。
setBackObject();//背景のオブジェクトをカメラ位置に合わせて設定する
...
}

ちなみに正しいとこんな感じです。
f:id:mayonage-kobo:20150313003122g:plain



ここまで読んだ時、「何だそんな事か」みたいな感想を持つかもしれません。僕もです。
ですがこの更新処理がスクリプト毎に分かれてしまうと特定が難しくなる気がします。実際、カメラと背景の位置更新を1つにまとめてみるまで気付くことが出来ませんでした。

今検索してみたらスクリプトの実行順番って設定できるらしいので、処理が分かれたままでも上手く対処出来そうではあります。
Unity - マニュアル: スクリプト実行順設定

で、何でUnityと関係ないって書いたかというと、Unity特有の問題でもないと思ったからです。言ってしまえばコードの書き方が間違ってただけ。「unity カメラ ずれ」とかで検索しても全然ヒットしないので、もしかするとあまりに当たり前すぎるのかもしれません。と思ったけど、スクリプト毎の実行順番に依存するのはやっぱりUnityならではなのかなあと。

というわけで、何故かカメラがずれるとかいう問題が発生したら更新の順番とか検討してみてください。


おまけ
カメラじゃないけど、よくしでかすのにあまりに当たり前なので(たぶん)ググっても出てこないやつ。
Instantiateで指定の位置にオブジェクト作りたいけど変な場所に召喚されますみたいなとき。
f:id:mayonage-kobo:20150313005957p:plain
矢印さんが迷子。
ある子オブジェクトの位置(localPosition)がやたら右にあって他の子オブジェクトの位置とかもそれに全部合わせていくとよく起こります。位置を見直してみましょう。
なんかいつの間にかずれてるんだよね。なんでだろうね。