如何在脚本中修改RectTransform的属性 [Unity 4.6 beta]

16

在此输入图片描述

你好,我正在使用Unity 4.6 beta的新UI系统...

我尝试了不同的代码,查看了文档并进行了搜索,但找不到答案...

例如,我有一张图片,我想在运行时改变宽度和高度。

public GameObject image4;
image4.GetComponent<RectTransform>().rect.Set(0,0,100, 300);

该方法无效。而且image4.GetComponent().rect.y是只读的,因此无法在运行时更改。

我还尝试过:

image4.transform.localScale.y = 15;

也不起作用。

在运行时更改大小的正确方式是什么?您可以给我一个JS或C#的例子,都没问题。


我不知道为什么设置器没有按预期工作,但你可以这样做:image4.GetComponent<RectTransform>().localScale = new Vector3(1,15,1); - vsenik
8个回答

36

有一天我在研究时发现了一个可以帮助我们处理新UI系统的扩展程序,如果你愿意,你可以改进这个扩展。

public static class RectTransformExtensions
{
    public static void SetDefaultScale(this RectTransform trans) {
        trans.localScale = new Vector3(1, 1, 1);
    }
    public static void SetPivotAndAnchors(this RectTransform trans, Vector2 aVec) {
        trans.pivot = aVec;
        trans.anchorMin = aVec;
        trans.anchorMax = aVec;
    }

    public static Vector2 GetSize(this RectTransform trans) {
        return trans.rect.size;
    }
    public static float GetWidth(this RectTransform trans) {
        return trans.rect.width;
    }
    public static float GetHeight(this RectTransform trans) {
        return trans.rect.height;
    }

    public static void SetPositionOfPivot(this RectTransform trans, Vector2 newPos) {
        trans.localPosition = new Vector3(newPos.x, newPos.y, trans.localPosition.z);
    }

    public static void SetLeftBottomPosition(this RectTransform trans, Vector2 newPos) {
        trans.localPosition = new Vector3(newPos.x + (trans.pivot.x * trans.rect.width), newPos.y + (trans.pivot.y * trans.rect.height), trans.localPosition.z);
    }
    public static void SetLeftTopPosition(this RectTransform trans, Vector2 newPos) {
        trans.localPosition = new Vector3(newPos.x + (trans.pivot.x * trans.rect.width), newPos.y - ((1f - trans.pivot.y) * trans.rect.height), trans.localPosition.z);
    }
    public static void SetRightBottomPosition(this RectTransform trans, Vector2 newPos) {
        trans.localPosition = new Vector3(newPos.x - ((1f - trans.pivot.x) * trans.rect.width), newPos.y + (trans.pivot.y * trans.rect.height), trans.localPosition.z);
    }
    public static void SetRightTopPosition(this RectTransform trans, Vector2 newPos) {
        trans.localPosition = new Vector3(newPos.x - ((1f - trans.pivot.x) * trans.rect.width), newPos.y - ((1f - trans.pivot.y) * trans.rect.height), trans.localPosition.z);
    }

    public static void SetSize(this RectTransform trans, Vector2 newSize) {
        Vector2 oldSize = trans.rect.size;
        Vector2 deltaSize = newSize - oldSize;
        trans.offsetMin = trans.offsetMin - new Vector2(deltaSize.x * trans.pivot.x, deltaSize.y * trans.pivot.y);
        trans.offsetMax = trans.offsetMax + new Vector2(deltaSize.x * (1f - trans.pivot.x), deltaSize.y * (1f - trans.pivot.y));
    }
    public static void SetWidth(this RectTransform trans, float newSize) {
        SetSize(trans, new Vector2(newSize, trans.rect.size.y));
    }
    public static void SetHeight(this RectTransform trans, float newSize) {
        SetSize(trans, new Vector2(trans.rect.size.x, newSize));
    }
}

我从这里找到的源代码: http://orbcreation.com


8

嘿,朋友们,尝试一下这个来改变UI游戏对象的位置和宽度

如果您想使用对象的实例,请使用以下代码:

leftButton.GetComponent<RectTransform>().anchoredPosition = new Vector2(-125, -36f); rightButton.GetComponent<RectTransform>().sizeDelta = new Vector2(x, y);

如果要在UI对象上放置脚本,则可以尝试以下代码来更改高度和宽度:

GetComponent<RectTransform>().anchoredPosition = new Vector2(-125, -36f);
GetComponent<RectTransform>().sizeDelta = new Vector2(x, y)

我看不到你的回答为已经给出的答案增加任何额外价值。 - Naytzyrhc
你想知道什么?如果没有的话,欢迎并再见。 - SogekingSenpai

3

当更改父对象 (例如在实例化后),事情会变得混乱。我发现重置一些参数真的非常有帮助(花了很多时间来尝试解决这个问题):

this.transform.SetParent(content.transform);
this.transform.localScale = Vector3.one;            
this.rectTransform.sizeDelta = Vector2.zero;
this.rectTransform.anchoredPosition = Vector2.zero;

希望这能帮到其他人:)

1
通常情况下,您不希望直接修改这些值,尤其是它们来自您已经设置了正确坐标的预制件。如果您只想将其正确添加到Canvas(或其他),但它“改变位置”,请执行以下操作:
GameObject instance;

void Start () {
    GameObject canvas = GameObject.Find ("Canvas");
    if (canvas != null) {
        GameObject go = Resources.Load<GameObject>("MyPrefab");
        if(go != null){
            instance = Instantiate(go);
            instance.GetComponent<Transform>().SetParent(canvas.GetComponent<Transform>(), false);
        }
    }
}

在设置父级时传递false将避免实例化预制体时矩形变换以奇怪的形式发生变化。


1

实际上,使用以下代码可以帮助操作:

GetComponent.sizeDelta = new Vector(new_size.x,new_size.y);

我成功地通过设置此属性来实现了新GUI的缩放。

这是我的自定义缩放代码:

    void Start()
{
    // Store initial Size and Position;
    ZoomedOutSize = new Vector2(GetComponent<RectTransform>().rect.width, GetComponent<RectTransform>().rect.height);
    ZoomedOutPos = new Vector2(GetComponent<RectTransform>().localPosition.x, GetComponent<RectTransform>().localPosition.y);
}

void Update()
{
    // Calculate the total delta at runtime cause it depends on parent (yah i know it's not optimal to have new vector ecery Update)
    ZoomSizeRate = new Vector2(gameObject.GetComponentInParent<ZoomDialog>().MaxSize.x - ZoomedOutSize.x, gameObject.GetComponentInParent<ZoomDialog>().MaxSize.y - ZoomedOutSize.y);
    ZoomPosRate = -GetComponent<RectTransform>().localPosition;

    // Zoom is the float with range(0,1) 0 - no Zoom, 1 - Fully Zoom to ParentSize;
    //Set the size delta and position as Initial + Rate * Zoom
    GetComponent<RectTransform>().sizeDelta = new Vector2(ZoomedOutSize.x + ZoomSizeRate.x * Zoom, ZoomedOutSize.y + ZoomSizeRate.y * Zoom);
    GetComponent<RectTransform>().localPosition = new Vector2(ZoomedOutPos.x + ZoomPosRate.x * Zoom, ZoomedOutPos.y + ZoomPosRate.y * Zoom);
}

出于性能原因,这并不好。请让专家来回答。 - Maxx

1
尝试使用类似以下的代码 [在 C# 中]:
 ...

    RectTransform rTrans = (RectTransform) transform.GetComponent<RectTransform>();

    // set new width and height

    rTrans.anchoredPosition = new Vector2(15, 200);

    ...

0
public GameObject rectPlayerCardCollection;
public GameObject rectCardInfo;

rectPlayerCardCollection.GetComponent<RectTransform>().localPosition = new Vector3(656f, 0, 0);
        RectTransform rt = rectPlayerCardCollection.GetComponent<RectTransform>();
        rt.sizeDelta = new Vector2(669.3f, 1125.3f);
        rectCardInfo.GetComponent<RectTransform>().localPosition = new Vector3(-652f, 0, 0);
        RectTransform rt2 = rectCardInfo.GetComponent<RectTransform>();
        rt2.sizeDelta = new Vector2(626.9f, 1080f);

1
请在您的回答中提供更多细节。目前的写法让人难以理解您的解决方案。 - Community

0

GetComponent().anchoredPosition3D; 这应该能正常工作,x,y,z是recttransform的PosX,PosY和PosZ, 您可以使用Vector3来存储该值。

Vector3 values = new Vector3();
public GameObject rect_obj;
//Use this if script is on that recttransform component
values = this.transform.GetComponent<RectTransform>().anchoredPosition3D;
 //else           
values = rect_obj.transform.GetComponent<RectTransform>().anchoredPosition3D;
        

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接