当前位置:网站首页>【Unity3D】无法正确获取RectTransform的属性值导致计算出错
【Unity3D】无法正确获取RectTransform的属性值导致计算出错
2022-07-02 06:36:00 【趁着头发多我想做游戏】
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;
}
边栏推荐
- Translation d30 (with AC code POJ 28:sum number)
- Sil/pil test of matlab code generation
- 虚幻AI蓝图基础笔记(万字整理)
- Alibaba cloud SLS log service
- Image recognition - data annotation
- [Yu Yue education] University Physics (Electromagnetics) reference materials of Taizhou College of science and technology, Nanjing University of Technology
- Image recognition - Data Acquisition
- 2.14 is it Valentine's day or Valentine's day when the mainstream market continues to fluctuate and wait for changes?
- Project practice, redis cluster technology learning (VIII)
- Bookmark collection management software suspension reading and data migration between knowledge base and browser bookmarks
猜你喜欢
随机推荐
Cmake command - Official Document
Junit4 runs MVN test test suite upgrade scheme
ICLR 2022: how does AI recognize "things I haven't seen"?
How does {} prevent SQL injection? What is its underlying principle?
2837xd Code Generation - Supplement (1)
Introduction to go language
go语言入门
Project practice, redis cluster technology learning (16)
Project practice, redis cluster technology learning (VII)
ue4材质的入门和原理笔记
Skywalking theory and Practice
Image recognition - data augmentation
AutoCAD - layer Linetype
Blender多镜头(多机位)切换
Alibaba cloud ack introduction
What is the relationship between realizing page watermarking and mutationobserver?
Operator exercises
2837xd code generation - Summary
虛幻AI藍圖基礎筆記(萬字整理)
Pycaret | a few lines of code to solve machine learning modeling

![[ue5] blueprint making simple mine tutorial](/img/87/d0bec747a6b6276d63a315f88745ec.png)






