Unity Scale with Screen Size模式下实例化Prefab UI位置错位问题问询
Unity UI Prefab实例化固定相对位置标准方案
你当前的实现存在3个核心错误,是导致位置偏移的根本原因:
- 父节点赋值顺序错误:先设置坐标再修改父节点,不同层级的坐标系缩放差异会直接打乱已设置的坐标值
- 坐标属性选择错误:RectTransform的
position是世界空间坐标,会受Canvas全局缩放影响,UI相对布局应该用anchoredPosition锚点相对坐标 - 手动修改缩放属于冗余操作,只要父节点挂载参数设置正确,缩放会自动适配Canvas规则,不需要手动基于
lossyScale计算修正
标准实现方案
前提:确认你的Canvas的参考分辨率为16:9规格(如1920*1080),承载生成元素的父节点的锚点、轴心点(pivot)已经按你需要的对齐规则设置完成(如需左上角对齐则锚点和轴心点均设为(0,1))。
修正后代码如下:
statFlag = Instantiate(_infoBox); // 先设置父节点,第二个参数传false:不保持世界坐标,自动适配父节点的缩放和坐标体系 statFlag.transform.SetParent(transform, false); // 使用anchoredPosition设置基于父节点锚点的相对偏移,不受Canvas缩放影响 statFlag.GetComponent<RectTransform>().anchoredPosition = gameObject.GetComponent<RectTransform>().anchoredPosition + new Vector2(-50, -250 - _displayedStats.Count * 50); // 删除手动修改localScale的代码,SetParent时已经自动适配正确缩放
补充说明
如果需要所有生成元素的相对位置完全固定,只需保证prefab自身的RectTransform锚点规则和父容器锚点规则一致即可,不需要额外做分辨率适配计算,16:9比例下不同分辨率的相对位置会完全对齐。
内容的提问来源于stack exchange,提问作者Zoltán Király
相关产品推荐
相关产品推荐

