LoginSignup
2
4

More than 5 years have passed since last update.

Unity ジョイスティック(バーチャルパッド)でFPSの移動と視点の操作

Last updated at Posted at 2017-08-23

概要と注意

Unityで画面の左右にジョイスティックを表示し、左のジョイスティックでプレイヤーの移動、右のジョイスティックで視点を操作できる様にするスクリプトです。左右どっちをどっちにするかは好きな様に変えられます。UIの位置の問題なので。
※FPS視点のプレイヤーを想定しています。視点操作は欠陥がありますが、これはいずれ修正するかも。

ジョイスティック(バーチャルパッド)でのプレイヤーの移動のスクリプト

MoveController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveController : MonoBehaviour {

    Touch touched = new Touch();
    public RectTransform canvas;
    Vector3 touchWorldPos;
    Vector3 startPos;
    int range = 100;
    Vector3 stickPos;
    public CharacterController player;
    int speed = 3;


    // Use this for initialization
    void Start () {
        startPos = transform.position;
    }

    // Update is called once per frame
    void Update () {
        if (Input.touchCount > 0) { //タッチされている場合
            for (int i = 0; i < Input.touchCount; i++) {
                touched = Input.touches [i];
                RectTransformUtility.ScreenPointToWorldPointInRectangle (canvas, touched.position, null, out touchWorldPos);
                if (Vector3.Distance (touchWorldPos, startPos) < range) {
                    transform.position = touchWorldPos; //タッチしてる点に画像がくる様にする
                    //playerを動かす
                    CollisionFlags cf= player.Move(new Vector3(speed * Time.deltaTime * ((touchWorldPos.x - startPos.x)/range), 0, speed * Time.deltaTime * ((touchWorldPos.y - startPos.y)/range)));
                }
            }
        } else { //タッチされていない場合→スティックを元の位置に戻す
            transform.position = startPos;
        }
    }
}

以下の画像の様にImageのUIにMoveController.csをアタッチします。
それぞれ変数もInspectorビューからアタッチ。
パーチャルパッド.png

rangeの値を大きくするとジョイスティックの範囲を広げられます。

ジョイスティック(バーチャルパッド)でのプレイヤーの回転の操作のスクリプト

FPSCameraController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FPSCameraController : MonoBehaviour {

    Touch touched = new Touch();
    public RectTransform canvas;
    Vector3 touchWorldPos;
    Vector3 startPos;
    int range = 100;
    Vector3 stickPos;
    public GameObject player;
    int speed = 100;

    // Use this for initialization
    void Start () {
        startPos = transform.position;
    }

    // Update is called once per frame
    void Update () {
        if (Input.touchCount > 0) { //タッチされている場合
            for (int i = 0; i < Input.touches.Length; i++) {
                touched = Input.touches [i];
                RectTransformUtility.ScreenPointToWorldPointInRectangle (canvas, touched.position, null, out touchWorldPos);
                if (Vector3.Distance (touchWorldPos, startPos) < range) {
                    transform.position = touchWorldPos; //タッチしてる点に画像がくる様にする
                    //カメラを動かす
                    //垂直方向の回転
                    player.transform.Rotate(transform.right, -speed * Time.deltaTime * ((touchWorldPos.y - startPos.y)/range));
                    //水平方向の回転
                    player.transform.Rotate(transform.up, speed * Time.deltaTime * ((touchWorldPos.x - startPos.x)/range));
                    print(player.transform.localRotation);
                }
            }
        } else { //タッチされていない場合→スティックを元の位置に戻す
            transform.position = startPos;
        }
    }
}

以下の画像の様にImageのUIにMoveController.csをアタッチします。
それぞれ変数もInspectorビューからアタッチ。

バーチャルパッド2.png

rangeの値を大きくするとジョイスティックの範囲を広げられます。

調整

スタンダードアセットのFirstPersonController.csのプレイヤーの回転の記述とFPSCameraController.csの記述が衝突して動かなくなるのでFirstPersonController.csの一部をコメントアウトします。

FirstPersonController.cs
private void RotateView()
{
    //↓↓↓FPSCameraControllerの回転と衝突するのでコメントアウト
    //m_MouseLook.LookRotation (transform, m_Camera.transform);
}
2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4