第四章 Unity工程和相机介绍

news2024/10/7 13:15:18

在上面的章节中,我们创建了一个“New Unity Project”工程,并保存到了“E:\workspace”工作空间下。那么,我就先看看这个工程的文件结构(E:\workspace\ New Unity Project)。

接下来,我们简单介绍一下这些目录:

Assets:资源目录,我们所有的模型,材质,代码都在这里。

Library:库目录,Unity把Asset下支持的资源导入成自身识别的格式,以及编译代码成为DLL文件都放在Library文件夹中,还包括我们使用的Packages插件库。

Logs:日志目录,保存工程中输入的log信息。

Packages:包目录,使用的一些插件,通常我们使用Package Manager窗口进行管理。

ProjectSettings:工程设置目录,当前工程下的各项设置参数记录。

Temp:临时目录,unity编译的时候自动生成的临时文件。

UserSettings:用户设置目录,记录用户的使用偏好等等。

在我们Unity主界面上的Project工程面板中有Assets和Packages,其实就是对应了上面的两个同名的目录。我们在Project工程面板中操作Assets和在Windows目录中操作Assets文件夹的效果是一样的。但是,仍然建议大家还是在Project工程面板中操作,尽量不要去Windows目录中操作Assets文件夹。因为Unity会自动为每一个资源文件创建一个同名的meta文件,大家去Windows目录下查看,就能发现这些meta文件。需要注意的是,在这个Assets目录下,Unity会忽略一些特殊的文件或文件夹。这些文件或文件夹不会纳入到Unity的管理范围之内(不会为其创建meta文件)。这些文件包括:

1. 隐藏的文件夹

2. 以“.”开头的文件和文件夹

3. 以“~”结尾的文件和文件夹

4. 名为 cvs 的文件和文件夹

5. 扩展名为 .tmp 的文件

接下来是Packages目录,建议在Package Manager窗口中管理。注意,Packages的目录只保存了插件库的配置信息。那么这些插件库的真实文件在哪里呢?就是存放到了 Library目录下。这个Library目录是Unity根据Packages中的配置信息自动管理的。我们可以删除(不要在打开Unity的情况下删除),删除后Unity会自动重新下载。我们可以在 Packages 文件夹中找到名为 manifest.json 的项目清单文件,该文件使用 JSON(JavaScript 对象表示法)语法。Unity 加载项目时,Unity Package Manager 会读取项目清单,以便计算要获取并加载的包的列表。当用户通过 Package Manager 窗口安装或卸载包时,Package Manager 会将这些更改存储在项目清单文件中。项目清单文件通过依赖关系对象来管理包的列表。

另外,Unity中有一些特殊文件夹名称,大家也需要了解一下。通常可为创建的文件夹选择任何名称来组织 Unity 项目。但是,Unity 为特殊目的保留了一些文件夹名称。

1. Editor文件夹,编辑器脚本在开发期间向 Unity 添加功能,但在运行时在构建中不可用。

2. Gizmos 文件夹允许将图形添加到场景视图,以帮助我们更好的识别游戏对象。

3. Resources文件夹可从脚本中加载资源,而不必手动将资源拖拽在场景中创建游戏对象。

4. Standard Assets官方标准资源文件夹,里面提供了很多的免费3D资源。

5. StreamingAssets流媒体资源文件夹也用于加载一些资源。

接下来,我们介绍2D游戏和3D游戏。

我们创建游戏项目工程的时候,可以指定是以2D游戏还是3D游戏。如下所示

3D 游戏通常使用三维模型作为游戏对象,并在游戏对象的表面上渲染材质和纹理,使它们看起来比较贴近现实世界的事物。同时,摄像机可以在场景中自由移动和旋转,当游戏对象靠近摄像机时,对象在屏幕上显得较大,反之就较小,这就是透视效果。这类摄像机也称之为透视摄像机。3D游戏世界对应的是XYZ三维坐标系。

2D 游戏使用平面图形(就是图片),也称之为spirit精灵。这些二维图形被绘制到屏幕上,就连动画也是通过绘制一系列的连续帧图片的方式来实现的。同时,摄像机没有透视效果,也就是说,所有的二维图形不会因为距离摄像机的远近而变大变小,我们称之为正交摄像机。2D游戏世界对应的XY二维坐标系。

还有一类游戏,他们使用三维模型来构建游戏世界,但是透视摄像机只能在X/Y两个维度上移动,并且不能旋转,类似于2D游戏的玩法。对于这些游戏,3D 效果的用途只是为了营造逼真的游戏世界,这种类型的游戏有时也被称为“2.5D”。当然,我们也可以在2D游戏中使用透视摄像机,让二维图形可以展现3D的效果。优秀的技术只会让游戏更加的精彩。也就是说,从技术角度出发,不存在严格意义上的2D游戏和3D游戏的区分。

那么,我们开始创建工程的时候,为什么还要区分2D和3D呢?其实,只是两种Unity工作模式而已。我们创建2D工程,就是2D模式,同理3D工程就是3D模式。但而后也可以随时在2D模式和3D模式之间切换。请注意,这里的模式跟我们通常所说的2D/3D游戏是两个概念。Unity中的2D/3D模式是为了帮助我们更加方便的开发2D/3D游戏,它体现的是Unit 编辑器的一些功能设置的不同。如何在项目工程中切换2D和3D模式呢?请在菜单栏选择:Edit -> Project Settings,然后选择 Editor(编辑器) 选项,然后将 Default Behavior Mode 设置为 2D 或 3D。

注意,这个修改并不会对我们当前已存在场景造成太多的影响。也就是说,虽然我们可以将3D模式改为2D模式,但是这并不代表说,我们的3D场景游戏会变成一个2D场景游戏。2D和3D模式的区别在于Unity编辑器的一些设置不同。在2D模式下,导入的任何图像都被作为精灵处理,同时也会启用Sprite Packer等工具,Scene 视图也会设置为2D效果,摄像机为正交类型,同时不使用天空盒,环境光将使用颜色值,实时光照和烘焙会关闭等等。在3D模式下,则正好相反,图像作为贴图处理,禁用Sprite Packer等工具,Scene 视图为3D效果,摄像机为透视类型,同时启用天空盒,环境光来源于天空盒,实时光照和烘焙也会开启等等。其实,这些设置的不同,目的就是为了让我们在2D模式下更方便的开发2D游戏,3D模式下更方便的开发3D游戏。

介绍完2D/3D模式与2D/3D游戏的关系之后,我们来介绍一个正交/透视摄像机。在我们的DirectX课程中讲过,摄像机本质就是取景变换矩阵和投影变换矩阵。取景变换矩阵就是摄像机的位置和观察点信息,而投影变换矩阵则分为正交和透视两种。透视投影就是一个正四棱锥,它由视域角度,远近裁剪面构成;而正交投影则是一个立方体,它有长和宽两参数构成。在Unity中,它给专门给我们提供了摄像机这个游戏对象。它可以通过菜单栏GameObject -> Camera方式来创建,一般情况下,一个场景需要一个摄像机就够了,但是有些时候可以创建多个来实现一些特殊功能。

以上是一个透视摄像机,经常用于3D游戏,是一个正四棱锥结构。

以上是一个正交摄像机,经常用于2D游戏,是一个立方体的结构。

在Scene 视图中点击选中摄像机,在Inspector检视视图中查看它的所有属性,

摄像机的Inspector检视视图中主要组件就是“Transform”和“Camera”两个。Transform组件代表了移动,旋转和缩放(世界三大变换),每一个游戏对象都拥有该组件(提醒一下)。Transform变换位置定义了摄像机位置(眼睛的位置),其向前的 (Z) 轴定义观察方向(眼睛观察方向),向上的 (Y) 轴定义摄像机的上方向(眼睛的上方向是Y轴),相当于我们之前的取景变换矩阵。如果我们需要调整摄像机的位置,或者旋转摄像机的话,我们就需要修改它的“Transform”组件。例如,我们让摄像机跟随玩家一起移动,就可以将玩家的移动同步到摄像机上。

Camera组件,根据名称可以得知,该组件是摄像机独有的组件,该组件定义了摄像机观察区域的大小和形状,相当于我们之前的投影变换矩阵。通过设置组件的各个参数,摄像机能够显示其在当前屏幕上观察到的内容。以下是Camera 组件中一些重要的参数。

1. Clear Flags(清除标记)默认天空盒,表示在屏幕上空的部分将显示天空盒。

2. Background(背景色)没有天空盒的情况下,屏幕上空的部分将显示背景色。

3. Culling Mask(剔除遮罩)默认Everything层,也就是摄像机渲染这个Layer层。我们可以点击控制栏右边的“Layers”查看Unity为我们预创建的几个Layer层。

很明显,Everything层代表了所有层的游戏对象,反之Nothing代表没有任何层。如果我们选择Nothing的话,就代表摄像机不渲染任何层的游戏对象,我们就看不见他们了。

4. Projection 代表摄像机类型,Perspective为透视摄像机,Orthographic正交摄像机。这两种摄像机的区别,我们在上面已经说明。当切换两种类型的时候,下面的一些参数会自动改变。当Perspective透视摄像机的时候,下面有“FOV Axis”,“Field of View”和“Physical Camera”三个参数;当Orthographic正交摄像机的时候,下面只有“Size”一个参数。

透视摄像机:FOV Axis代表视野轴,可以分为Horizontal水平和Vertical垂直两种,这两个选项与Field of View(视角范围)有密切关系。当选择Horizontal的时候,调整Field of View数值就是改变摄像机左右(水平方向)开合角度;当选择Vertical的时候,调整Field of View数值就是改变摄像机上下(垂直方向)开合角度。这个就类似于我们投影变换矩阵中的视域角度,只不过Unity可以让我们从水平和垂直两个轴向来改变这个角度值。Physical Camera参数我们在后面章节中再介绍,这里直接忽略掉即可。透视摄像机的结构是一个正四棱锥,我们看到的视野范围,就是由锥体的开合角度决定的。这个应该很容易理解。

正交摄像机:Size也代表摄像机的视野。它的值表示的是在屏幕的竖直方向上,摄像机所绘制出来的区域的一半。如果数值是5的话,那么正交摄像机采集区域(立方体)的高度就是10。这里的数值单位是Unity的单位哦,而不是屏幕的像素单位。当然,两者存在一个转换的问题。默认情况下,100像素等于1 Unity 单位。那我们如何来设置正交摄像机采集区域的宽度呢?这里就涉及到了屏幕分辨率自适应的问题了。Uinty通过屏幕的宽高比得到aspect,再通过纵向的采集高度乘以 aspect 获得摄像机横向的采集范围。说到这个aspect,大家要区分Game视图中的aspect,这个指最终游戏屏幕的宽高比,它主要让我们对不同屏幕进行游戏画面的测试。

5. Clipping Planes开始和停止渲染位置到摄像机的距离,分为Near和Far两个数值,其实就是我们上文提到的近裁剪面和远裁剪面,两个数值之间的内容才会被摄像机采集。

6. Viewport Rect 通过四个值指示将在屏幕上绘制此摄像机视图的位置。在DirectX课程中,我们在渲染管线章节中也提到过视口转换,就是将投影平面的内容转换到屏幕窗体上。它的主要参数就是X/Y坐标和W/H宽高。我们在该参数中也对应看到了这个四个参数值。

7. Depth(深度)摄像机在绘制顺序中的位置,具有更大值的摄像机将绘制在具有更小值的摄像机之上。默认情况下,Main Camera的Depth值是-1。新创建的摄像机的Depth值是0,只有Depth值大的摄像机的视图才会呈现到Game游戏视图中。在Unity场景中,一个摄像机对应一个游戏视图。如果场景中有多个摄像机,我们需要设置其余摄像机的输出。

8. Rendering Path定义摄像机的渲染路径,默认值为Use Graphics Settings。我们可以去在Editor -> Project Setting -> Graphics窗口可设置默认的渲染路径,

当然,每个Camera可覆盖上面默认的渲染路径。渲染路径是与光照和阴影相关的一系列操作。不同的渲染路径具有不同功能和性能特征。其中两个比较重要的选项分别是“Deferred延迟渲染”和“Forward前向渲染”。 前向渲染是内置渲染管线中的默认渲染路径。关于两者的详细区别,我们这里不介绍了,大家可以去官方或者第三方资料查阅一下。

9. Target Texture将摄像机视图输出的渲染纹理。我们可以在工程面板中创建一个“渲染器纹理”,然后再创建一个摄像机,将刚刚创建的渲染器纹理应用到新摄像机的目标纹理上。这样,摄像机采集的内容就会输出到这个纹理上面。然后我们再创建一个平面,将纹理拖拽到平面上。我们就可以在平面上看到摄像机照射的内容了。

10. Occlusion Culling为此摄像机启用遮挡剔除,意味着隐藏在其他对象后面的对象不会被渲染。这个对游戏对象的渲染起到一个优化的作用。

关于摄像机的内容,我们就暂时介绍到这里。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/463608.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【老王读SpringMVC-3】根据 url 是如何找到 controller method 的?

前面分析了 request 与 handler method 映射关系的注册,现在再来分析一下 SpringMVC 是如何根据 request 来获取对应的 handler method 的? 可能有人会说,既然已经将 request 与 handler method 映射关系注册保存在了 AbstractHandlerMethodMapping.Ma…

Python 二进制 八进制 十进制 十六进制之间的转换

众所周知:计算机底层是以二进制数来进行存储计算,而计算机进制:数制是用一组固定的符号和统一的规则来表示数值的方法。 开始下面讲述之前首先要声明: 二进制,八进制,十六进制 都可以转换为十进制&#xf…

【DRF配置管理】如何在视图类使用get_objects()

原文作者:我辈李想 版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。 DRF应用和管理 【DRF配置管理】Django使用DRF框架 【DRF配置管理】如何在视图类配置参数(一) 【DRF配置管理】如何在视图类配置参数(二) 【DRF配置管理…

第二届广州·琶洲算法大赛启动,百度飞桨助力广州打造中国算法新高地

‍‍ 生成式人工智能热潮席卷全球,算法创新成为 AI 突破发展的关键,推动实体经济高质量增长。4月25日,第二届广州琶洲算法大赛正式启动,广州市政府主办、百度飞桨等联合承办,广召天下算法英雄,加快“琶洲算…

<网络编程>网络套接字

目录 理解源IP地址和目的IP地址 认识端口号 端口号和进程ID的关系 理解源端口号和目的端口号 初步认识TCP、UDP协议 TCP协议 UDP协议 网络字节序列 socket网络接口 socket常见API sockaddr结构 UDPsocket 编码: 理解源IP地址和目的IP地址 源IP&#xf…

服装店铺装修有哪些窍门?做好这3点,顾客主动上门

现在街边有各种各样的服装店,有的服装店客流不断,有的服装店却很冷清,导致这种现象的原因有很多,比较重要的一点就是你的服装店铺装修没做好。 你的服装店铺装修足够吸引人吗? 什么样的服装店铺装修才能吸引顾客&#…

【技巧】如何修改PDF文件?

PDF文件格式安全、标准化,很多人在工作中几乎离不开。可有些小伙伴想要修改PDF文件内容时,发现无法修改,那是什么情况呢?如何才能修改PDF文件呢?下面小编就来分享一些小技巧。 技巧一:使用PDF编辑器 如果使…

凌恩生物文献分享|一株细菌完成图也能发一区10分+!

期刊:Science of the Total Environment 影响因子:10.753 发表时间:2022 样本类型:Bosea sp. Ads-6菌株 客户单位:中国科学院微生物研究所 一、研究背景 环境中抗生素残留和耐药性的增加引发了许多…

一文详解汽车操作系统现状

摘要: 智能座舱和自动驾驶的发展,特斯拉的突飞猛进,让各大主机厂越来越重视汽车操作系统。但车企现在所做的软件定义汽车,大都是通过软硬件解耦来降低造车成本、丰富新车功能,在操作系统层面大都还停留在市场调研和学…

linux ubantu 16.04 安装fbprophet 和 pystan经验总结

写在前面 之前在window11上,安装了一下午,不是C版本不行,就是这个那个不通过,主要是Pystan运行不起来就很气,fbprophet本身就需要依赖这个包,然后MSVC不支持,裂开。尝试了很多次,碰…

基于Java开发的分布式在线教育系统,支持考试、直播、问答

一、开源项目简介 知道学习平台是一个基于 Java 开发的分布式在线教育系统项目采用前后端分离的企业级微服务架构引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手容易注重代码规范,严格控制包依赖可以帮助个人、企业或机构快速搭建一个在线…

C# 利用TabControl控件制作多窗口切换

TabControl控件切换时触发的事件 选项卡切换触发的是TabControl控件的SelectedIndexChanged事件。 当TabControl控件的任何一个TabPage被点击或选择,即发生SelectedIndexChanged事件事件。 代码如下: private void tabControl1_SelectedIndexChanged(o…

设计模式 --- 结构型模式

一、概述 结构型模式描述如何将类或对象按某种布局组成更大的结构。它分为类结构型模式和对象结构型模式,前者采用继承机制来组织接口和类,后者釆用组合或聚合来组合对象。 由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”…

L2TP Client-initated场景

L2TP Client-initated场景 1. 原理 ![原理](https://img-blog.csdnimg.cn/66ce3169502b4252bca5d9d7a6c0027c.png)1.1 阶段1:创建L2TP隧道 C与LNS通过交互三条消息协商隧道ID、UDP端口(1701)、主机名称、L2TP版本、隧道验证等参数。 1.2 …

使用Spark实现词频统计

文章目录 一,词频统计准备工作(一)版本选择问题(二)安装Scala2.12.15(三)启动集群的HDFS与Spark(四)在HDFS上准备单词文件 二,本地模式运行Spark项目&#xf…

Meta的分割一切模型SAM( Segment Anything )测试

Meta不久前开源发布了一款图像处理模型,即分割一切模型:Segment Anything Model,简称 SAM,号称要从任意一张图片中分割万物,源码地址为: https://github.com/facebookresearch/segment-anything打开后看到…

ssm+java企业公司产品分销商管理系统

一、 二、经营管理: ①分销商每月提交自己进多少货物(从总部进购了多少“鹊巢”的商品给自己负责区的大型商超)——对应的种类一共进多少货物;该种类中具体的产品又进了多少货物具体到(参考三产品管理模块)…

RelativeLayout相对布局

一、官方地址&#xff1a; https://developer.android.google.cn/reference/kotlin/android/widget/RelativeLayout?hlen 二、概述 相对布局&#xff08;RelativeLayout&#xff09;是一种根据父容器和兄弟控件作为参照来确定控件位置的布局方式 三、基本格式 <RelativeLay…

Nacos注册中心的使用

文章目录 Nacos注册中心1. 服务注册到nacos1&#xff09;引入依赖2&#xff09;配置nacos地址3&#xff09;重启 2.服务分级存储模型2.1.给user-service配置集群2.2.同集群优先的负载均衡 3.权重配置 Nacos注册中心 国内公司一般都推崇阿里巴巴的技术&#xff0c;比如注册中心…

Docker安装Redis(普通安装+在线安装+离线安装)

文章目录 Redis概述一、磁盘安装1.1 安装环境1.2 安装步骤1.3 服务器启停命令 二、docker安装1.在线安装2.离线安装 总结 Redis概述 Redis&#xff0c;英文全称是Remote Dictionary Server&#xff08;远程字典服务&#xff09;&#xff0c;是一个开源的使用ANSI C语言编写、支…