Fadeout.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. public class Fadeout : MonoBehaviour
  5. {
  6. public float time = 1;
  7. float playTime;
  8. SkinnedMeshRenderer[] mRenderers;
  9. string orgShaderName;
  10. float orgStrength = 1.0f;
  11. List<Shader> orgShaders = new List<Shader>();
  12. Shader fadeOutShader = null;
  13. int mAplhaPropId = 0;
  14. int mClrStrengthPropId = 0;
  15. List<MaterialPropertyBlock> mPropBlocks;
  16. private void Awake()
  17. {
  18. mAplhaPropId = Shader.PropertyToID("_Alpha");
  19. mClrStrengthPropId = Shader.PropertyToID("_ClrStrength");
  20. mPropBlocks = new List<MaterialPropertyBlock>();
  21. if (mRenderers == null)
  22. mRenderers = GetComponentsInChildren<SkinnedMeshRenderer>();
  23. if(mRenderers!=null)
  24. {
  25. for(int idx =0; idx < mRenderers.Length;idx++)
  26. {
  27. mPropBlocks.Add(new MaterialPropertyBlock());
  28. }
  29. }
  30. }
  31. void OnEnable()
  32. {
  33. playTime = 0;
  34. if (mRenderers == null)
  35. mRenderers = GetComponentsInChildren<SkinnedMeshRenderer>();
  36. orgShaders.Clear();
  37. if(fadeOutShader == null)
  38. fadeOutShader = ResourceMgr.Instance.FindShader("Hero/FadeOut", "Assets/Shaders/Actor/FadeOut");
  39. for (int i = 0; i < mRenderers.Length; i++)
  40. {
  41. if (mRenderers[i] != null && mRenderers[i].material != null)
  42. {
  43. orgShaders.Add(mRenderers[i].material.shader);
  44. orgShaderName = mRenderers[i].material.shader.name;
  45. if(fadeOutShader != null)
  46. {
  47. mRenderers[i].material.shader = fadeOutShader;
  48. }
  49. //mRenderers[i].material.SetFloat("_Alpha", 1);
  50. orgStrength = mRenderers[i].material.GetFloat("_ClrStrength");
  51. mPropBlocks[i].SetFloat(mAplhaPropId, 1);
  52. mRenderers[i].SetPropertyBlock(mPropBlocks[i]);
  53. }
  54. }
  55. }
  56. // Update is called once per frame
  57. void Update()
  58. {
  59. if (mRenderers != null && time > 0)
  60. {
  61. for (int i = 0; i < mRenderers.Length; i++)
  62. if (mRenderers[i] != null && mRenderers[i].material != null)
  63. {
  64. //mRenderers[i].material.SetFloat("_Alpha", 1 - playTime / time);
  65. //mRenderers[i].material.SetFloat("_ClrStrength", 0.9f + 0.8f * playTime / time);
  66. mPropBlocks[i].SetFloat(mAplhaPropId, 1 - playTime / time);
  67. mPropBlocks[i].SetFloat(mClrStrengthPropId, 0.9f + 0.8f * playTime / time);
  68. mRenderers[i].SetPropertyBlock(mPropBlocks[i]);
  69. }
  70. }
  71. playTime += Time.deltaTime;
  72. }
  73. public void Reset()
  74. {
  75. for (int i = 0; i < mRenderers.Length; i++)
  76. {
  77. if (mRenderers[i] != null && mRenderers[i].material != null)
  78. {
  79. //mRenderers[i].material.SetFloat("_Alpha", 1);
  80. //mRenderers[i].material.SetFloat("_ClrStrength", orgStrength);
  81. mPropBlocks[i].SetFloat(mAplhaPropId, 1);
  82. mPropBlocks[i].SetFloat(mClrStrengthPropId, orgStrength);
  83. mRenderers[i].SetPropertyBlock(mPropBlocks[i]);
  84. mRenderers[i].material.shader = orgShaders[i];
  85. }
  86. }
  87. }
  88. }