[Unity]Vuforiaでフルスクリーン動画再生をする


## はじめに

以前は、Vuforiaでムービーの再生をしたとき、ダブルタップでフルスクリーン再生になっていたと思うのだが、最近のVuforiaではダブルタップしてもフルスクリーンにならないようだ。
仕方がないので、スクリプトを自作して対処した覚書。

>参考：[Unity + Vuforia でARな動画再生を試してみた](http://qiita.com/JunSuzukiJapan/items/f6ed23bb519d01fdaaa3)


## コード

基本的には、AR CameraにアタッチされているPlayVideoコンポーネントのplayFullscreen変数をtrueにして、TryPickingVideoメソッドを呼び出せば良い。

実際のコードは以下。

```csharp: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の撃ち方を考えてみた](http://qiita.com/JunSuzukiJapan/items/1698a21323558e246c4f)の記事で書いたものと同等だが、ダブルタップに対応したバージョンになっている。

## おまけコード

以下にTapBehaviourとAR Cameraに貼り付けておくTouchHandlerのコードも一応書いておくが、詳細はここでは説明しない。

```csharp: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){}
}
```

```csharp: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;
        }
    }
}
```