Unity 动态更换Image图片 && UI自适应

Posted 彭老希

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity 动态更换Image图片 && UI自适应相关的知识,希望对你有一定的参考价值。

一、动态更换Image图片

前提:Image源文件必须存放在自行创建的文件夹[Resources]中

方式一:typeof 类型 Resources.Load()动态更换Image

Image img;
//image路径
string path = "Images/Item/img";
//参数为资源路径和资源类型
Sprite sprite = Resources.Load(path,typeof(Sprite)) as Sprite;
//动态更换image
Img.sprite = sprite;

方式二:泛型
这里的icon_数值:00实际上是图片的名称,只不过用的是正则的方式替换了

Sprite sprite = Resources.Load<Sprite>($"Images/icon_数值:00");

二、UI自适应

using UnityEngine;
using UnityEngine.UI;

public enum AnchorPresets

    TopLeft,
    TopCenter,
    TopRight,

    MiddleLeft,
    MiddleCenter,
    MiddleRight,

    BottomLeft,
    BottonCenter,
    BottomRight,
    BottomStretch,

    VertStretchLeft,
    VertStretchRight,
    VertStretchCenter,

    HorStretchTop,
    HorStretchMiddle,
    HorStretchBottom,

    StretchAll

public enum PivotPresets

    TopLeft,
    TopCenter,
    TopRight,

    MiddleLeft,
    MiddleCenter,
    MiddleRight,

    BottomLeft,
    BottomCenter,
    BottomRight,

public enum UILocation

    Left,
    Center,
    Right

public static class UIUtil

    /// <summary>
    /// 自适应Image,不考虑高度,如果图片比父物体要宽,图片将会自适应
    /// </summary>
    /// <param name="mImage"></param>
    /// <param name="mIsAdaptHeight">是否进行高度自适应,有滑动条可忽略</param>
    /// <param name="mSize">缩放倍数</param>
    public static void AdaptiveUIImage( this Image mImage, bool mIsAdaptHeight = false, float mSize = 0.95f)
    
        if (mImage.type != Image.Type.Simple)
            return;
        mImage.SetNativeSize ();
        if (mImage.rectTransform.sizeDelta.x > mImage.rectTransform.parent.GetComponent<RectTransform> ().sizeDelta.x)
        
            float w = mImage.rectTransform.parent.GetComponent<RectTransform> ().sizeDelta.x / mImage.rectTransform.sizeDelta.x;
            //Debug.Log ("图片宽:" + f + "%");
            mImage.rectTransform.sizeDelta = new Vector2 (mImage.rectTransform.sizeDelta.x * w, mImage.rectTransform.sizeDelta.y * w) * mSize;
        
        if (mIsAdaptHeight)
        
            if (mImage.rectTransform.sizeDelta.y > mImage.rectTransform.parent.GetComponent<RectTransform> ().sizeDelta.y)
            
                float h = mImage.rectTransform.parent.GetComponent<RectTransform> ().sizeDelta.y / mImage.rectTransform.sizeDelta.y;
                //Debug.Log ("图片宽:" + f + "%");
                mImage.rectTransform.sizeDelta = new Vector2 (mImage.rectTransform.sizeDelta.x * h, mImage.rectTransform.sizeDelta.y * h) * mSize;
            
        
    
    /// <summary>
    /// 自适应Text,不考虑宽度(宽度可自定义),如果txt数量过多导致显示不出来下一行,可自适应高度
    /// </summary>
    /// <param name="mText">text</param>
    public static void AdaptiveUIText( this Text mText, bool mIsAdaptWide = false, float mSize = 0.95f )
    
        if (mIsAdaptWide)
        
            mText.rectTransform.sizeDelta = new Vector2 (mText.transform.parent.GetComponent<RectTransform>().sizeDelta.x* mSize, mText.rectTransform.sizeDelta.y);
        
        mText.rectTransform.sizeDelta = new Vector2 (mText.rectTransform.sizeDelta.x, mText.preferredHeight);
    

    /// <summary>
    /// UI自适应(子物体锚点不允许为Stretch模式)
    /// </summary>
    /// <param name="mUIParent">父物体</param>
    /// <param name="mUILocation">自适应位置</param>
    /// <param name="mGap">间隔距离</param>
    /// <param name="mAlterUIParent">父物体是否跟随子物体调整大小</param>
    public static void AdaptiveUI( this RectTransform mUIParent, UILocation mUILocation = UILocation.Center, float mGap = 10f, bool mAlterUIParent = true )
    
        #region 锚点固定左上角
        foreach (RectTransform item in mUIParent)
        
            item.SetAnchor (AnchorPresets.TopLeft);
        
        #endregion

        RectTransform UIItem = null;
        foreach (Transform item in mUIParent.transform)
        
            if (!item.gameObject.activeSelf)
                continue;

            #region 自适应Text与Image
            Image image = item.GetComponent<Image> ();
            Text text = item.GetComponent<Text> ();
            if (image)
                AdaptiveUIImage (image);
            if (text)
                AdaptiveUIText (text,true);
            #endregion

            if (UIItem == null)
            
                UIItem = item.GetComponent<RectTransform> ();
                UIItem.anchoredPosition = new Vector2 (UIItem.anchoredPosition.x, ( UIItem.sizeDelta.y / -2 ));
            
            else
            
                float itemx = item.GetComponent<RectTransform> ().anchoredPosition.x;
                float itemy = UIItem.anchoredPosition.y - ( item.GetComponent<RectTransform> ().sizeDelta.y / 2 ) - ( UIItem.sizeDelta.y / 2 );
                item.GetComponent<RectTransform> ().anchoredPosition = new Vector2 (itemx, itemy);
                UIItem = item.GetComponent<RectTransform> ();
            
            SetUILocation (mUIParent, item.GetComponent<RectTransform> (), mUILocation, mGap);
        
        //设置父物体的长度
        if (mAlterUIParent)
        
            float mUIParent_Y = ( UIItem.anchoredPosition.y * -1 ) + ( UIItem.sizeDelta.y / 2 );
            mUIParent.sizeDelta = new Vector2 (mUIParent.sizeDelta.x, mUIParent_Y + mGap);
            //mUIParent.SetPivot (PivotPresets.TopCenter);
            //mUIParent.SetAnchor ( AnchorPresets.TopLeft);
        
    

    static void SetUILocation( RectTransform mUIParent, RectTransform mTaggetUI, UILocation mUILocation, float mGap )
    
        float mTaggetUI_X = 0;
        float mTaggetUI_Y = mTaggetUI.anchoredPosition.y - mGap;
        switch (mUILocation)
        
            case UILocation.Left:
                mTaggetUI_X = mTaggetUI.sizeDelta.x / 2 + mGap;
                break;
            case UILocation.Center:
                mTaggetUI_X = mUIParent.sizeDelta.x / 2;
                break;
            case UILocation.Right:
                mTaggetUI_X = mUIParent.sizeDelta.x - ( mTaggetUI.sizeDelta.x / 2 ) - mGap;
                break;
        
        mTaggetUI.anchoredPosition = new Vector2 (mTaggetUI_X, mTaggetUI_Y);
    

    public static void SetAnchor( this RectTransform source, AnchorPresets allign, int offsetX = 0, int offsetY = 0 )
    
        source.anchoredPosition = new Vector3 (offsetX, offsetY, 0);

        switch (allign)
        
            case ( AnchorPresets.TopLeft ):
                
                    source.anchorMin = new Vector2 (0, 1);
                    source.anchorMax = new Vector2 (0, 1);
                    break;
                
            case ( AnchorPresets.TopCenter ):
                
                    source.anchorMin = new Vector2 (0.5f, 1);
                    source.anchorMax = new Vector2 (0.5f, 1);
                    break;
                
            case ( AnchorPresets.TopRight ):
                
                    source.anchorMin = new Vector2 (1, 1);
                    source.anchorMax = new Vector2 (1, 1);
                    break;
                

            case ( AnchorPresets.MiddleLeft ):
                
                    source.anchorMin = new Vector2 (0, 0.5f);
                    source.anchorMax = new Vector2 (0, 0.5f);
                    break;
                
            case ( AnchorPresets.MiddleCenter ):
                
                    source.anchorMin = new Vector2 (0.5f, 0.5f);
                    source.anchorMax = new Vector2 (0.5f, 0.5f);
                    break;
                
            case ( AnchorPresets.MiddleRight ):
                
                    source.anchorMin = new Vector2 (1, 0.5f);
                    source.anchorMax = new Vector2 (1, 0.5f);
                    break;
                

            case ( AnchorPresets.BottomLeft ):
                
                    source.anchorMin = new Vector2 (0, 0);
                    source.anchorMax = new Vector2 (0, 0);
                    break;
                
            case ( AnchorPresets.BottonCenter ):
                
                    source.anchorMin = new Vector2 (0.5f, 0);
                    source.anchorMax = new Vector2 (0.5f, 0);
                    break;
                
            case ( AnchorPresets.BottomRight ):
                
                    source.anchorMin = new Vector2 (1, 0);
                    source.anchorMax = new Vector2 (1, 0);
                    break;
                

            case ( AnchorPresets.HorStretchTop ):
                
                    source.anchorMin = new Vector2 (0, 1);
                    source.anchorMax = new Vector2 (1, 1);
                    break;
                
            case ( AnchorPresets.HorStretchMiddle ):
                
                    source.anchorMin = new Vector2 (0, 0.5f);
                    source.anchorMax = new Vector2 (1, 0.5f);
                    break;
                
            case ( AnchorPresets.HorStretchBottom ):
                
                    source.anchorMin = new Vector2 (0, 0);
                    source.anchorMax = new Vector2 (1, 0);
                    break;
                

            case ( AnchorPresets.VertStretchLeft ):
                
                    source.anchorMin = new Vector2 (0, 0);
                    source.anchorMax = new Vector2 (0, 1);
                    break;
                
            case ( AnchorPresets.VertStretchCenter ):
                
                    source.anchorMin = new Vector2 (0.5f, 0);
                    source.anchorMax = new Vector2 (0.5f, 1);
                    break;
                
            case ( AnchorPresets.VertStretchRight ):
                
                    source.anchorMin = new Vector2 (1, 0);
                    source.anchorMax = new Vector2 (1, 1);
                    break;
                

            case ( AnchorPresets.StretchAll ):
                
                    source.anchorMin = new Vector2 (0, 0);
                    source.anchorMax = new Vector2 (1, 1);
                    break;
                
        
    

    public static void SetPivot( this RectTransform source, PivotPresets preset )
    

        switch (preset)
        
            case ( PivotPresets.TopLeft ):
                
                    source.pivot = new Vector2 (0, 1);
                    break;
                
            case ( PivotPresets.TopCenter ):
                
                    source.pivot = new Vector2 (0.5f, 1);
                    break;
                
            case ( PivotPresets.TopRight ):
                
                    source.pivot = new Vector2 (1, 1);
                    break;
                

            case ( PivotPresets.MiddleLeft ):
                
                    source.pivot = new Vector2 (0, 0.5f);
                    break;
                
            case ( PivotPresets.MiddleCenter ):
                
                    source.pivot = new Vector2 (0.5f, 0.5f);
                    break;
                
            case ( PivotPresets.MiddleRight ):
                
                    source.pivot = new Vector2 (1, 0.5f);
                    break;
                

            case ( PivotPresets.BottomLeft ):
                
                    source.pivot = new Vector2 (0, 0);
                    break;
                
            case ( PivotPresets.BottomCenter ):
                
                    source.pivot = new Vector2 (0.5f, 0);
                    breakWPF-模拟动态更换logo的过程,如何把网上的图片下载到指定目录。

Unity之Image & Raw Image

Unity开发之实现更换鼠标图片

小功能⭐️Unity动态更换天空盒旋转天空盒

Unity 安卓启动图片(splash image)前黑屏解决方法

UGUI怎么获取Image,怎么动态的更换Image