AR/VR/MR

AR开发之Vuforiar功能演示

2019-05-30  本文已影响32人  明月海子

项目介绍

识别到卡片,可以对人物进行选择,缩放,删除,以及音效播放,特效展示等

功能展示

创建一个脚本,定义自己的功能,将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;
        }
    }

}

}

手机截屏功能

Y1.png

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);

    }
}

}

提示:手机保持图片不成功,可能是由于Android保存权限问题

上一篇 下一篇

猜你喜欢

热点阅读