0.0 はじめに
UnityのAsset(アセットストア)のJoystick Packを使うと3D、2D問わずゲームにバーチャルスティックを簡単に実装できます。
バーチャルスティックの種類もFixed(スティックは常に表示され、位置が固定されている)、Floating(スティックはタップされるまで非表示だが、タップされたらその場にスティックが表示される)とDynamic(スティックはタップされるまで非表示だが、タップされたらその場にスティックが表示され、ドラッグすると追従する)という3種類のモードがあります。
ただCanvasのRender Modeの設定がScreen Space - Camera(RenderMode==ScreenSpaceCamera)の状態で、Floatingモードをつかうと1回目だけコントローラーが表示されない、動作が変な感じになります。
対策を見つけるのにかなり時間がかかったので忘れないうちに記事にしておきます。
もちろん、CanvasのRender Modeの設定をScreen Space - Overlayを変えればこの問題は起きなくなります。
1.0 スクリプトの変更
ScriptsフォルダのBaseフォルダにあるJoystickを変更します。
ScreenPointToAnchoredPosition関数(138行目あたり?)の頭 、Vector2 localPoint = Vector2.zero;の前、(もしくはすぐ後)に下記の記述を挿入する
if (cam == null && canvas.renderMode == RenderMode.ScreenSpaceCamera)
cam = canvas.worldCamera;
この記述がないとcam変数にcanvas.worldCameraが設定されないので、canvasの大きさが考慮されずJoystickの位置が意図しない場所に表示されてしまいます。
ちなみにこの関数を呼んでいるFloatingJoystickクラス(Joystickクラスの継承先)ではScreenPointToAnchoredPosition関数の後にOnPointerDown関数を呼んでいますが、こちらの関数にはこの記述が含まれている、、、、なぜだろう?