Edited at

[Unity] シューティングゲームに使える相対移動を実装する

More than 3 years have passed since last update.

スマートフォンでシューティングゲームの自機を操作する場合、バーチャルパッドよりも相対移動の方が相性が良いです。

相対移動とは、画面上で任意の場所をタッチしてから指をスライドすることで、その移動分だけ自機が移動するような操作を指します。

メインカメラの設定により実装方法が異なりますので、それぞれまとめておきます。

それぞれのスクリプトを適当なオブジェクト(Cubeとか)にそのまま追加すればすぐに動きます。


メインカメラのProjection設定がOrthographicの場合

using UnityEngine;

using System.Collections;

public class player : MonoBehaviour {

private Vector3 playerPos;
private Vector3 mousePos;

void Update () {
playerControl ();
}

private void playerControl(){

if (Input.GetMouseButtonDown (0)) {
playerPos = this.transform.position;
mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
}

if (Input.GetMouseButton (0)) {

Vector3 prePos = this.transform.position;
Vector3 diff = Camera.main.ScreenToWorldPoint (Input.mousePosition) - mousePos;

//タッチ対応デバイス向け、1本目の指にのみ反応
if (Input.touchSupported) {
diff = Camera.main.ScreenToWorldPoint (Input.GetTouch (0).position) - mousePos;
}

diff.z = 0.0f;
this.transform.position = playerPos + diff;

}

if (Input.GetMouseButtonUp (0)) {
playerPos = Vector3.zero;
mousePos = Vector3.zero;
}
}
}


メインカメラのProjection設定がPerspectiveの場合

メインカメラがz=-10に、自機がz=0にいる前提です。

それ以外の場合は、適宜adjustmentの数値を調整してください。

using UnityEngine;

using System.Collections;

public class player : MonoBehaviour {

public float adjustment = 3.0f;

private Vector3 playerPos;
private Vector3 mousePos;

void Update () {
playerControl ();
}

private void playerControl(){

if (Input.GetMouseButtonDown (0)) {
playerPos = this.transform.position;
mousePos = Camera.main.ScreenToViewportPoint(Input.mousePosition) * Camera.main.fieldOfView / adjustment;
}

if (Input.GetMouseButton (0)) {

Vector3 prePos = this.transform.position;
Vector3 diff = Camera.main.ScreenToViewportPoint (Input.mousePosition) * Camera.main.fieldOfView / adjustment - mousePos;

//タッチ対応デバイス向け、1本目の指にのみ反応
if (Input.touchSupported) {
diff = Camera.main.ScreenToViewportPoint (Input.GetTouch (0).position) * Camera.main.fieldOfView / adjustment - mousePos;
}

diff.z = 0.0f;
this.transform.position = playerPos + diff;

}

if (Input.GetMouseButtonUp (0)) {
playerPos = Vector3.zero;
mousePos = Vector3.zero;
}
}
}