当前位置:网站首页>【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;
}
边栏推荐
- 2837xd Code Generation - stateflow (4)
- [Yu Yue education] University Physics (Electromagnetics) reference materials of Taizhou College of science and technology, Nanjing University of Technology
- UE illusory engine programmed plant generator setup -- how to quickly generate large forests
- ue4材质的入门和原理笔记
- Junit5 支持suite的方法
- Junit5 supports suite methods
- Remember a simple Oracle offline data migration to tidb process
- Binary and decimal system of C language
- Brief analysis of edgedb architecture
- Minimum number of C language
猜你喜欢

2837xd代码生成模块学习(4)——idle_task、Simulink Coder
![[illusory] weapon slot: pick up weapons](/img/a7/1e395fc9cdfd0359e7ae4d2313290d.png)
[illusory] weapon slot: pick up weapons

虛幻AI藍圖基礎筆記(萬字整理)

Record the interesting process of using Xray for the first time

阿里云ack介绍

Off grid control of three-phase inverter - PR control

Kinect DK obtains color RGB images in cv:: mat format (used in openpose)

2837xd 代碼生成——補充(1)

Skywalking理论与实践

2837xd code generation - Supplement (2)
随机推荐
UE illusory engine programmed plant generator setup -- how to quickly generate large forests
[ue5] two implementation methods of AI random roaming blueprint (role blueprint and behavior tree)
Binary and decimal system of C language
Basic notes of illusory AI blueprint (10000 words)
Eslint reports an error
go语言入门
Ue5 - ai Pursuit (Blueprint, Behavior tree)
Introduction and prevention of penetration test
Record the interesting process of using Xray for the first time
虛幻AI藍圖基礎筆記(萬字整理)
ESLint 报错
Translation d30 (with AC code POJ 28:sum number)
Remember a simple Oracle offline data migration to tidb process
2837xd code generation - stateflow (2)
Error reporting on the first day of work (error reporting when Nessus installs WinPcap)
2837xd 代码生成——StateFlow(2)
Notes de base sur les plans illusoires d'IA (triés en 10 000 mots)
2837xd代码生成模块学习(4)——idle_task、Simulink Coder
Blender石头雕刻
How to judge the quality of primary market projects when the market is depressed?