概要と注意
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ビューからアタッチ。
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ビューからアタッチ。
rangeの値を大きくするとジョイスティックの範囲を広げられます。
調整
スタンダードアセットのFirstPersonController.cs
のプレイヤーの回転の記述とFPSCameraController.cs
の記述が衝突して動かなくなるのでFirstPersonController.cs
の一部をコメントアウトします。
FirstPersonController.cs
private void RotateView()
{
//↓↓↓FPSCameraControllerの回転と衝突するのでコメントアウト
//m_MouseLook.LookRotation (transform, m_Camera.transform);
}