Unity3D游戏开发之如何截屏的技能培训

下面我们开始今天的Unity3D技能培训。 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D、3D小规模游戏及网页游戏开发。

今天我们来做点简单的东西,做个什么呢?答案就是截屏。作为一名热爱单机游戏的玩家,每次在玩游戏的同时截取游戏中比较喜欢的画面,特别是学习了Unity3D以后玩游戏的时候更多地是从一个游戏设计者的角度来看待游戏,换句话说,可能关注技术的成分更多一点吧。比如在写《Unity3D游戏开发之自由视角下的角色控制》《Unity3D游戏开发之角色控制漫谈》这两篇文章时,碰到无法把握的问题的时候就是通过玩游戏来体会的,在玩游戏的过程中总是会抓取比较喜欢的画面,如图,下面是收集的部分截图:

好了,欣赏完美丽的风景,下面我们就来一起学习在Unity3D实现截屏,先给出实现截屏的三种实现方式:

[csharp] view plaincopyprint?

  1. /// <summary>
  2. /// 使用Application类下的CaptureScreenshot()方法实现截图
  3. /// 优点:简单,可以快速地截取某一帧的画面、全屏截图
  4. /// 缺点:不能针对摄像机截图,无法进行局部截图
  5. /// </summary>
  6. /// <param name="mFileName">M file name.</param>
  7. private void CaptureByUnity(string mFileName)
  8. {
  9. Application.CaptureScreenshot(mFileName,0);
  10. }
  11. /// <summary>
  12. /// 根据一个Rect类型来截取指定范围的屏幕
  13. /// 左下角为(0,0)
  14. /// </summary>
  15. /// <param name="mRect">M rect.</param>
  16. /// <param name="mFileName">M file name.</param>
  17. private IEnumerator CaptureByRect(Rect mRect,string mFileName)
  18. {
  19. //等待渲染线程结束
  20. yield return new WaitForEndOfFrame();
  21. //初始化Texture2D
  22. Texture2D mTexture=new Texture2D((int)mRect.width,(int)mRect.height,TextureFormat.RGB24,false);
  23. //读取屏幕像素信息并存储为纹理数据
  24. mTexture.ReadPixels(mRect,0,0);
  25. //应用
  26. mTexture.Apply();
  27. //将图片信息编码为字节信息
  28. byte[] bytes = mTexture.EncodeToPNG();
  29. //保存
  30. System.IO.File.WriteAllBytes(mFileName, bytes);
  31. //如果需要可以返回截图
  32. //return mTexture;
  33. }
  34. private IEnumerator  CaptureByCamera(Camera mCamera,Rect mRect,string mFileName)
  35. {
  36. //等待渲染线程结束
  37. yield return new WaitForEndOfFrame();
  38. //初始化RenderTexture
  39. RenderTexture mRender=new RenderTexture((int)mRect.width,(int)mRect.height,0);
  40. //设置相机的渲染目标
  41. mCamera.targetTexture=mRender;
  42. //开始渲染
  43. mCamera.Render();
  44. //激活渲染贴图读取信息
  45. RenderTexture.active=mRender;
  46. Texture2D mTexture=new Texture2D((int)mRect.width,(int)mRect.height,TextureFormat.RGB24,false);
  47. //读取屏幕像素信息并存储为纹理数据
  48. mTexture.ReadPixels(mRect,0,0);
  49. //应用
  50. mTexture.Apply();
  51. //释放相机,销毁渲染贴图
  52. mCamera.targetTexture = null;
  53. RenderTexture.active = null;
  54. GameObject.Destroy(mRender);
  55. //将图片信息编码为字节信息
  56. byte[] bytes = mTexture.EncodeToPNG();
  57. //保存
  58. System.IO.File.WriteAllBytes(mFileName,bytes);
  59. //如果需要可以返回截图
  60. //return mTexture;
  61. }
  62. }

接下来,我们来调用这三个方法实现一个简单的截图的例子:

[csharp] view plaincopyprint?

  1. //定义图片保存路径
  2. private string mPath1;
  3. private string mPath2;
  4. private string mPath3;
  5. //相机
  6. public Transform CameraTrans;
  7. void Start()
  8. {
  9. //初始化路径
  10. mPath1=Application.dataPath+"\\ScreenShot\\ScreenShot1.png";
  11. mPath2=Application.dataPath+"\\ScreenShot\\ScreenShot2.png";
  12. mPath3=Application.dataPath+"\\ScreenShot\\ScreenShot3.png";
  13. }
  14. //主方法,使用UGUI实现
  15. void OnGUI()
  16. {
  17. if(GUILayout.Button("截图方式1",GUILayout.Height(30))){
  18. CaptureByUnity(mPath1);
  19. }
  20. if(GUILayout.Button("截图方式2",GUILayout.Height(30))){
  21. StartCoroutine(CaptureByRect(new Rect(0,0,1024,768),mPath2));
  22. }
  23. if(GUILayout.Button("截图方式3",GUILayout.Height(30))){
  24. //启用顶视图相机
  25. CameraTrans.camera.enabled=true;
  26. //禁用主相机
  27. Camera.main.enabled=false;
  28. StartCoroutine(CaptureByCamera(CameraTrans.camera,new Rect(0,0,1024,768),mPath3));
  29. }
  30. }

在第三中截图方式中,在场景里放了一个名为TopCamera的摄像机,它垂直向下投影到游戏场景里,这样可以使玩家看到场景的顶视图。这里我们用这个相机来测试第三个方法,此时需要先激活该相机。场景设置如图:

我们下面来看三种方法截图的效果:

从截图的效果来看,第一种方法的效果是最好的,不过定制化是个问题。第二种方法效果一般吧,感觉这里TextureFormat没有选好吧。第三种效果基本达到了想要的要求,不过摄像机的投影范围似乎没有设计好。这里我们发现第二张截图会把编辑器的窗口渲染到里面,认为是程序运行的时候,即使将Game窗口放到最大,仍然会受到窗口的影响,后来就把程序编译成可执行文件,不过程序运行完之后,却没有找到对应的截图。后来查找了官方的API才知道原因是这样的:

Description

Contains the path to the game data folder (Read Only).

The value depends on which platform you are running on:

Unity Editor: <path to project folder>/AssetsMac player: <path to player app bundle>/ContentsiPhone player: <path to player app bundle>/<AppName.app>/DataWin player: <path to executablename_Data folder>Web player: The absolute url to the player data file folder (without the actual data file name)Flash: The absolute url to the player data file folder (without the actual data file name)Note that the string returned on a PC will use a forward slash as a folder separator

更多精彩请点击http://www.gopedu.com/article

显然,我们从这里可以知道Application.datapath在不同的平台上对应的位置。对于可执行(.exe,Windows平台)的文件,它对应在和应用程序对应的一个文件夹里,例如可执行文件的名字叫做UnityGame,那么对应的位置就是UnityGame_Data这个文件啦。所以问题应该是出在没有在这里建一个ScreenShot的文件夹,希望大家以后做相关项目的时候注意一下吧。好了,这就是今天的内容了,希望大家喜欢啊。

时间: 2024-12-29 06:52:50

Unity3D游戏开发之如何截屏的技能培训的相关文章

unity3d游戏开发之简单的透明shader技能培训

下面我们开始今天的Unity3D游戏开发技能透明shader技能培训. 我们学习Unity3D培训目标:让U3D初学者可以更快速的掌握U3D技术,自行制作修改素材,可以独立完成2D.3D小规模游戏及网页游戏开发. [plain] view plaincopy // Shader created with Shader Forge Beta 0.34 // Shader Forge (c) Joachim Holmer - http://www.acegikmo.com/shaderforge/

投影方式- Unity3D游戏开发培训

投影方式- Unity3D游戏开发培训   作者:邓家海 2018-02-12 20:33:13 摘  要 透视投影是3D渲染的基本概念,也是3D程序设计的基础.掌握透视投影的原理对于深入理解其他3D渲染管线具有重要作用.本文详细介绍了透视投影的原理和算法实现,包括透视投影的标准模型.一般模型和屏幕坐标变换等,并通过VC实现了一个演示程序. 在Unity3D里面,投影方式决定了我们人眼看到的场景,投影方式一般分为透视投影和正交投影两种,透视投影相当于我们人的眼睛看到的东西.越远越小,越近越大.还

Unity3D游戏开发初探—2.初步了解3D模型基础

一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被.机械等等,比如一个大楼的3D模型图.3D模型也包括玩具和电脑模型领域. 互联网的形态一直以来都是2D模式的,但是随着3D技术的不断进步,在未来的时间里,将会有越来越多的互联网应用以3D的方式呈现给用户,包括网络视讯.电子阅读.网络游戏.虚拟社区.电子商务.远程教育等等.甚至对于旅游业,3D互联网也能

[Unity3D]Unity3D游戏开发之异步记载场景并实现进度条读取效果

大家好,我是秦元培.欢迎大家关注我的博客,我的博客地址是:blog.csdn.net/qinyuanpei.终于在各种无语的论文作业中解脱了,所以立即抓紧时间来这里更新博客.博主本来计划在Unity3D游戏开发之从<魂斗罗>游戏说起(上)--目标追踪这篇文章后再写一篇<Unity3D游戏开发之从<魂斗罗>游戏说起(下)>,只是眼下博主的项目进度有些缓慢,所以想等项目稳定下来以后再和大家分享. 作为大家等待博主更新博客的回报,我们今天来说一说Unity3D中的游戏场景异步

Unity3D游戏开发从零单排(六) - 人物运动及攻击连击

提要 今天要实现的是一个简单人物控制器.包括用w,a,s,d来控制人物上下左右跑动,鼠标左击发出连招,都是基于老的lagacy的动画.虽然unity3d自带有charactorcontroller,但是并不是很好用,所以人物控制相关的全部自己来实现.先上效果图: 场景搭建 首先下载这个package,里面包含了人物的动作还有地面的模型.将人物和地面都拖进场景中.这里的模型默认的动画模式是lagacy,不用修改.模型有点偏小,改变模型的scale值为10.最好不要改源文件的scale的scale

unity3D游戏开发实战原创视频讲座系列10之《保卫战:异形入侵》游戏开发第一季

讲解目录 <保卫战:异形入侵>游戏开发    1 第一讲   游戏演示和资源的介绍    1 第二讲  "异形"怪物的实现    1 第三讲  "异形"怪物生命值的体现    9 第四讲  "异形"怪物死后处理    12 第五讲  玩家的制作    15 第六讲  玩家的行走控制(键盘)    16 第七讲  武器的切换(鼠标)     16 第八讲  摄像头的变化(鼠标)    19 第九讲  子弹预制体和特效的制作    20

Unity3D游戏开发从零单排(五) - 导入CS模型到Unity3D

游戏动画基础 Animation组件 Animation组件是对于老的动画系统来说的. 老的动画形同对应的动画就是clip,每个运动都是一段单独的动画,使用Play()或CrossFade(),直接播放动画 或淡入淡出播放动画. animation.Play("name"); animation.CrossFade("name"); 下面的是它的几个属性 Animation:默认的动画片段: Aniamtions:包含的动画片段: Play Automaticall

【Unity3D游戏开发】—— 导入网上下载的.unitypackage包

这两天遇到了这样一个问题,网上下载的别人导出的.unitypackage包.如果双击打开,则会出现"Failed importing package "的错误. 为此很头疼,查了一些资料,需要将.unitypackage包复制到Editor\Standard Packages文件夹下, 然后ctrl+9打开 Asset Store, 点击下载然后找到刚刚复制的包名,点击Import导入即可. 还有一种方法类似,将.unitypackage包复制到Editor\Standard Pack

Unity3D游戏开发之详解 Animation类和Animator类

Unity3D游戏开发之详解 Animation类和Animator类 Animation类 animation组件用于播放动画.可以指定动画剪辑到动画组件并从脚本控制动画播放.在Unity的动画系统基于权重并且支持动画融合,叠加动画,动画混合,标签和完全控制动画播放的各个方面. 如果想播放一个简单的动画,可以使用Animation.Play:如果想在动画之间交叉淡入,可以使用Animation.CrossFade:如果想改变动画模式(循环,一次,乒乓),可以改变动画导入设置里面的动画帧的Wra