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

回见~

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于vue的可视化大屏2

这个可视化大屏分为四个部分 一个引入代码&#xff0c;引入全局 index.vue. 左边代码centerleft.vue 右边代码centerright.vue 中间代码center.vue 主代码&#xff1a; 这是一段 Vue 框架的代码。 在 <template> 部分&#xff1a; 定义了一个根 div 元素。其中包含一…

一些学习网站分享

一些学习网站分享&#xff1a; ✅力扣(LeetCode) 力扣 (LeetCode) 官网 - 全球极客挚爱的技术成长平台 力扣是一个刷题站&#xff0c;支持C&#xff0c;Java&#xff0c;Python等多种编程语言&#xff0c;并按难度分为简单、中等、困难三个等级。是真的能刷到大厂真题 ✅Gith…

程序员学CFA——经济学(六)

经济学&#xff08;六&#xff09; 国际贸易与资本流动国际贸易相关术语开放/封闭经济自由贸易/贸易保护贸易比价国内生产总值与国民生产总值 国际贸易的利弊分析益处弊端 从贸易中获益&#xff1a;比较优势比较优势和绝对优势比较优势的来源 贸易限制和贸易保护施行贸易保护政…

【Linux】WEB网站网络防火墙(WAF软件)Fail2ban:保护服务器免受恶意攻击的必备工具

随着互联网的迅速发展&#xff0c;服务器的安全性日益成为用户和管理员关注的焦点。恶意攻击者不断寻找机会侵入服务器&#xff0c;窃取敏感信息、破坏数据或者滥用系统资源。为了抵御这些威胁&#xff0c;许多安全工具应运而生&#xff0c;其中一款备受推崇的工具就是 Fail2ba…

基于Python的哔哩哔哩数据分析系统设计实现过程,技术使用flask、MySQL、echarts,前端使用Layui

背景和意义 随着互联网和数字媒体行业的快速发展&#xff0c;视频网站作为重要的内容传播平台之一&#xff0c;用户量和内容丰富度呈现爆发式增长。本研究旨在设计并实现一种基于Python的哔哩哔哩数据分析系统&#xff0c;采用Flask框架、MySQL数据库以及echarts数据可视化技术…

保密U盘仍然存在数据安全危机?该怎么用才能规避?

保密U盘以前主要用于国家涉密单位或部门&#xff0c;但随着人们对于信息安全的重视越来越高&#xff0c;在民用企事业单位以及个人用户方面也应用得日益广泛。 使用保密U盘在安全性上比普通U盘具有优势&#xff0c;但却仍然存在安全危机&#xff0c;具体为&#xff1a; 病毒和…

在Windows中使用开源高性能编辑器Zed(持续更新)

简介 “Zed is a high-performance, multiplayer code editor from the creators of Atom and Tree-sitter. It’s also open source.” “Zed是一款高性能的支持多人协作的代码编辑器&#xff0c;由Atom和Tree-sitter的创建者开发。它也是开源的。” Zed主打“高性能”&…

微信小程序引入自定义子组件报错,在 C:/Users/***/WeChatProjects/miniprogram-1/components/路径下***

使用原生小程序开发时候&#xff0c;会报下面的错误&#xff0c; [ pages/button/button.json 文件内容错误] pages/button/button.json: [“usingComponents”][“second-component”]: “…/…/components/second-child/index”&#xff0c;在 C:/Users/***/WeChatProjects/m…

C 语言中的联合(Union)的用途是什么?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

AI论文作图——如何表示模型参数冻结状态

一、LOGO &#x1f525; win10win11 ❄️ win10win11 二、注意事项&#xff1a; 根据电脑系统&#xff0c;选择对应的版本。 参考&#xff1a; 【AI论文作图】如何表示模型参数冻结状态&#xff1f;

Llama-2 vs. Llama-3:利用微型基准测试(井字游戏)评估大模型

编者按&#xff1a; 如何更好地评估和比较不同版本的大语言模型&#xff1f;传统的学术基准测试固然重要&#xff0c;但往往难以全面反映模型在实际应用场景中的表现。在此背景下&#xff0c;本文作者别出心裁&#xff0c;通过让 Llama-2 和 Llama-3 模型进行井字游戏对决&…

TikTok海外运营,云手机多种变现方法

从现阶段来看&#xff0c;TikTok 的用户基数不断增长&#xff0c;已然成为全球创业者和品牌的全新竞争舞台。其用户数量近乎 20 亿&#xff0c;年轻用户占据主导&#xff0c;市场渗透率也逐年提高。不管是大型企业、著名品牌&#xff0c;还是个体创业者&#xff0c;都绝不能小觑…

【Mac】Charles for Mac(HTTP协议抓包工具)及同类型软件介绍

软件介绍 Charles for Mac 是一款功能强大的网络调试工具&#xff0c;主要用于HTTP代理/HTTP监视器。以下是它的一些主要特点和功能&#xff1a; 1.HTTP代理&#xff1a;Charles 可以作为HTTP代理服务器&#xff0c;允许你查看客户端和服务器之间的所有HTTP和SSL/TLS通信。 …

GuLi商城-商品服务-API-品牌管理-OSS获取服务端签名

新建第三方服务: 引入common 把common中oss的依赖都拿到第三方服务中来 配置文件: 加上nacos注解:<

RequestContextHolder多线程获取不到request对象

RequestContextHolder多线程获取不到request对象&#xff0c;调用feign接口时&#xff0c;在Feign中的RequestInterceptor也获取不到HttpServletRequest问题解决方案。 1.RequestContextHolder多线程获取不到request对象 异常信息&#xff0c;报错如下&#xff1a; 2024-07-0…

共生与变革:AI在开发者世界的角色深度剖析

在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已不再是遥不可及的概念&#xff0c;而是逐步渗透到我们工作与生活的每一个角落。对于开发者这一群体而言&#xff0c;AI的崛起既带来了前所未有的机遇&#xff0c;也引发了关于其角色定位的深刻讨论——AI…

Vue使用Echarts(入门级)

最终效果&#xff1a; npm install echarts --save // 先安装echarts<template><!-- 创建一个dom区域用于挂载echarts图表 --><div id"chart" style"width: 600px;height:500px;"/> </template> <script> import * as ech…

基于Unity3D的Rokid AR Glass项目开发环境搭建

初识Rokid AR 一、SDK简介二、准备工作1.软件环境2.硬件环境 三、快速接入SDK1.配置Package Manager2.安装UXR2.0 SDK 四、导入官方Demo进行模拟器测试五、Rokid AR系列教程 一、SDK简介 UXR2.0 SDK是Rokid为Unity开发者提供的AR开发工具包&#xff0c;提供空间定位跟踪、双目…

理解局域网技术:从基础到进阶

局域网&#xff08;LAN&#xff09;是在20世纪70年代末发展起来的&#xff0c;起初主要用于连接单位内部的计算机&#xff0c;使它们能够方便地共享各种硬件、软件和数据资源。局域网的主要特点是网络为一个单位所拥有&#xff0c;地理范围和站点数目均有限。 局域网技术在计算…

PowerShell install 一键部署mysql 9.0.0

mysql 前言 MySQL 是一个基于 SQL(Structured Query Language)的数据库系统,SQL 是一种用于访问和管理数据库的标准语言。MySQL 以其高性能、稳定性和易用性而闻名,它被广泛应用于各种场景,包括: Web 应用程序:许多动态网站和内容管理系统(如 WordPress)使用 MySQL 存…