Unity中制作游戏的快照游戏支持玩家拍快照

Wesley13
• 阅读 785

Unity中制作游戏的快照游戏支持玩家拍快照

有些游戏支持玩家“拍快照”,也就是将游戏的精彩瞬间以图片的形式记录下来的功能。这个功能比较有趣,而且以后的用途也会很广,为此本节打算介绍:截取矩形区域内游戏视图,并将其显示在视图其它区域的方法。具体的操作步骤如下本文选自Unity游戏开发技巧集锦:

(1)在Project视图里,创建一个C#脚本文件,并命名为ScreenTexture。在此脚本中编写如下的代码:

  • 01     using UnityEngine;

  • 02     using System.Collections;

  • 03    

  • 04     public class ScreenTexture : MonoBehaviour

  • 05     {

  • 06              //公有成员

  • 07              public int photoWidth = 50;                                    //矩形的宽度

  • 08              public int photoHeight = 50;                                  //矩形的高度

  • 09              public int thumbProportion = 25;                          //截图的显示比例

  • 10              public Color borderColor = Color.white;             //矩形框架的颜色

  • 11              public int borderWidth = 2;                                              //矩形框的宽度

  • 12              //私有成员

  • 13              private Texture2D texture;

  • 14              private Texture2D border;

  • 15              private int screenWidth;

  • 16              private int screenHeight;

  • 17              private int frameWidth;

  • 18              private int frameHeight;

  • 19              private bool shoot = false;

  • 20              // 脚本初始化时,调用此函数

  • 21              void Start ()

  • 22              {

  • 23                       screenWidth = Screen.width;

  • 24                       screenHeight = Screen.height;

  • 25                       frameWidth = Mathf.RoundToInt(screenWidth * photoWidth * 0.01f);

  • 26                       frameHeight = Mathf.RoundToInt(screenHeight * photoHeight * 0.01f);

  • 27                       texture = new Texture2D (frameWidth,frameHeight,TextureFormat.RGB24,false);

  • 28                       border = new Texture2D (1,1,TextureFormat.ARGB32, false);

  • 29                       border.SetPixel(0,0,borderColor);

  • 30                       border.Apply();

  • 31              }

  • 32              // 运行游戏时,每帧都调用此函数

  • 33              void Update ()

  • 34              {

  • 35                        //鼠标左键按下的时候

  • 36                       if (Input.GetKeyUp(KeyCode.Mouse0))

  • 37                                 StartCoroutine(CaptureScreen());

  • 38              }

  • 39              //在Game视图上,绘制纹理

  • 40              void OnGUI ()

  • 41              {

  • 42                        //绘制矩形框的四个边

  • 43                       GUI.DrawTexture(

  • 44                                                   new Rect(

  • 45                                                             (screenWidth*0.5f)-(frameWidth*0.5f) - borderWidth*2,

  • 46                                                             ((screenHeight*0.5f)-(frameHeight*0.5f)) - borderWidth,

  • 47                                                             frameWidth + borderWidth*2,

  • 48                                                             borderWidth),

  • 49                                                   border,ScaleMode.StretchToFill);

  • 50                       GUI.DrawTexture(

  • 51                                                   new Rect(

  • 52                                                             (screenWidth*0.5f)-(frameWidth*0.5f) - borderWidth*2,

  • 53                                                             (screenHeight*0.5f)+(frameHeight*0.5f),

  • 54                                                             frameWidth + borderWidth*2,

  • 55                                                             borderWidth),

  • 56                                                   border,ScaleMode.StretchToFill);

  • 57                       GUI.DrawTexture(

  • 58                                                   new Rect(

  • 59                                                             (screenWidth*0.5f)-(frameWidth*0.5f)- borderWidth*2,

  • 60                                                             (screenHeight*0.5f)-(frameHeight*0.5f),

  • 61                                                             borderWidth,

  • 62                                                             frameHeight),

  • 63                                                   border,ScaleMode.StretchToFill);

  • 64                       GUI.DrawTexture(

  • 65                                                   new Rect(

  • 66                                                             (screenWidth*0.5f)+(frameWidth*0.5f),

  • 67                                                             (screenHeight*0.5f)-(frameHeight*0.5f),

  • 68                                                             borderWidth,

  • 69                                                             frameHeight),

  • 70                                                   border,ScaleMode.StretchToFill);

  • 71                        //绘制矩形框中截取到的Game视图

  • 72                       if(shoot)

  • 73                       {

  • 74                                 GUI.DrawTexture(

  • 75                                                   new Rect (

  • 76                                                             10,

  • 77                                                             10,

  • 78                                                             frameWidth*thumbProportion*0.01f,

  • 79                                                             frameHeight*thumbProportion* 0.01f),

  • 80                                                   texture,ScaleMode.StretchToFill);

  • 81                       }

  • 82              }

  • 83              //截取矩形框里的Game视图

  • 84              IEnumerator CaptureScreen ()

  • 85              {

  • 86                       yield return new WaitForEndOfFrame();

  • 87                       texture.ReadPixels(

  • 88                                 new Rect(

  • 89                                          (screenWidth*0.5f)-(frameWidth*0.5f),

  • 90                                (screenHeight*0.5f)-(frameHeight*0.5f),

  • 91                                frameWidth,

  • 92                                          frameHeight),

  • 93                                 0,0);

  • 94                       texture.Apply();

  • 95                       shoot = true;

  • 96              }

  • 97     }

脚本代码中,40行的OnGUI()函数,使用GUI.DrawTexture()绘制了矩形框,以及矩形框中截取到的游戏视图;84行的CaptureScreen()函数,使用texture.ReadPixels()读取矩形框中的所有像素点,然后存储到texture中。触发“拍照”功能的操作是,在Game视图中的任意位置,单击鼠标左键,即36行代码实现的功能。

(2)将脚本ScreenTexture赋予Main Camera,然后选中Main Camera,在Inspector视图里可以设置脚本组件的一些属性,如图2-19所示本文选自Unity游戏开发技巧集锦。

Unity中制作游戏的快照游戏支持玩家拍快照

图2-19  Main Camera上ScreenTexture脚本组件的各属性 图2-20 当前的Scene视图

(3)为游戏的场景添加一些几何体,并调整它们各自的位置,如图2-20所示。

(4)运行游戏,当在Game视图中的任意位置,单击鼠标左键的时候,可在视图的左上角看到矩形框中截取到的游戏视图,如图2-21所示本文选自Unity游戏开发技巧集锦。

Unity中制作游戏的快照游戏支持玩家拍快照

图2-21 运行游戏,查看截图的效果

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
Unity小王子私藏的开发2D游戏的常用插件合集
Unity以开发3D游戏见长,早期版本的Unity在开发2D游戏时不慎方便,因此AssetStore出现了很多2D游戏开发引擎。现在Unity对2D游戏的支持越来越好,而这些开发2D游戏的Unity插件也得到了更多开发者的喜爱。1:RexEngine:Classic2DPlatformerEngine(https://www.os
Wesley13 Wesley13
3年前
Unity 4.x 2D游戏开发基础教程大学霸第一更
Unity4.x2D游戏开发基础教程大学霸第1章  Unity及其组成的介绍本书主要讲解的是,如何使用Unity开发2D游戏。但在开始讲解之前,最好先熟悉一下Unity这个工具。本章会首先介绍Unity的下载和安装,然后会介绍Unity界面的各组成部分,这些知
Wesley13 Wesley13
3年前
Unity 2D游戏开发快速入门第1章创建一个简单的2D游戏
Unity2D游戏开发快速入门第1章创建一个简单的2D游戏即使是现在,很多初学游戏开发的同学,在谈到Unity的时候,依然会认为Unity只能用于制作3D游戏的。实际上,Unity在2013年发布4.3版本的时候,就开始提供对制作2D游戏的支持了。例如,提供了一些专用于开发2D游戏的Unit
Wesley13 Wesley13
3年前
Unity2D游戏开发基础教程1.2项目、资源和场景
Unity2D游戏开发基础教程1.2项目、资源和场景如果使用Unity制作游戏,就一定会接触到项目(Project、资源(Asset)和场景(Scene)。本节将依次介绍它们。1.2.1项目Unity是一个基于项目的应用。这就意味着每开发一个新游戏,都要创建一个新项目。一个项目就代表
Wesley13 Wesley13
3年前
Unity2D游戏开发基础教程1.2 项目、资源和场景
Unity2D游戏开发基础教程1.2项目、资源和场景如果使用Unity制作游戏,就一定会接触到项目(Project、资源(Asset)和场景(Scene)。本节将依次介绍它们。1.2.1项目Unity是一个基于项目的应用。这就意味着每开发一个新游戏,都要创建一个新项目。一个项目就
Wesley13 Wesley13
3年前
Unity 2D游戏开发教程之为游戏场景添加多个地面
Unity2D游戏开发教程之为游戏场景添加多个地面为游戏场景添加多个地面显然,只有一个地面的游戏场景太小了,根本不够精灵四处活动的。那么,本节就来介绍一种简单的方法,可以为游戏场景添加多个地面。具体的操作方法是:(1)在Project视图里,新建一个文件夹,命名为Pr