在许多典型的房产展示项目当中,经常需要动态地实现例如墙纸、地板等材质的更换以获得不同的展示效果,下面将通过一个简单的教程介绍实现这一功能的关键技术。
首先需要场景中创建一个简易的样品房,样品房里面有一个地面和两面相互垂直的墙壁。当选中样品房中的墙壁或地面,控制台就会输出选中对象的名称。场景中还提供四个按钮,包括“墙纸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教程:实现房产项目中的材质动态切换