Unity3D截屏保存本地和上传方法

news2024/7/6 19:38:59

系列文章目录

unity工具


文章目录

  • 系列文章目录
  • 👉前言
  • 👉一、模型截图保存
    • 👉1-1 模型格式
    • 👉1-2 设置图片大小
    • 👉1-3 代码如下
  • 👉二、截图上传给后端保存
  • 👉壁纸分享
  • 👉总结


👉前言

有时候会用到给模型制作模型的图片,就是那种每一个模型的样子,展示每一个模型的图片,如果你有现成的UI那就不需要了,如果没有就可以自己制作了,所以写了一个制作图片小工具,方便使用,简单记录一下
大家好,我是心疼你的一切,不定时更新Unity开发技巧,觉得有用记得一键三连哦。
欢迎点赞评论哦.
下面就让我们进入正文吧 !


提示:以下是本篇文章正文内容,下面案例可供参考

👉一、模型截图保存

就比如我们的模型有很多很多个,现在又需要每个模型的图片,这时候就可以使用了,自己动手丰衣足食

👉1-1 模型格式

在这里插入图片描述

👉1-2 设置图片大小

看你需要多大的图片就把game视窗的如下设置 设置一下,我用的是600*600,具体你用多大,看你喜欢多大的
在这里插入图片描述

👉1-3 代码如下

代码里原本写了一个自动把所有模型都设置图片的,试验了一下,不是很友好,因为每个模型大小不一样,所以摄像机距离模型的距离也不一样,所以要想要那种模型刚刚好在图片中间的,就不是很友好了,具体解决方法就没有用自动的设置图片,而是选择了手动调摄像机距离,然后截图保存的(如果你的模型要是很多很多的话,建议你还是研究一下根据模型大小来设置相机位置的,如果你研究好了,也可以告诉我,让我学习学习),当然如果有建模的也可以给你渲图,美工也行

代码设置了保存位置和图片格式 如有修改请自行修改即可

using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEngine;

public class SaveJPG : MonoBehaviour
{
    public GameObject[] gameObjects;
    //string fileName = Application.streamingAssetsPath + "/UI/photo.jpg";
    public Camera camera;
    public Transform fuwutiParent;
    public int jsq = 0;
    
    private void Start()
    {
        //自动保存图片
        //StartCoroutine(CloneTuPian());       
    }
    private void Update()
    {
        #region 半自动保存图片手动对位置
        if (Input.GetKeyDown (KeyCode.Space))
        {
            for (int i = 0; i < fuwutiParent.childCount; i++)
            {
                fuwutiParent.GetChild(jsq).gameObject.SetActive(true);
            }           
           
        }
        if (Input.GetKeyDown (KeyCode.A))
        {
            string str_ = fuwutiParent.GetChild(jsq).name.Split('(')[0].ToString();
            CaptureScreenByRT(str_);
            fuwutiParent.GetChild(jsq).gameObject.SetActive(false);
            jsq++;
            Debug.Log(jsq);
        }
        #endregion
    }

    IEnumerator CloneTuPian()
    {
        while (jsq<gameObjects .Length)
        {
            GameObject obj = Instantiate(gameObjects[jsq]);
            string str_ = obj.transform.name.Split('(')[0].ToString ();
            CaptureScreenByRT(str_);
            Destroy(obj);
            yield return new WaitForSeconds(1f);         
            jsq++;
        }
        Debug.Log("生成结束");
    }
    public void CaptureScreenByRT(string fileName)
    {
        Rect rect = new Rect(0, 0, 600, 600);  //设置图片大小
        //Rect rect = new Rect(0, 0, Screen.width , Screen.height);   //全屏的时候用
        // 创建一个RenderTexture对象  
        RenderTexture rt = new RenderTexture((int)rect.width, (int)rect.height, 0);
        // 临时设置相关相机的targetTexture为rt, 并手动渲染相关相机  
        camera.targetTexture = rt;
        camera.Render();
        // 激活这个rt, 并从中中读取像素。  
        RenderTexture.active = rt;
        Texture2D screenShot = new Texture2D((int)rect.width, (int)rect.height, TextureFormat.RGB24, false);
        // 注:这个时候,它是从RenderTexture.active中读取像素 
        screenShot.ReadPixels(rect, 0, 0);
        screenShot.Apply();
        // 重置相关参数,以使用camera继续在屏幕上显示  
        camera.targetTexture = null;
        RenderTexture.active = null;
        GameObject.Destroy(rt);
        // 最后将这些纹理数据,成一个png图片文件  
        byte[] bytes = screenShot.EncodeToPNG();
        string path = Application.streamingAssetsPath + "/UI/房间里设备-20240109/" + fileName.ToLower () + ".jpg";
        System.IO.File.WriteAllBytes(path, bytes);
#if UNITY_EDITOR
        AssetDatabase.Refresh();
#endif
    }


}

👉二、截图上传给后端保存

上传的功能代码如下

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using UnityEngine.UI;
/// <summary>
/// 截屏 并发送给后端
/// </summary>
public class ScreenCaptureAndSend : MonoBehaviour
{
    public string serverUrl = "";

    public RawImage rawImage;

    private void Start()
    {
        CaptureAndSend();
    }
    public void CaptureAndSend()
    {
        StartCoroutine(CaptureAndSendCoroutine());
    }

    IEnumerator CaptureAndSendCoroutine()
    {
        // 等待一帧结束
        yield return new WaitForEndOfFrame();

        // 截取屏幕
        byte[] imageBytes = ScreenCapture.CaptureScreenshotAsTexture().EncodeToPNG();
       
        //这个是测试截屏的内容的,不用的话到时候可以删除了
        DisplayImage(imageBytes);
        //yield return null;
        // 创建POST请求
        UnityWebRequest request = UnityWebRequest.Post(serverUrl, "POST");

        // 将图片数据作为请求的body
        UploadHandlerRaw uploadHandler = new UploadHandlerRaw(imageBytes);
        uploadHandler.contentType = "image/png";
        request.uploadHandler = uploadHandler;

        // 发送请求
        yield return request.SendWebRequest();

        // 处理响应
        if (request.result != UnityWebRequest.Result.Success)
        {
            Debug.LogError("Error sending screenshot: " + request.error);
        }
        else
        {
            Debug.Log("Screenshot sent successfully");
            // 在这里处理后端返回的响应数据
            string response = request.downloadHandler.text;
            Debug.Log("Server response: " + response);
        }
    }

    /// <summary>
    /// 加载图片
    /// </summary>
    /// <param name="bytes"></param>
    void DisplayImage(byte[] bytes)
    {
        Texture2D texture = new Texture2D(1, 1);
        texture.LoadImage(bytes); // 从字节数组加载图片数据
        rawImage.texture = texture; // 将加载的图片设置到RawImage组件
    }

    //获取图片byte[]流赋值到rawImage上面  用来之后获取后端图片给自己功能赋值
    void LoadImage(byte[] bytes,RawImage rawImage)
    {
        Texture2D texture = new Texture2D(1, 1);
        texture.LoadImage(bytes); // 从字节数组加载图片数据
        rawImage.texture = texture; // 将加载的图片设置到RawImage组件
    }
}

具体你跟后端怎么传,就修改代码就好了

👉壁纸分享

请添加图片描述
请添加图片描述
以上就是本地截屏保存和上传数据保存的方法,以后如果有更好的,我会继续更新添加,欢迎阅读评论。

下一篇文章有从服务器下载图片,加载到场景里显示的博客

感谢支持!!!

👉总结

本次总结的就是截屏保存的实现,有需要会继续添加新的
如能帮助到你,就帮忙点个赞吧,三连更好哦,谢谢
你的点赞就是对博主的支持,有问题记得留言评论哦!
不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒

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

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

相关文章

cad由于找不到mfc140u.dll的解决方法,彻底解决mfc140u.dll丢失问题

在计算机辅助设计&#xff08;CAD&#xff09;的时候&#xff0c;我们可能会遇到各种错误和问题。其中&#xff0c;“CAD由于找不到mfc140u.dll&#xff0c;无法继续执行代码”的错误提示。这个问题可能会导致CAD无法启动运行&#xff0c;因此&#xff0c;我希望通过分享我的经…

云计算【第一阶段(22)】进程和计划任务管理

一、查看进程 1.1、程序和进程的关系 程序 保存在硬盘&#xff0c;光盘等介质中的可执行代码和数据静态保存的代码 进程 在cpu及内存中运行的程序代码动态执行的代码父&#xff0c;子进程&#xff1a;每个程序可以创建一个或多个进程 1.2、查看进程 1.2.1、静态查看进程…

Geotools系列说明之入门介绍与坐标系转换说明

Geotools介绍 借用官网的介绍 GeoTools is an open source Java library that provides tools for geospatial data 就是提供java处理地理空间的工具详细内容请参考官网 Geotools环境搭建 我们这里只讨论Geotools在Maven中和Idea的项目实战&#xff0c;至于Geotools的服务端…

Altium Designer软件下载安装「PCB设计软件」安装包资源获取

Altium Designer作为一款集成化的电子产品开发系统&#xff0c;它主要适用于Windows操作系统&#xff0c;为电子设计工程师们提供了一个高效、便捷的工作平台。 在Altium Designer中&#xff0c;原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出…

DVWA 靶场 File Inclusion 通关解析

前言 DVWA代表Damn Vulnerable Web Application&#xff0c;是一个用于学习和练习Web应用程序漏洞的开源漏洞应用程序。它被设计成一个易于安装和配置的漏洞应用程序&#xff0c;旨在帮助安全专业人员和爱好者了解和熟悉不同类型的Web应用程序漏洞。 DVWA提供了一系列的漏洞场…

KVB App:集运价格飙升:地缘风险下的投资新机遇

摘要 随着全球地缘政治局势的反复和海运需求的持续高企&#xff0c;集装箱运价在近期不断攀升&#xff0c;吸引了越来越多的投资者。摩根大通的最新报告指出&#xff0c;地缘风险加剧和航运市场需求旺盛使得即期运费可能继续走高。本文将深入分析当前集运市场的情况及其对投资者…

备份和还原

stai和dnta snat&#xff1a;源地址转换 内网---外网 内网ip转换成可以访问外网的ip 内网的多个主机可以使用一个有效的公网ip地址访问外部网络 DNAT&#xff1a;目的地址转发 外部用户&#xff0c;可以通过一个公网地址访问服务内部的私网服务。 私网的ip和公网ip做一个…

SQLite、MySQL、PostgreSQL 3个关系数据库之间优缺点对比

引言 关系数据模型以行和列的表格形式组织数据&#xff0c;在数据库管理工具中占主导地位。今天还有其他数据模型&#xff0c;包括NoSQL和NewSQL&#xff0c;但是关系数据库管理系统&#xff08;RDBMS&#xff09;仍然占主导地位用于存储和管理全球数据。 本文比较了三种实现最…

40岁学习java是否需要报班学习?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;应该不需要。各种公开免费的…

新能源行业必会基础知识-----电力市场概论笔记-----绪论

新能源行业知识体系-------主目录-----持续更新(进不去说明我没写完)&#xff1a;https://blog.csdn.net/grd_java/article/details/139946830 目录 1. 电力市场的定义2. 对传统电力系统理论的挑战 1. 电力市场的定义 1. 我国电力市场的进程 我国新一轮电力体制改革的5大亮点&…

摒弃反模式:使用Kotlin委托优化Android BaseActivity

摒弃反模式&#xff1a;使用Kotlin委托优化Android BaseActivity 在Android开发中&#xff0c;许多开发者习惯于创建名为“BaseActivity”或“BaseFragment”的基类&#xff0c;以便在所有Activity或Fragment中共享一些通用行为。这种方法乍一看似乎是个好主意&#xff0c;但实…

C语言实现KMP算法

#include<stdio.h> #include<string.h> #include<stdlib.h>void getNextArray(char * sub_str, int sub_str_length, int * next_array); int kmpSearch(char * sub_str, char * main_str);int main(void) {// 1 声明用于算法处理的字符串char origin_str[] …

整数智能与上海数据交易所携手,共筑数据要素市场新篇章

近期&#xff0c;整数智能荣获上海数据交易所“数据治理服务商”证书&#xff0c;正式加入上海数据交易所数商生态&#xff0c;成为上海数据交易所官方认证的数据治理服务商。 在数字经济的浪潮中&#xff0c;上海数据交易所一直扮演着引领者和推动者的角色。紧扣建设国家级…

CID引流电商:传统电商破局的新动力

摘要&#xff1a;CID引流电商为传统电商带来破局新机遇&#xff0c;通过跨平台引流、精准定位和高效转化&#xff0c;解决了流量获取难、成本高的问题&#xff0c;提升了销售业绩和市场竞争力。CID引流电商助力传统电商在激烈竞争中保持领先&#xff0c;推动行业持续发展。 随…

气象相关图表制作-字体图标、图片、折线的堆叠

开发工作中有个需要展示气温&#xff08;折线&#xff09;、天气&#xff08;图片&#xff09;、风羽&#xff08;字体图标&#xff09;的图表展示需求&#xff0c;之前用过highcharts的关于类似的chart&#xff0c;里面的风雨用的是自带的图片&#xff0c;但是现在要求风羽需要…

2024年Apache DolphinScheduler 社区开源之夏活动中选公示

各位社区伙伴们&#xff0c;经过严格的评审和筛选&#xff0c;我们非常高兴地向大家公布Apache DolphinScheduler 社区在本年度的开源之夏活动中&#xff0c;中选的学生和导师名单&#xff01; 序号项目名称中选学生导师1增加Raft注册插件胡世豪朱学通2k8s任务功能扩展戴明辰伏…

【原创工具】孔夫子旧书网店铺图书采集工具1.0

目录 1 概述2 演示效果2.1 图文2.2视频3 核心逻辑3.1 导出数据4 附件下载5 使用方式1 概述 爬取孔夫子旧书网的店铺图书信息(条码、书名、售价、定价),支持导出和调速(默认速度5条/s)、支持识别该店铺最新上架图书和总计图书数量,采集结果和官网排序一致,可以对比测试 2…

启动台出现agent app的解决方法~

启动台出现agent app的解决方法&#xff5e; 如果用了战网&#xff0c;Battle.net&#xff0c;在卸载后有一个agent app&#xff0c;启动台删除不掉&#xff0c;应用程序里面没有&#xff0c;怎么办呢&#xff1f; 解决方法&#xff1a;找到这个app所在位置&#xff0c;可以通…

STM32将外部SDRAM空间作为系统堆(Heap)空间

概述 stm32可以外扩很大的sram&#xff0c;常见外部sram的初始化函数一般是c语言写的&#xff0c;默认写在main函数里面。stm32初始化首先进入汇编代码startup_stm32f429xx.s&#xff0c;在汇编代码中Reset_Handler&#xff08;复位中断服务程序&#xff09;里面先调用了Syste…

ABAP开发:动态Open SQL编程案例介绍

动态Open SQL是Open SQL的扩展。它不是要求整个SQL语句都是动态指定的。通过熟悉的静态ABAP编码表达静态已知的部分&#xff0c;动态元素的部分通过动态标记指定。动态片段不明确包含在ABAP源代码中&#xff0c;而是源代码包含一个ABAP变量&#xff0c;用括号括起来作为占位符。…