当前位置:   article > 正文

【Unity3D】无法正确获取RectTransform的属性值导致计算出错_some values driven by canvas

some values driven by canvas

UGUI获取RectTransform的某些属性时坑实在是太多了,以博主踩过的坑记录一下:

1.由于ContentSizeFitter组件导致不能正确获取UI的宽高

参考宣雨松大神的做法:Unity3D研究院之ContentSizeFitter同步立即响应回调

public static Vector2 GetPreferredSize (RectTransform rect, ContentSizeFitter fitter) {
   if (rect == null || fitter == null) {
       return Vector2.zero;
   }
   LayoutRebuilder.ForceRebuildLayoutImmediate (rect);
   return new Vector2 (HandleSelfFittingAlongAxis (0, fitter, rect), HandleSelfFittingAlongAxis (1, fitter, rect));
}

//获取宽和高
private static float HandleSelfFittingAlongAxis (int axis, ContentSizeFitter fitter, RectTransform rect) {
    ContentSizeFitter.FitMode fitting = (axis == 0 ? fitter.horizontalFit : fitter.verticalFit);
    if (fitting == ContentSizeFitter.FitMode.MinSize) {
        var size = LayoutUtility.GetMinSize (rect, axis);
        return size;
    } else {
        var size = LayoutUtility.GetPreferredSize (rect, axis);
        return size;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2. Canvas上有提示 ‘some values driven by canvas’ 时无法获取Canvas正确的宽高

如果想获取Canvas的RectTransform.rect.width / RectTransform.rect.height出现这个提示时要小心了,rect很有可能宽高都是零,估计也是因为RectTransform需要等一帧才会把正确的宽高设置到RectTransform中,因此博主的做法是:
开一个协程,不断检测RectTransform.rect.width / RectTransform.rect.height,当两个值都大于零才执行你的回调

注意,如果有需求把物体的世界坐标转换到某个Canvas下的UI坐标时,也要等到Canvas的rect宽高都大于零,否则也是错的,这里提供一下转换的代码:

public static Vector3 WorldToUGUIPosition (Camera worldCam, Vector3 worldPos, Camera uiCamera, RectTransform uiRect) {
   	var pos = worldCam.WorldToScreenPoint (worldPos);
    Vector2 result;
    RectTransformUtility.ScreenPointToLocalPointInRectangle(uiRect, pos, uiCamera, out result);
    return result;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/110372
推荐阅读
相关标签
  

闽ICP备14008679号