Unity 常见问题 之 添加 ContentSizeFitter 组件后 RectTransform 的 sizeDelta 不能实时获取最新变化size 的问题
目录
Unity 常见问题 之 添加 ContentSizeFitter 组件后 RectTransform 的 sizeDelta 不能实时获取最新变化size 的问题
一、简单介绍
Unity 问题整理,自己整理的一些 Unity 开发可能遇到的问题,方便后期游戏开发。
本节介绍,在使用ContentSizeFitter进行动态尺寸变化配置的时候,有时候需要获取ContentSizeFitter组件上的RectTransform 的 sizeDelta的size ,但是会遇到不能实时获取到的问题,这里做一个简单的该问题解决方法的记录,如果你有更好的方法,欢迎留言交流。
二、问题现象
如图,
1、Text 添加了 ContentSizeFitter
2、在Text 变化的时候,获取 Text 的 RectTransform 的 sizeDelta 值
3、会发现获取 sizeDelta 的值不是实时的,老是滞后
4、问题测试代码
using UnityEngine.UI;
public class TestContentSizeFitter : MonoBehaviour
{
[SerializeField]private Text m_Text;
private RectTransform m_TextRectTransform;
// Start is called before the first frame update
void Start()
{
m_TextRectTransform = m_Text.GetComponent<RectTransform>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
m_Text.text += " New Text New Text New Text New Text New Text";
Debug.Log(" m_TextRectTransform.sizeDelta: " + m_TextRectTransform.sizeDelta);
}
}
}
三、问题分析
在使用 ContentSizeFitter 实时调整Text 数据的调整 RectTransform尺寸时,这时Canvas 还没有 Rebuild,需要及时获取到实时的数据,此时需要自己收到立即针对该RectTransform 进行重建步骤,就可以获取到实时的数据了
四、问题解决方法之一
1、解决原理:获取前添加如下代码,及时 Rebuild
LayoutRebuilder.ForceRebuildLayoutImmediate(m_TextRectTransform); // m_TextRectTransform 是你的 RectTransform
2、如图,添加后实时获取到了 Text 的 RectTransform 的 sizeDelta 值
3、添加后的测试代码
using UnityEngine.UI;
public class TestContentSizeFitter : MonoBehaviour
{
[SerializeField]private Text m_Text;
private RectTransform m_TextRectTransform;
// Start is called before the first frame update
void Start()
{
m_TextRectTransform = m_Text.GetComponent<RectTransform>();
}
// Update is called once per frame
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
m_Text.text += " New Text New Text New Text New Text New Text";
// 获取前手动 Rebuild
LayoutRebuilder.ForceRebuildLayoutImmediate(m_TextRectTransform);
Debug.Log(" m_TextRectTransform.sizeDelta: " + m_TextRectTransform.sizeDelta);
}
}
}