Unity:FPSController のカーソルロックを外部スクリプトから切り替える方法

今回はUnity の Standard Assets の Character アセットに含まれている FPSController のプレハブを使用して、外部スクリプトからマウスカーソルのロックを制御する方法を試してみました。

マウスカーソルロックについて

FPSの操作で必要になるマウスカーソルを画面中央に固定する機能ですが、キャラクターのインベントリ画面の操作やシステムメニューの GUI 操作時にカーソルロックを解除したいケースがあります。

通常はプレハブのコンポーネントのLock Cursor のチェックを外しておいて、別のスクリプトで制御すると大丈夫ですね。

FirstPersonControllerの場合

RigidbodyFirstPersonControllerの場合

マウス右クリックでカーソルロックを切り替えるスクリプト

新しいスクリプトを作成してマウス右クリックでカーソルロックの制御ができるようにしてみました。画面にボタンを表示してカーソルロック時は非表示になるようにしています。

スクリプト

プレハブのコンポーネントから関数を呼び出してカーソルロック処理を行う

次に FPSController のスクリプトコンポーネントからカーソルロックの処理を呼び出して制御してみることにしました。まずは、プレハブのコンポーネントで使用されているスクリプトを調べてみました。

プレハブ FPSController のコンポーネント

スクリプト FirstPersonController からマウス操作のスクリプト MouseLook を呼び出しています。しかしプライベート属性になっているので、他のスクリプトからアクセスできません。

プレハブ RigidBodyFPSController のコンポーネント

スクリプト RigidbodyFirstPersonController からマウス操作のスクリプト MouseLook を呼び出しています。これはパブリック属性になっているので他のスクリプトからも呼び出せます。

スクリプト MouseLook のカーソルロック処理

プレハブ FPSController と RigidBodyFPSController はスクリプト MouseLook のメソッドを呼び出してカーソルロックの制御を行っています。
スクリプトのコード内でカーソルロック処理を行っているのは下記の部分です。Esc キーを押したらカーソルロック解除、マウス左ボタンクリックでカーソルロック有効になります。

スクリプト

というわけで、別のスクリプトから SetCursorLock() を実行すれば、カーソルロックが制御できることが分かりました。色々試してこのようなコードが出来上がりました。

StandardAssets のスクリプトは名前空間が使用されているのであらかじめ使用宣言が必要でした。今回の場合は using UnityStandardAssets.Characters.FirstPerson; となります。

WebGL

動作確認用にWebGLビルドしたものがこちらです。プレハブのインスタンス RigidBodyFPSController の Lock Curslr チェックボックスはオンのままで、外部スクリプトから制御しています。
画像クリックで再生(ファイルサイズ:約12MB)

まとめ

記事の最後で紹介したスクリプトでは、右クリックのカーソルロックと Esc キーのカーソルロックを併用すると処理が重複しているようで、切替処理の挙動が怪しいです。

結局のところ、最初の手順の通り、プレハブの Lock Curslr チェックボックスを外しておいて、カーソルロックを制御する方法が一番手っ取り早いと思いました!

また、WebGLビルドの場合は カーソルロック時にWebブラウザから
Esc キーでカーソル制御の解除」
というメッセージが表示されるので、カーソルロック切り換えのキー割り当てはそのままにしておく方が良さそうです。