【Unity】FPS操作をタッチ画面に対応させてみた

unity

FPSゲームはPCであればキーボードとマウスで操作しますが、モバイル対応時にジョイスティックやボタンをつけて操作してみました。

作ってみたゲームは以下の通りです。

 

ジョイスティックで移動、透明パネルで視点回転、ボタンで発砲、という操作になっています。

使用しているのはStandardAssetsのRigidBodyFPSController(以降、FPSコントローラ)です。

FPSコントローラはPCで操作すると、キーボードのWASDで移動、マウス移動で視点回転がデフォルトになっています。

こいつを少し改造して、モバイル向けにしてみました。

必要なステップとしては、

  1. FPSコントローラを変更。
  2. ジョイスティックや、パネル、ボタンを配置。
  3. ジョイスティック等を動かした時に、FPSコントローラを操作するスクリプトを作成。

動画ではボタンで発砲していますが、ジャンプボタンを実装する流れで説明します。

FPSコントローラを変更

キーボード、マウス入力をジョイスティックやボタン入力にします。

RigidbodyFirstPersonController.cs

// 90行目付近 下記を追加
        [HideInInspector]
        public Vector2 RunAxis;
        [HideInInspector]
        public bool JumpAxis;

// 128行目 変更
            // if(CrossPlatformInputManager.GetButtonDown("Jump") && !m_Jump)
            if (JumpAxis && !m_Jump)

// 223行目 変更
            //x = CrossPlatformInputManager.GetAxis("Horizontal"),
            //y = CrossPlatformInputManager.GetAxis("Vertical")
             x = RunAxis.x,
             y = RunAxis.y

ジャンプと移動に関して、ボタン入力に変更しています。

次に視点移動をパネル入力に変更します。

MouseLook.cs

下記を追加&変更します。

        [HideInInspector]
        public Vector2 LookAxis;
           //float yRot = CrossPlatformInputManager.GetAxis("Mouse X") * XSensitivity;
            //float xRot = CrossPlatformInputManager.GetAxis("Mouse Y") * YSensitivity;

            float yRot = LookAxis.x * XSensitivity;
            float xRot = LookAxis.y * YSensitivity;

マウスから視点回転を操作していましたが、パネルからの入力に切り替えます。

ジョイスティックとボタンの配置

Joystick Packをアセットストアから入手します。

Canvasの中に、Fixed Joystickのprefabを配置します。

ジョイスティックの中のボタンを、コピーしてジャンプボタンにしています。

パネルを透明にして右側に配置します。

右側のボタンとパネルについては、以下のサイトにあるスクリプト(FixedButton.cs, FixedTouchField.cs)をそれぞれアタッチします。

https://gist.github.com/ditzel/0257d74a7a04626efce7bd1f7a6cfaa0

FPSコントローラを操作するスクリプトを作成

using UnityEngine;
using UnityStandardAssets.Characters.FirstPerson;

public class MyScript : MonoBehaviour
{

    public FixedJoystick MovejoyStick;
    public FixedButton JumpButton;
    public FixedTouchField TouchField;


    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        var fps = GetComponent<RigidbodyFirstPersonController>();

        fps.RunAxis = MovejoyStick.Direction;
        fps.JumpAxis = JumpButton.Pressed;
        fps.mouseLook.LookAxis = TouchField.TouchDist;
    }
}

作成したらRigidBodyFPSController.csにアタッチします。

ジョイスティック、ボタン、パネルをセットして完了です。

参考