AR开发之Vuforiar功能演示
项目介绍
识别到卡片,可以对人物进行选择,缩放,删除,以及音效播放,特效展示等
功能展示
创建一个脚本,定义自己的功能,将DefaultTrackableEventHandler脚本在组件上删除,添加自己的脚本,MyDefaultTrackableEvetnHandler,大部分来自DefaultTrackableEventHandler,修改部分方法,实现属于自己的功能
public class MyDefaultTrackableEventHandler : MonoBehaviour, ITrackableEventHandler
{
public GameObject AiXiPrefab;
public GameObject bloodPrefab;
public GameObject TonadoPrefab;
private AudioSource auido;
#region PROTECTED_MEMBER_VARIABLES
protected TrackableBehaviour mTrackableBehaviour;
protected TrackableBehaviour.Status m_PreviousStatus;
protected TrackableBehaviour.Status m_NewStatus;
#endregion // PROTECTED_MEMBER_VARIABLES
#region UNITY_MONOBEHAVIOUR_METHODS
protected virtual void Start()
{
mTrackableBehaviour = GetComponent<TrackableBehaviour>();//获取到物体的组件
if (mTrackableBehaviour)
mTrackableBehaviour.RegisterTrackableEventHandler(this);//注册委托
auido = this.GetComponent<AudioSource>();
}
protected virtual void OnDestroy()
{
if (mTrackableBehaviour)
mTrackableBehaviour.UnregisterTrackableEventHandler(this);
}
#endregion // UNITY_MONOBEHAVIOUR_METHODS
#region PUBLIC_METHODS
public void OnTrackableStateChanged(//当状态改变的时候执行
TrackableBehaviour.Status previousStatus,
TrackableBehaviour.Status newStatus)
{
m_PreviousStatus = previousStatus;
m_NewStatus = newStatus;
if (newStatus == TrackableBehaviour.Status.DETECTED ||
newStatus == TrackableBehaviour.Status.TRACKED ||
newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
{
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
OnTrackingFound();//当识别到图片的时候
}
else if (previousStatus == TrackableBehaviour.Status.TRACKED &&
newStatus == TrackableBehaviour.Status.NO_POSE)
{
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
OnTrackingLost();//当丢失图片的时候调用
}
else
{
// For combo of previousStatus=UNKNOWN + newStatus=UNKNOWN|NOT_FOUND
// Vuforia is starting, but tracking has not been lost or found yet
// Call OnTrackingLost() to hide the augmentations
OnTrackingLost();
}
}
#endregion // PUBLIC_METHODS
#region PROTECTED_METHODS
protected virtual void OnTrackingFound()
{
//找到了需要识别的物体的时候
if (!auido.isPlaying)
{
auido.Play();
}
GameObject AIXI = GameObject.Instantiate(AiXiPrefab,transform.position - new Vector3(0,0,0),transform.rotation);
AIXI.transform.parent = this.transform;
GameObject el = GameObject.Instantiate(bloodPrefab, transform.position, Quaternion.identity);
el.transform.parent = this.transform;
Destroy(el, 5f);
GameObject e2 = GameObject.Instantiate(TonadoPrefab, transform.position, Quaternion.identity);
e2.transform.parent = this.transform;
Destroy(e2, 5f);
}
protected virtual void OnTrackingLost()
{//丢失了需要识别的物体
Destroy(GameObject.Find("Aixi(Clone)"));
Destroy(GameObject.Find("RFX_Blood_Puddle(Clone)"));
Destroy(GameObject.Find("RFX_Tonado_Flame(Clone)"));
}
控制人物脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Player : MonoBehaviour
{
public AudioClip welcomeClip;
void Start()
{
Invoke("PlaywelcomeClip", 8.0f);
}
void Update()
{
if (transform.localPosition.y > 0)
{
return;
}
transform.Translate(new Vector3(0,0.2f,0) * Time.deltaTime);
}
private void PlaywelcomeClip()
{
AudioSource.PlayClipAtPoint(welcomeClip, transform.position);
}
}
触屏操作
public class TouchTap : MonoBehaviour
{
private float touchTime;
private bool newTouch = false;
void Update()
{
if (Input.GetMouseButton(0))
{
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hitInfo;
if (Physics.Raycast(ray,out hitInfo))
{
//双击屏幕
//if (Input.touchCount == 1 && Input.GetTouch(0).phase == TouchPhase.Began)
//{
// if (Input.GetTouch(0).tapCount == 2)//当一个手指双击屏幕
// {
// Destroy(hitInfo.collider.gameObject);
// }
//}
//长按屏幕
if (Input.touchCount == 1)//一个手指头点击
{
Touch touch = Input.GetTouch(0);
if (touch.phase == TouchPhase.Began)//开始触摸点击
{
newTouch = true;
touchTime = Time.time;
}
else if (touch.phase == TouchPhase.Stationary)//当手指是静止的时候
{
newTouch = false;
Destroy(hitInfo.collider.gameObject);
}
else
{
newTouch = false;
}
}
}
}
}
}
滑动旋转
public class Rotate : MonoBehaviour
{
float xSpeed = 150f;
void Update()
{
if (Input.GetMouseButton(0))
{
if (Input.touchCount == 1)
{
if (Input.GetTouch(0).phase == TouchPhase.Moved)
{
transform.Rotate(Vector3.up * Input.GetAxis("Mouse X") * -xSpeed * Time.deltaTime);
}
}
}
}
}
缩放
public class EnLarge : MonoBehaviour
{
Vector2 oldPos1;
Vector2 oldPos2;
void Update()
{
if (Input.touchCount == 2)
{
if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved)
{
Vector2 temPos1 = Input.GetTouch(0).position;
Vector2 temPos2 = Input.GetTouch(1).position;
if (IsEnLarge(oldPos1, oldPos2, temPos1, temPos2))
{
float oldScale = transform.localScale.x;
float newScale = oldScale * 1.025f;
transform.localScale = new Vector3(newScale, newScale, newScale);
}
else
{
float oldScale = transform.localScale.x;
float newScale = oldScale / 1.025f;
transform.localScale = new Vector3(newScale, newScale, newScale);
}
oldPos1 = temPos1;
oldPos2 = temPos2;
}
}
}
//判断手势缩放
bool IsEnLarge(Vector2 oP1, Vector2 oP2,Vector2 nP1,Vector2 nP2)
{
float length1 = Mathf.Sqrt((oP1.x - oP2.x) * (oP1.x - oP2.x) + (oP1.y - oP2.y) * (oP1.y - oP2.y));
float length2 = Mathf.Sqrt((nP1.x - nP2.x) * (nP1.x - nP2.x) + (nP1.y - nP2.y) * (nP1.y - nP2.y));
if (length1 < length2)
{
return true;
}
else
{
return false;
}
}
}
聚焦功能,切换前后摄像头,打开闪光灯
namespace Vuforia
{
public class CameraSetting : MonoBehaviour
{
void Start()
{
var vuforia = VuforiaARController.Instance;
vuforia.RegisterVuforiaStartedCallback(OnVuforiaStarted);
vuforia.RegisterOnPauseCallback(OnPaused);
}
private void OnVuforiaStarted()
{
CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
}
private void OnPaused(bool isPaused)
{
}
public void OnFocusModeClick()//自动对焦功能
{
CameraDevice.Instance.SetFocusMode(CameraDevice.FocusMode.FOCUS_MODE_CONTINUOUSAUTO);
}
public bool IsBack = false;
public void SwitchCameraDirection()//切换手机的前置摄像头和后置摄像头
{
if (IsBack == false)
{
CameraDevice.Instance.Stop();
CameraDevice.Instance.Deinit();
CameraDevice.Instance.Init(CameraDevice.CameraDirection.CAMERA_FRONT);
CameraDevice.Instance.Start();
IsBack = true;
}
else
{
CameraDevice.Instance.Stop();
CameraDevice.Instance.Deinit();
CameraDevice.Instance.Init(CameraDevice.CameraDirection.CAMERA_BACK);
CameraDevice.Instance.Start();
IsBack = false;
}
}
public bool IsLight = false;
public void FlashTourch()//打开手机闪光灯
{
if (IsLight == false)
{
CameraDevice.Instance.SetFlashTorchMode(true);
IsLight = true;
}
else
{
CameraDevice.Instance.SetFlashTorchMode(false);
IsLight = false;
}
}
}
}
手机截屏功能

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using UnityEngine.UI;
public class ScreenShot : MonoBehaviour
{
private Camera ARCamera;
public GameObject OBJ;
public Text text;
void Start()
{
ARCamera = GameObject.Find("ARCamera").GetComponent<Camera>(); ;
//Invoke("OnScreenShotClick", 10f);
}
public void OnScreenShotClick()
{
System.DateTime now = System.DateTime.Now;
string times = now.ToString();
times = times.Trim();//去掉字符串的空格
times = times.Replace("/","-");//用-替换/
string fileName = "ARScreenShot" + times + ".png";
text.text = "设置路径";
if (Application.platform == RuntimePlatform.Android)
{
text.text = "截屏开始";
//包含UI截屏方式
Texture2D texture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
texture.Apply();
byte[] bytes = texture.EncodeToPNG();
//规定写法,sdcard是手机的存储卡,DCIM是相册,Screenshots是手机截屏文件夹
string destination = "sdcard/DCIM/Screenshots";
if (!Directory.Exists(destination))
{
Directory.CreateDirectory(destination);
}
string pathSave = destination + "/" + fileName;
File.WriteAllBytes(pathSave, bytes);
OBJ.GetComponent<Material>().color = Color.red;
text.text = "截屏成功";
//不包含UI的截屏方式
//RenderTexture rt = new RenderTexture(Screen.width,Screen.height,1);
//ARCamera.targetTexture = rt;
//ARCamera.Render();
//RenderTexture.active = rt;
//Texture2D texture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
//texture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);
//texture.Apply();
//ARCamera.targetTexture = null;
//RenderTexture.active = null;
//Destroy(rt);
//byte[] bytes = texture.EncodeToPNG();
////规定写法,sdcard是手机的存储卡,DCIM是相册,Screenshots是手机截屏文件夹
//string destination = "sdcard/DCIM/Screenshots";
//if (!Directory.Exists(destination))
//{
// Directory.CreateDirectory(destination);
//}
//string pathSave = destination + "/" + fileName;
//File.WriteAllBytes(pathSave, bytes);
}
}
}