【Unity】ここだけ押さえる! Unityのカメラワーク初級編

【Unity】ここだけ押さえる! Unityのカメラワーク初級編

ゲームにおいて大事なものは?

と聞かれたときに出てくる答えは様々なれど、それでも「見た目」という回答が上位にくるのは間違いないと思います。

見た目はゲームへの没入感にも関わってくる重要なポイント。プレイヤーが没入感を持つためには、人間であるプレイヤーの感覚から見て不自然でない表現が大切です。

例えば、「主人公となる生物は外敵から身を守るために常に目が回転しているので、カメラもずっと回転させて表現します」とかだと、ゲーム画面がずっと回転することになります。これってプレイヤーの感覚からするとあまりにかけ離れたものですよね。多くの人たちにとって、視界は常に回転しているものではないし、多分めまいの時を思い出して気持ち悪くなるんじゃないかな。

例えが大分極端になった気もしますが何を言いたいかというと、画面に表示される絵は人間の視界、目の機能に近いものにした方がプレイヤーもゲームの世界に入っていきやすいということ。

Unity世界で私たちの「目」となってくれるのはカメラです。カメラの動きが自然であれば、それだけ私たちの感覚に近い世界として認識されやすくなり、ひいてはゲームの世界への没入感に繋がっていきます。

そこで今回注目したいのがカメラワークについて。撮影技法としてのカメラワークは映画の世界で特に研究されていて、カメラの動かし方とその効果が対応づけられており、そこから学ぶのが一番の近道だと思います。

ここでは分かりやすくまとまっている上記の2サイトを参考にさせていただき、Unityでカメラワークを表現するとどうなるかを実例付きで紹介します。

なおここではカメラワークの実際の動きを紹介するにとどめ、ソースコードを含めた実装サンプルについては各項目から飛べるようにする予定です。

 

 

環境

macOS 10.13 High Sierra

Unity2018.2.9f1

この記事を書いている2018/10/29時点では14fまでリリースされています。

 

カメラワークの種類

ここでは以下の7種類のカメラワークをUnityでの実例付きで紹介します。

  1. フィクス(Fix)……カメラを固定して撮影
  2. パン(Pan)……カメラを水平方向に振る
  3. ティルト(Tilt)……カメラを垂直方向に振る
  4. ズームイン/アウト(Zoom In/Out)……レンズの焦点距離を変える
  5. フォーカスイン/アウト(Focus In/Out)……ピントの合う点を変える
  6. トラック(Track)……被写体の動きに合わせてカメラを移動させる
  7. ドリーイン/アウト(Dolly In/Out)……カメラ自体を動かして被写体に近づける/遠ざかる

上記のカメラワークは、カメラ自体の動きによって4つのタイプに分けられます。

フィクスはカメラを動かさない撮影方法。

パンとティルトはカメラ自体の位置は変えないけど向きを変える撮影方法。

ズームイン/アウト、フォーカスイン/アウトもカメラ自体の位置は変えず、焦点距離やピントを変える撮影方法。

トラックとドリーイン/アウトはカメラ自体を動かす撮影方法です。

表現したい演出に応じて、カメラ自体を動かすのか、カメラはそのままで角度だけ変えるのか、といったようにUnityでいじる場所が変わるので、Unityのパラメータと対応づけて覚えるといい感じ。

 

フィクス

フィクスはカメラを動かさない撮影方法です。

撮影の基本のキとも言われる方法で、映像作品の多くはフィクスが6割を占めているらしいです。(ソニーの『ビデオ撮影テクニック』より)

カメラワークといっても常にカメラを動かしている訳ではなく、固定された画面を映すことで落ち着きが生まれます。

 

Unityでの実装と実例

Unityではカメラを動かさなければいいので、Sceneビューでカメラの位置を決めたらそのままにしておけばOK。

キャラクターがカメラに寄ってくる時にもフィクスは有効です。

 

こんな場面で

基本となるカメラワークだけに、使用できる場面は多岐に渡ります。

フィクスでは客観的な絵、落ち着いた絵になる傾向があるため、そのような場面で使うといい感じ。会話シーンとか、何かの説明シーンなどかな。

他には、ミステリーアドベンチャー系、あるいはスニーキングミッション系のゲームであれば監視カメラの映像として使うといいかも。

上記の作例2では愛嬌のあるキャラクターが近づいてきますが、ホラーゲームで固定カメラに近づいてくるクリーチャーを作ったりすると、プレイヤーに近づいてくる感じがして怖さマシマシ。

 

パン

パンはカメラを水平方向(左右)に振る撮影方法です。主に左から右に振るのがパン、右から左に振るのが逆パンと呼ばれます。

フィールドの広大さを表現したり、視点が移動していく様子を表現するときに使うといい感じ。複数の被写体(画面に映したいオブジェクト)の位置関係を説明するのにも使われます。

実生活だと、目の前を走るマラソンランナーを見る時に首を振って目で追いかけるあの感じが近いかも。多くの人はマラソンランナーを走って追いかけたりはせず、カメラ(体)を動かさずに首の角度だけを変えますよね。たまに沿道で見かける並走ランナーは後で出てくるトラックです。

 

Unityでの実装と実例

Unityで実装する場合は、カメラオブジェクトのTransform内、RotationのY軸を操作します。

スクリプトの中でコルーチンを使って徐々に変化させてもいいですし、iTweenを使って簡単にアニメーションさせてもOK。iTweenの方がコルーチンより楽ちんです。

動画の中ではカメラを左から右にパンさせています。パンの前後にはフィクスで固定された映像を入れておくと安定感が出ます。いきなり変化させると酔いそうな映像になるので、開始と終了の際にはパンのスピードが徐々に変化するようにします。

 

こんな場面で

新しいフィールドにたどり着いた時や、新しいステージにたどり着いた時に、その広さを表現するために使うといい感じです。広大な砂漠、広大な海、広大な平原など、とにかく広さをプレイヤーに伝えたい時に。

ミステリーアドベンチャー系のゲームだったら、事件が起きたことを知らされた登場人物たちの表情をパンで映していくのもいいと思います。犯人だけ不自然な表情をしている、なんて表現に使えそう。

特別な理由がなければ、基本の左から右のパンを使います。人間って並んでいるものを見る時左から右へと見ていくらしいので、こっちが自然みたい。確かに今文章を読む時も左から右に読んでいますものね。

 

ティルト

ティルトはカメラを垂直方向(上下)に振る撮影方法です。下から上に振るのがティルトアップ、逆に上から下に振るのがティルトダウン。縦パンなんて言う人もいるみたい。Wizardry経験者にとっては残念ながらティルトウェイトの名前がついたカメラワークはありませんでした。

パンが広さなら、ティルトは高さです。高層ビルの高さを表現する時に、下から見上げる感じを出すといい感じ。イメージとしては、FF7のミッドガルで神羅カンパニーの前に立ったクラウドがビルを見上げる感じ。逆に屋上から地面を見下すことで、こんなに高いんだ……と表現するのもあり。

ティルトは縦方向のカメラワークなので、人物を映し出す時にも使えます。足元から顔にカメラを振れば、もったいつけてプレイヤーの期待感を高めることができます。逆に顔から足元にカメラを振る場合、イケメンなのに足元がサンダル、みたいなギャグ感を演出するのにもいいかも。

ティルトアップの方は「希望」とか「前進」といった心理的効果を演出できるみたい。

 

Unityでの実装と実例

Unityでティルトを実装する場合は、パンと同様カメラオブジェクトのTransformのRotationをいじります。今度は縦方向なのでX軸周りに回転させます。

こちらも移動前後にフィクスを入れ、一度画面の内容をプレイヤーに伝えた後にカメラを動かし始めると安心して見ていられる画面になるかと思います。

動画ではカメラを下から上に振っています。目の前にあるビルの高さを表現するイメージで、徐々にカメラの回転速度を上げ、緩やかに回転が終わるようにしています。

ティルトダウンの例も入れているので、ビルの高さを味わってみてください。これ、通常のモニターだとそこまで怖くはありませんが、VRだとぞわっとするかも。

 

こんな場面で

ラスボスの城、あるいはそれに準ずるボスの砦に挑む時の演出に最適。カメラに収まりきらないほどの大きなダンジョンやステージをティルトアップで表現することにより、敵の強大さを演出しつつ、主人公の「やってやるぞ!」という「希望」のある心理状態を演出できます。

ティルトダウンを使う場合は、アクションゲームなどで落ちたらゲームオーバーになる高い場所を表現するのがいいかも。地面を見る主人公の目線を表現することで、プレイヤーも同じように背筋がひゅんひゅんする感覚を共有できます。

ミステリーアドベンチャー系のゲームなら人物の全身を映すのに便利ですし、ホラーゲームであれば、顔は人間っぽいけど、カメラが下に向くに連れ、触手が生えていたり足が10本生えていることがわかるクリーチャーの紹介なんかに便利。

コンシューマー機向けのゲームであれば横長の画面、スマホ向けのゲームであれば縦長の画面、なんて具合にリリースしようとしているプラットフォームに応じて画面の向きが異なることもあるので、パンとティルトの使い分けをするのも大事です。

 

ズームイン/アウト

ズームはレンズの焦点距離を変えること。これによって画面に映る被写体(オブジェクト)の大きさが変わります。試しにスマホのカメラを使ってズームしてみるとすぐイメージできると思います。

画面に映る範囲を角度で表す画角というものがあるんだけど、この画角が広い状態(広角)から狭い状態(望遠)に変えることをズームイン、逆に望遠から広角に変えることをズームアウトと呼びます。

ズームインの効果として、集中させたいオブジェクトへの視線の誘導、表情などのディティールの表現などがあります。泣きながら敵にトドメを刺す、みたいな場面では目にズームインするといい感じ。

逆のズームアウトの効果は、被写体と周囲のオブジェクトとの関係の説明、正体を徐々に明かす、集中させた視線の解放などがあります。ヒロインがアップで表示された後にズームアウトすると周囲に敵がいるとか、敵を裏で操っていた黒幕の口元からズームアウトして正体が判明する、といった感じに使えます。

ズームイン/アウトの注意点として、ズームは人間の目にはない機能であるため若干不自然であり、多用しないほうが良い点が挙げられます。

 

Unityでの実装と実例

Unityでズームイン/アウトを実装する場合は、CameraコンポーネントのField of View(視野角、画角)の値を変更します。……FIELD OF VIEWっていうとDAN DAN 心魅かれてくを思い出します。ドラゴンボールGTを毎週見ていたのが懐かしい。

[Field of View]は以下の画像で青字になっている項目。デフォルトでは60度になっています。UnityでField of Viewを扱う場合は垂直方向の角度を表します。水平方向の画角についてはViewportのアスペクト比から計算してくれるので便利。

Field of Viewの設定
Field of Viewの設定

 

下にちらっと見えている[Physical Camera]のトグルをTrueにすると、以下のように玄人向けの設定が表示されます。こちらは焦点距離やセンサーサイズを直でいじれるので、現実世界のカメラ撮影に慣れている人向け。これらの設定を元に[Field of View]の値が再計算されます。

猛者は物理カメラをいじるべし
猛者は物理カメラをいじるべし

 

スクリプトから[Field of View]の値を変えるときは、コルーチンを使って徐々に変化させるか、iTweenのValueToを使って変化させるといい感じ。iTweenが簡単でおすすめです。

動画では広角で小さく映っていたねこ勇者がズームインによって画面に大きく表示されるようになっています。

ゲーム的に使うならば、スコープを覗いている表現として画面の周りに黒いマスクを用意するといい感じです。あるいは黒いマスクをズーム先のオブジェクトの大きさまで縮小し、そのキャラクターに注目させるのもあり。

 

こんな場面で

ズームインは、特定のオブジェクトに注目させたい時に使います。会話シーンでキャラクターの表情を見せる、遠くにいる敵に注目させるといった使い方がいいですね。

上でも少し触れましたが、スコープを覗いている表現としてもバッチリ。特にFPS系のゲームを作る場合はスコープで狙撃するなんて場面は多いはずなので、どんどん使ってみた方がよかです。

もういっこ上で触れたものについてですが、穴あきの黒いマスクをキャラクターの大きさにする方法はスーパーマリオワールドのゴール後の演出に似てますね。ステージクリアした際、マリオにズームしてステージを隠すことで、「このステージはもう終わったよ」感を出しています。カメラのズームとUIの組み合わせによる視線誘導はアクションゲームで使いやすい表現だと思います。

反対のズームアウトは、RPGでもミステリーでも黒幕の正体を明かす時にバッチリハマります。他には目覚めた主人公がズームされていて、ちょうど気が付いたところでズームアウトすると実は敵に囲まれてた、みたいな感じもグッド。

ホラーゲームで使う時には、走っているクリーチャーに正面からズームしている状態から始まって、ズームアウトしていくと主人公が画面に映り、実は主人公の後ろから迫ってきていました、ここからステージスタートです! みたいな感じに使えそう。三人称目線で操作するゲームだとカメラワークを色々といじれて楽しいですよね。

ズームアウトは「実は!」という時に効果的です。

 

フォーカスイン/アウト

レンズを操作してピントの合う距離を変える撮影方法です。フォーカスは「(対象物に)焦点を当てる」という意味ですから、フォーカスインでは焦点の合っていない状態から焦点を合わせる方法、フォーカスアウトは逆に焦点が合っている状態から焦点が合っていない状態に変化させる方法となります。

フォーカスインとしてイメージしやすいのは、主人公が目覚めるタイミングで画面がぼやけているところから始まって、徐々に周りに焦点を合わせて目覚めを表現する方法です。何かを思い出している時にもフォーカスインを使うことで「はっ」と思い出した感じを演出できます。

反対にフォーカスアウトでは、主人公がやられてだんだんと焦点が合わなくなるようにすると意識を失っていく様子を表現できます。意識を失うという意味では、眠りに落ちるところを表現するのにも使えます。

 

Unityでの実装と実例

実はUnityだと、デフォルトではカメラに映るオブジェクトは全てピントが合った状態になっています。現実のカメラのように、カメラからの距離に応じてボケたりピントが合ったり、みたいにはなってないんです。

ピントが合っている距離を表す被写界深度という言葉がありますが、Unityの場合は被写界深度がめっちゃ深い状態です。

これを現実のカメラに寄せるためには、Post Processing(ポストプロセシング)と呼ばれる処理を行います。

このPost Processingは日本語に訳せば事後処理。Update()が呼ばれ、画面にレンダリングされる画像が内部で用意された後、実際に画面に表示する前に処理を施してくれます。

動画では画面がぼやけた状態から始まり、操作キャラ(カメラ)が目覚めた様子を表現してみました。起きた時に、徐々にピントが合って行くあの感じです。

逆のフォーカスアウトについても、ノックアウトされた様子を表現しました。ゲームオーバー演出にいいかも。

画面のぼやけがポイントなので、なるべく高画質で再生することをおすすめ。低画質だと表現によるぼやけなのか、画質によるぼやけなのか若干わかりにくかったです。

 

こんな場面で

フォーカスインは目覚め、フォーカスアウトは気絶を表現するのに便利。

フォーカスインをRPGのオープニングなんかで使うとそれっぽいですね。後は敵に捕まった後、牢屋とか実験室で目覚めた時に「知らない天井だ……」と演出してみるのもあり。

会話シーンであれば、会話の中で何かキーワードが出て来た時に、背景のオブジェクトに注目させるのもいいでしょう。日本のドラマだとよくやってる方法かもしれません。例えばドラマの下町ロケットであれば、「我が帝国重工は〜」みたいなセリフがあると背景の帝国重工のロゴにフォーカスする、なんてのをよくやってます。

フォーカスアウトはゲームオーバーの表現に使えます。特にFPSのように主人公の視点で進むゲームだと効果的です。カメラ=主人公の目なので、やられた時に意識が遠のいていく様子がわかりやすいですね。

 

トラック

トラックはカメラ自体を動かしたり、被写体の動きに合わせてカメラを動かす撮影方法です。Trackは追跡する、道を辿るといった意味合いの言葉。

現実の撮影現場だと台車の上にカメラを乗せ、それを動かして撮影したり、人が被写体と一緒に歩いて撮影を行います。マラソンや駅伝の中継でよく見る、ランナーと並走するバイクから撮影しているあれもトラックです。

パンはカメラを移動させずに角度を変える撮影方法だったのに対し、トラックはカメラ自体も動くことから、パンに比べるとダイナミックな画になります。

現実世界におけるトラックの難点として、被写体と移動しつつブレのない映像を撮影する必要があるため、機材や技術が必要になることが挙げられます。身もふたもないこと言えばコストがかかるんです。

 

Unityでの実装と実例

が、ここで扱っているのはUnityでのカメラワーク。トラックはスクリプトを使って簡単に実装できるんです。

カメラの制御用スクリプトで、Start()で被写体とカメラの相対的な位置関係(オフセット)を取得し、Update()で被写体の位置とオフセットからカメラの位置をセットするだけ。ね? 簡単でしょう?

歩き回る主人公を映すためにカメラを追随させる方法はUnityの公式チュートリアルでも紹介されています。

このブログで作成したチュートリアルでも同じように実装しています。

 

動画では花の向こう側にある道を歩いているキャラをカメラが追いかけています。キャラクターの手前に静止しているオブジェクトを挟むと、より動きを演出することができます。

 

こんな場面で

ステージの幕間の演出や、イベントシーンでは動きを表現するのにぴったり。例えばキャラクターが走って逃げている様子をカメラで追っていけば臨場感あふれる場面になります。

キャラクターを動かさなくてもカメラだけを一気に移動させれば、背景が流れる速度がそれだけ大きくなり、遠くにいるキャラまでの距離の長さを表現することもできます。被写体を追う、カメラだけ飛ばす、という2通りのトラックがあるので場面に合わせて使用すると吉。

もちろん、このトラックは通常の操作でもガンガン使うカメラワークです。フィールドを歩き回るRPG、建物内で戦うFPS、クリーチャーから逃げるホラーゲームなど、プレイヤーの操作に合わせて画面が動くゲームでは必須とも言えるものなので、これだけは使えるようになっておきたいところ。

逆に動きを入れたくない場面や、プレイヤーの移動に関わらず一定の画面を表示したい場合は、最初に扱ったフィクスを使いましょ。

 

ドリーイン/アウト

ドリーインはカメラが被写体に近づいていく撮影方法、ドリーアウトはカメラが被写体から遠ざかる撮影方法です。

ドリー(Dolly)とはカメラを水平移動させるための台車のこと。台車を使ってブレないように近づけたり遠ざけたりしていたのが元になっているようです。

ドリーイン/アウトで強調されるのは遠近感で、それにより立体感が演出できます。

ズームとちょっと紛らわしいのですが、カメラ自体を動かすかどうかが分かれ目。実はこのブログでやってるチュートリアルでもズームインとドリーインを混同して扱っていました(反省)

ズームインでは画角が変わり、画面に映るオブジェクトの数は少なくなります。被写体が画面の多くを占めるようになるため、他のオブジェクトとの相対関係は分かりにくくなるんですね。その分被写体のディティールが分かりやすくなるメリットが生まれています。

一方ドリーインでは被写体に近づくことから、画面内の被写体は大きく映し出されますが画角が変わりません。画角が変わらなければ、被写体の奥にあるオブジェクトも映ることになります。遠くにあるオブジェクトと、近くにいる被写体が同時に映ることとなり、遠近感が分かりやすくなるのです。

 

Unityでの実装と実例

Unityでドリーイン/アウトを実装する場合は、カメラオブジェクトのTransform内、Positionの値を変化させます。

上で紹介したチュートリアルで使っていた画像をそのまま使いまわして説明すると、被写体となるボールがあるときに、カメラの位置を青色の線の方向(左側)に近づければドリーインとなり、黄色の線の方向(右側)に遠ざければドリーアウトとなります。

数直線での概念図
数直線での概念図

 

被写体とカメラが同じ軸上にいる場合は簡単に操作できますが、角度がついていたりするとちょっと大変。特にTimelineで自力で動かすと泣きそうになります。

なので、スクリプトから被写体とカメラの直線距離(上の図の赤い線)を取得し、そこに補正をかけることでカメラの位置を移動させます。

Vector3.Distanceを使うと2点間の距離を取得できるので、被写体とカメラそれぞれのtransform.positionから距離を計算しましょう。この距離を基準とし、近づけたい場合は1より小さい値をかけ、遠ざけたい場合は1より大きい値をかけます。

続いて被写体のtransform.positionに補正後の値を加算し、その値をカメラのtransform.positionにセットすることで、ドリーイン/アウト後の位置にカメラを置くことができます。あとはこの値のセットをコルーチンなりiTweenで行えば、経時変化としてカメラを動かすことができます。

動画では単純なドリーインと、ドローンによる空撮をイメージしたドリーアウトを入れています。ズームと違う点は、画面奥にあるビル群が画面にちゃんと入っていること。ズームだと正面のねこ勇者が画面の大半を占めています。

動画後半でズームインとドリーインを比較し、それぞれ画角がどうなるかを並べているのでそれもご覧くださいな。

 

こんな場面で

画面内を走り回る操作キャラに対して、画角を変更することなくカメラを近づける、または遠ざける処理を実装したい時にドリーイン/アウトが使われます。

例えば64マリオでCボタンを操作するときのあの感じです。C▲を押すとカメラがマリオに近づき、C▼を押すとカメラがマリオから遠ざかって周囲の様子を確認することができます。

会話シーンなどのイベントシーンでは、テーブルを囲む人の多さや部屋の広さを表現するのに使えます。例えば西洋風の細長いテーブルを人が囲んでいる場面で、お誕生日席に王様やら貴族やらの偉い人が座っている場面を考えてみましょ。

このテーブルの上を駆け抜けるようにカメラを近づければ、お誕生日席にいる登場人物(被写体)がどれだけの人に囲まれているか、そして豪勢な料理を用意することからいかにお金を持っているか、これを立体感を持って表現できます。画角が変わらないため、テーブルを囲んでいる人物達の表情も映るのがいい感じ。ズームだと被写体の人物しか映らないので、画面がちょっと寂しいことになっちゃうんです。

あとは立体感を持った風景を映し出したい時にドリーアウトを使うといいかも。現実世界だとドローンを使った空撮をイメージするといいかな。風景を被写体と捉えれば、ドローンのカメラが空高く飛んで行く時には被写体から遠ざかっています。初めて到達したステージの紹介に使うとプレイヤーのワクワクを刺激できます。

 

まとめ

映画やドラマで使われるカメラワーク7種類について、Unityで実装するという観点から紹介。表でまとめると以下のようになります。

No カメラの動き カメラワークの名前 効果
1 動かさない フィクス 基本、落ち着き、客観的な画
2 動かさず角度だけ変える パン 視点の移動、被写体の位置関係
3 動かさず角度だけ変える ティルト 縦のディテール、被写体の全身を映す

(ティルトアップのみ)希望、前進

4 動かさず焦点距離を変える ズームイン/アウト (ズームイン)視線の誘導、被写体の強調

(ズームアウト)集中の解放、周囲との関係を見せる

5 動かさずピントの合う位置を変える フォーカスイン/アウト (フォーカスイン)目覚め、思い出す

(フォーカスアウト)意識が遠のく、眠り

6 被写体を追う トラック 移動の流動感、臨場感、ダイナミックさ
7 被写体に近づける/遠ざける ドリーイン/アウト 遠近感の強調、立体感

個々の実装サンプルについては別途記事を用意するとして、まずはカメラワークにどんな種類があるのかを頭に入れておくだけでもイメージが膨らむと思います。

さぁこれでもうあなたはカメラワークの基本が身に付きました。きっとこれから映画やドラマを見る時に、はたまたゲームをやっている時にも「今のはパンだ」「ここはトラックで被写体を追いかけている」「やっぱりフィクスは落ち着くよね」なんて気になって仕方なくなるはずです。

そうなればしめたもの。あなたのゲームを作る時にも、狙った効果を最大限に引き出すカメラワークが選択できるんです。

まずはUnityのカメラをいじり回して、色々なカメラワークを試してみてね。

 

追記

Unityでカメラワークを実現する場合にはCinemachineを使うと便利です。機能が多いので学習コストはありますが、その分表現の幅が広がるので時間のある時に挑戦してみることをおすすめします。

 

     

ゲーム開発の攻略チャートを作りました!

CTA-IMAGE

「ゲームを作ってみたいけど、何から手を付けていいか分からない!」


そんなお悩みをお持ちの方向けに、todoがアプリをリリースした経験を中心に、ゲーム作りの手順や考慮すべき点をまとめたe-bookを作成しました。ゲーム作りはそれ自体がゲームのように楽しいプロセスなので、「攻略チャート」と名付けています。


ゲームを作り始めた時にぶつかる壁である「何をしたら良いのか分からない」という悩みを吹き飛ばしましょう!