unity3d 锚点设置_unity3d ugui 代码设置锚点参数 - CSDN
  • unity自己出了UGUI之后,方便UI界面的编辑使用,再也不用其他插件了,最近看到了RectTransform的两个方法,使用起来还是蛮方便的,因为在做UI的list的时候,经常要做的是在代码里面生成列表的元素,所以就用到了我...

    unity自己出了UGUI之后,方便UI界面的编辑使用,再也不用其他插件了,最近看到了RectTransform的两个方法,使用起来还是蛮方便的,因为在做UI的list的时候,经常要做的是在代码里面生成列表的元素,所以就用到了我下面说的两个方法:

    SetInsetAndSizeFromParentEdge
    SetSizeWithCurrentAnchors

    第一个是根据边来设置坐标,有四个值:Top、Bottom、Left、Right。

    第二个是根据方向设置坐标,有两个值:Horizontal、Vertical。

    先来说第一个函数,有三个参数:

    第一个是一个Edge类型的值,需要指定以父对象的哪个边为基准(也就是上面四个值之中的一个);

    第二个参数,是离指定边的距离;

    第三个参数,是本身的宽度或者高度;

    这样通过设置上下边和左右边来设置子物体的位置和宽高就可以了。


    第二个函数,有两个参数:

    第一个是Axis类型的值,需要指定一个方向,水平或者垂直;

    第二个参数,是本身的宽高;

    我这里写了几个静态函数,可以参考下用法:

    /// <summary>
        /// 调整 RectTransform 组件中的 Left、Bottom 属性
        /// </summary>
        /// <param name="rt">引用目标 RectTransform 对象</param>
        /// <param name="left">Left值</param>
        /// <param name="bottom">Bottom值</param>
        public static void LeftBottom(RectTransform rt, float left, float bottom) {
            // float value1 = rt.offsetMax.x + left;
            // float value2 = rt.offsetMax.y + bottom;
    
            // rt.offsetMin = new Vector2(left, bottom);
            // rt.offsetMax = new Vector2(rt.offsetMax.x + value1, rt.offsetMax.y + value2);
    
    		Vector2 size = rt.rect.size;
    		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, left, size.x);
    		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, bottom, size.y);
        }
        /// <summary>
        /// 调整 RectTransform 组件中的 Left、Top 属性
        /// </summary>
        /// <param name="rt"></param>
        /// <param name="left">Left值</param>
        /// <param name="top">Top值</param>
        public static void LeftTop(RectTransform rt, float left, float top) {
            // float value1 = rt.offsetMin.y - top;
            // float value2 = rt.offsetMax.x + left;
            // Debug.Log(value1);
            // Debug.Log(value2);
    
            // rt.offsetMin = new Vector2(left, rt.offsetMin.y + value1);
            // rt.offsetMax = new Vector2(rt.offsetMax.x + value2, -top);
    
    		Vector2 size = rt.rect.size;
    		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, left, size.x);
    		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, top, size.y);
        }
        /// <summary>
        /// 调整 RectTransform 组件中的 Right、Bottom 属性
        /// </summary>
        /// <param name="rt"></param>
        /// <param name="right">Right值</param>
        /// <param name="bottom">Bottom值</param>
        public static void RightBottom(RectTransform rt, float right, float bottom) {
            // float value1 = rt.offsetMin.x - right;
            // float value2 = rt.offsetMax.y + bottom;
    
            // rt.offsetMin = new Vector2(rt.offsetMin.x + value1, bottom);
            // rt.offsetMax = new Vector2(-right, rt.offsetMax.y + value2);
    
    		Vector2 size = rt.rect.size;
    		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, right, size.x);
    		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, bottom, size.y);
        }
        /// <summary>
        /// 调整 RectTransform 组件中的 Right、Top 属性
        /// </summary>
        /// <param name="rt"></param>
        /// <param name="right">Right值</param>
        /// <param name="top">Top值</param>
        public static void RightTop(RectTransform rt, float right, float top) {
            // float value1 = rt.offsetMin.x - right;
            // float value2 = rt.offsetMin.y - top;
    
            // rt.offsetMin = new Vector2(rt.offsetMin.x + value1, rt.offsetMin.y + value2);
            // rt.offsetMax = new Vector2(-right, -top);
    
    		Vector2 size = rt.rect.size;
    		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, right, size.x);
    		rt.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, top, size.y);
        }
    	public static void Center(RectTransform rt, float x, float y){
    		Vector2 size = rt.rect.size;
    		rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, size.x);
    		rt.SetSizeWithCurrentAnchors(RectTransform.Axis.Vertical, size.y);
    		rt.localPosition = new Vector2(x, y);
    	}


    另外,有个朋友提出另一种方法,通过设置offsetMin和offsetMax来达到目的,这个比较复杂,他自己写了四个基本类型的(分别是距离四个边的位置),可以根据这个自己再进行拓展:

    /// <summary>
        /// 调整 RectTransform 组件中的 Left 属性
        /// </summary>
        /// <param name="rt">引用目标 RectTransform 对象</param>
        /// <param name="left">Left值</param>
        public static void Left(RectTransform rt, float left) {
            if (left < rt.offsetMin.x) {
                float value = rt.offsetMin.x - left;
                
                rt.offsetMin = new Vector2(left, rt.offsetMin.y);
                rt.offsetMax = new Vector2(rt.offsetMax.x - value, rt.offsetMax.y);
            } else if (left > rt.offsetMin.x) {
                float value = left - rt.offsetMin.x;
                
                rt.offsetMin = new Vector2(left, rt.offsetMin.y);
                rt.offsetMax = new Vector2(rt.offsetMax.x + value, rt.offsetMax.y);
            }
        }
    
        /// <summary>
        /// 调整 RectTransform 组件中的 Right 属性
        /// </summary>
        /// <param name="rt">引用目标 RectTransform 对象</param>
        /// <param name="left">Right值</param>
        public static void Right(RectTransform rt, float right) {
            if (right < -rt.offsetMax.x) {
                float value = -rt.offsetMax.x - right;
                
                rt.offsetMin = new Vector2(rt.offsetMin.x + value, rt.offsetMin.y);
                rt.offsetMax = new Vector2(-right, rt.offsetMax.y);
            } else if (right > -rt.offsetMax.x) {
                float value = right + rt.offsetMax.x;
    
                rt.offsetMin = new Vector2(rt.offsetMin.x - value, rt.offsetMin.y);
                rt.offsetMax = new Vector2(-right, rt.offsetMax.y);
            }
        }
    
        /// <summary>
        /// 调整 RectTransform 组件中的 Top 属性
        /// </summary>
        /// <param name="rt">引用目标 RectTransform 对象</param>
        /// <param name="left">Top值</param>
        public static void Top(RectTransform rt, float top) {
            if (top < -rt.offsetMax.y) {
                float value = -rt.offsetMax.y - top;
    
                rt.offsetMin = new Vector2(rt.offsetMin.x, rt.offsetMin.y + value);
                rt.offsetMax = new Vector2(rt.offsetMax.x, -top);
            } else if (top > -rt.offsetMax.y) {
                float value = top + rt.offsetMax.y;
    
                rt.offsetMin = new Vector2(rt.offsetMin.x, rt.offsetMin.y - value);
                rt.offsetMax = new Vector2(rt.offsetMax.x, -top);
            }
        }
    
        /// <summary>
        /// 调整 RectTransform 组件中的 Bottom 属性
        /// </summary>
        /// <param name="rt">引用目标 RectTransform 对象</param>
        /// <param name="left">Bottom值</param>
        public static void Bottom(RectTransform rt, float bottom) {
            if (bottom < rt.offsetMin.y) {
                float value = rt.offsetMin.y - bottom;
                
                rt.offsetMin = new Vector2(rt.offsetMin.x, bottom);
                rt.offsetMax = new Vector2(rt.offsetMax.x, rt.offsetMax.y - value);
            } else if (bottom > rt.offsetMin.y) {
                float value = bottom - rt.offsetMin.y;
    
                rt.offsetMin = new Vector2(rt.offsetMin.x, bottom);
                rt.offsetMax = new Vector2(rt.offsetMax.x, rt.offsetMax.y + value);
            }
        }



    展开全文
  • 下面我们扩展了unity编译器的功能,可以一键设置锚点。效果如下:  代码要放在Editor文件夹下才能被我们编译器运行。代码如下: //一键设置锚点 [MenuItem("CONTEXT/RectTransform/SetAnchors")] ...

        做移动端UI自适应的适合我们经常要设置锚点。UI量很多的时候我们一点点设置很糟心。下面我们扩展了unity编译器的功能,可以一键设置锚点。效果如下:

        代码要放在Editor文件夹下才能被我们编译器运行。代码如下:

        //一键设置锚点
        [MenuItem("CONTEXT/RectTransform/SetAnchors")]
        public static void SetAnchors(MenuCommand mc)
        {
            RectTransform trans = mc.context as RectTransform;
            RectTransform parent = null;
            try
            {
                parent = trans.parent.GetComponent<RectTransform>();
            }
            catch (Exception ex)
            {
                Debug.Log("不能在Canvas上操作!");
                return;
            }
            float w = parent.rect.width;
            float h = parent.rect.height;
            float minX = trans.anchoredPosition.x - trans.rect.width / 2f;
            float minY = trans.anchoredPosition.y - trans.rect.height / 2f;
            float maxX = trans.anchoredPosition.x + trans.rect.width / 2f;
            float maxY = trans.anchoredPosition.y + trans.rect.height / 2f;
            minX /= w;
            minX += 0.5f;
            minY /= h;
            minY += 0.5f;
            maxX /= w;
            maxX += 0.5f;
            maxY /= h;
            maxY += 0.5f;
    
            trans.anchorMax = new Vector2(maxX, maxY);
            trans.anchorMin = new Vector2(minX, minY);
            trans.anchorMax = new Vector2(maxX, maxY);
    
            trans.offsetMin = Vector2.zero;
            trans.offsetMax = Vector2.zero;
        }
        public static Vector2 GetMainGameViewSize()
        {
            Type T = Type.GetType("UnityEditor.GameView,UnityEditor");
            MethodInfo GetSizeOfMainGameView = T.GetMethod("GetSizeOfMainGameView", BindingFlags.NonPublic | BindingFlags.Static);
            System.Object Res = GetSizeOfMainGameView.Invoke(null, null);
            return (Vector2)Res;
        }
    

        如果本博客对你有帮助,记得点关注哦!

    展开全文
  • unity3d锚点快捷键脚本

    2020-07-27 23:32:45
    ctrl+[:锚点跟随到节点放大缩小和对齐
  • Unity3D默认的设置下,在不同分辨率,就算我明明在Unity3D看到这4个按钮安分布置到屏幕的4个角,而且在Unity3D调试的时候,也看到确实如此了,但是在发布的运行时候,尤其允许用户可以自行调整分辨率的情况下。...

    在Unity3D中,即使我们布置好UGUI如下图所示:


    如果我们不进行一些调整。在Unity3D默认的设置下,在不同分辨率,就算我明明在Unity3D看到这4个按钮安分布置到屏幕的4个角,而且在Unity3D调试的时候,也看到确实如此了,但是在发布的运行时候,尤其允许用户可以自行调整分辨率的情况下。

    比如在640x480的分辨率之下:


    在比如在800x600分辨率之下:


    这根本就不是我想要的,好吗?我明明在你Unity3D那个Canvas那个框放好了UI组件,好吗?你Unity3D给我整出这些东西处理。

    于是就衍生出一个Canvas自适应的问题了。无论是在PC还是各种移动设备,自适应是最重要的。那种定死分辨率的游戏就是反人类。

    这方面其实根本就不用写代码或者设置摄像机的,只需要调调属性就好,没这么复杂,但这么容易调,就不会有这么多问题了。同时,再补充一句,基本是在没有创建UI时调整,是调好自适应再创建UI的。具体如下操作:

    1、对于Canvas的属性如下图设置。


    2、对于四个角的Button分别设置其锚点,左上的Button锚点就弄到左上即可,左下的弄到左下……以此类推,如图所示。


    那么发布的时候就得到我们想要的效果,在经典的1366x768分辨率测试都没有问题:


    起初的锚点没有更改的时候,即使改完Canvas,各个组件还是样式错乱的,不能自适应的。为何就小改一下锚点就这么大魔力了?下面谈谈锚点。

    关于锚点

    每个UI都有自己的锚点,锚点分为4个部分,用4个三角形表示,各个UI也有4个控制点,在选择矩形工具的时候你可以清晰看到4个锚点和UI的4个控制点,如图所示:


    这里Button是子控件,Canvas是子控件,一旦主控件被设置自动拉伸,子控件和锚点的距离(不是比例)将永远不变。在上述情况,则类似,这个Button被钉在左下角,同时补上3个不可被拉伸的钢丝,如下图所示:


    这就同时让Button存在自适应的效果。所以对于四个角的Button分别设置其锚点,左上的Button锚点就弄到左上即可,左下的弄到左下……以此类推。

    当锚点的四点合一的时候,你的UI就完全不会因为窗口改变而被压缩变形了,当然,他有超出你的父节点的可能。

    当锚点的左右两边分开的时候,UI不会随着父节点的高的大小变化,而之后随着宽的大小变化。

    当锚点上下两边分开的时候,UI不会随着父节点的宽的大小变化,而之后随着高的大小变化。

    当锚点四点分开的时候,父节点物体大小的改变总是会影响到这个UI。

    锚点的位置任何UI都可以被设置的。

    下面再举个反例说明这个问题,比如左上的Button设置成锚点四点分开,如图:


    会得到如下的情况:


    因此,在做自适应屏幕的时候,大家要根据需要,合理选择锚点的位置。

    其实理论上,Unity3D这锚点思想与C#窗体有点相似,关于C#窗体的思想,具体可以参考《【C#】用组件的Anchor属性解决最大化组件的缩放问题》(点击打开链接)。

    展开全文
  • 按住Alt键,改变锚点在父物体的位置,也改变物体的位置 按住Shift键即改变物体锚点位置,也改变物体中心的位置 若锚点集中于一点,物体的大小不会随父物体的缩放改变 锚点绑定父物体四周,物体会和服务体一起缩放,...

    PosX、PosY、PosZ:是物体相对父物体矩形框中心的偏移量 

    custom:点击custom ,只改变锚点位置
    按住Alt键,改变锚点在父物体的位置,也改变物体的位置
    按住Shift键即改变物体锚点位置,也改变物体中心的位置

    若锚点集中于一点,物体的大小不会随父物体的缩放改变
    锚点绑定父物体四周,物体会和服务体一起缩放,速度比父物体缩放快,很容易翻转,物体和父物体相对位置不变
    锚点绑定于物体本身四周,物体会和父物体等比例缩放,物体和父物体相对位置不变

    Anchors:  锚点 是以父物体左下角为原点的比例值,确定了锚点和父物体的相对位置
    Rotation  
    Scale: 
    UI的缩放和旋转是以物体中心点为为参考

    物体大小、位置的确定
    锚点--锚点和物体四个顶点的距离和角度 是固定值

    要确定物体的位置,先要确定物体的锚点相对父物体的位置,在通过锚点确定物体的位置

    若有错误,欢迎指正!

     

    展开全文
  • 效果图像这样,中间是模型,周围其他是签到框这样的布局,我想动态生成各个动态框,涉及到一个定位问题,锚点设置(动态去设置每个item的位置) 实现方法 SetInsetAndSizeFromParentEdge(); 此方法属于...

    问题背景

    在做签到系统时,需求给的效果图如下

     

    效果图像这样,中间是模型,周围其他是签到框这样的布局,我想动态生成各个动态框,涉及到一个定位问题,锚点的设置(动态去设置每个item的位置)

    实现方法

    SetInsetAndSizeFromParentEdge();

    此方法属于RectTransform里面得函数,(如果想更多了解RectTransform的话前面我有分析,https://www.cnblogs.com/answer-yj/p/10623304.html),这个函数有三个参数,第一个参数RectTransform.Edge.Left,是指左边的边界,第三个参数是图片的尺寸(有些地方说这是长度,但是我觉得有可能长有可能宽,需要看RectTransform.Edge的值),第二个参数是离边界的距离。注意第三个参数,这是图片尺寸,以第一个参数决定是图片的哪个尺寸

    实现代码

            for (int i = 1; i < 8; i++)
            {
                GameObject go = Instantiate(Resources.Load<GameObject>("Prefab"));
                go.transform.SetParent(GameObject.Find("GameObject").transform);
                go.transform.localPosition = Vector3.zero;
                RectTransform rectTransform = go.GetComponent<RectTransform>();
                switch (i)
                {
                    case 1:
                        rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, 0, 207);
                        rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 0, 209);
                        break;
                    case 2:
                        rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Top, 0, 207);
                        rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, 0, 209);
                        break;
                    case 3:
                        rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 0, 209);
                        break;
                    case 4:
                        rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, 0, 209);
                        break;
                    case 5:
                        rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, 0, 207);
                        rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 0, 209);
                        break;
                    case 6:
                        rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, 0, 207);
                        break;
                    case 7:
                        rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Bottom, 0, 207);
                        rectTransform.SetInsetAndSizeFromParentEdge(RectTransform.Edge.Right, 0, 209);
                        break;
                }
            }

    就这样实现了所需布局。

    (新手上路,欢迎指正)

     

    转载于:https://www.cnblogs.com/answer-yj/p/10640897.html

    展开全文
  • 大致方法就是新建一个cube(cube最简单,所以用cube),把cube想象成模型的锚点,调整cube在模型中的位置,如图: 然后在hierarchy列表中将模型拖入cube中,选中cube,在软件左上...
  • 删除Scroll View上ScrollRect组件指定的Scroll Bar。
  • 如图想要拖动黄色圈内的蓝点改变锚点,解决方法 1 添加组件Rect Transform,直接改Pivot就行 2 添加组件Rect Transform后,将这里点击为显示Pivot,然后直接拖动蓝色点就行 ...
  • 修改3D物体锚点,找到了一个脚本,分享一下 using System.Collections.Generic; using UnityEngine; using UnityEditor; public class SceneTool : EditorWindow { [MenuItem("Owen/Tool")] //绘制窗口 static ...
  • 一、锚点的作用在Unity5中的UGUI系统中,它给我们提供了一一个像叶子一样的图标,这个就是Unity中的锚点,我们可将将这个叶子分为四部分: 这个锚点的作用是时控件到这四个点的距离不变,但若屏幕逐渐缩小时控件...
  • 这个时候由于unity的版本的原因导致模型的部件的中心不一致。出现锚点不在物体的中心这样对其进行旋转操作的时候就出现不了想要的效果。步骤:新建一个cube(cube最简单),把cube想象成模型的锚点,调整cube在模型...
  • 如下图所示设置,将Pivot 设置为0,0 并以左下角为原点 这样PosX 和 PosY 就是 0 ,这样就不会随着屏幕大小比例的变化而使得有些图片显示不全会不能铺满 接着写个脚本,根据当前屏幕的长和宽,与当前UI的Width和...
  • 如何 添加图片 第一添加图集 制作图集: 选择需要的图片 点击Create即可形成图集 第二在 sprite中选择 ...第二 Sliced裁剪模式 主要图片放大后 周围的花纹可能会失帧 所以就显示纯色部分 ...锚点两种 第一在N...
  • Unity3D实用插件之Anchor Snap,快速设置图片锚点包裹图片 目录 1、博客介绍 2、内容 (1)设置图片锚点包裹 (2)设置图片以及子物体锚点包裹 3、推送 4、结语 1、博客介绍 本篇介绍插件Anchor Snap,该...
  •  图中心的圆点就是我说的重心点,它对应unity中字段是Pivot。取值范围0-1。x、y都是0.5时就是如图的中心位置。左下角是  (0,0),右上角是(1,1) 2、修改重心点然后旋转效果如下:第一重心点在(0.5,0.5)。第...
  • 它从 Unity 4.6 开始,被集成到 Unity 的编辑器中。相较于旧的 UI 系统,它绝对属于一个巨大的飞跃!因为只要有过旧 UI 系统使用体验的开发者,大部分都对它没有任何好感,以至于在过去的很长一段时间里,大家都在...
  • 【UGUI】代码设置锚点

    2017-08-10 18:00:52
    先看一下效果 代码也很简单 obj.transform.GetComponent().SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 0, 0); obj.transform.GetComponent().SetInsetAndSizeFromParentEdge(RectTransform.Edge...
  • Unity UGUI中RectTransfrom中锚点(Anchor)、中心(Pivot)、Rect及坐标分析 发表于2017/11/19 23:48:15 111人阅读 分类: unity3d ...Unity UGUI中RectTransfrom中锚点(Anchor)...标签(空格分隔): unity3d
1 2 3 4 5 ... 20
收藏数 1,423
精华内容 569
关键字:

unity3d 锚点设置