【问题标题】:How to modify RectTransform properties in script [Unity 4.6 beta]如何在脚本中修改 RectTransform 属性 [Unity 4.6 beta]
【发布时间】:2014-10-17 10:58:51
【问题描述】:

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

尝试了不同的代码,查看了文档并四处搜索,但找不到答案……

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

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

这是行不通的。而 image4.GetComponent().rect.y 只是 GET,所以不能在运行时更改。

我也试过了:

image4.transform.localScale.y = 15;

这也不起作用。

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

【问题讨论】:

  • 我不知道为什么设置器不能按预期工作,但你可以这样做:image4.GetComponent().localScale = new Vector3(1,15,1);

标签: unity3d


【解决方案1】:

一天研究。 我找到了一个可以帮助我们处理新 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

【讨论】:

    【解决方案2】:

    嘿,朋友,试试这个来改变 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)
    

    【讨论】:

    • 我看不到您的回答为已经给出的答案增加了任何附加值。
    • 告诉我你想知道什么??只是告诉我如果没有然后欢迎和再见
    【解决方案3】:

    当更改父级时(例如在实例化之后),事情变得一团糟,我发现重置一些参数确实有帮助(花了很多时间试图解决这个问题):

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

    希望对其他人有所帮助:)

    【讨论】:

      【解决方案4】:

      尝试使用类似的东西 [在 C# 中]:

       ...
      
          RectTransform rTrans = (RectTransform) transform.GetComponent<RectTransform>();
      
          // set new width and height
      
          rTrans.anchoredPosition = new Vector2(15, 200);
      
          ...
      

      【讨论】:

        【解决方案5】:

        您通常不想直接修改这些值,如果它们来自您已经使用正确坐标设置的预制件,如果您只想在画布(或其他)下正确添加它但它“改变了位置”这样做:

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

        在 set parent 上传递false 将避免在实例化预制件时以奇怪的形式更改矩形变换。

        【讨论】:

          【解决方案6】:

          实际上玩以下可以帮助: 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);
          }
          

          【讨论】:

          • 这对性能不利。请让专家来解答。
          【解决方案7】:

          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;
                  
          

          【讨论】:

            【解决方案8】:
            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);
            

            【讨论】:

            • 请在您的回答中提供更多详细信息。正如目前所写的那样,很难理解您的解决方案。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-07
            • 2019-07-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多