用unity+Vuforia制作了一個簡單的AR演示,實作用虛擬按鈕進行互動,用手勢控制模型旋轉和縮放,
- Vuforia虛擬按鈕
- 手勢控制模型旋轉縮放
視頻鏈接:https://www.bilibili.com/video/BV1Ny4y147aW/

關于Vuforia sdk的安裝,unity的安卓環境配置和打包apk,網上教程很多,這里就不介紹了,主要放一下虛擬按鈕和手勢控制的代碼,供大家參考學習,
我的unity版本是2019.4.24f1c1,Vuforia sdk版本是目前最新版9.8.5,人物模型是從unity商店免費下載的,
Vuforia虛擬按鈕
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;
public class VbController : MonoBehaviour
{
public GameObject girl;
private Animator animator;
void Start()
{
girl = GameObject.Find("girl");
animator = girl.GetComponent<Animator>();
var vbbs = GetComponentsInChildren<VirtualButtonBehaviour>();
for (int i = 0; i < vbbs.Length; ++i)
{
vbbs[i].RegisterOnButtonPressed(OnButtonPressed);
vbbs[i].RegisterOnButtonReleased(OnButtonReleased);
}
}
public void OnButtonPressed(VirtualButtonBehaviour vb)
{
switch (vb.VirtualButtonName)
{
case "RunButton":
animator.SetBool("walk", false);
animator.SetBool("run", true);
break;
case "WalkButton":
animator.SetBool("run", false);
animator.SetBool("walk", true);
break;
default:
animator.SetBool("walk", false);
animator.SetBool("run", false);
break;
}
}
public void OnButtonReleased(VirtualButtonBehaviour vb)
{
animator.Play("Idle");
}
}
手勢控制模型旋轉縮放
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
public enum FingerIE
{
zero,
OneFinger,
TwoFinger,
}
public class FingerController : MonoBehaviour
{
public Vector3 initialRot;
public Vector3 initialSca;
public static FingerController instance;
IEnumerator ie;
FingerIE finger_num = FingerIE.zero;
void Awake()
{
instance = this;
}
// Update is called once per frame
void Update()
{
if (Input.touchCount == 0)
{
if (finger_num != FingerIE.zero)
{
StopCoroutine(ie);
ie = null;
finger_num = FingerIE.zero;
}
}
else if (Input.touchCount == 1)
{
if (finger_num != FingerIE.OneFinger)
{
if (ie != null)
{
StopCoroutine(ie);
}
ie = IMonitorMouseOneFinger();
StartCoroutine(ie);
finger_num = FingerIE.OneFinger;
}
}
else if (Input.touchCount == 2)
{
if (finger_num != FingerIE.TwoFinger)
{
if (ie != null)
{
StopCoroutine(ie);
}
ie = IIMonitorMouseTwoFinger();
StartCoroutine(ie);
finger_num = FingerIE.TwoFinger;
}
}
}
/// <summary>
/// 一根手指控制轉動
/// </summary>
/// <returns></returns>
IEnumerator IMonitorMouseOneFinger()
{
Touch oneFingerTouch;
while (true)
{
oneFingerTouch = Input.GetTouch(0);
if (oneFingerTouch.phase == TouchPhase.Moved)
{
Vector2 deltaPos = oneFingerTouch.deltaPosition;
//transform.Rotate(-Vector3.forward * deltaPos.x * 0.2f, Space.Self);
//transform.Rotate(-Vector3.left * deltaPos.y * 0.2f, Space.Self);
//模型繞自身y軸旋轉
transform.Rotate(-Vector3.up * deltaPos.x * 0.2f, Space.Self);
}
yield return 0;
}
}
/// <summary>
/// 兩個手指控制縮放
/// </summary>
/// <returns></returns>
IEnumerator IIMonitorMouseTwoFinger()
{
Touch firstOldTouch;
Touch secondOldTouch;
Touch firstNewTouch;
Touch secondNewTouch;
float oldDistance;
float newDistance;
while (true)
{
firstOldTouch = Input.GetTouch(0);
secondOldTouch = Input.GetTouch(1);
oldDistance = Vector2.Distance(firstOldTouch.position, secondOldTouch.position);
yield return 0;
firstNewTouch = Input.GetTouch(0);
secondNewTouch = Input.GetTouch(1);
newDistance = Vector2.Distance(firstNewTouch.position, secondNewTouch.position);
if (oldDistance > newDistance && this.transform.localScale.x > 0.25f)
{
this.transform.localScale -= Vector3.one * 0.1f;
}
else if (oldDistance < newDistance && this.transform.localScale.x < 2f)
{
this.transform.localScale += Vector3.one * 0.1f;
}
}
}
/// <summary>
/// 復位
/// </summary>
public void ResetRot()
{
this.transform.localEulerAngles = initialRot;
this.transform.localScale = initialSca;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/277419.html
標籤:其他
上一篇:最短路徑(迪杰斯特拉演算法)
