学习目标
了解场景模型的制作流程
了解场景模型中贴图的制作
了解C#脚本基础
了解场景漫游中第一人称的控制
了解场景烘焙概念
项目描述
AR售楼展示系统项目通过AR技术与售楼相结合,产生了更方便的售楼展示系统,让学习者学完这个项目后对场景类项目制作有了更深刻的理解和掌握,也学习到了再这种类型项目中主要的展示方式。
任务一 项目场景搭建
素材准备和导入设置
这个项目中用到了很多UI图片,格式为PNG。把这些图片整理好导入到unity工程文件下。更改图片类型为UGUI能用的精灵图片。
上述图片素材使用在项目中的功能界面下,上下左右按钮控制第一人称的方向移动。喇叭按钮控制音频播放。
首先把制作好的扫描图上传到Vuforia官网平台上,检查识别图的星级等级,如果没有星级要从新制作识别图,上传完成后下载数据文件到本机并导入到unity工程文件中。
随着素材资源的导入,unity工程内部为了管理的方便需要建立相关名称的文件夹,模型文件Model 图片文件Texture 声音文件Audio 等。配音解说在制作项目时候一般会找配音公司完成,如果是自己学习制作项目的时候可以把解说词放到相关的配音网站自动配音。这里面就要把制作好的配音文件导入到unity工程文件下。
2. 模型制作
项目中模型是根据被扫描图片上的户型制作而成,在制作这类模型时候我们先有CAD尺寸图,把CAD的尺寸图导入到3DMmax中,在用3DMAX的画线工具描画户型的线框,在挤出高度。户型中门窗的空洞可以用布尔功能完成。3DMAX的尺寸尽量和CAD中的尺寸相同。模型大小相同,也就是说当我们扫描图片出现户型模型时,模型正好和户型尺寸一样。
户型中的沙发、床、电视等模型可以在相关模型网站下载使用,尽量找风格统一的模型进行装饰室内,调整模型大小进行适配,网上下载的模型尽量使用低模,因为项目是用在移动端相对PC端面数是影响运行效率的重要因素。
模型制作完成后就要给模型赋予材质,材质方面大多数用到了贴图,贴图要更具不同的物体材质赋予不同的贴图。这里面要把门、地板、床、沙发、地毯等物体赋予不同材质贴图。这里面注意赋予给模型材质后UV的问题模型的美化程度关系到项目的质量。
选中模型导出FBX格式到unity工程文件下,户型模型没用动画所以在导出设置的时候可以勾选掉动画选项。导入进来的模型没有贴图把贴图文件到入unity工程文件。由于是贴图文件我们不用更改图片类型就用普通图片就可以。
把导入进来的户型模型托入到场景管理面板下,并把材质贴图赋予给模型,检查模型是否有问题,比如模型部件位置是否移动,贴图是或否漏贴等问题。检查无误后就要对模型进行烘焙。
3. UI界面制作
新建unity工程后匹配下安卓平台,根据项目中需求把AR应用制作成横屏模式。分辨率选择1920*1080 Landscape。项目中还是应用三场景跳转的模式,一个场景做主界面另外两个个场景做功能界面。
新建场景命名“ZJM”并保存。创建UI“panel”并在“Image”组件里修改颜色如图
在制作项目中美化的效果是能体现出项目的高端性,所以在项目中颜色的搭配尤为重要,一个项目中界面的颜色不能超过五中颜色,色彩的搭配尽量复合协调性。在这个项目中界面的大部分颜色选择了和被扫描图背景颜色相同的色彩。
界面的设计风格也是很重要,现在比较流行的设计风格是扁平化设计。我们把界面放大观看后会发现界面的边缘是黑色的。这不符合扁平化的精髓,所以要去掉黑边,也就是可以不用自带的精灵图片。如图
在界面的设计上需要把界面的上下加上线条,操作方式就是在“panel”添加“Image”。具体参数如图图形的锚点是需要注意的地方。
给“panel”上添加文字作为系统的名称“AR售楼展示系统”。Text的具体参数如图。
添加进入扫描按钮“Button”作为进入GNJM场景的按钮,在GNJM场景中我们只放置一个喇叭按钮作为播放音频。在MYJM场景中加入返回按钮和控制第一人称漫游的按钮,这节里不在阐述。在制作界面交互章节中在具体说明。
任务二 C#语法基础
1.从这个项目开始我们开发AR应用功能用的是unity自带的C#语言,根据现在的unity版本想编写一段程序必须使用C#语言(“#”读作“sharp”)。用来编写C#语言的文本文件叫做C#脚本。最新版本unity已经把Javascript语言淘汰了。
在unity中新建C#脚本,在资源管理面板中执行“Create”> “C# Script”命令。
双击打开脚本,当前脚本中出现的就是unity定义好的初始C#脚本,其基本结构如图。
命名空间是引用一些封装好的内容,这样才可以在脚本中使用一些定义。比如要在脚本中使用集成Image类型,就必须引用UGUI的命名空间using UnityEngine.UI;。
在定义类的位置需要注意C#脚本的类名必须同脚本的名字相同。“MonoBehaviour”是继承的类。简单地说,因为这里继承了“MonoBehaviour”,脚本才有了可以拖动并依附给场景中游戏对象的功能。
花括号“{ }”,它规定了类、函数、语句的内容范围。当他们执行的时候,写在花括号里的内容才会被执行。括号“( )”,用来规定参数、条件等内容的书写规范。
双斜杠“//”,用来定义注释,双斜杠所在的这一行是不会被运行或者编译的。临时不需要的代码我们也可以用这种方法让它暂时失效。
函数:
Start函数:写在Start函数中的代码,在脚本开始运行的时候执行一次。
Update函数:写在Update函数中的代码,程序运行的每一帧都会执行。初学者可以理解为程序运行时一直在执行。
这里面说的函数也可以叫做方法,可以看做是脚本中的一个模块,能够实现特定的功能。在函数中public是对函数进行修饰,表示函数为共有函数,可以被其它脚本调用。void位置是函数返回值,返回值可以简单的理解为当把函数看做一个算式时,返回值就是计算结果。这里void代表该函数不需要返回值,只是简单执行函数中的命令。
函数名称有自己定义,但不能使用系统已经定义好的默认名称。“()”为函数的参数,不填写则代表该函数不使用参数。
变量:
变量是编程中的同一个抽象概念,可以自己定义一个名称代表某一个类型的数据。Unity中常用来引用或者存储一些具体的对象。例如,unity场景中有一个动物模型,现在要使用代码控制动物进行旋转,那么代码和模型之间需要建立一种联系。此时可以在脚本中申请一个变量:
Public Gameobject person_A;
其中,Gameobject是这个变量的类型,游戏对象类型。
person_A是我们自己给这个动物模型定义的变量名称。将动物模型指定给这个变量后,在脚本中person_A就代表动物模型,所有对person_A下达的命令就是对这个动物模型下达的命令。
Public 是关键字公有,在这里最直接的意义就是能够让这个变量在unity的检视面板中显示出来,便于将变量与具体模型之间达成联系,也就是方便给变量赋值。
新建一个脚本,声明变量,保存脚本,把脚本拖动到场景资源管理面板Hierarchy中任意一个游戏对象上,查看这个游戏对象的检视面板,在检视面板脚本属性中出现了这个公有变量,将模型拖动到变量后方的方框中,就完成了变量的赋值。
变量之所以称为变量,是因为它指代的内容是可以变化的,如果给person_A指定的不是刚才的动物模型,而是汽车模型等其它游戏对象,那么person_A在代码中所指代的就是汽车等这些具体对应的对象。
变量的类型有很多,不同的变量类型可以代表的内容也不同。常见的变量类型如下。
Gameobject:游戏对象,可以指代场景面板中出现的任何元素。
Bool:布尔类型,布尔类型只有两个值,即true(真)、false(假)。
Int:可以理解为整数类型。
Float: 浮点数类型,可以理解为小数类型,浮点数的值末尾添加r.
Textuer: 普通纹理类型,可以理解为普通图片。
Sprite: UGUI中用到的精灵如片类型。
AR功能
在场景“GNJM”中载入ARCamera相机并把场景自带的Main Camera相机删除。在ARCamera组件中添加Vuforia Key。如果看见组件中有感叹号提示说明我们的unity环境还没适配Vuforia,勾选XR Settings中选项。
添加Vuforia的ImageTarget到场景管理面板中默认状态下识别图已经添加到它的组件上。
把户型模型拖拽到场景资源管理面板下,检查模型的大小是否与识别图的户型大小一致,如果不一致按照识别图户型大小设置。
把户型模型设置为ImageTarget子物体,因为我们在扫描识别图的时出现的模型是能看见内部的,所以模型的房顶部分可以删掉不要,扫描出来模型就能看见内部结构方便观察。之后我们要做的事就是把场景烘焙。烘焙完的效果会更加真实。
任务三 项目交互功能开发
界面UI交互功能
界面UI交互这里只做主界面的进入扫描按钮功能和GNJM场景中按钮播放音频动能。
在“Script”文件夹中新建一个脚本,单击鼠标右键并执行“Create>C#Script”命令,将其,命名为“Button_A”,打开脚本。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Button_A : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
public void () {
//创建一个新方法;
Application.LoadLevel(1);
//加载的关卡(场景Scene中的编号);
}
}
在场景管理面板中新建一个空物体,命名为“Script_Manager”,用来挂载脚本。把脚本拖动到这个空物体上,在Button按钮属性面板中,找到OnClick(),单击下方的+号,在出现的对象栏中拖入挂载脚本物体“Script_Manager”,在其后选择刚才编写的用来加载场景的函数ButtonA。
把场景“ZJM”和“GNJM”添加到不发窗口中,记住他们的场景编号顺序不能错,运行引擎测试脚本功能。
在GNJM场景中创建按钮进行播放音频功能,新建Button 由于精灵图片是一张喇叭形状的按钮所以Button上的文字可以不用删掉。这样使用者看见喇叭形状就知道是控制声音按钮创建参数如图。
声音的播放我们用一种不写脚本的方法制作,首先在场景资源管理面板下创建Audio Source,创建后在组件参数中添加要播放的音效,如图
上面的参数中勾选去掉,第一个勾选的话运行起来就会播放音效,第二个勾选的话就会一直播放音效,注意这两个地方。
找到播放音效按钮,添加点击事件并把Audio Source物体拖拽到对象栏中,在后面添加方法。运行项目点击按钮播放音效。
模型参数控制
模型的放大和缩小是改变他们的组件里的参数来实现,我们用两只手指触摸屏幕改变手指之间的距离来判断是对模型的放大还是缩小。两手指之间的距离变短模型变小,距离变大模型放大。
在“Script”文件夹中新建一个脚本,单击鼠标右键并执行“Create>C#Script”命令,将其命名为“ModelScale”,打开脚本。
using UnityEngine;
using System.Collections;
using System.IO;
public class ModelScale : MonoBehaviour {
private Touch oldTouch1; //上次触摸点1(手指1)
暂无评论内容