Unity中制作游戏的快照游戏支持玩家拍快照
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中制作游戏的快照游戏支持玩家拍快照的更多相关文章
- unity中制作模拟第一人称视角下的指南针
private int zRotation; public GameObject obj; public void Update() { //obj = GameObject.Find("C ...
- Unity中制作血条2.0
##1.血量显示 不必像之前那样添加Slider组件 直接创建Image 在添加Source Image之后,将Image Type 修改为Filled 通过修改Fill Mode就可以显示不同效果 ...
- Unity编程标准导引-Unity中的基本概念-2.1界面概览
Unity中的基本概念 本文我们介绍Unity中的基本概念,包括:场景.游戏对象.组件.预制件.资源等. 2.1.界面概览 打开Unity之后,我们大概可以看到以上画面,以上画面中即显示了我们最常用到 ...
- 【Unity游戏开发】用C#和Lua实现Unity中的事件分发机制EventDispatcher
一.简介 最近马三换了一家大公司工作,公司制度规范了一些,因此平时的业余时间多了不少.但是人却懒了下来,最近这一个月都没怎么研究新技术,博客写得也是拖拖拉拉,周六周天就躺尸在家看帖子.看小说,要么就是 ...
- Unity中巧用协程和游戏对象的生命周期处理游戏重启的问题
主要用到协程(Coroutines)和游戏对象的生命周期(GameObject Lifecycle)基础知识,巧妙解决了游戏重启的问题. 关于协程,这里有篇文章我觉得写的非常好,理解起来也很容易.推荐 ...
- C#开发Unity游戏教程之Unity中方法的参数
C#开发Unity游戏教程之Unity中方法的参数 Unity的方法的参数 出现在脚本中的方法,无论是在定义的时候,还是使用的时候,后面都跟着一对括号“( )”,有意义吗?看起来最多也就是起个快速识别 ...
- Unity引擎入门——制作第一个2D游戏(1)
Unity作为当今最流行的游戏引擎之一,受到各大厂商的喜爱. 像是炉石传说,以及最近的逃离塔克夫,都是由unity引擎开发制作. 作为初学者的我们,虽然无法直接做出完成度那么高的作品,但每一个伟大的目 ...
- 【Unity3d游戏开发】游戏中的贝塞尔曲线以及其在Unity中的实现
RT,马三最近在参与一款足球游戏的开发,其中涉及到足球的各种运动轨迹和路径,比如射门的轨迹,高吊球,香蕉球的轨迹.最早的版本中马三是使用物理引擎加力的方式实现的足球各种运动,后来的版本中使用了根据物理 ...
- 使用Unity中的Box Collider组件完成游戏场景中的碰撞检测功能
一.介绍 目的:通过Unity自带的组件完成游戏场景中的碰撞检测功能. 软件环境:Unity 2017.3.0f3 二.实现过程 1,在面板中点击Add Component按钮 2,添加Box Col ...
随机推荐
- acdream.A Very Easy Triangle Counting Game(数学推导)
A - A Very Easy Triangle Counting Game Time Limit:1000MS Memory Limit:64000KB 64bit IO Forma ...
- BC.36.Gunner(hash)
Gunner Accepts: 391 Submissions: 1397 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536 ...
- cocos基础教程(11)事件分发机制
cocos3.0的事件分发机制: 创建一个事件监听器-用来实现各种触发后的逻辑. 事件监听器添加到事件分发器_eventDispatcher,所有事件监听器有这个分发器统一管理. 事件监听器有以下几种 ...
- Java中的final修饰符
1.什么时候可以选择final修饰符 如果想让一个类不被其他类继承,不允许在有子类,这时候就要考虑用到final来修饰. 2.用final修饰的类 首先大家要明白,用final修饰的类是不能被继承的, ...
- @version ||= version
# -*- encoding : utf-8 -*- class InterfaceBaseController < ActionController::Base private def set ...
- [OpenJudge 3061]Flip The Card
[OpenJudge 3061]Flip The Card 试题描述 There are N× Ncards, which form an N× Nmatrix. The cards can be p ...
- NYOJ 106背包问题
http://acm.nyist.net/JudgeOnline/problem.php?pid=106 背包问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现 ...
- BZOJ 1002 [ FJOI 2007 ]
-------------------------萌萌哒分割线------------------------- 题目很容易看懂,数据范围也不大.当然可以卡过暴力的人了. 在n=1时很明显是一种,如下 ...
- C#中Const和Readonly的区别
const 的概念就是一个包含不能修改的值的变量.常数表达式是在编译时可被完全计算的表达式.因此不能从一个变量中提取的值来初始化常量.如果 const int a = b+1;b是一个变量,显然不能再 ...
- vim技巧之快速进入引号删除至右引号前的内容
参考:http://blog.chinaunix.net/uid-23381466-id-88482.html f'l ct' #fX,X可用任何字符,l表示向右移一位,ct'表示删除至引号前di'