読者です 読者をやめる 読者になる 読者になる

あさちゅんのゲームブログ

UnityやSiv3Dに関するゲーム開発メモを残していきます

Unity初心者でも簡単に作れるFPSカメラの作り方

Unity FPS 物理演算 C#

ハッカソンに行ったらFPS視点やキャラの後ろを追従するカメラを作ったまでは良かったが、カメラの向きと入力が一致せずに最悪の操作性になって苦労している人が多かったので、今回はそんな人向けに、Unity初心者でも作れるFPSカメラを紹介しようと思います。

本当に初心者向けなので、経験者の方はどうぞStandard Assetsをお使いください〜

プレイヤーを作る

FPSなのでプレイヤーのキャラを用意せずに、カメラをそのまま動かします。

ここで一つ問題があります。移動する時に座標をそのままいじってしまうと、せっかく作った壁などを突き抜けてしまいます。なので、ここはUnityご自慢の物理演算を使おうと思います。

Main CameraにAdd Componentで以下の3つをつけてください。

つけれたら下の画像のように設定してください。

f:id:chunchunmorning:20160731002405p:plain

もし、今の段階で床などを作っていなければ、適当に配置してください。カメラの座標はそれに合わせて変更していただいて大丈夫です。

これでFPSプレイヤーの完成です。ここからお待ちかねのスクリプトを書いていきます。

移動を実装する

スクリプトにこのように書いていきます。

上から解説していきます。まず、Startで自分のRigidbodyを変数m_Rigidbodyに代入、m_Rigidbodyを通して操作できるようにします。。

見ていたチュートリアルによっては、これをせずに「rigidbody」に対して操作していたかもしれませんが、非推奨なのでやめましょう。

次にUpdateの上半分では十字キーの入力に応じて、回転させています。これで首が回せます。

最後に下半分は長いですが、やっていることは簡単でWASDキーの入力状態を取得してrigidbodyのvelocityを変えています。

物理演算なのにAddForceじゃないの?って思った人も多いと思いますが、AddForceをすると最初は遅く、だんだん速くなってしまうので、力を加えるのではなく速度を直接いじります。この方法でも壁にぶつかったら止まってくれます。

打ち終わったら実行してみてください。十字キーで見渡すことができ、WASDキーで動こうとしたら、転んでうまく動けないと思います笑

動いただけで転ぶのではかっこ悪いので、転ばないようにします。

Unityに戻ってRigidbody項目の一番下にある、Constrainsの横の三角形を押して展開してください。

f:id:chunchunmorning:20160731002403p:plain

上の画像のように展開されてFreeze Position, Freeze Rotationの項目が出たと思います。

これは物理演算でいじってほしくない項目を設定するところで、今回は勝手に転んでほしくないので、画像のようにFreeze Rotationのx, y, z全てにチェックをつけてください。

この状態でもう一回実行すれば、転ばずに動けたと思います。

カメラとキーの向きを合わせる

転ばずに動くことには成功しましたが、首を動かした途端うまく動けなくなったと思います。

例えばWキーを押した時は前に進むはずですが、実際にはZ軸の+方向に進んでいるだけで、カメラから見た前ではないからです。

これを直すためにはスクリプトの最後の一行、velocityに代入しているところを以下のように書き換えます。

transform.forwardはアタッチされているGameObjectの前方向、つまり今回の場合カメラの前方向を返してくれます。それにWキーとSキー、つまり前後方向の移動量zをかけます。

同様にtransform.rightは右方向を返すので左右方向の移動量xをかけると、カメラの向きを考慮した入力が作れます。

ベクトルは数字の用に足し合わせることができるので、この2つの和をvelocityに代入してやればFPSカメラの完成です。

まとめ

Unityの設定をいじったり、スクリプトを書いたりしたりして少し大変だったかもしれませんが、やっていること一つ一つはとても簡単だったと思います。

今はスクリプトではなくエディタで設定するのが面倒かもしれませんが、慣れると便利に使えるようになるので、ぜひこれを機にUnityに親しんでいただければと思います。

使用したソフト
OS X El Capitan バージョン 10.11.5
Unity 5.4.0f3 Personal