欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity射线检测更换物体材质球

程序员文章站 2022-06-10 23:49:55
...

今天遇到了这样的一个需求觉得很有建设性:在摄像机跟随角色移动的过程中,如果遇到物体遮挡,将其变为透明材质,物体移开后还原初始材质。
下面是我的实现方式:~

1、创建射线。(顺便把透明材质球加载出来)

  private Ray ray;
  
   //透明材质球
  private Material alphaMate;
  
 void Start()
  {
    ray = Camera.main.ScreenPointToRay(transform.position);
	
    alphaMate = Resources.Load<Material>("Ambient Particle");
  }

2、准备工作。

 RaycastHit hit;

  //照射到的物体
  private GameObject selectModel;
  
  //遮挡物的所有材质
  private MeshRenderer[] targetMeshs;
  
  //用来存储遮挡物变透明之前的所有材质
  private List<Material> tempMats = new List<Material>();

3、接下来就是替换方法了(如果是实时监测,别忘了放Update里)。

 void ChangeMates()
  {
    //圆柱形射线检测:起点为摄像机位置,圆柱半径0.5,方向沿摄像机Z轴正方向射出500的长度。
    if (Physics.SphereCast(CameraTrans.position, 0.5f, CameraTrans.forward, out hit, 500))
    {
      //通过碰撞物体的名字判断是否为遮挡物
      if (hit.collider.gameObject.name == "Collider")
      {
        //将遮挡物暂存在selectModel中,以便之后的还原材质
        selectModel = hit.collider.gameObject;  
        if (selectModel != null)
        {
          //获取到遮挡物中的所有原始材质球
          targetMeshs = hit.collider.transform.parent.GetComponentsInChildren<MeshRenderer>();
          //更换材质球
          for (int i = 0; i < targetMeshs.Length; i++)
          {
            //暂存遮挡物的原始材质
            tempMats.Add(targetMeshs[i].material);
            //更换透明材质
            targetMeshs[i].material = alphaMate;
          }
        }
       }
      else //遮挡物移开
      {
        //判断遮挡物是否已经被更换完毕
        if (selectModel != null)
        {
          for (int i = 0; i < targetMeshs.Length; i++)
          {
            //还原材质
            targetMeshs[i].material = tempMats[i];
          }
          //清空selectModel信息和list。
          selectModel = null;
          tempMats.Clear();  
        }
      }

4、有更好的方法欢迎指点。