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游戏开发技巧集锦。

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

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

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

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

Unity中制作游戏的快照游戏支持玩家拍快照的更多相关文章

  1. unity中制作模拟第一人称视角下的指南针

    private int zRotation; public GameObject obj; public void Update() { //obj = GameObject.Find("C ...

  2. Unity中制作血条2.0

    ##1.血量显示 不必像之前那样添加Slider组件 直接创建Image 在添加Source Image之后,将Image Type 修改为Filled 通过修改Fill Mode就可以显示不同效果 ...

  3. Unity编程标准导引-Unity中的基本概念-2.1界面概览

    Unity中的基本概念 本文我们介绍Unity中的基本概念,包括:场景.游戏对象.组件.预制件.资源等. 2.1.界面概览 打开Unity之后,我们大概可以看到以上画面,以上画面中即显示了我们最常用到 ...

  4. 【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher

    一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是 ...

  5. Unity中巧用协程和游戏对象的生命周期处理游戏重启的问题

    主要用到协程(Coroutines)和游戏对象的生命周期(GameObject Lifecycle)基础知识,巧妙解决了游戏重启的问题. 关于协程,这里有篇文章我觉得写的非常好,理解起来也很容易.推荐 ...

  6. C#开发Unity游戏教程之Unity中方法的参数

    C#开发Unity游戏教程之Unity中方法的参数 Unity的方法的参数 出现在脚本中的方法,无论是在定义的时候,还是使用的时候,后面都跟着一对括号“( )”,有意义吗?看起来最多也就是起个快速识别 ...

  7. Unity引擎入门——制作第一个2D游戏(1)

    Unity作为当今最流行的游戏引擎之一,受到各大厂商的喜爱. 像是炉石传说,以及最近的逃离塔克夫,都是由unity引擎开发制作. 作为初学者的我们,虽然无法直接做出完成度那么高的作品,但每一个伟大的目 ...

  8. 【Unity3d游戏开发】游戏中的贝塞尔曲线以及其在Unity中的实现

    RT,马三最近在参与一款足球游戏的开发,其中涉及到足球的各种运动轨迹和路径,比如射门的轨迹,高吊球,香蕉球的轨迹.最早的版本中马三是使用物理引擎加力的方式实现的足球各种运动,后来的版本中使用了根据物理 ...

  9. 使用Unity中的Box Collider组件完成游戏场景中的碰撞检测功能

    一.介绍 目的:通过Unity自带的组件完成游戏场景中的碰撞检测功能. 软件环境:Unity 2017.3.0f3 二.实现过程 1,在面板中点击Add Component按钮 2,添加Box Col ...

随机推荐

  1. javascript 快速排序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  2. Visual Studio 2015 各版本神KEY

    Visual Studio 2015 简体中文专业版专业版神Key:HMGNV-WCYXV-X7G9W-YCX63-B98R2 Visual Studio 2015 繁体中文企业版企业版神Key1:H ...

  3. 以DDD为开发模式的设计开发步骤可以是

    以DDD为开发模式的设计开发步骤可以是:1)分析需求:2)画出用例图,系统中各个角色如何使用系统,也包括外部系统如何使用系统,也包括系统中到某个时间点自动启动的某些功能(此时角色就是时间):3)针对各 ...

  4. Spring AOP使用整理:自动代理以及AOP命令空间

    三.自动代理的实现 1.使用BeanNameAutoProxyCreator 通过Bean的name属性自动生成代理Bean. <bean class="org.springframe ...

  5. IOS8修改状态栏颜色

    IOS8修改状态栏颜色 http://blog.csdn.net/suelu/article/details/43701913 使用了storyboard,直接view controller里面设置s ...

  6. 彻底理解数字图像处理中的卷积-以Sobel算子为例

    彻底理解数字图像处理中的卷积-以Sobel算子为例 作者:FreeBlues 修订记录 2016.08.04 初稿完成 概述 卷积在信号处理领域有极其广泛的应用, 也有严格的物理和数学定义. 本文只讨 ...

  7. SPFA算法心得

    SPFA算法是改进后的Bellman-Ford算法,只是速度更快,而且作为一个算法,它更容易理解和编写,甚至比Dijkstra和B-F更易读(当然,Floyd是另一回事了,再也没有比Floyd还好写的 ...

  8. 1-2+3-4+5-6+7......+n的几种实现

    本文的内容本身来自一个名校计算机生的一次面试经历,呵呵,没错,你猜对了,肯定 不是我 个人很喜欢这两道题,可能题目原本不止两道,当然,我这里这分析我很喜欢的两道. 1.写一个函数计算当参数为n(n很大 ...

  9. 【OpenStack】OpenStack系列1之OpenStack本地开发环境搭建&&向社区贡献代码

    加入OpenStack社区 https://launchpad.net/,注册用户(597092663@qq.com/Admin@123) 修改个人信息,配置SSH keys.OpenPGP keys ...

  10. Java异常的栈轨迹fillInStackTrace和printStackTrace的用法

    本文转自wawlian 捕获到异常时,往往需要进行一些处理.比较简单直接的方式就是打印异常栈轨迹Stack Trace.说起栈轨迹,可能很多人和我一样,第一反应就是printStackTrace()方 ...