Unity版本:2020.3.0
先看看成品效果
AR傳送門(一)
目錄
- 一、AR環境搭建
- 二、AR傳送門原理
- 1、制作傳送門
- 2、AR平面檢測,生成傳送門
- 三、代碼控制AR的狀態檢測、開啟及關閉
- 1、如何判斷設備是否滿足AR硬體需求
- 2、如何主動開啟、關閉AR功能
- 四、專案下載鏈接
一、AR環境搭建
我這邊開發AR用的是ARFoundation,集成了ARCore和ARKit的功能,AR環境的搭建有兩種方式:
1、直接使用unity提供的AR模板
在unityHub面板新建專案,彈出如下彈框,選擇AR模板,設定好專案名稱和位置,創建,

進入專案后,可以在Project視圖中找到SampleScene場景,如下圖,是三個核心游戲體,

2、如果是在已有專案上添加AR功能,則可以手動匯入AR支持,
打開專案,Window–>PackageManager,選擇UnityRegistry

搜索XR(unity現在把AR/VR都歸到了XR),選擇AR支持,發布安卓選ARCore,發布iOS選擇ARKit,點擊Install匯入,我這里已經匯入過了,所以顯示Remove

匯入完之后,可以在Project視圖下看到Packages有哪些包

導完包后,可以在GameObject選項下看到XR選項,選擇AR Session Origin和AR Session ,AR的基本環境便搭好了,

AR環境搭建好以后,記得把專案切換成安卓平臺,打開Edit–>ProjectSetting,進行XR設定,(老版的XR設定在Player里面,勾選virtual reality Support)
選擇安卓平臺,勾選ARCore,專案如果想啟動后就進入AR,勾選Initialize XR on StartUp,否則不勾選 手動開啟,開啟方法后面再說,

二、AR傳送門原理
1、制作傳送門
如下效果,外部看不到傳送門里的游戲體,只能從門看到內部情況,
這個傳送門預設體我會放在文末的專案鏈接里,


這個效果主要通過 通道遮罩 ColorMask實作,
ColorMask可以讓我們制定渲染結果的輸出通道,而不是通常情況下的RGBA這4個通道全部寫入,可選引數是 RGBA 的任意組合以及 0, 這將意味著不會寫入到任何通道,可以用來單獨做一次Z測驗,而不將結果寫入顏色通道
Shader "DepthMask" {
SubShader {
// Render the mask after regular geometry, but before masked geometry and
// transparent things.
Tags {"Queue" = "Geometry-10" }
// Turn off lighting, because it's expensive and the thing is supposed to be
// invisible anyway.
Lighting Off
// Draw into the depth buffer in the usual way. This is probably the default,
// but it doesn't hurt to be explicit.
ZTest LEqual
ZWrite On
// Don't draw anything into the RGBA channels. This is an undocumented
// argument to ColorMask which lets us avoid writing to anything except
// the depth buffer.
ColorMask 0
// Do nothing specific in the pass:
Pass {}
}
}
2、AR平面檢測,生成傳送門
在AR Session Origin游戲體下添加AnchorCreator組件,用AR模板的應該直接就有,然后把自己做好的傳送門預設體拖到Anchor Prefab上,當應用開啟AR相機檢測到平面后,點擊螢屏,會在指定位置自動生成我們的傳送門,

三、代碼控制AR的狀態檢測、開啟及關閉
如果專案并不是進來就開啟AR,而是在特定時刻手動打開,可以接著看下面的方法:
1、如何判斷設備是否滿足AR硬體需求
//開啟AR支持檢測
if ((ARSession.state == ARSessionState.None) ||
(ARSession.state == ARSessionState.CheckingAvailability))
{
yield return ARSession.CheckAvailability();
}
if (ARSession.state == ARSessionState.Unsupported)
{
tip.text = "當前設備不支持AR功能";
//不支持AR的后續處理
UnsupportedAR();
yield break;
}
else if (ARSession.state == ARSessionState.NeedsInstall)
{
tip.text = "當前設備需要安裝ARCore以支持AR功能";
yield return ARSession.Install();
}
else
{
tip.text = "當前設備支持AR功能";
LoadARScene();
}
2、如何主動開啟、關閉AR功能
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.XR.ARFoundation;
using UnityEngine.XR.ARSubsystems;
using UnityEngine.XR.Management;
using UnityEngine.SceneManagement;
using MR_LBS.Client.Unity3D;
public class ARStateCheck : MonoBehaviour
{
public Text tip;
public void OpenAR()
{
#if UNITY_EDITOR
LoadARScene();
#else
StartCoroutine(StartXR());
#endif
}
public IEnumerator StartXR()
{
yield return XRGeneralSettings.Instance.Manager.InitializeLoader();
if (XRGeneralSettings.Instance.Manager.activeLoader == null)
{
Debug.LogError("Initializing XR Failed. Check Editor or Player log for details.");
}
else
{
Debug.Log("Starting XR...");
XRGeneralSettings.Instance.Manager.StartSubsystems();
gameObject.AddComponent<ARSession>();
yield return null;
//開啟AR支持檢測
if ((ARSession.state == ARSessionState.None) ||
(ARSession.state == ARSessionState.CheckingAvailability))
{
yield return ARSession.CheckAvailability();
}
if (ARSession.state == ARSessionState.Unsupported)
{
tip.text = "當前設備不支持AR功能";
//不支持AR的后續處理
UnsupportedAR();
yield break;
}
else if (ARSession.state == ARSessionState.NeedsInstall)
{
tip.text = "當前設備需要安裝ARCore以支持AR功能";
yield return ARSession.Install();
}
else
{
tip.text = "當前設備支持AR功能";
LoadARScene();
}
}
}
/// <summary>
/// 加載AR場景
/// </summary>
void LoadARScene()
{
SceneManager.LoadScene("ARScene", LoadSceneMode.Single);
}
public void StopXR()
{
Debug.Log("Stopping XR...");
XRGeneralSettings.Instance.Manager.StopSubsystems();
XRGeneralSettings.Instance.Manager.DeinitializeLoader();
Debug.Log("XR stopped completely.");
SceneManager.LoadScene("ARScene", LoadSceneMode.Single);
Destroy(UnityPhotonClient.Instance.gameObject);
StopAllCoroutines();
SceneManager.LoadScene("LogIn");
}
/// <summary>
/// 不支持AR的后續處理
/// </summary>
public void UnsupportedAR() {
}
}
四、專案下載鏈接
https://download.csdn.net/download/qq_43505432/33628985
代碼控制AR用下圖兩個場景

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/330444.html
標籤:其他
