Unity解决:Unity SpriteRenderer屏幕自适应的多种模式

上代码:

cs 复制代码
using UnityEngine;
 
[RequireComponent(typeof(Camera))]
public class SpriteAdapter : MonoBehaviour {
 
    [System.Serializable]
    public class SpriteInfo
    {
        public SpriteRenderer Value = null;
        public EFillModel Model = EFillModel.ShowAll;
    }
 
    public enum EFillModel
    {
        /// <summary>
        /// 显示图片的所有内容
        /// </summary>
        ShowAll,
        /// <summary>
        /// 使图片内容填满屏幕
        /// </summary>
        Full,
        /// <summary>
        /// 根据图片高度填充屏幕
        /// </summary>
        WithHeight,
        /// <summary>
        /// 根据图片宽度填充屏幕
        /// </summary>
        WithWidth
        
    }
 
    public enum EUpdateType
    {
        /// <summary>
        /// 只在唤醒时更新一次
        /// </summary>
        UpdateOnAwake,
        /// <summary>
        /// 再每次视口发生变化的时候更新一次
        /// </summary>
        UpdateOnViewportChanged
    }
 
    public EUpdateType TickType = EUpdateType.UpdateOnAwake;
    public SpriteInfo[] Members;
    Camera Viewport;
    float ScreenRatio;
 
    void Awake () {
        Viewport = GetComponent<Camera>();
        UpdateAll();
    }
 
    private void LateUpdate()
    {
        if (TickType != EUpdateType.UpdateOnViewportChanged) return;
        if (ScreenRatio != Viewport.aspect)
        {
            UpdateAll();
        }
    } 
 
    /// <summary>
    /// 更新所有应用屏幕适配的图片
    /// </summary>
    void UpdateAll()
    {
        for (int i = 0; i < Members.Length; i++)
        {
            AdaptSpriteRender(Members[i]);
        }
 
        ScreenRatio = Viewport.aspect;
    }
 
    /// <summary>
    /// 使sprite铺满整个屏幕
    /// </summary>
    private void AdaptSpriteRender(SpriteInfo _spriteInfo)
    {
        SpriteRenderer spriteRenderer = _spriteInfo.Value;
        Vector3 scale = spriteRenderer.transform.localScale;
        float cameraheight = Viewport.orthographicSize * 2;
        float camerawidth = cameraheight * Viewport.aspect;
        float texr = (float)spriteRenderer.sprite.texture.width / spriteRenderer.sprite.texture.height;
        float viewr = camerawidth / cameraheight;
        switch (_spriteInfo.Model)
        {
            case EFillModel.WithHeight:
                //> 根据图片高度进行填充
                scale *= cameraheight / spriteRenderer.bounds.size.y;
                break;
            case EFillModel.WithWidth:
                //> 根据图片宽度进行填充
                scale *= camerawidth / spriteRenderer.bounds.size.x;
                break;
            case EFillModel.Full: 
                //> 填满整个屏幕
                if (viewr >= texr)
                {
                    if(viewr >= 1 && texr >= 1 || texr < 1)
                        scale *= camerawidth / spriteRenderer.bounds.size.x;
                    else
                        scale *= cameraheight / spriteRenderer.bounds.size.y;
                }
                else
                {
                    if (viewr <= 1 || texr > 1)
                        scale *= cameraheight / spriteRenderer.bounds.size.y; 
                    else
                        scale *= camerawidth / spriteRenderer.bounds.size.x;
                }
                break;
            default:
                //> 在屏幕上显示图片的全部内容
                if (viewr >= texr)
                {
                    scale *= cameraheight / spriteRenderer.bounds.size.y;
                }
                else
                {
                    scale *= camerawidth / spriteRenderer.bounds.size.x;
                }
                break;
        }
        spriteRenderer.transform.localScale = scale; 
    } 
}

如何使用:

1.把脚本挂在Camera上

2.把需要进行屏幕适配的SpriteRender对象放在Member队列中

3.选择更新类型EUpdateType、选择适配类型EFillModel即可

相关推荐
我是唐青枫11 小时前
深入理解 C#.NET Interlocked.Increment:原子操作的核心
c#·.net
yue00811 小时前
C# 字符串倒序
开发语言·c#
ejjdhdjdjdjdjjsl13 小时前
C#类型转换与异常处理全解析
开发语言·c#
我是唐青枫15 小时前
深入理解 C#.NET Parallel:并行编程的正确打开方式
开发语言·c#·.net
yue00815 小时前
C# ASCII和字符串相互转换
c#
TypingLearn16 小时前
Perigon.CLI 10.0 重磅发布【AspNetCore开发模板和辅助工具】
c#·.net·aspnetcore
Sheep Shaun17 小时前
STL中的map和set:红黑树的优雅应用
开发语言·数据结构·c++·后端·c#
沉默金鱼18 小时前
Unity实用技能-GM命令
unity·游戏引擎
chillxiaohan19 小时前
unity粗糙、高光、光泽度调节shader记录
unity·游戏引擎
kylezhao201919 小时前
C# 中常用的定时器详解
开发语言·c#