3Dモデルをスワイプで回転させられるような機能を実装する
1.各オブジェクトの配置
表示して眺めたい3Dオブジェクトを配置する。
次に空のゲームオブジェクトを生成し、そのオブジェクトを先に配置したオブジェクトの中心に配置する。
その下にMainCameraを配置する。位置は3Dモデルから少し離れた位置に。
2.回転スクリプトをアタッチ
空のゲームオブジェクトに以下のスクリプトをアタッチする。
using UnityEngine; | |
using UnityEngine.UI; | |
using System.Collections; | |
public class Rotate : MonoBehaviour { | |
public float maxAngle = 60.0F; //垂直方向に回転できる上限角度 | |
public float minAngle = 300.0F; //垂直方向に回転できる下限角度 | |
public float rotateSpeed = 30.0f; //回転速度(角度/秒) | |
private GameObject camera; //メインカメラ | |
private Vector2 beforePoint; //1フレーム前のポイント(各指) | |
private Vector2 nowPoint; //現フレームのポイント(各指) | |
private Vector2 difference; //二本指操作チェック用差分 | |
private float horizontalAngle; | |
private float varticalAngle; | |
void Start() { | |
camera = this.transform.Find("MainCamera").gameObject; | |
} | |
void Update() { | |
//1本指でタップした場合は回転 | |
if (Input.touchCount == 1) { | |
//押下時のポイントを取得 | |
if (Input.touchCount > 0) { | |
if (Input.GetTouch(0).phase == TouchPhase.Began) { | |
beforePoint = Input.GetTouch(0).position; | |
} | |
} | |
//スワイプでの継続した入力があった場合、その方向へ回転させる | |
if (Input.GetTouch(0).phase == TouchPhase.Moved) { | |
nowPoint = Input.GetTouch(0).position; | |
//水平方向の移動があった場合、水平方向に回転 | |
if (nowPoint.x - beforePoint.x != 0) { | |
horizontalAngle = nowPoint.x - beforePoint.x; | |
horizontalAngle *= rotateSpeed * Time.deltaTime; | |
//水平方向に回転させる(水平方向はワールド軸) | |
this.transform.Rotate(0, horizontalAngle, 0, Space.World); | |
} | |
//垂直方向の回転があった場合、垂直方向に回転 | |
if (nowPoint.y - beforePoint.y != 0) { | |
varticalAngle = nowPoint.y - beforePoint.y; | |
varticalAngle *= rotateSpeed * Time.deltaTime; | |
//現在の角度を丸め込み(小数点第一位) | |
float tmpAngles = Mathf.Round(this.transform.rotation.eulerAngles.x * 10); | |
tmpAngles /= 10; | |
//上方向に回転 | |
if (tmpAngles <= maxAngle) { | |
//指定した最大角度を超える場合は最大角度まで回転するようにする | |
if (varticalAngle + this.transform.rotation.eulerAngles.x > maxAngle) { | |
varticalAngle = maxAngle - this.transform.rotation.eulerAngles.x; | |
} | |
//垂直方向に回転させる(垂直方向はローカル軸) | |
this.transform.Rotate(varticalAngle, 0, 0, Space.Self); | |
//指定角度を超えてしまった場合の処理 | |
} | |
else if (tmpAngles > maxAngle && tmpAngles <= 180) { | |
//下方向にしか回転できないようにする | |
if (varticalAngle < 0) { | |
this.transform.Rotate(varticalAngle, 0, 0, Space.Self); | |
} | |
} | |
//下方向に回転 | |
if (tmpAngles >= minAngle) { | |
//指定した最大角度を超える場合は最大角度まで回転するようにする | |
if (varticalAngle + this.transform.rotation.eulerAngles.x < minAngle) { | |
varticalAngle = minAngle - this.transform.rotation.eulerAngles.x; | |
} | |
this.transform.Rotate(varticalAngle, 0, 0, Space.Self); | |
//指定角度を超えてしまった場合の処理 | |
} | |
else if (tmpAngles < minAngle && tmpAngles > 180) { | |
//上方向にしか回転できないようにする | |
if (varticalAngle > 0) { | |
this.transform.Rotate(varticalAngle, 0, 0, Space.Self); | |
} | |
} | |
} | |
//現フレームのポイントを格納 | |
beforePoint = nowPoint; | |
} | |
} | |
} | |
} |
メインカメラの親となる空のゲームオブジェクトを回転させる事で、モデルの周りをメインカメラが回転するという方法。
この処理などを合わせてビューワっぽく実装したのがこちら