• unity 房产项目 材质切换


    原文链接

    在许多典型的房产展示项目当中,经常需要动态地实现例如墙纸、地板等材质的更换以获得不同的展示效果,下面将通过一个简单的教程介绍实现这一功能的关键技术。

    首先需要场景中创建一个简易的样品房,样品房里面有一个地面和两面相互垂直的墙壁。当选中样品房中的墙壁或地面,控制台就会输出选中对象的名称。场景中还提供四个按钮,包括“墙纸1”、"墙纸2"、“地板1”还有“地板2”,当我们鼠标选中地板时,可以点击“地板1”或“地板2”动态地更换地板材质,同理当我们鼠标选中墙壁时我们可以点击“墙纸1”、"墙纸2"动态地分别更换两面墙壁的墙纸。如下图所示:



    第一步先在场景中创建上面描述的样品房,其中包括两面墙壁和一个地板,之后还需要把摄像机调整到合适的位置并加入合理的方向光源。


    接着,需要把相关的图片素材导入工程,把所有墙纸和地板的素材放到一个命名为“image”的文件夹里面。然后创建对应的四个材质,其命名分别为floor01、floor02、wall01和wall02,。最后,我们需要创建一个命名为Material的文件夹并在里面创建一个js脚本。


    在场景中,先为样品房中的对象赋予一个默认的材质使场景初始时不会显得太单调。



    在脚本中需要先声明若干变量,其中包括一个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");
        }

    先把脚本文件拖到场景的摄像机上,点击摄像机查看其属性,如图右下角红色区域所示。


    脚本属性中有以下几项:_wall01Material、_wall02Material、_floor01Material和_floor02Material,需要为这些属性指定相应的材质。


    场景就基本搭建好,最后需要做的就是编写具体的脚本,下面为完整代码。

        #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材质怎么加;unity3d切换场景代码;unity3d 场景名称;unity3d js做什么;unity3d ray;unity3d 场景切换效果;unity3d打开项目;unity3d 项目;unity3d自带项目在哪;unity3d自带项目;unity3d材质加不了;unity3d材质;unity3d 给材质;unity3d 场景切换代码;unity3d 当前场景名称;unity3d用js做什么;unity3d ray ray;unity3d 切换场景效果

  • 相关阅读:
    什么是语义化的HTML?有何意义?为什么要做到语义化?
    Doctype作用?严格模式与混杂模式如何区分?它们有何差异?
    js和jq中常见的各种位置距离之offsetLeft和position().left的区别(四)
    js和jq中常见的各种位置距离之offset和offset()的区别(三)
    js和jq中常见的各种位置距离之offset()和position()的区别(二)
    js和jq中常见的各种位置距离之offsetLeft/clientLeft/scrollLeft (一)
    剖析js中的数据类型
    js数组去重几种方法
    SSE and Websocket
    鲜为人知的空元素╮(╯▽╰)╭
  • 原文地址:https://www.cnblogs.com/lpcoder/p/7061570.html
Copyright © 2020-2023  润新知