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

news2024/11/16 0:00:12

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. 结束

回见~

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1910635.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

婴幼儿自闭症的六大警示前兆:家长需警惕的早期信号

婴幼儿自闭症是一种复杂的发育障碍&#xff0c;其早期症状往往较为微妙&#xff0c;但若能及早发现并干预&#xff0c;对孩子的成长至关重要。以下是婴幼儿自闭症的六个主要前兆&#xff1a; 首先&#xff0c;目光呆滞与反应迟钝。婴儿期&#xff0c;孩子应能对外界刺激如声音…

Java基础-组件及事件处理(中)

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 BorderLayout布局管理器 说明&#xff1a; 示例&#xff1a; FlowLayout布局管理器 说明&#xff1a; …

Vue3项目如何使用npm link本地测试组件库

一、组件库操作 1、在组件库项目中先运行npm run lib&#xff0c;其效果如下 2、在组件库项目中在运行npm link&#xff0c;其效果如下 会创建一个全局的软连接指向本地的组件库 二、Vue3项目使用 1、在项目中运行 npm link 组件名称&#xff08;即&#xff1a;组件库packag…

Kettle常用参数配置

目录 一、时区二、时间戳三、tinyint类型转换 一、时区 Kettle链接mysql出现报错&#xff1a;Connection failed. Verify all connection parameters and confirm that the appropriate driver is installed. The server time zone value is unrecognized or represents more…

嵌入式单片机,两者有什么关联又有什么区别?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;使用单片机是嵌入式系统的…

HSG金属表面缺陷检测

HSG金属表面缺陷检测 1. 项目背景1.1 项目简述1.2 项目目标 2. 解决方案3. 数据集3.1 收集各种缺陷的图片3.2 利用有限图片创造更多可能3.3 分割图像3.4 打标签 4. 部分代码4.1 数据集划分4.2图像分割4.3 训练模型4.4 预测 5. 预测结果 1. 项目背景 1.1 项目简述 iPad HSG 的…

【运维】磁盘满了怎么办?如何快速找到占用空间的文件和腾出空间

机器用久了&#xff0c;很容易生成很多临时或者无用的文件&#xff0c;占用大量空间造成磁盘不够用。尤其是服务器&#xff0c;当磁盘不够用时&#xff0c;系统会出现莫名其妙的问题&#xff0c;数据库可能会造成数据损坏。此时快速定位可以删除的大文件并及时释放空间&#xf…

Linux内核网络性能问题的追踪(工具篇)

在现代计算环境中&#xff0c;网络性能对于系统的整体性能至关重要。网络瓶颈不仅会影响数据传输速度&#xff0c;还会影响应用程序的响应时间&#xff0c;最终影响用户体验。为了有效地解决网络性能问题&#xff0c;了解和使用各种追踪工具至关重要。另外一方面&#xff0c;造…

SQLServer用户们,你们摊上大事了!

最近一段时间&#xff0c;我们经常会收到了许多用户的咨询&#xff0c;问我们何时能纳管SQLServer&#xff1f;耐不住小伙伴们的猛烈催促及热切期待&#xff0c;本不想纳管SQLServer的研发团队也抓紧将这项需求提上日程。并在DBdoctor v3.2.2版本中成功实现了对SQLServer的纳管…

VS2019运行报错 应输入预处理器指令

根据错误提示&#xff0c;找到对应行&#xff0c;然后删除多余的#字符即可

小程序渗透测试的两种方法——burpsuite、yakit

首先呢主要是配置proxifier&#xff0c;找到小程序的流量&#xff0c;然后使用burpsuite或者yakit去抓包。 一、使用burpsuiteproxifier的抓包测试 1、先配置proxifier&#xff0c;开启http流量转发 勾选确定 2、配置burp对应代理端口&#xff0c;选择profile&#xff0c;点…

软件工具网站推荐

1.菜鸟工具 菜鸟工具 - 不止于工具菜鸟工具&#xff0c;为开发设计人员提供在线工具&#xff0c;网址导航&#xff0c;提供在线PHP、Python、 CSS、JS 调试&#xff0c;中文简繁体转换&#xff0c;进制转换等工具。致力于打造国内专业WEB开发工具&#xff0c;集成开发环境&…

手把手和你一起从0搭建一个vite+Vue3+element-plus的后台管理系统!

首选需要node环境。你可以参考&#xff1a;如何创建一个vue的新项目&#xff0c;用命令行的方式创建.下载node.js-CSDN博客 所需要的内容官网&#xff1a; https://vitejs.dev/ 安装 | Element Plus Vue Router | Vue.js 的官方路由 axios中文网|axios API 中文文档 | axio…

在国内允许交易伦敦金吗?有没有好的伦敦金交易策略

伦敦金&#xff0c;作为全球金融市场上的一种重要投资品种&#xff0c;以其独特的交易机制和价值稳定性吸引了无数投资者的目光。然而&#xff0c;对于国内投资者而言&#xff0c;是否可以合法参与伦敦金的交易&#xff0c;以及如何制定有效的交易策略&#xff0c;是他们普遍关…

主动算法交易!减持回购/套利/大单拆分/篮子交易/预埋单神器工具!

主动算法致力于服务机构投资者&#xff0c;为其提供以成交为目的的自动化交易执行。 在有限容量内&#xff0c;充分追求客户个性化需求&#xff0c;保证执行效率、降低冲击成本、减少人力成本、保护交易意图、 捕捉交易机会、 符合监管要求和获取交易环节的ALpha收益。 能够帮…

初阶C++(二)

初阶C&#xff08;二&#xff09; 1. 重载函数&#xff08;一&#xff09;对于重载函数的理解&#xff08;二&#xff09;重载函数分类2.引用&#xff08;一&#xff09; 引⽤的概念和定义&#xff08;二&#xff09;引用的使用&#xff08;三&#xff09;const引用 1. 重载函数…

EI期刊目录为何还没更新?预警、On Hold、镇压多重bug,神仙难救Top能逃此劫吗?

本周投稿推荐 SCI • 能源科学类&#xff0c;1.5-2.0&#xff08;25天来稿即录&#xff09; • CCF推荐&#xff0c;4.5-5.0&#xff08;2天见刊&#xff09; • 生物医学制药类&#xff08;2天逢投必中&#xff09; EI • 各领域沾边均可&#xff08;2天录用&#xff09…

*AI大模型热潮下的冷静思考:谁在守护模型安全?

随着2023年4月的到来&#xff0c;AI大模型领域仿佛迎来了春天&#xff0c;各类产品如雨后春笋般涌现&#xff0c;成为科技界乃至社会各界的热议焦点。从阿里巴巴的“通义千问”到华为的“盘古大模型”&#xff0c;再到商汤科技的“商量SenseChat”&#xff0c;以及即将亮相的“…

一文清晰了解CSS

一、基本概念 1.定义 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;&#xff0c;前面说了CSS是一种用于描述网页内容外观和样式的标记语言。 具体地&#xff0c;它通过选择器将样式规则应用到HTML元素上&#xff0c;控制网页的布局、颜色、字体等…

linux中top、htop监控工具命令详解

文章目录 top 命令概述如何使用 top 命令top 命令输出解释各部分解释系统信息任务信息CPU 使用信息内存使用信息进程信息 top 命令的常用交互操作top 命令的常用选项查看每个CPU使用情况示例说明默认视图按下 1 键后的视图 如何使用 htop和top之间比较用户界面和可用性功能和特…