【Unity 实用技巧】为游戏截图添加自定义水印LOGO

1. 前言

大家好,我是Mark。在Unity开发中,屏幕截图功能是一项常用的功能,它常用于游戏分享而默认的截图往往缺乏辨识度。本文将介绍如何在Unity中实现带有自定义LOGO的屏幕截图,话不多说开搞~

2. 最终效果

3. 示例代码

代码比较简单且都有注释,笔者还贴心的为大家内置了四种位置方便大家选择~

using System;  
using UnityEngine;  
using System.Collections;  
using System.IO;  

public class ScreenshotCapture : MonoBehaviour  
{  
    // 定义截图的快捷键  
    public KeyCode screenshotKey = KeyCode.F12;  

    // 定义水印的纹理  
    public Texture2D logo;  

    // 定义水印的大小  
    public Vector2 logoSize = new Vector2(100, 100);  

    public float logoPosOffset = 10;  
    // 定义水印的位置枚举  
    public LogoPosition logoPositionEnum = LogoPosition.BottomLeft;  

    // 枚举类型,定义水印可能的位置  
    public enum LogoPosition  
    {  
        BottomLeft,    // 底部左侧  
        BottomRight,   // 底部右侧  
        BottomCenter,  // 底部中间  
        TopLeft,       // 顶部左侧  
        TopRight,      // 顶部右侧  
        TopCenter      // 顶部中间  
    }  

    // 每一帧调用,检测是否按下了截图键  
    void Update()  
    {        
        if (Input.GetKeyDown(screenshotKey))  
        {            // 如果按下截图键,则开始截图协程  
            StartCoroutine(CaptureScreenshotWithLogo());  
        }    
    }  
    // 截图协程,用于在帧结束时捕获屏幕内容并添加水印  
    IEnumerator CaptureScreenshotWithLogo()  
    {        // 等待当前帧结束  
        yield return new WaitForEndOfFrame();  

        // 创建一个新的Texture2D来保存屏幕内容  
        Texture2D screenTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);  
        screenTexture.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0);  
        screenTexture.Apply();  

        // 创建一个新的Texture2D来保存带有水印的图像  
        Texture2D combinedTexture = new Texture2D(Screen.width, Screen.height, TextureFormat.RGBA32, false);  
        combinedTexture.SetPixels(screenTexture.GetPixels());  

        // 根据枚举计算水印位置  
        Vector2 logoPosition = CalculateLogoPosition();  

        // 计算水印缩放比例  
        float scaleX = logoSize.x / logo.width;  
        float scaleY = logoSize.y / logo.height;  

        // 将水印绘制到Texture2D上  
        for (int y = 0; y < logo.height; y++)  
        {            for (int x = 0; x < logo.width; x++)  
            {                Color logoPixel = logo.GetPixel(x, y);  
                if (logoPixel.a > 0f) // 只绘制不透明的像素  
                {  
                    int targetX = (int)(logoPosition.x + x * scaleX);  
                    int targetY = (int)(logoPosition.y + y * scaleY);  
                    combinedTexture.SetPixel(targetX, targetY, logoPixel);  
                }            
            }        
        }        
        combinedTexture.Apply();  

        // 将Texture2D转换为PNG格式的字节数组  
        byte[] bytes = combinedTexture.EncodeToPNG();  

        // 生成唯一的文件名  
        string filename = "Screenshot_" + DateTime.Now.ToString("yyyy-MM-dd_HH-mm-ss") + ".png";  

        // 拼接完整的保存路径  
        string path = Path.Combine(Application.persistentDataPath, filename);  

        // 保存截图文件  
        File.WriteAllBytes(path, bytes);  

        // 清理资源  
        Destroy(screenTexture);  
        Destroy(combinedTexture);  

        // 在控制台输出截图保存的路径  
        Debug.Log("Screenshot with logo saved to: " + path);  
    }  
    // 根据枚举值计算水印位置  
    private Vector2 CalculateLogoPosition()  
    {        
        float screenWidth = Screen.width;  
        float screenHeight = Screen.height;  

        // 根据枚举值返回水印的位置  
        switch (logoPositionEnum)  
        {            case LogoPosition.TopLeft:  
                return new Vector2(logoPosOffset, (screenHeight - logoSize.y)-logoPosOffset);  
            case LogoPosition.TopRight:  
                return new Vector2((screenWidth - logoSize.x)-logoPosOffset, (screenHeight - logoSize.y)-logoPosOffset);  
            case LogoPosition.TopCenter:  
                return new Vector2((screenWidth - logoSize.x) / 2, (screenHeight - logoSize.y)-logoPosOffset);  
            case LogoPosition.BottomLeft:  
                return new Vector2(logoPosOffset, logoPosOffset);  
            case LogoPosition.BottomRight:  
                return new Vector2((screenWidth - logoSize.x)-logoPosOffset, logoPosOffset);  
            case LogoPosition.BottomCenter:  
                return new Vector2((screenWidth - logoSize.x) / 2, logoPosOffset);  
            default:  
                // 如果传入未知的枚举值,则输出错误信息  
                Debug.LogError("Unknown logo position enum value: " + logoPositionEnum);  
                return Vector2.zero;  
        }    
    }
}

4. 注意事项

  • 导入LOGO后勾选对应属性(如果图片没有Alpha通道则不需要勾选 Alpha Is Transparenc

5. 结束

回见~

对你有帮助的话可以点赞、关注、收藏,有问题评论区见哈~

原创不易,若转载请注明出处,感谢大家~

相关推荐

  1. html实现网页添加定义水印内容

    2024-07-09 20:36:03       64 阅读
  2. unity 相机

    2024-07-09 20:36:03       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-09 20:36:03       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-09 20:36:03       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-09 20:36:03       57 阅读
  4. Python语言-面向对象

    2024-07-09 20:36:03       68 阅读

热门阅读

  1. 如何在SpringCloud项目中实现客户端负载均衡?

    2024-07-09 20:36:03       26 阅读
  2. 深入理解 Docker 容器技术

    2024-07-09 20:36:03       31 阅读
  3. GCP FrontendConfig 详解:优化您的云负载均衡

    2024-07-09 20:36:03       29 阅读
  4. jdk1.8 ConcurrentHashMap 源码分析

    2024-07-09 20:36:03       27 阅读
  5. Android如何创建一个自定义回调接口(例3)

    2024-07-09 20:36:03       24 阅读
  6. mac上挂载linux目录

    2024-07-09 20:36:03       27 阅读
  7. 构建自己的docker基础镜像

    2024-07-09 20:36:03       22 阅读
  8. 每天10个vue面试题(一)

    2024-07-09 20:36:03       23 阅读
  9. Vue3框架搭建:vue+vite+pina+typescript

    2024-07-09 20:36:03       21 阅读
  10. R 绘图 - 饼图

    2024-07-09 20:36:03       51 阅读