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

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;
    }
}

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;
}
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值