如何在没有"移动效果的情况下在Unity中显示相对于其他元素的元素"?

时间:2018-03-16 01:05:25

标签: c# unity3d position unityscript relative

我从几周开始就团结起来,并且我遇到了一些显示问题。

您可以在此处查看我想要实现的目标: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;字符串,而是显示相应的翻译以及我无法设置固定位置的原因,因为两个翻译的长度不同。)

提前致谢!

2 个答案:

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