Как изменить свойства RectTransform в script [Unity 4.6 beta]

enter image description here

Привет, я использую новую систему пользовательского интерфейса из бета-версии 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 или С#, не имеет значения.

Ответ 1

Один день исследования. Я нашел расширение, которое может помочь нам разобраться с новой системой пользовательского интерфейса. u может улучшить это расширение, если вы хотите.

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

Ответ 2

Привет, просто попробуй это, чтобы изменить положение и ширину пользовательского интерфейса.

если вы хотите использовать экземпляр объекта использовать это leftButton.GetComponent<RectTransform>().anchoredPosition = new Vector2(-125, -36f); rightButton.GetComponent<RectTransform>().sizeDelta = new Vector2(x, y);

И если вы хотите поместить script в объект пользовательского интерфейса, попробуйте это изменить высоту и ширину

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

Ответ 3

При смене родителя (например, после Instantiate) все становится беспорядочным, я обнаружил, что сброс нескольких параметров действительно помог (потратил немало времени, пытаясь понять это):

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

Надеюсь, что это поможет кому-то еще:)

Ответ 4

попробуйте использовать что-то вроде этого [в С#]:

 ...

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

    // set new width and height

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

    ...

Ответ 5

Активное воспроизведение следующего может помочь: GetComponent.sizeDelta = new Vector (new_size.x, new_size.y);

Я успешно достиг увеличения в новом графическом интерфейсе, установив это свойство.

Вот мой собственный код для масштабирования:

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

Ответ 6

Обычно вы не хотите напрямую изменять эти значения, даже если они получены из сборника, который вы уже установили с правильными координатами, если вы просто хотите добавить его правильно под холст (или другим), но он "изменяет" position "сделать это:

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 в родительском наборе исключает изменение прямого преобразования в странных формах при создании экземпляра сборника.