unity3d : 使摄像机和玩家之间的阻挡物体透明

这里提供两个脚本,一个绑在需要透明的物体上(AutoTransparen.cs),一个绑在PLayer身上(ClearSight.cs)。

 

以下是这两个脚本。

 

  1. usingUnityEngine;
  2. usingSystem.Collections;
  3.  
  4. publicclassAutoTransparent:MonoBehaviour
  5. {
  6. privateShader m_OldShader =null;
  7. privateColor m_OldColor =Color.black;
  8. privatefloat m_Transparency =0.3f;
  9. privateconstfloat m_TargetTransparancy =0.3f;
  10. privateconstfloat m_FallOff =0.1f;// returns to 100% in 0.1 sec
  11.  
  12. publicvoidBeTransparent()
  13. {
  14. // reset the transparency;
  15. m_Transparency = m_TargetTransparancy;
  16. if(m_OldShader ==null)
  17. {
  18. // Save the current shader
  19. m_OldShader = renderer.material.shader;
  20. m_OldColor = renderer.material.color;
  21. renderer.material.shader =Shader.Find("Transparent/Diffuse");
  22. }
  23. }
  24. voidUpdate()
  25. {
  26. if(m_Transparency <1.0f)
  27. {
  28. Color C = renderer.material.color;
  29. C.a = m_Transparency;
  30. renderer.material.color = C;
  31. }
  32. else
  33. {
  34. // Reset the shader
  35. renderer.material.shader = m_OldShader;
  36. renderer.material.color = m_OldColor;
  37. // And remove this script
  38. Destroy(this);
  39. }
  40. m_Transparency +=((1.0f-m_TargetTransparancy)*Time.deltaTime)/ m_FallOff;
  41. }
  42. }

 

  1. usingUnityEngine;
  2. usingSystem.Collections;
  3.  
  4. publicclassClearSight:MonoBehaviour
  5. {
  6. publicfloatDistanceToPlayer=5.0f;
  7. voidUpdate()
  8. {
  9. RaycastHit[] hits;
  10. // you can also use CapsuleCastAll()
  11. // TODO: setup your layermask it improve performance and filter your hits.
  12. hits =Physics.RaycastAll(transform.position, transform.forward,DistanceToPlayer);
  13. foreach(RaycastHit hit in hits)
  14. {
  15. Renderer R = hit.collider.renderer;
  16. if(R ==null)
  17. continue;// no renderer attached? go to next hit
  18. // TODO: maybe implement here a check for GOs that should not be affected like the player
  19.  
  20. AutoTransparent AT = R.GetComponent<AutoTransparent>();
  21. if(AT ==null)// if no script is attached, attach one
  22. {
  23. AT = R.gameObject.AddComponent<AutoTransparent>();
  24. }
  25. AT.BeTransparent();// get called every frame to reset the falloff
  26. }
  27. }
  28. }

 

参考:http://answers.unity3d.com/questions/44815/make-object-transparent-when-between-camera-and-pl.html

posted on 2013-05-31 11:59  geoffyange  阅读(1039)  评论(0)    收藏  举报

导航