精华内容
下载资源
问答
  • 下面我们扩展了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;
        }
    

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

    展开全文
  • untiy 一键设置锚点,UGUI ,让我们省去繁琐的设置锚点过程,可以自己去研究一下,详细文档下次更新上传.
  • Unity3D】UGUI自适应屏幕与锚点

    万次阅读 多人点赞 2017-04-17 17:05:12
    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属性解决最大化组件的缩放问题》(点击打开链接)。

    展开全文
  • [MenuItem("CONTEXT/RectTransform/Auto")] public static void AutoRectAnior() { Debug.Log("自适应锚点"); //获得当前设置UI RectTransform rect = Selection.activeGameOb...

      

    [MenuItem("CONTEXT/RectTransform/Auto")]
        public static void AutoRectAnior()
        {
            Debug.Log("自适应锚点");
            //获得当前设置UI
            RectTransform rect = Selection.activeGameObject.GetComponent<RectTransform>();
            //获取其父级
            RectTransform parent = rect.parent.GetComponent<RectTransform>();
            RectTransform canvas = rect.GetComponentInParent<Canvas>().GetComponent<RectTransform>();
            if (!rect || ! parent || !canvas)
            {
                Debug.Log("自适应锚点失败,缺少对象!");
                return;
            }
            Bounds rectBounds = RectTransformUtility.CalculateRelativeRectTransformBounds(canvas, rect);//计算src的包围盒
            Bounds parentBounds = RectTransformUtility.CalculateRelativeRectTransformBounds(canvas, parent);//计算tar的包围盒
    
            float cMinX = 0.5f, cMinY = 0.5f, cMaxX = 0.5f, cMaxY = 0.5f;
            //获取设置UI的宽和高
            float cWidth = rectBounds.size.x; //rect.sizeDelta.x * rect.localScale.x;
            float cHight = rectBounds.size.y;//rect.sizeDelta.y * rect.localScale.y;
            //获取设置UI父级的宽和高
            float pWidth = parentBounds.size.x;//parent.sizeDelta.x * parent.localScale.x;
            float pHight = parentBounds.size.y;//parent.sizeDelta.y * parent.localScale.y;
            //重新计算锚点位置
            cMinX = (pWidth / 2 - (cWidth * rect.pivot.x - rect.anchoredPosition.x)) / pWidth;
            cMinY = (pHight / 2 - (cHight * rect.pivot.y - rect.anchoredPosition.y)) / pHight;
            cMaxX = (pWidth / 2 + (cWidth * (1 - rect.pivot.x) + rect.anchoredPosition.x)) / pWidth;
            cMaxY = (pHight / 2 + (cHight * (1 - rect.pivot.y) + rect.anchoredPosition.y)) / pHight;
            //重新设置UI的锚点位置
            rect.anchorMin = new Vector2(cMinX, cMinY);
            rect.anchorMax = new Vector2(cMaxX, cMaxY);
            //设置UI的相对距离
            rect.offsetMax = new Vector2(0, 0);
            rect.offsetMin = new Vector2(0, 0);
    
            Debug.Log("自适应锚点成功!");
        }
    

      上述绑定代码未完善。。。后续完善

    转载于:https://www.cnblogs.com/lovewaits/p/7704335.html

    展开全文
  • 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);
            }
        }



    展开全文
  • 如下图所示设置,将Pivot 设置为0,0 并以左下角为原点 这样PosX 和 PosY 就是 0 ,这样就不会随着屏幕大小比例的变化而使得有些图片显示不全会不能铺满 接着写个脚本,根据当前屏幕的长和宽,与当前UI的Width和...
  • Unity3D实用插件之Anchor Snap,快速设置图片锚点包裹图片 目录 1、博客介绍 2、内容 (1)设置图片锚点包裹 (2)设置图片以及子物体锚点包裹 3、推送 4、结语 1、博客介绍 本篇介绍插件Anchor Snap,该...
  • Unity3D开发之设置UI位置

    千次阅读 2020-04-29 15:36:05
    而UI不像3D物体可以直接设置Position。因为决定他位置的是RectTransform,并且UI会设置锚点,位置并不是固定。下面就来记录不同状况下设置UI位置的方法。 一.不设置锚点 直接设置LocalPosition即可。代码如下: ...
  • Unity3d 场景的淡入淡出效果实现 思路 用UGUI设计一张全屏的纯色图片 控制图片的Alpha值,来实现淡入淡出的效果 实现 先新建一张图片,设置锚点为全屏 设置颜色值 新建脚本Fade_Control using ...
  • unity3D 滑动居中选择效果

    千次阅读 2018-11-15 19:14:07
    1 Grid 和子物体锚点设置如下 2 脚本挂在Grid上面 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System; ...
  • Unity3D-----NGUI

    2020-06-09 15:03:37
    NGUI一、NGUI插件的安装二、NGUI的使用1、sprite2、锚点设置三、图集制作 一、NGUI插件的安装 不同版本的Unity对应不同版本的NGUI,找到相应版本的NGUI插件后,在Unity中直接导入这个NGUI包,在Unity窗口中出现NGUI...
  • Unity3D之虚拟摇杆

    2017-08-03 19:34:09
    第二步:设置图片锚点(左下角) 第三步: 添加JoysticksCtl脚本(代码如下)挂载到场景中的图片上 第四步:在Joystick图片下创建子物体图片Point,为图片添加Event Trigger脚本,添加Drag和Point Up事件 ...
  • 总体思路:使用UGUI中图片的alpha值来控制镜头淡入淡出。...将 图片 锚点设置为全屏,按键alt+鼠标 点击锚点 位置:如图: 将下面代码绑定到该图片上: 代码源码:将alpha值进行递减,直到为...
  • 首先那Slider是由 Background Fill Area Handle Slide Area 组成具体参数请看api 在开发游戏时又很多的进度条是用图片来进行设置的 ...他的锚点设置为1 他的位置/宽高设为0 创建一个Text开看一下pivot的变...
  • unity3d自动生成2D动画

    千次阅读 2015-02-05 22:57:20
    生成AnimationClip、Controller以及设置State等都是参考了他提供的代码,这里我主要...这里主要看代码吧,值得一提的是,设置自定义锚点必须将spriteAlignment设置为9(customer),否则设置的pivot将不起作用。
  • 设置对象(Mesh)的锚点

    千次阅读 2016-08-24 22:26:07
    2016.8.14 孙广东 第一种方式:本文参考: http://wiki.unity3d.com/index.php?title=SetPivotPivot (锚点), 熟悉 UGUI肯定熟悉 锚点锚点就是 对象的位置中心点, 缩放和旋转的中心!!!/*  * Version:...
  • Unity3D UGUI学习小结

    千次阅读 2017-07-17 21:07:45
    1.锚点和中心点问题:简单点说就是,锚点四个花瓣在一个点时,中心点的坐标;不在一个点时,中心点和花瓣所组成边框的距离 2.点击事件处理,button可以在OnClick,添加方法。Image等组件可以在EventSystem设置。也可...
  • Unity3D–通过携程控制跳转场景的渐隐渐现 1:创建UI–image,再设置锚点,alt+鼠标左键,把图片铺满 2:image 下挂载脚本 2.1:变量和引用命名空间 using UnityEngine; using UnityEngine.UI;//ui using UnityEngine...
  • 下图为UI的层级结构,Anchors下的四个物体为UI的四个角,注意物体的锚点设置成对应的位置,而Communication的锚点设置为stretch、stretch 具体代码如下: using System.Collections;...
  • (小哥是unity3D新入门菜鸟。。。) 首先创建5个button 然后Main Camera和Canvas的设置 然后把5个button各自的锚点拖到各自的4个角上 这样在不同分辨率下button大小会自适应(真机上没试过。。。) 1280...
  • RectTransform,Transform ,Rect 本文提供全流程,中文...AnchorPresets —— 快速锚点预设(设置)面板 RectTransformAPI属性解析 offsetMax、offsetMin —— 偏移量 anchorMax、anchorMin —— 锚点矩形 sizeDelta —
  • 3.设置锚点 4.设置ScoreText位置。 注意,ScoreText位置的位置是相对于锚点而言的!,与锚点距离y方向相差55 5.设置ScoreText参数 6.添加Shadow 7.为ScoreText添加脚本ScoreManager.cs using Uni.....
  • Unity3D开发之Rect.size和sizeDelta的区别

    千次阅读 2019-05-28 10:19:42
    昨天发现自己做的时间段选择...后来设置锚点后打印width接近0.这是明显的错误。翻unityanswer发现确实有人遇到这个问题,是因为Awake初始化ui的Rectangle还没有初始化出来,所以获取到的值是错误的,要在Start函数或...
  • GUIText 和GUITexture 1、GUIText 锚点(Anchor)的概念我...而GUIText 对象本身也是支持设置锚点的,但是只有9个选项。用于设置显示的Text文本的整体的自身坐标原点。 任何对象都会有Transform组件,而在GUIT...
  • 其实早有预料 但总想着生命在于折腾 而且我之前的博文才说过要做3D,不要做2D ...然后,就是默认设置很不友善,尽管有各种提示,框架,设置都很不错,但真心不是一个UI导向的框架, 如果你不把这些坑踩平,很难用,新
  • 在这16个位置生成鱼,也就是创建16个空项目来装出生点,设置锚点和坐标,尺寸合适 并且将所有出生点的红轴旋转指向地图 创建一个空项目然后挂脚本 MakeFish.cs public class MakeFish : MonoBehaviour { /...
  • 昨天修改项目,加了一个...项目中InputField下有Text、Image等子物体,Image的锚点在左上角(根据项目需求设置),用户可以拖拽Image,拖拽后要保存位置信息; 当我没加InputField的放大功能,即InputField的piv...
  • Unity--UI控件

    千次阅读 2017-10-26 16:07:00
    注:具体属性查看https://docs.unity3d.com/Manual/script-Text.html官方文档 RectTransform组件: Width/Height:矩形框的宽高(用于显示) Left、Top、Right、Bottom:Anchors形成一个锚框时,代表矩形与锚框的内...
  • 在我的笔记Unity3D里面之 简单聊天系统一 里面已经介绍怎么创建聊天系统的背景、给聊天系统添加滚动条,设置Anchor锚点、以及设计聊天系统的输入框。  效果图如下所示:   现在我们要做的就是使用脚本控制聊天...

空空如也

空空如也

1 2
收藏数 31
精华内容 12
关键字:

unity3d锚点设置