Unity版本:2020.3.0
先看看成品效果
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();
}
不支持AR的手机可下载ARCore.apk,能支持部分原本不支持AR的手机,注意!不是全部,千元以下的手机就别想了(目前试了两款手机,小米可以,华为不支持) https://download.csdn.net/download/qq_43505432/85017218
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/66732461
代码控制AR用下图两个场景
今天的文章unity传送场景_unity3d制作场景地图分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/88079.html