首页 > 编程语言 >Unity UGUI的AspectRatioFitter(宽高比适应器)组件的介绍及使用

Unity UGUI的AspectRatioFitter(宽高比适应器)组件的介绍及使用

时间:2023-07-20 12:04:47浏览次数:60  
标签:容器 AspectRatioFitter 元素 Unity UI aspectRatioFitter 组件 宽高比

Unity UGUI的AspectRatioFitter(宽高比适应器)组件的介绍及使用

1. 什么是AspectRatioFitter组件?

AspectRatioFitter(宽高比适应器)是Unity UGUI中的一个组件,用于控制UI元素的宽高比例,使其能够根据父容器的大小进行自适应调整。

2. 为什么要使用AspectRatioFitter组件?

AspectRatioFitter组件可以帮助我们在不同分辨率的屏幕上保持UI元素的宽高比例,确保UI的显示效果不会因为屏幕尺寸的变化而失真或变形。

3. 如何使用AspectRatioFitter组件?

3.1 工作原理

AspectRatioFitter组件通过调整UI元素的宽高比例来适应父容器的大小。它有两种模式可供选择:Fit In Parent(适应父容器)和 Envelope Parent(包裹父容器)。

  • Fit In Parent模式:UI元素会根据父容器的大小等比例缩放,以适应父容器的尺寸。如果UI元素的宽高比例与父容器的宽高比例不一致,UI元素会在父容器内留有空白区域。
  • Envelope Parent模式:UI元素会根据父容器的大小等比例缩放,以填满父容器的尺寸。如果UI元素的宽高比例与父容器的宽高比例不一致,UI元素会超出父容器的范围。

3.2 常用属性

  • Aspect Mode:设置AspectRatioFitter的模式,可选值为Fit In Parent和Envelope Parent。
  • Aspect Ratio:设置UI元素的宽高比例。

3.3 常用函数

  • SetLayoutHorizontal():在水平方向上调整UI元素的布局。
  • SetLayoutVertical():在垂直方向上调整UI元素的布局。

4. 例子代码

4.1 适应父容器的宽高比例

using UnityEngine;
using UnityEngine.UI;

public class FitInParentExample : MonoBehaviour
{
    public AspectRatioFitter aspectRatioFitter;

    private void Start()
    {
        aspectRatioFitter.aspectMode = AspectRatioFitter.AspectMode.FitInParent;
        aspectRatioFitter.aspectRatio = 16f / 9f;
    }
}

操作步骤:

  1. 创建一个空物体,并添加一个RectTransform组件作为父容器。
  2. 在父容器下创建一个UI元素,如Image或Text。
  3. 将AspectRatioFitter组件添加到UI元素上。
  4. 将父容器拖拽到FitInParentExample脚本的aspectRatioFitter属性上。
  5. 运行游戏,观察UI元素的宽高比例是否适应父容器。

注意事项:

  • 确保父容器的RectTransform组件的宽高比例与UI元素的宽高比例一致。

4.2 包裹父容器的宽高比例

using UnityEngine;
using UnityEngine.UI;

public class EnvelopeParentExample : MonoBehaviour
{
    public AspectRatioFitter aspectRatioFitter;

    private void Start()
    {
        aspectRatioFitter.aspectMode = AspectRatioFitter.AspectMode.EnvelopeParent;
        aspectRatioFitter.aspectRatio = 4f / 3f;
    }
}

操作步骤:

  1. 创建一个空物体,并添加一个RectTransform组件作为父容器。
  2. 在父容器下创建一个UI元素,如Image或Text。
  3. 将AspectRatioFitter组件添加到UI元素上。
  4. 将父容器拖拽到EnvelopeParentExample脚本的aspectRatioFitter属性上。
  5. 运行游戏,观察UI元素是否填满父容器,并超出父容器的范围。

注意事项:

  • 确保父容器的RectTransform组件的宽高比例与UI元素的宽高比例一致。

4.3 动态调整宽高比例

using UnityEngine;
using UnityEngine.UI;

public class DynamicAspectRatioExample : MonoBehaviour
{
    public AspectRatioFitter aspectRatioFitter;
    public Slider slider;

    private void Start()
    {
        aspectRatioFitter.aspectMode = AspectRatioFitter.AspectMode.FitInParent;
        slider.onValueChanged.AddListener(OnSliderValueChanged);
    }

    private void OnSliderValueChanged(float value)
    {
        aspectRatioFitter.aspectRatio = value;
    }
}

操作步骤:

  1. 创建一个空物体,并添加一个RectTransform组件作为父容器。
  2. 在父容器下创建一个UI元素,如Image或Text。
  3. 将AspectRatioFitter组件添加到UI元素上。
  4. 将父容器拖拽到DynamicAspectRatioExample脚本的aspectRatioFitter属性上。
  5. 创建一个Slider,并将其拖拽到DynamicAspectRatioExample脚本的slider属性上。
  6. 运行游戏,通过拖动Slider来动态调整UI元素的宽高比例。

注意事项:

  • Slider的值范围应与UI元素的宽高比例一致。

4.4 适应父容器的宽高比例(带动画)

using UnityEngine;
using UnityEngine.UI;

public class FitInParentWithAnimationExample : MonoBehaviour
{
    public AspectRatioFitter aspectRatioFitter;
    public AnimationCurve animationCurve;
    public float animationDuration = 1f;

    private float targetAspectRatio = 16f / 9f;
    private float currentAspectRatio;

    private void Start()
    {
        aspectRatioFitter.aspectMode = AspectRatioFitter.AspectMode.FitInParent;
        currentAspectRatio = aspectRatioFitter.aspectRatio;
    }

    private void Update()
    {
        float t = Mathf.Clamp01(Time.time / animationDuration);
        aspectRatioFitter.aspectRatio = Mathf.Lerp(currentAspectRatio, targetAspectRatio, animationCurve.Evaluate(t));
    }
}

操作步骤:

  1. 创建一个空物体,并添加一个RectTransform组件作为父容器。
  2. 在父容器下创建一个UI元素,如Image或Text。
  3. 将AspectRatioFitter组件添加到UI元素上。
  4. 将父容器拖拽到FitInParentWithAnimationExample脚本的aspectRatioFitter属性上。
  5. 创建一个AnimationCurve,并将其拖拽到FitInParentWithAnimationExample脚本的animationCurve属性上。
  6. 设置animationDuration属性为动画的持续时间。
  7. 运行游戏,观察UI元素的宽高比例是否逐渐适应父容器,并根据动画曲线进行插值。

注意事项:

  • 确保父容器的RectTransform组件的宽高比例与UI元素的宽高比例一致。

4.5 包裹父容器的宽高比例(带动画)

using UnityEngine;
using UnityEngine.UI;

public class EnvelopeParentWithAnimationExample : MonoBehaviour
{
    public AspectRatioFitter aspectRatioFitter;
    public AnimationCurve animationCurve;
    public float animationDuration = 1f;

    private float targetAspectRatio = 4f / 3f;
    private float currentAspectRatio;

    private void Start()
    {
        aspectRatioFitter.aspectMode = AspectRatioFitter.AspectMode.EnvelopeParent;
        currentAspectRatio = aspectRatioFitter.aspectRatio;
    }

    private void Update()
    {
        float t = Mathf.Clamp01(Time.time / animationDuration);
        aspectRatioFitter.aspectRatio = Mathf.Lerp(currentAspectRatio, targetAspectRatio, animationCurve.Evaluate(t));
    }
}

操作步骤:

  1. 创建一个空物体,并添加一个RectTransform组件作为父容器。
  2. 在父容器下创建一个UI元素,如Image或Text。
  3. 将AspectRatioFitter组件添加到UI元素上。
  4. 将父容器拖拽到EnvelopeParentWithAnimationExample脚本的aspectRatioFitter属性上。
  5. 创建一个AnimationCurve,并将其拖拽到EnvelopeParentWithAnimationExample脚本的animationCurve属性上。
  6. 设置animationDuration属性为动画的持续时间。
  7. 运行游戏,观察UI元素是否逐渐填满父容器,并根据动画曲线进行插值。

注意事项:

  • 确保父容器的RectTransform组件的宽高比例与UI元素的宽高比例一致。

5. 参考资料

标签:容器,AspectRatioFitter,元素,Unity,UI,aspectRatioFitter,组件,宽高比
From: https://blog.51cto.com/u_7509448/6784075

相关文章

  • Unity UGUI的ContentSizeFitter(内容尺寸适应器)组件的介绍及使用
    UnityUGUI的ContentSizeFitter(内容尺寸适应器)组件的介绍及使用1.什么是ContentSizeFitter组件?ContentSizeFitter是UnityUGUI中的一个组件,用于自动调整UI元素的大小,以适应其内容的大小变化。它可以根据内容的大小自动调整UI元素的宽度和高度,确保内容不会被截断或溢出。2.Cont......
  • unity3d unitywebrequest
    Unity3D中的UnityWebRequest是用于发送HTTP请求和处理HTTP响应的类。它提供了一种方便的方式来从服务器获取数据,例如从Web服务器的数据库中检索数据,并通过HTTP请求将数据发送回Unity3D应用程序。使用UnityWebRequest类,您可以执行以下操作:创建请求:您可以使用UnityWebRequest类......
  • 为什么unity里的异步加载要配合协程使用
      在Unity中,异步加载资源时需要配合协程使用的原因是为了避免阻塞主线程。在游戏开发中,资源加载通常是一个耗时的操作,如果在主线程中进行同步加载,会导致游戏卡顿或者无响应,影响用户体验。使用协程可以将资源加载操作放在后台线程中进行,然后在加载完成后再将结果返回到主线程......
  • Unity资源&&配置存档路径问题
    stringdir=Application.persistentDataPath;//万能路径,打包前打包后移动端都可用,该路径可读、可写,但是只能在程序运行时才能读写操作,不能提前将数据放入这个路径。#ifUNITY_EDITORdir=Application.streamingAssetsPath;//打包前可用#endif#if(UNITY_ANDRO......
  • Unity游戏存档读档的几种方式
    1.二进制privatestaticvoidSaveByBinary(){//创建二进制格式化程序BinaryFormatterbf=newBinaryFormatter();//创建一个文件流FileStreamfs=File.Create(GetFilePath(SaveDataType));//二进制方法序列化对象......
  • Unity 协程详解
    在程序开发时,光是了解协程怎么用是远远不够的,因为当程序出现一些有关于协程的错误时,理解协程的原理就十分有必要性了。1.协程使用的一些问题我们知道如果在Unity中编写一个死循环,会造成运行游戏时整个Unity编辑器卡死,而协程函数在使用时好像是可以与Update函数并行不斥......
  • Unity下载安装包并进行安装
    项目上要做更新,还没学热更新,要做到游戏内部下载安装包并进行安装的效果,项目不采用Url转跳默认下载器的方式。Url转跳下载方式Application.OpenURL(URL);用这个转跳你的Nginx下载路径就行了,项目上不让用这种方式Unity内下载安装包Unity调用安卓安装安装包参考文章待整理......
  • 在Unity3D中使用ScriptableObject进行序列化
    ScriptableObject类型经常用于存储一些unity3d本身不可以打包的一些object,比如字符串,一些类对象等。用这个类型的子类型,则可以用BuildPipeline打包成assetbundle包供后续使用,非常方便。这样除了playerpref和c#文件读取外,另外的一种存取一些数据对象的方法1.usingUnityEngine;......
  • unity3D制作并使用Assetbundles方法
    在网页中为了控制.unity文件的大小,加速载入速度,可以把系统用到的资源制作成Assestbundles,根据需要进行动态的加载和卸载。具体作法:1、使用脚本重新定义系统菜单,添加一个制作Assetbunles的菜单命令://C#Example//Buildsanassetbundlefromtheselected......
  • Unity3D_根据不同的屏幕缩放UI(在横屏上运行竖屏软件)
    一、首先我们创建一个1080*1920分辨率的场景 效果如下二、随便添加一张UI图片三、打包出来看效果(我们发现UI显示不全,这是因为UI的尺寸任然是1080*1920,而我们的电脑是1920*1080) 四、我们在Unity中做以下设置1.选中游戏物体Canvas2.点击组件CanvasScaler上的UISc......