Unity3D学习——截图并保存任意目录

本文介绍如何在Unity中使用System.Windows.Forms.dll实现截图保存功能。包括配置.NET2.0集、放置dll文件、编写脚本等步骤。同时提供两种实现方式,一种是简单的截图保存,另一种在文件名冲突时会询问是否覆盖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.前提条件:仅限于--Pc and Mac Standalone

2.准备工作:①找到System.Windows.Forms.dll:在unity的安装目录中找到它,如E:\ProgramFiles(x86)                            \Unity\Editor\Data\Mono\lib\mono\2.0
                   ②设置.NET 2.0集:Untiy默认是.NET 2.0 Subset。在Edit->Project Settings->Player->OtherSettings中修改。

3.具体实现:①任意打开一项目,新建Plugins文件夹,将找到的System.Windows.Forms.dll复制进去
                  ②新建一脚本,并拽至任一物体上。
                  ③运行后,根据操作键进行截图并保存。

4.脚本部分:

using UnityEngine;
using System.Windows.Forms;
public class Screenshot : MonoBehaviour {
   void Update() {
        if (Input.GetKeyDown(KeyCode.Z)) {
            SaveFileDialog saveLog = new SaveFileDialog();
            saveLog.InitialDirectory = "c:\\";
            saveLog.Filter = "Image Files(*.JPG;*.BMP;*.PNG)|*.JPG;*.BMP;*.PNG|All files (*.*)|*.*";
           DialogResult result = saveLog.ShowDialog();
           if (result == DialogResult.OK) {
                string path = saveLog.FileName;
                UnityEngine.Application.CaptureScreenshot(path);
           }
       }
   }
}

5.注意事项:①代码中所有的API均可在Msdn上查阅
<font face='\"微软雅黑' style="box-sizing: border-box;" \"="">http://msdn.microsoft.com/zh-cn/library/system.windows.forms.savefiledialog.aspx
                   ② EditorUtility.SaveFilePanel也可以实现相同功能,只不过必须在编辑器下才可以。

6.关于报错:
①在编辑器运行,当出现此弹窗,确定忽略即可。发布成桌面客户端是不会有这个弹窗的。

②关于其他报错,有可能是切换到.NET 2.0 Subset的时候没有实时编译造成的。Build一个客户端后错误就会消失。

7.效果图

二:第二种Unity截图保存,如果相同文件名提示是否替换

       SaveFileDlg pth = new SaveFileDlg();
        pth.structSize   = Marshal.SizeOf(pth);
        //pth.filter       = "Image Files(*.JPG;*.BMP;*.PNG)|*.JPG;*.BMP;*.PNG|All files (*.*)|*.*";  //Win32不会出错
        pth.filter       = "Image Files(*.jpg;*.bmp;*.png)\0*.jpg;*.bmp;*.png\0\0";                   //Win64适配
        pth.file         = new string(new char[256]);
        pth.maxFile      = pth.file.Length;
        pth.fileTitle    = new string(new char[64]);
        pth.maxFileTitle = pth.fileTitle.Length;
        pth.initialDir   = Application.dataPath.Replace('/', '\\'); // 默认路径
        pth.title        = "保存截图";                                                                                                  //最后这个参数才是提示是否替换的关键
        pth.flags = 0x00080000 | 0x00001000 | 0x00000800 | 0x00000200 | 0x00000008 | 0x00000002;//对应Win64的适配
        pth.defExt = "jpg"; 

        if (SaveFileDialogs.GetSaveFileName(pth))
        {
            string path = pth.file;
            ScreenCapture.CaptureScreenshot(path);
        }

### 如何在Unity中处理透明图片 #### 使用普通图片实现灰度透明效果 在Unity3D中,可以通过特定的方法将普通图片设置为具有透明效果的材质。一种常见的做法是利用Shader或者调整材质属性来实现灰度透明效果[^1]。具体操作可以参考以下步骤: - 准备一张带有透明区域的PNG图像(确保该图像已经具备Alpha通道)。 - 将这张图片导入到Unity项目中,将其纹理类型设置为`Sprite (2D and UI)`或`Advanced`模式下的`Texture Type: Default`启用`Alpha is Transparency`选项。 #### 设置UI按钮上的透明图片 如果需要在UI组件(如Button)上应用透明图片,则需注意其交互逻辑以及渲染方式。例如,在脚本中定义透明度过滤阈值通过代码动态控制透明行为[^2]。以下是示例代码片段展示如何配置两个按钮分别加载不同的透明素材: ```csharp using UnityEngine; using UnityEngine.UI; public class UnityImageAlphaTest : MonoBehaviour { public Button btnImage1; public Button btnImage2; [Header("透明度过滤阈值")] public float alphaThreshold = 0.5f; void Start() { btnImage1.onClick.AddListener(OnClickImage); btnImage2.onClick.AddListener(OnClickImage); // 对第二个按钮额外设定透明度检测最小阈值 btnImage2.GetComponent<Image>().alphaHitTestMinimumThreshold = alphaThreshold; } private void OnClickImage() { Debug.Log("点击图片测试!"); } } ``` 此段代码展示了如何通过编程手段指定某个控件对于用户输入响应时考虑像素实际可见程度的影响因素——即所谓的“透明度”。 #### 利用Photoshop预处理精灵图集中的透明背景 当涉及到复杂的动画序列或者是由多个帧组成的连续动作表现形式时,通常会采用精灵图集的形式管理这些资源文件。为了让其中某些部分呈现完全不可见状态(也就是常说的全透),可以在外部图形编辑软件Adobe Photoshop里完成初步准备工作后再引入引擎内部进一步调试优化[^3]: 1. **开启新图层**:使用PS打开原始素材后右键单击锁定图标解除限制使其成为可编辑的工作区; 2. **选取工具移除不需要的内容**:切换至魔术棒或其他相似功能快速圈定目标范围之外多余的部分; 3. **清除选定区域**:按键盘Delete按键消除所选内容从而形成自然过渡边缘; 4. **导出成果物**:最后记得选择支持保留透明信息格式保存修改后的版本供后续环节调用。 #### 实现视频播放过程里的局部遮罩现象 除了静态画面外,有时候还需要针对实时流媒体数据源执行类似的视觉修饰工作。比如在一个大型展览现场布置多台显示终端共同协作演绎同一个主题故事线期间,可能希望隐藏掉原片头尾两端固定的黑场间隔时间以便观众获得更加流畅连贯的整体观感体验[^4]。此时就可以借助插件Color Key Effect达成目的—它允许开发者自定义挑选任意单一色彩作为基准点自动替换周围临近色调直至满足预期标准为止。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alxes_七局

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值