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

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

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、有更好的方法欢迎指点。

上一篇:php – 如何防止我的网站被“提升”?


下一篇:Keras猫狗大战二:加载模型预测单张图片