我从几周开始就团结起来,并且我遇到了一些显示问题。
您可以在此处查看我想要实现的目标:ScreenShot
在我的几个页面上,我左边有一个带有图标的标题,我希望它在标题的左边是40px,无论它的大小。
所以我做了一个预制版,标题为空文本,图标为空的RawImage,我将该预制件放在屏幕的中央顶部。
我将预制件上的以下C#脚本与'字符串'标题的参数和'纹理'要显示的图标的参数。
using System.Linq;
using UnityEngine;
using UnityEngine.UI;
public class TitlePage : MonoBehaviour {
public string title;
public Texture texture;
private Text titlePageText;
private RawImage iconPage;
void Awake()
{
titlePageText = gameObject.GetComponentsInChildren<Text>().First();
iconPage = gameObject.GetComponentsInChildren<RawImage>().First();
}
void Start()
{
titlePageText.text = title;
}
void Update()
{
iconPage.rectTransform.anchoredPosition = new Vector2(-titlePageText.rectTransform.rect.width / 2 - 40, iconPage.rectTransform.anchoredPosition.y);
iconPage.texture = texture;
}
}
标题设置在&#34;开始&#34;功能,问题是图标。 &#34;更新&#34;中的代码函数将图标放在想要的位置,如果它在&#34;更新&#34;功能因为在&#34;开始&#34;,&#39; titlePageText.rectTransform.rect.width&#39;给出0.但是在&#34;更新&#34;功能,图标默认显示在中间,并且几乎立即在左侧移动,但我们可以看到位置发生变化。
也许有解决办法避免这种情况?
也许我开错了?
(我不会把我的标题文字放在一边,因为我希望我的应用程序是多语言的,所以我不会在参数中显示&#39;字符串,而是显示相应的翻译以及我无法设置固定位置的原因,因为两个翻译的长度不同。)
提前致谢!
答案 0 :(得分:2)
我不完全确定你的问题究竟是什么,但听起来好像你试图从一个稍微尴尬的角度解决问题。是否有理由不使用Unity的布局(甚至是自动布局组)来实现目标?
我刚做了一个快速测试:当我将锚点X设置为0并且将X设置为X时,将“内容大小调整组件”添加到文本对象,其中“水平”设置为“已缓冲”,而不是将图像放置为该文本对象的子项。到1,图像现在跟随文本的左侧,无论大小。
除非文本(或其位置)发生变化,否则这样做的好处是绝对零工作,在这种情况下,所有内容都由Unity的UI系统自动处理
答案 1 :(得分:0)
听起来titlePageText的宽度没有立即在Start()中获得值,这就是它最初为零的原因。在找到非零值的几帧之后,它最终会移动你的iconPage,但此时你的对象已经有了纹理。你真的不应该在Update()中这样做,因为这意味着它将不断地每帧都设置你的iconPage的anchoredPosition和纹理。
避免这种情况的一个解决方案是使用带有yield
的协程来等待组件初始化然后设置位置。请注意,由于您正在引入一些强制加载时间,因此这有点像黑客攻击。
public string title;
public Texture texture;
private Text titlePageText;
private RawImage iconPage;
void Awake()
{
titlePageText = gameObject.GetComponentsInChildren<Text>().First();
iconPage = gameObject.GetComponentsInChildren<RawImage>().First();
}
void Start()
{
titlePageText.text = title;
StartCoroutine(initializeComponenets());
}
IEnumerator initializeComponenets()
{
yield return new waitForSeconds(.05f); //might need longer wait here
iconPage.rectTransform.anchoredPosition = new Vector2(-titlePageText.rectTransform.rect.width / 2 - 40, iconPage.rectTransform.anchoredPosition.y);
iconPage.texture = texture;
}