カメラのカクツキを調整
あついいいっ!!
ついに夏が私とPCに本格的に攻撃を始めやがった…
そして、MAYA Indieついにサービス開始しましたね。
買いましたよ!当日に!
だが、注文確認メールはきたが、購入確定メールが届かない…
決済ミスったかただ遅れてるだけか…
土日挟んだためサポートも使えずモヤモヤしている週末です。
明日には使えるようになるといいなぁ・・・
それはさておき、アニメーションの追加作業中に気になったことがありました。
それがテストプレイ時のカメラのカクツキ。
実際ゲームファイルとして書き出しとかなり軽減されて気になりにくくはなるんですが、
それでも長くやると気になるレベルになりそうだったので早めに対処することにしました。
が…
思いのほかこれが厄介で…
とりあえず最初に修正前と修正後の動画をご覧ください。
(動画として録画した時点でFPSが違うので両方カクついているようにみてます(笑)
実際は修正後はスムーズなんです。)
修正前
修正後
修正前のものを停止時は特に何もありませんがキャラが横に移動すると、キャラがブレる感じがする。
最初はキャラがブレていると思ったのですが、よ~く背景を見ると微妙にプルプルしている。
というわけでカメラが原因であることに気づきました。
しかしここから、カメラがカクつく原因と解決策を探すのが大変でした。
まずはカメラがカクつく原因について。
考えられたのがコード自体がおかしい。
カメラの移動はまず2キャラ間の中心を取り、その中心にダミーのオブジェクトを置き、どちらかのキャラの方向に軸を決め、決まったらそこから正面になる軸の方向にオフセットを取ってカメラの位置を決めていました。
最初はこれに問題があると思っていましたが、
色々とテストした結果、違うキャラ(シンプルなオブジェクト)に変えると、
カメラはカクつかなかった。
というわけでスクリプトは問題なさそうという結論に。
次にUnityの仕様に依存する原因に色々と検証していたころ、それっぽい原因を発見。
検証の内容は省くとして(色々やりすぎて覚えてないw)
原因はアニメーションの重心の仕様によるトランスフォームの変化が原因っぽかったです。
なんかややこしくてうまく説明できるかわかりませんが…
Unityのアニメーションの位置情報は原点を元にするのではなくオブジェクトの重心になるんです。
なので、オブジェクト自体を動かしていなくてアニメーションが動いていると重心が動くので、位置情報は常に動くんです。↓動画右上の数字が動いている奴
それを止めるためにポーズにベイクというのがあって、これにチェックを入れると位置情報は動かなくなります。
アニメーションによる移動がつかなくなり、スクリプトによる移動が必要になります(ルートモーションっていうのだったかな)。
そんな感じで位置情報を動かしたくない(ループアニメなど)はポーズにベイクしスクリプトで位置を調整
キャラの移動はベイクしないでアニメ通りに動かしています。
で、問題だったのが子のポーズにベイクしていない状態で変化する位置情報。
一見、一定速度で歩いているように見えるのですが、重心を基にしているとなると、腰や手足の動き、体のひねりなどから、数値的には一定になってないっぽい。
さらに横だけじゃなく、奥行きも微妙にずれるため、カメラ位置の元になってる中心位置も微妙にずれてるっぽい。
それにより横のずれだけじゃなくて、回転も加わりカクカクしているように見えてるっぽいんです。
で、ここから解決策の模索が始まりました。
とにかく問題なのが、キャラの位置情報が一定に変化しないこと。
これをキレイにすれば、何とかなりそうという方向で作業開始。
とにかく動きまくるキャラの位置情報を安定させようとするがこれにかなり四苦八苦。
中々うまくいかず方向転換。
中心位置の情報を安定化させようとするもうまくいかず。
最終的にブレているカメラの動きを安定させようとするもうまくいかず。
しばらく悩んだ…
そしてまた再び方針転換、
ここまではスクリプトのみで改善を目指していましたが、ダミーオブジェクト等を追加してそれを利用して、ブレを安定化させることに。
結果的にこれで理想の動きに近づきました。
まずは中心点の位置の安定化させるために、ダミーオブジェクトを作成し、動きまくる中心位置に対して、ダミーオブジェクトがキャラ間の中心位置にゆっくり追従するコードを作成。
同様にカメラ位置もゆっくり追従するようにする。
片方だけでもできそうだったのですが、2キャラ間の中心からオフセットを取っているため、奥行き方向に動くと微妙にカメラがブレるんで、中心点とカメラにダミーオブジェクトを追従するようにしました。
中心のダミーオブジェクトは縦方向にオフセットを取って、その中心点をカメラが向くようにしました。
これでようやくカメラがブレずに動くようになりました。
プログラミングと計算の知識がもっとあればダミーオブジェクト使わなくてもできそうだったのですが、私のスキルではまだ難しそうです…
でもまぁ内部的なことより、目的の動作を達成できたのでとりあえず、これで良しとしようと思います。
過去作もそうですが、ゲーム作る上で思った以上にダミーオブジェクトって重宝するんですよ(笑)
知識や技術が足りなくても何とかしてくれるダミーオブジェクト。
カヲル君に感謝です!
早くエヴァ見たいなぁw