HTC Vive VR房产项目开发五(通过材质列表切换地板材质)

一、搭建界面

1、在地板Floor1下创建一个canvas,重命名为FloorMatList,并添加脚本VRTK_UI Canvas,用于与UI进行交互


2、创建一个Panel,并且重命名为MatUIContainer,添加组件Grid Layout Group,设置内容距离上下左右的间距Padding,设置layout中内容的大小Cell Size,设置内容间的间距Spacing,设置内容为固定行数Constraint,并设置行数Constraint Count


3、在FloorMatList下创建一个Button并且重命名为ShowMatButton,设置大小和位置,设置source image并设置Highlighted Color


将text的内容置为空


4、创建一个Button,设置大小和位置,并设置Highlighted Color,将其拖动到Project视图做成Prefeb


二、创建脚本

1、

FloorMatList的脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
using UnityEngine.UI;
[System.Serializable]
public class FloorMatList : MonoBehaviour {

    public GameObject floor;                                 //地板
    private bool isOpen = false;                            //列表是否打开
    public Transform matUIContainer;                        //材质列表容器
    public FloorMatData[] matDataList;                      //材质列表
    public GameObject matButtonPrefeb;                      //材质按钮原型
    private int curMatIndex = 0;

	
	void Start () {
        init();
	}
	
	
	void Update () {
		
	}

   

    private void init()
    {
        matUIContainer.localScale = new Vector3(0,1,1);                                  //初始化材质列表容器
        foreach (FloorMatData data in matDataList) {
            GameObject matButton = Instantiate(matButtonPrefeb);                        //动态生成承装材质的button
            matButton.transform.parent = matUIContainer;                                //将button作为matUIContainer的子物体,放置在容器里面
            RectTransform rect = matButton.GetComponent<RectTransform>();               
            rect.localPosition = Vector3.zero;                                          //重置位置
            rect.localRotation = Quaternion.Euler(Vector3.zero);                        //重置选择
            rect.localScale = Vector3.one;                                              //重置缩放值
            matButton.GetComponent<Image>().sprite = data.matThumb;                     //设置按钮的缩略图
            matButton.GetComponent<Button>().onClick.AddListener(delegate() {           //设置按钮点击事件
                onMatButtonClick(matButton);
            });
        }
    }

    private void onMatButtonClick(GameObject button)
    {
        int i = 0;
        //所有动态生成的按钮是放在UIContainer中的,遍历所有的元素,找到传递过来的按钮进行设置
        foreach (Transform child in matUIContainer)
        {
            if(button.transform == child && curMatIndex != i)
            {
                floor.GetComponent<Renderer>().material = matDataList[i].floorMat;              //更改指定元素的材质
                curMatIndex = i;
            }
            i++;
        }
    }

    public void showMatList()
    {
        Debug.LogError("showMatList........................");
        //如果打开
        if (isOpen)
        {
            //关闭提示框
            matUIContainer.DOScale(new Vector3(0,1,3),0.3f);
        }//如果关闭
        else
        {
            //打开提示框
            matUIContainer.DOScale(Vector3.one, 0.3f);
        }
        //重置标记位
        isOpen = !isOpen;
    }
}



FloorMatData的脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[System.Serializable]
public class FloorMatData {
                                
    public Material floorMat;           //地板材质
    public Sprite matThumb;             //材质缩略图

}



2、将脚本FloorMatList挂载到物体FloorMatList之上,并将MatUIContainer赋值给脚本的变量MatUIContainer及其它变量的值


设置集合元素的个数并给其元素赋值


3、给按钮添加点击事件,点击On Click的“+”,将FloorMatList对象拖动过来,并且选择FloorMatList中的方法showMatList


三、运行后

初始化时默认的场景


按下touch pad键将指针指向button,如果容器没有展开,按下trigger键,容器展开




当选择对应的材质的button地板切换成对应的材质





如果容器展开,点击按钮容器关闭





注:1、参考资料:http://edu.manew.com/course/344/learn#lesson/5755

2、材质列表导入进来后不能直接使用,因为使用了The lab renderer,需要修改shader为Valve/vr_standard和Tiling值




  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值