使用MRUK Kit时,如何基于桌面尺寸缩放GameObject
解决MRUK Kit访问空间锚点并按桌面尺寸缩放对象的方案
1. 获取Find Spawn Position模块的空间锚点
MRUK Kit的FindSpawnPosition组件在平面检测成功后会自动生成空间锚点,直接从组件实例中即可获取:
private FindSpawnPosition _spawnModule; void Start() { _spawnModule = GetComponent<FindSpawnPosition>(); // 监听平面检测完成事件 _spawnModule.OnPlaneDetected.AddListener(HandlePlaneDetected); } void HandlePlaneDetected() { SpatialAnchor spawnAnchor = _spawnModule.SpawnAnchor; if (spawnAnchor != null) { ScaleObjectToDesktop(spawnAnchor); } }
2. 提取桌面尺寸并缩放对象
从空间锚点关联的XRPlane组件中获取平面边界,再按比例缩放目标对象:
void ScaleObjectToDesktop(SpatialAnchor anchor) { XRPlane desktopPlane = anchor.GetComponent<XRPlane>(); if (desktopPlane == null) return; // 计算桌面实际尺寸(extents是半长,所以乘2) Vector2 desktopSize = new Vector2(desktopPlane.extents.x * 2, desktopPlane.extents.z * 2); GameObject spawnedObj = _spawnModule.SpawnedObject; // 按桌面尺寸与对象初始尺寸的比例缩放,留10%边距避免超出 float scaleX = (desktopSize.x / spawnedObj.transform.localScale.x) * 0.9f; float scaleZ = (desktopSize.y / spawnedObj.transform.localScale.z) * 0.9f; // 取较小的比例保证对象完全在桌面内 float finalScale = Mathf.Min(scaleX, scaleZ); spawnedObj.transform.localScale = new Vector3(finalScale, spawnedObj.transform.localScale.y, finalScale); }
关键注意点
- 确保
FindSpawnPosition组件的Spawn Object字段已绑定你要放置的GameObject - 必须在平面检测完成后访问锚点,否则会出现空引用
- 缩放时保持对象高度不变,只调整平面内的尺寸比例
内容的提问来源于stack exchange,提问作者nenester
相关产品推荐
相关产品推荐

