在 Unity 中使用周遭建築物和地形
透過集合功能整理內容
你可以依據偏好儲存及分類內容。
Streetscape Geometry API 可提供場景中地形、建築物或其他結構物的幾何圖形。您可以透過命中測試 API 使用幾何圖形來遮蔽、算繪或放置 AR 內容。街景幾何圖形資料是透過 Google 街景服務圖像取得。
試用範例
地理空間範例應用程式示範如何取得及算繪街景幾何圖形。
設定 Geospatial API
如要使用街景地形,您必須在專案中設定地理空間 API。按照「啟用 Geospatial API」一節中的操作說明設定 Geospatial API。
啟用街景幾何圖形
當 GeospatialMode
設為 GeospatialMode.Enabled
,而 StreetscapeGeometryMode
設為 StreetscapeGeometryMode.Enabled
時,Geospatial API 會取得街景幾何圖形資料。

在 ARCore 工作階段中取得街景幾何圖形
將
ARStreetscapeGeometryManager
元件新增至
GameObject
。新增、更新或移除街景幾何圖形時,系統會觸發
ARStreetscapeGeometryManager.StreetscapeGeometriesChanged
事件。
public Material streetscapeGeometryMaterial;
List<ARStreetscapeGeometry> _addedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
List<ARStreetscapeGeometry> _updatedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
List<ARStreetscapeGeometry> _removedStreetscapeGeometries = new List<ARStreetscapeGeometry>();
public void OnEnable()
{
StreetscapeGeometryManager.StreetscapeGeometriesChanged +=
GetStreetscapeGeometry;
}
public void Update() {
foreach (ARStreetscapeGeometry streetscapegeometry in _addedStreetscapeGeometries)
{
GameObject renderObject = new GameObject(
"StreetscapeGeometryMesh", typeof(MeshFilter), typeof(MeshRenderer));
if (renderObject)
{
renderObject.transform.position = streetscapegeometry.pose.position;
renderObject.transform.rotation = streetscapegeometry.pose.rotation;
renderObject.GetComponent<MeshFilter>().mesh = streetscapegeometry.mesh;
renderObject.GetComponent<MeshRenderer>().material = streetscapeGeometryMaterial;
}
}
}
public void OnDisable()
{
StreetscapeGeometryManager.StreetscapeGeometriesChanged -=
GetStreetscapeGeometry;
}
private void GetStreetscapeGeometry(ARStreetscapeGeometriesChangedEventArgs eventArgs)
{
_addedStreetscapeGeometries = eventArgs.Added;
_updatedStreetscapeGeometries = eventArgs.Updated;
_removedStreetscapeGeometries = eventArgs.Removed;
}
ARStreetscapeGeometry
包含建築物資訊:
建構 LOD 1
BuildingLOD1
包含建築物足跡,向上延伸至平頂。建築物高度可能不準確。

建構 LOD 2
BuildingLOD2
會提供更高解析度的幾何圖形。網格牆和屋頂會更貼近建築物的形狀。煙囪或屋頂通風口等較小的建築物特徵可能仍會突出網格。

Mesh
是多邊形網格,代表街景幾何圖形的表面重建作業。請參閱 Mesh
和 MeshRenderer
。請注意,根據預設,系統不會計算法線;請參閱 Mesh.RecalculateNormals()
瞭解如何計算法線。
使用
ARAnchorManager.AddAnchor()
在
ARStreetscapeGeometry.mesh
中,在頂點附近的特定姿勢建立錨點。這個錨點會從父項
ARStreetscapeGeometry
繼承追蹤狀態。
ARRaycastManagerExtensions.RaycastStreetscapeGeometry
可用於對街景幾何圖形進行命中測試。如果偵測到交集,XRRaycastHit
就會包含撞擊位置的姿勢資訊,以及撞擊的 ARStreetscapeGeometry
參照。這個街景幾何圖形可傳遞至 ARAnchorManager.AddAnchor()
,以建立連結至此的錨點。
Vector2 screenTapPosition = Input.GetTouch(0).position;
List<XRRaycastHit> hitResults = new List<XRRaycastHit>();
if (RaycastManager.RaycastStreetscapeGeometry(screenTapPosition, ref hitResults)){
ARStreetscapeGeometry streetscapegeometry =
StreetscapeGeometryManager.GetStreetscapeGeometry(hitResults[0].trackableId);
if (streetscapegeometry != null)
{
ARAnchor anchor = StreetscapeGeometryManager.AttachAnchor(streetscapegeometry, hitResults[0].pose);
}
}
啟用地理空間景深
地理空間深度功能會結合街景幾何圖形和本機感應器輸入內容,以強化深度資料。啟用地理空間深度後,除了當地觀察到的深度,輸出深度和原始深度圖片也會修改為包含光柵化街景幾何圖形。這可能會提高使用深度資料的姿勢準確度。
除非另有註明,否則本頁面中的內容是採用創用 CC 姓名標示 4.0 授權,程式碼範例則為阿帕契 2.0 授權。詳情請參閱《Google Developers 網站政策》。Java 是 Oracle 和/或其關聯企業的註冊商標。
上次更新時間:2025-08-13 (世界標準時間)。
[null,null,["上次更新時間:2025-08-13 (世界標準時間)。"],[[["\u003cp\u003eThe Streetscape Geometry APIs utilize Google Street View data to provide 3D geometry of terrain and buildings for use in AR experiences.\u003c/p\u003e\n"],["\u003cp\u003eDevelopers can obtain and render Streetscape Geometries by enabling the Geospatial and Streetscape Geometry modes within the Geospatial API.\u003c/p\u003e\n"],["\u003cp\u003e\u003ccode\u003eARStreetscapeGeometry\u003c/code\u003e objects contain mesh data, geometry type (terrain or building), and quality level, enabling developers to interact with the geometry.\u003c/p\u003e\n"],["\u003cp\u003eAR content can be attached to or hit-tested against Streetscape Geometry using provided methods for anchoring and raycasting.\u003c/p\u003e\n"],["\u003cp\u003eEnabling Geospatial Depth can enhance depth data by combining Streetscape Geometry with local sensor input for improved accuracy.\u003c/p\u003e\n"]]],["Streetscape Geometry APIs provide terrain and building geometry from Google Street View imagery for AR applications. To use it, enable the Geospatial API and set both `GeospatialMode` and `StreetscapeGeometryMode` to `Enabled`. An `ARStreetscapeGeometryManager` component obtains the data, triggering an event when geometries change. The data, provided as meshes, can be used for occlusion, rendering and placing AR content with anchors. Geometry quality varies from basic (`BuildingLOD1`) to high fidelity (`BuildingLOD2`). Hit-tests against geometry can return the point of contact. Geospatial Depth combines sensor input with Streetscape geometry to improve depth data.\n"],null,["# Use buildings and terrain around you on Unity\n\nThe Streetscape Geometry APIs provide the geometry of terrain, buildings, or other structures in a scene. The geometry can be used for occlusion, rendering, or placing AR content via hit-test APIs. Streetscape Geometry data is obtained through Google Street View imagery.\n\nTry the sample\n--------------\n\nThe [Geospatial sample app](https://github.com/google-ar/arcore-unity-extensions/tree/master/Samples~/Geospatial) demonstrates how to obtain and render Streetscape Geometries.\n\nSet up the Geospatial API\n-------------------------\n\nTo use Streetscape Geometry, you'll need to set up the Geospatial API in your project.\nFollow instructions on [Enabling the Geospatial API](/ar/develop/unity-arf/geospatial/enable) to set up the Geospatial API.\n\nEnable Streetscape Geometry\n---------------------------\n\nThe Geospatial API obtains Streetscape Geometry data when the [`GeospatialMode`](/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#geospatialmode) is set to [`GeospatialMode.Enabled`](/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#geospatialmode_enabled) and [`StreetscapeGeometryMode`](/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#streetscapegeometrymode) is set to [`StreetscapeGeometryMode.Enabled`](/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#streetscapegeometrymode_enabled).\n\nObtain Streetscape Geometry in an ARCore session\n------------------------------------------------\n\nAdd an [`ARStreetscapeGeometryManager`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometryManager) component to a `GameObject`. When Streetscape Geometries are added, updated, or removed, the [`ARStreetscapeGeometryManager.StreetscapeGeometriesChanged`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometryManager#streetscapegeometrieschanged) event is triggered.\n\n\u003cbr /\u003e\n\n public Material streetscapeGeometryMaterial;\n\n List\u003cARStreetscapeGeometry\u003e _addedStreetscapeGeometries = new List\u003cARStreetscapeGeometry\u003e();\n List\u003cARStreetscapeGeometry\u003e _updatedStreetscapeGeometries = new List\u003cARStreetscapeGeometry\u003e();\n List\u003cARStreetscapeGeometry\u003e _removedStreetscapeGeometries = new List\u003cARStreetscapeGeometry\u003e();\n\n public void OnEnable()\n {\n StreetscapeGeometryManager.StreetscapeGeometriesChanged +=\n GetStreetscapeGeometry;\n }\n\n public void Update() {\n foreach (ARStreetscapeGeometry streetscapegeometry in _addedStreetscapeGeometries)\n {\n GameObject renderObject = new GameObject(\n \"StreetscapeGeometryMesh\", typeof(MeshFilter), typeof(MeshRenderer));\n\n if (renderObject)\n {\n renderObject.transform.position = streetscapegeometry.pose.position;\n renderObject.transform.rotation = streetscapegeometry.pose.rotation;\n renderObject.GetComponent\u003cMeshFilter\u003e().mesh = streetscapegeometry.mesh;\n renderObject.GetComponent\u003cMeshRenderer\u003e().material = streetscapeGeometryMaterial;\n }\n }\n }\n\n public void OnDisable()\n {\n StreetscapeGeometryManager.StreetscapeGeometriesChanged -=\n GetStreetscapeGeometry;\n }\n\n private void GetStreetscapeGeometry(ARStreetscapeGeometriesChangedEventArgs eventArgs)\n {\n _addedStreetscapeGeometries = eventArgs.Added;\n _updatedStreetscapeGeometries = eventArgs.Updated;\n _removedStreetscapeGeometries = eventArgs.Removed;\n }\n\nUnderstand [`ARStreetscapeGeometry`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry)\n--------------------------------------------------------------------------------------------------------------------\n\n[`ARStreetscapeGeometry`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry) contains information about a building:\n\n- [`ARStreetscapeGeometry.streetscapeGeometryType`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry#streetscapegeometrytype) \n Identifies the StreetscapeGeometry as either terrain or a building.\n- [`ARStreetscapeGeometry.mesh`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry#mesh) \n Obtain a polygon [`Mesh`](https://docs.unity3d.com/ScriptReference/Mesh.html) that corresponds to this terrain or building.\n- [`ARStreetscapeGeometry.quality`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry#quality) \n Provides the quality of the mesh data. Levels of detail are described in the [CityGML 2.0 standard](https://portal.ogc.org/files/?artifact_id=16675).\n\n### Building LOD 1\n\n[`BuildingLOD1`](/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#streetscapegeometryquality_buildinglod1) consists of building footprints extruded upwards to a flat top. Building heights may be inaccurate.\n\n### Building LOD 2\n\n[`BuildingLOD2`](/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#streetscapegeometryquality_buildinglod2) will have higher fidelity geometry. Mesh walls and roofs will more closely match the building's shape. Smaller features like chimneys or roof vents may still poke outside of the mesh.\n\nUnderstand [`Mesh`](https://docs.unity3d.com/ScriptReference/Mesh.html)\n-----------------------------------------------------------------------\n\n[`Mesh`](https://docs.unity3d.com/ScriptReference/Mesh.html) is a polygon mesh representing a surface reconstruction of the Streetscape Geometry.\n\nSee [`Mesh`](https://docs.unity3d.com/ScriptReference/Mesh.html) and [`MeshRenderer`](https://docs.unity3d.com/Manual/class-MeshRenderer.html). Note that the normals are not calculated by default;\nsee [`Mesh.RecalculateNormals()`](https://docs.unity3d.com/ScriptReference/Mesh.RecalculateNormals.html) to calculate them.\n\nAttach AR content to a [`ARStreetscapeGeometry`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry)\n--------------------------------------------------------------------------------------------------------------------------------\n\nUse [`ARAnchorManager.AddAnchor()`](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/api/UnityEngine.XR.ARFoundation.ARAnchorManager.html#UnityEngine_XR_ARFoundation_ARAnchorManager_AddAnchor_UnityEngine_Pose_) to create an anchor at a given pose near vertices in [`ARStreetscapeGeometry.mesh`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry#mesh). This anchor will inherit its tracking state from the parent [`ARStreetscapeGeometry`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry).\n\n\u003cbr /\u003e\n\n### Perform a hit-test against [`ARStreetscapeGeometry`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry)\n\n[`ARRaycastManagerExtensions.RaycastStreetscapeGeometry`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARRaycastManagerExtensions#raycaststreetscapegeometry) can be used to hit-test against Streetscape Geometry. If intersections are found, [`XRRaycastHit`](https://docs.unity3d.com/Packages/com.unity.xr.arsubsystems@4.2/api/UnityEngine.XR.ARSubsystems.XRRaycastHit.html) contains pose information about the hit location as well as a reference to the [`ARStreetscapeGeometry`](/ar/reference/unity-arf/class/Google/XR/ARCoreExtensions/ARStreetscapeGeometry) which was hit. This Streetscape Geometry can be passed to [`ARAnchorManager.AddAnchor()`](https://docs.unity3d.com/Packages/com.unity.xr.arfoundation@4.2/api/UnityEngine.XR.ARFoundation.ARAnchorManager.html#UnityEngine_XR_ARFoundation_ARAnchorManager_AddAnchor_UnityEngine_Pose_) to create an anchor attached to it. \n\n Vector2 screenTapPosition = Input.GetTouch(0).position;\n List\u003cXRRaycastHit\u003e hitResults = new List\u003cXRRaycastHit\u003e();\n if (RaycastManager.RaycastStreetscapeGeometry(screenTapPosition, ref hitResults)){\n ARStreetscapeGeometry streetscapegeometry =\n StreetscapeGeometryManager.GetStreetscapeGeometry(hitResults[0].trackableId);\n if (streetscapegeometry != null)\n {\n ARAnchor anchor = StreetscapeGeometryManager.AttachAnchor(streetscapegeometry, hitResults[0].pose);\n }\n }\n\nEnable Geospatial Depth\n-----------------------\n\n[Geospatial Depth](/ar/develop/unity-arf/depth/geospatial-depth) combines Streetscape Geometry\nwith local sensor input to enhance depth data. When Geospatial Depth is enabled,\nthe output depth and raw depth images are modified to include rasterized Streetscape Geometry in addition to locally observed depth.\nThis may improve the accuracy of poses using Depth."]]