2014-10-17 7 views
14

enter image description hereJak zmodyfikować właściwości RectTransform w skrypcie [Unity 4.6 beta]

Witam, używam nowy system UI z Unity 4.6 beta ...

próbowali różnych kodów, spojrzał na docs i wyszukiwane, ale nie mogą znaleźć odpowiedzi ...

Na przykład. Mam obraz i chcę zmienić szerokość i wysokość podczas uruchamiania.

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

co nie działa. Natomiast image4.GetComponent(). Rect.y to GET, więc nie można go zmienić w czasie wykonywania.

Próbowałem również:

image4.transform.localScale.y = 15; 

który nie działa.

Jaki jest właściwy sposób zmiany rozmiaru w czasie wykonywania? Możesz dać mi przykład w JS lub C#, nie ma znaczenia.

+0

Nie wiem, dlaczego setery nie działają zgodnie z oczekiwaniami, ale można to zrobić: image4.GetComponent (). LocalScale = new Vector3 (1,15,1); – vsenik

Odpowiedz

31

Jeden dzień badań. Znalazłem rozszerzenie, które może nam pomóc w radzeniu sobie z nowym systemem interfejsu użytkownika. możesz poprawić to rozszerzenie, jeśli chcesz.

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

Kod źródłowy znalazłem stąd: http://orbcreation.com

1

spróbuje użyć coś takiego [C#]:

... 

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

    // set new width and height 

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

    ... 
3

Przy zmianie rodzica (np po instancji), robi się bałaganiarski, znalazłem resetowanie kilku parametrów naprawdę pomogło (spędziłem sporo czasu próbując to rozgryźć):

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

nadzieję, że pomoże ktoś inny :)

+0

dzięki, to mi bardzo pomogło! –

0

Zazwyczaj nie chcemy modyfikować bezpośrednio te wartości, tym bardziej, jeśli pochodzą z prefabrykatów już konfigurację z poprawnymi coords, jeśli po prostu chcesz go dodać poprawnie pod namiotem (lub innych), ale pozycji „zmiany” to zrobić:

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

Przechodząc false na planie rodzic będzie uniknąć rect przekształcić zmieniane w postaci dziwnych gdy uruchamianiu tego prefabrykatów.

1

Aktywnie grając za pomocą może pomóc: GetComponent.sizeDelta = new Vector (new_size.x, new_size.y);

Udało mi się osiągnąć Powiększenie nowego GUI, ustawiając tę ​​właściwość.

Oto mój własny kod do skalowania:

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

Hey Friend prostu spróbuj aby zmienić położenie i szerokość w UI GameObject

jeśli chcesz użyć instancji obiektu użytku Ta leftButton.GetComponent<RectTransform>().anchoredPosition = new Vector2(-125, -36f); rightButton.GetComponent<RectTransform>().sizeDelta = new Vector2(x, y);

a jeśli chcesz umieścić skrypt na obiekcie UI następnie spróbuj to zmienić wysokość i szerokość

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

Nie widzę Twojej odpowiedzi, dodając żadnej dodatkowej wartości do już udzielonych odpowiedzi. – Naytzyrhc

+0

po prostu powiedz mi, co chcesz wiedzieć? po prostu powiedz mi, czy nic nie jest wtedy mile widziane – SogekingSenpai

Powiązane problemy