当前位置:   article > 正文

Unity控制物体透明度的探索(包含递归遍历的方法)_u3d uv纹理递归遍历

u3d uv纹理递归遍历

由于项目要求,要实现对物体透明度的控制,就开始了探索之路。

首先考虑到的是改变其Color中的alpha值,但是未能实现控制,因其Rending Mode属性为Opaque,所以要改变此属性。下面为该部分代码:

  1. public static void SetMaterialRenderingMode(Material material, RenderingMode renderingMode)
  2. {
  3. switch (renderingMode)
  4. {
  5. case RenderingMode.Opaque:
  6. material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
  7. material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
  8. material.SetInt("_ZWrite", 1);
  9. material.DisableKeyword("_ALPHATEST_ON");
  10. material.DisableKeyword("_ALPHABLEND_ON");
  11. material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
  12. material.renderQueue = -1;
  13. break;
  14. case RenderingMode.Cutout:
  15. material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
  16. material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
  17. material.SetInt("_ZWrite", 1);
  18. material.EnableKeyword("_ALPHATEST_ON");
  19. material.DisableKeyword("_ALPHABLEND_ON");
  20. material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
  21. material.renderQueue = 2450;
  22. break;
  23. case RenderingMode.Fade:
  24. material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
  25. material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
  26. material.SetInt("_ZWrite", 0);
  27. material.DisableKeyword("_ALPHATEST_ON");
  28. material.EnableKeyword("_ALPHABLEND_ON");
  29. material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
  30. material.renderQueue = 3000;
  31. break;
  32. case RenderingMode.Transparent:
  33. material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
  34. material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
  35. material.SetInt("_ZWrite", 0);
  36. material.DisableKeyword("_ALPHATEST_ON");
  37. material.DisableKeyword("_ALPHABLEND_ON");
  38. material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
  39. material.renderQueue = 3000;
  40. break;
  41. }
  42. }
首先,我要改变的是建筑模型,有些有子物体,其中还有些并没有材质球,所以要遍历所有子物体,并找出有材质球的部分。

  1. private void ToTransparent(GameObject obj){
  2. if (obj.gameObject.GetComponent<MeshRenderer>())
  3. {
  4. obj.gameObject.GetComponent<MeshRenderer>().material.color = new Color(1.0f, 1.0f, 1.0f, gameObject.GetComponent<UISlider> ().value);
  5. SetMaterialRenderingMode(obj.gameObject.GetComponent<MeshRenderer>().material, RenderingMode.Fade);
  6. if (gameObject.GetComponent<UISlider> ().value >= 0.9)
  7. {
  8. SetMaterialRenderingMode(obj.gameObject.GetComponent<MeshRenderer>().material, RenderingMode.Opaque);
  9. }
  10. children [i] = obj;
  11. i++;
  12. }
  13. foreach(Transform child in obj.transform){
  14. ToTransparent(child.gameObject);
  15. }
  16. }

通过调用该方法,改为Fade,则可以通过改变Alpha值的方法改变透明度。但是接下来会遇到部分建筑为变透明的现象,查找原因,是因为只改变了其第一个材质球,所以还要遍历一下材质球。

  1. public void OnChange(){
  2. //遍历物体下的每个材质球,否则只改变第一个
  3. for(int m=0;m<i;m++){
  4. foreach(Material child in children[m].gameObject.GetComponent<MeshRenderer>().materials){
  5. child.color = new Color(1.0f, 1.0f, 1.0f, gameObject.GetComponent<UISlider> ().value);
  6. }
  7. //children[m].gameObject.GetComponent<MeshRenderer>().material.color = new Color(1.0f, 1.0f, 1.0f, gameObject.GetComponent<UISlider> ().value);
  8. if (gameObject.GetComponent<UISlider> ().value >= 0.9) {
  9. SetMaterialRenderingMode (children [m].gameObject.GetComponent<MeshRenderer> ().material, RenderingMode.Opaque);
  10. } else {
  11. SetMaterialRenderingMode(children[m].gameObject.GetComponent<MeshRenderer>().material, RenderingMode.Fade);
  12. }
  13. }
  14. }
仅为本人摸索的方法,若有更好的方法请留言,不胜感激。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号