自定义含RawImage的Prefab实例化后显示在屏幕中心,如何修正位置?
解决带RawImage的Prefab实例化后固定在屏幕中心的问题
问题核心是UI组件(RawImage属于UI)的渲染逻辑和普通3D物体完全不同:
- 球体、圆柱体这类3D预制体直接在世界空间渲染,设置父物体、世界位置、旋转都会生效;
- 带RawImage的Prefab依赖Canvas渲染,默认Canvas的
Screen Space - Overlay模式会让UI脱离世界空间,完全基于屏幕坐标布局,和你设置的父物体、世界位置无关。
直接有效的解决方案:将Canvas改为世界空间模式
- 选中带RawImage的Prefab里的Canvas,在Inspector面板找到
Canvas组件 - 把
Render Mode从默认的Screen Space - Overlay改成World Space - 调整Canvas的
RectTransform参数:- 把
Width和Height改成合适的尺寸(比如100x100,按需调整) - 确保
Anchor Presets和Pivot设置为(0.5,0.5)(让UI中心对齐你设置的位置)
- 把
代码优化细节
Canvas改为World Space后,现有代码就能正常工作,可调整顺序避免坐标转换问题:
GameObject obj = Instantiate(ArPrefab); obj.transform.SetParent(face.transform, false); // 第二个参数设为false,避免父物体缩放影响UI obj.transform.localPosition = face.vertices[8] - face.transform.position; // 直接使用局部位置 obj.transform.localRotation = Quaternion.identity; // 继承父物体旋转的话,设为identity即可 obj.SetActive(true);
为什么调整Canvas排序顺序没用?
Canvas的Sort Order只控制UI的显示层级(谁在谁上方),和UI的位置完全无关,所以改这个无法解决位置问题。
内容的提问来源于stack exchange,提问作者foobar
相关产品推荐
相关产品推荐

