2014-10-17 67 views
14

enter image description here如何修改RectTransform性質的腳本[統一4.6β-

您好,我使用的是新的UI系統從Unity 4.6測試版...

嘗試了不同的代碼,看了看文檔和四處搜尋,但無法找到答案......

例如。我有一個圖像,我想在運行時改變寬度和高度。

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

哪個行不通。而image4.GetComponent()。rect.y只是GET,因此不能在運行時更改。

我也試過:

image4.transform.localScale.y = 15; 

這也不起作用。

是什麼在運行時改變大小的正確方法?你可以給我一個JS或C#的例子,沒關係。

+0

我不知道爲什麼setters不能按預期工作,但你可以這樣做:image4.GetComponent ()。localScale = new Vector3(1,15,1); – vsenik 2014-10-17 15:43:23

回答

31

一天研發。 我發現了一個擴展,可以幫助我們處理新的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

1

嘗試使用類似的東西[C#中]:

... 

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

    // set new width and height 

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

    ... 
3

當(實例化後如)改變父母,事情就變得凌亂,我重新發現了幾個參數,真的幫了(花費相當多的時間試圖弄清楚這一點):

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

希望幫助別人:)

+0

謝謝,這幫了我很多! – 2015-09-29 10:09:14

0

您通常不希望直接修改這些值,甚至更多,如果他們來自一個預製你有正確的COORDS已經建立,如果你只是想添加它正確下帆布(或其他),但它「改變位置」這樣做:

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將避免RECT變換怪異的形式實例化預製時被改變。

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); 
} 
4

嘿朋友剛剛嘗試這一點,如果你想使用一個對象 使用此 的情況下更改的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) 
+0

我看不到你的答案,增加任何額外的價值已經給出的答案。 – Naytzyrhc 2015-12-03 08:57:51

+0

只是告訴我你想知道什麼?只要告訴我,如果沒有,歡迎和再見 – SogekingSenpai 2015-12-04 09:54:59