0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-07-29

はじめに

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

参考:Unity + Vuforia でARな動画再生を試してみた

コード

基本的には、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;
        }
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?