はじめに
以前は、Vuforiaでムービーの再生をしたとき、ダブルタップでフルスクリーン再生になっていたと思うのだが、最近のVuforiaではダブルタップしてもフルスクリーンにならないようだ。
仕方がないので、スクリプトを自作して対処した覚書。
コード
基本的には、AR CameraにアタッチされているPlayVideoコンポーネントのplayFullscreen変数をtrueにして、TryPickingVideoメソッドを呼び出せば良い。
実際のコードは以下。
SwitchFullscreen.cs
using UnityEngine;
using System.Collections;
public class SwitchPlayVideoFullscreen : TapBehaviour {
public PlayVideo playVideo; // ARカメラのPlayVideoコンポーネントをUnityエディタ上でセットしておく。
public override void DoubleTap (Vector3 position){
if (playVideo == null) return;
playVideo.playFullscreen = true;
playVideo.TryPickingVideo ();
}
}
コード中のTapBehaviourは、Unityで画面をタップした時のRayの撃ち方を考えてみたの記事で書いたものと同等だが、ダブルタップに対応したバージョンになっている。
おまけコード
以下にTapBehaviourとAR Cameraに貼り付けておくTouchHandlerのコードも一応書いておくが、詳細はここでは説明しない。
TapBehaviour.cs
using UnityEngine;
using System.Collections;
public class TapBehaviour : MonoBehaviour {
public enum FlickDirection {
Up,
Down,
Left,
Right,
};
// タッチしたときに呼ばれる。
public virtual void TapDown(Vector3 position){}
// タッチを離したときに呼ばれる。
public virtual void TapUp(Vector3 position){}
//
public virtual void Move(Vector3 position){}
// Double Tap
public virtual void DoubleTap(Vector3 position){}
// Flick
public virtual void Flick(FlickDirection dir, float distance){}
}
TouchHandler.cs
using UnityEngine;
using System;
using System.Collections;
public class TouchHandler : MonoBehaviour {
public Camera localCamera; // AR CameraをUnityエディタ上でセットしておく。
public float distance = 1000; // Rayの届く距離
TapBehaviour mTarget = null;
Vector3 mMouseDownPosition;
Vector3 mMouseUpPosition;
float mFlickDistanceX = 0.0f;
float mFlickDistanceY = 0.0f;
float mFlickDistance = 0.0f;
bool mIsHorizontalFlick;
bool isFlick = false;
float mSeconds = 0.0f;
const float maxFlickTime = 0.2f;
const float MinFlickDistance = 15.0f;
void Update () {
if(Input.touchCount <= 0) return;
//Debug.Log("touch count = " + Input.touchCount);
// タッチされたとき
Touch touch = Input.GetTouch(0);
if(touch.phase == TouchPhase.Began){
//Debug.Log("touch began");
isFlick = false;
mSeconds = 0.0f;
// メインカメラからクリックしたポジションに向かってRayを撃つ。
//Ray ray = localCamera.ScreenPointToRay(Input.mousePosition);
Ray ray = localCamera.ScreenPointToRay(touch.position);
RaycastHit hit = new RaycastHit();
//mMouseDownPosition = Input.mousePosition;
mMouseDownPosition = touch.position;
if (Physics.Raycast(ray, out hit, distance)) {
GameObject selectedGameObject = hit.collider.gameObject;
mTarget = selectedGameObject.GetComponent(typeof(TapBehaviour)) as TapBehaviour;
Debug.Log ("mTarget = " + mTarget);
if(mTarget != null){
mTarget.TapDown(mMouseDownPosition);
}
}
// 指を移動中
}else if(touch.phase == TouchPhase.Moved){
mSeconds += touch.deltaTime;
Vector3 position = touch.deltaPosition;
if(mTarget != null){
mTarget.Move(position);
}
// 指を離したとき
}else if(touch.phase == TouchPhase.Ended){
//Debug.Log("touch ended");
mSeconds += touch.deltaTime;
Debug.Log("time: " + mSeconds);
// メインカメラからクリックしたポジションに向かってRayを撃つ。
//Ray ray = localCamera.ScreenPointToRay(Input.mousePosition);
Ray ray = localCamera.ScreenPointToRay(touch.position);
RaycastHit hit = new RaycastHit();
//mMouseUpPosition = Input.mousePosition;
mMouseUpPosition = touch.position;
// フリックした距離が MinFlickDistance 以上なら isFlick を true に変更
mFlickDistanceX = mMouseUpPosition.x - mMouseDownPosition.x;
mFlickDistanceY = mMouseUpPosition.y - mMouseDownPosition.y;
mFlickDistance = Mathf.Abs(mFlickDistanceX) > Mathf.Abs(mFlickDistanceY) ? mFlickDistanceX : mFlickDistanceY;
if (mSeconds < maxFlickTime && (mFlickDistance > MinFlickDistance || mFlickDistance < -MinFlickDistance)) {
Debug.Log ("flick!!");
isFlick = true;
mIsHorizontalFlick = Mathf.Abs(mFlickDistanceX) >= Mathf.Abs(mFlickDistanceY);
TapBehaviour.FlickDirection dir;
if(mIsHorizontalFlick){ // Horizontal Flick
if(mFlickDistanceX > 0){
dir = TapBehaviour.FlickDirection.Right;
}else{
dir = TapBehaviour.FlickDirection.Left;
}
}else{ // Vertical Flick
if(mFlickDistanceY > 0){
dir = TapBehaviour.FlickDirection.Up;
}else{
dir = TapBehaviour.FlickDirection.Down;
}
}
if(mTarget != null){
mTarget.Flick(dir, mFlickDistance);
}
}
if ( ! isFlick && Physics.Raycast(ray, out hit, distance)) {
//Debug.Log ("Not Flick");
GameObject selectedGameObject = hit.collider.gameObject;
TapBehaviour target = selectedGameObject.GetComponent(typeof(TapBehaviour)) as TapBehaviour;
if(target != null && target == mTarget){
if(touch.tapCount == 1){
//Debug.Log ("TapUp");
target.TapUp(mMouseUpPosition);
}else if(touch.tapCount >= 2){
//Debug.Log ("Double Tap");
target.DoubleTap(mMouseUpPosition);
}
}
}
mTarget = null;
}
}
}