Unity3D教程:实现房产项目中的材质动态切换
在许多典型的房产展示项目当中,经常需要动态地实现例如墙纸、地板等材质的更换以获得不同的展示效果,下面将通过一个简单的教程介绍实现这一功能的关键技术。
首先需要场景中创建一个简易的样品房,样品房里面有一个地面和两面相互垂直的墙壁。当选中样品房中的墙壁或地面,控制台就会输出选中对象的名称。场景中还提供四个按钮,包括“墙纸1”、"墙纸2"、“地板1”还有“地板2”,当我们鼠标选中地板时,可以点击“地板1”或“地板2”动态地更换地板材质,同理当我们鼠标选中墙壁时我们可以点击“墙纸1”、"墙纸2"动态地分别更换两面墙壁的墙纸。如下图所示:
Unity3D教程:实现房产项目中的材质动态切换
第一步先在场景中创建上面描述的样品房,其中包括两面墙壁和一个地板,之后还需要把摄像机调整到合适的位置并加入合理的方向光源。
Unity3D教程:实现房产项目中的材质动态切换
接着,需要把相关的图片素材导入工程,把所有墙纸和地板的素材放到一个命名为“image”的文件夹里面。然后创建对应的四个材质,其命名分别为floor01、floor02、wall01和wall02,。最后,我们需要创建一个命名为Material的文件夹并在里面创建一个js脚本。
Unity3D教程:实现房产项目中的材质动态切换
在场景中,先为样品房中的对象赋予一个默认的材质使场景初始时不会显得太单调。
Unity3D教程:实现房产项目中的材质动态切换
在脚本中需要先声明若干变量,其中包括一个GameObject类型的当前对象,还有GameObject类型的_wall01、_wall02和_floor分别对应样品房中的两面墙壁和地板。
最关键的部分是需要声明Material类型的_wall01Material、_wall02Material、_floor01Material和_floor02Material分别对应两种墙纸和两种地板的材质。
public var curObject:GameObject = null;
private var _wall01:GameObject = null;
private var _wall02:GameObject = null;
private var _floor:GameObject = null;
public var _wall01Material:Material = null;
public var _wall02Material:Material = null;
public var _floor01Material:Material = null;
public var _floor02Material:Material = null;
function Start()
{
_wall01 = GameObject.Find("wall01");
_wall02 = GameObject.Find("wall02");
_floor = GameObject.Find("floor");
}
先把脚本文件拖到场景的摄像机上,点击摄像机查看其属性,如图右下角红色区域所示。
Unity3D教程:实现房产项目中的材质动态切换
脚本属性中有以下几项:_wall01Material、_wall02Material、_floor01Material和_floor02Material,需要为这些属性指定相应的材质。
Unity3D教程:实现房产项目中的材质动态切换
场景就基本搭建好,最后需要做的就是编写具体的脚本,下面为完整代码。
#pragma strict
public var curObject:GameObject = null;
private var _wall01:GameObject = null;
private var _wall02:GameObject = null;
private var _floor:GameObject = null;
public var _wall01Material:Material = null;
public var _wall02Material:Material = null;
public var _floor01Material:Material = null;
public var _floor02Material:Material = null;
function Start()
{
_wall01 = GameObject.Find("wall01");
_wall02 = GameObject.Find("wall02");
_floor = GameObject.Find("floor");
}
function Update()
{
// 获得当前选中的对象
if (Input.GetMouseButton (0))
{
var ray = Camera.main.ScreenPointToRay (Input.mousePosition);
var hit : RaycastHit;
if (Physics.Raycast (ray, hit))
{
Debug.DrawLine (ray.origin, hit.point);
//print(hit.collider.gameObject.name);curObject = hit.collider.gameObject;// 显示当前选中对象的名称
print(curObject);
}}
}
function OnGUI()
{
// 给选中的墙壁更换墙纸1
if(GUI.Button(Rect(10, 10, 100, 80), "墙纸1"))
{
if(curObject == null)
{
return;
}
// 用户选中的是墙壁
if(curObject == _wall01 || curObject == _wall02)
{
curObject.renderer.material = _wall01Material;
}
}
// 给选中的墙壁更换墙纸2
if(GUI.Button(Rect(120, 10, 100, 80), "墙纸2"))
{
if(curObject == null)
{
return;
}// 用户选中的是墙壁
if(curObject == _wall01 || curObject == _wall02)
{
curObject.renderer.material = _wall02Material;
}
}
// 给选中的地板更换地板1
if(GUI.Button(Rect(230, 10, 100, 80), "地板1"))
{
if(curObject == null)
{
return;
}// 用户选中的是地板
if(curObject == _floor)
{
curObject.renderer.material = _floor01Material;
}
}
// 给选中的地板更换地板2
if(GUI.Button(Rect(340, 10, 100, 80), "地板2"))
{
if(curObject == null)
{
return;
}// 用户选中的是地板
if(curObject == _floor)
{
curObject.renderer.material = _floor02Material;
}
}
}
下图为运行效果:
Unity3D教程:实现房产项目中的材质动态切换
Unity3D教程:实现房产项目中的材质动态切换相关推荐
- XamarinSQLite教程Xamarin.iOS项目中打开数据库文件
XamarinSQLite教程Xamarin.iOS项目中打开数据库文件 以下是打开MyDocuments.db数据库的具体操作步骤: (1)将Mac电脑上的MyDocuments.db数据库移动到W ...
- java web配置dll文件_JavaWeb项目中dll文件动态加载方法解析(详细步骤)
相信很多做Java的朋友都有过用Java调用JNI实现调用C或C++方法的经历,那么Java Web中又如何实现DLL/SO文件的动态加载方法呢.今天就给大家带来一篇JAVA Web项目中DLL/SO ...
- Vue项目中如何设置动态的TDK
TDK是什么 TDK就是网站的标题(title).描述(description)和关键词(keyword) TDK在哪里 上面大佬对TDK的概念解释的很全面,但是在网页中的TDK在哪里呢,作为开发人员 ...
- JNI_Android项目中调用.so动态库实现详解【转】
转自 http://www.cnblogs.com/sevenyuan/p/4202759.html 1. 在Eclipse中创建项目:TestJNI 2. 新创建一个class:TestJNI.ja ...
- Unity3D开发HTC VIVE项目中插件HTC.Input.Utility.Plugin插件的运用
这是基于SteamVR基础之上的一款插件,再获得硬件设备上比之前单独使用steamVR方便很多. 比如,之前我们获得硬件设备是这样的:首先写一个如下图的脚本,挂在CameraRig的手柄上(看需要那个 ...
- VUE项目中CSS设置动态宽度的方法
网上找到三种方法: 一.使用cumputed 首先你务必看Vue的官方文档.涉及到的基础知识有: 绑定内联样式的使用 computed的使用 文档写的都是基础使用.那么在项目实战中如何使用,两步就能实 ...
- vue项目中运用webpack动态配置打包多种环境域名
在如今前后端分离,各种框架盛行的前端界,对项目的打包要求也越来越复杂,本人分享一个vue项目里,根据命令行输入不同的命令,打包出不同环境域名的方法.(欢迎纠错,谢谢.) 1. 安装插件 cross-e ...
- vue项目中使用Echarts 动态更改图表数据 , Vue 折线图、柱状图等图表动态刷新 ,
问题:在vue组件中,用echarts插件 动态获取.修改图表数据 解决:已解决! 第一步:打开cmd命令窗口 安装echarts依赖 安装:npm install echarts -S 第二步:在m ...
- Vue项目中常见问题(23)动态展示Floor组件
目录 gitee仓库地址:登录 - Gitee.comhttps://gitee.com/CMD-UROOT/sph-project/commits/master 1.查看数据对应的位置 2.为什么这 ...
最新文章
- 传统数据中心穿上“云”外衣 任重而道远
- jmeter tps指标在哪里看_JMeter功能不够用?看这里
- 7999元大疆最新无人机,支持第一人称视角极速拍摄,网友:不是航拍,是直接起飞...
- 记一次Weblogic连接池泄露的修复过程
- 浅谈 Celery 分布式队列
- HDU - 1525
- .html文件可以删掉吗,packages文件夹可以删除吗?
- VS2003创建动态库的一点笔记
- 《A Tour of PostgreSQL Internals》学习笔记——进程间通信
- Windows 7 With SP1 MSDN版 含简体中文版
- android自定义view背景透明度,Android 背景透明度设置总结
- 群晖服务器中用Docker运行Oracle11g
- matlab如何批量去背景,ImageJ怎么消除背景 批量去背景教程
- Fedora系统配置中文输入法
- SCI论文写作--科研其实远没有那么难
- 5G无线技术基础自学系列 | 大规模天线阵列
- Reader之FileReader、BufferedReader
- 啊哈添柴挑战Java1828. 逆序输出(简单)
- 如何启动/停止/重启MySQL + 进入MYSQL
- no module named pygame