基于Unity AR Core与AR Foundation的多场景平面检测适配问题
解决方案
一、隐藏平面检测的可视化网格
- 找到场景中的
AR Plane Manager组件 - 选中它关联的
Plane Prefab,在预制体内部禁用Mesh Renderer和Line Renderer组件(无需边框的话可直接关闭) - 配置完成后,AR Core会正常检测平面用于锚定,但不会在屏幕上显示任何网格
二、实现单次锚点创建与场景复用
核心思路
只创建一个全局AR锚点,所有场景内容都挂载到该锚点下,切换场景时仅替换锚点下的内容,而非重复创建锚点。
代码实现示例
- 创建单例管理器脚本
ARAnchorManager:
using UnityEngine; using UnityEngine.XR.ARFoundation; using UnityEngine.XR.ARSubsystems; public class ARAnchorManager : MonoBehaviour { public static ARAnchorManager Instance; public ARRaycastManager raycastManager; public Transform arAnchor; private void Awake() { Instance = this; } public void TryCreateAnchor(Vector2 screenPos) { // 已有锚点则直接返回 if (arAnchor != null) return; // 检测屏幕点击对应的平面 if (raycastManager.Raycast(screenPos, out var hits, TrackableType.PlaneWithinPolygon)) { var hitPose = hits[0].pose; // 创建AR锚点 var anchorObj = new GameObject("ARAnchor"); var anchor = anchorObj.AddComponent<ARAnchor>(); anchor.transform.SetPositionAndRotation(hitPose.position, hitPose.rotation); arAnchor = anchor.transform; } } // 切换场景内容的方法 public void SwitchSceneContent(GameObject scenePrefab) { if (arAnchor == null) return; // 清除锚点下现有子物体 foreach (Transform child in arAnchor) { Destroy(child.gameObject); } // 实例化新场景内容到锚点下 Instantiate(scenePrefab, arAnchor); } }
- 按钮绑定逻辑:
- 放置锚点按钮:绑定
ARAnchorManager.Instance.TryCreateAnchor(Input.mousePosition)(移动端替换为Input.GetTouch(0).position) - 场景切换按钮:绑定
ARAnchorManager.Instance.SwitchSceneContent(对应场景预制体)
注意事项
- 将每个场景的内容做成预制体,根对象位置设为(0,0,0),确保挂载到锚点后位置正确
- 需先创建锚点再切换场景,否则切换方法会直接返回
三、额外优化建议
- 在UI上添加状态提示:未创建锚点时,场景切换按钮置灰或提示用户先放置锚点
- 若需要微调锚点位置,可给锚点添加拖拽功能,直接调整
ARAnchor的Transform参数即可
内容的提问来源于stack exchange,提问作者Business Stork
相关产品推荐
相关产品推荐

