HeroGPURenderManager.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. using UnityEngine;
  2. using Utility;
  3. namespace GameLogic.Combat.Hero.HeroGPU
  4. {
  5. public class HeroGPURenderManager : Singleton<HeroGPURenderManager>
  6. {
  7. protected Map<string, BetterList<HeroGPUMono>> gpuRenderMap = new Map<string, BetterList<HeroGPUMono>>();
  8. int enableShaderId = Shader.PropertyToID("_EnableAnimation");
  9. int animtionStateId = Shader.PropertyToID("_AnimationState");
  10. public HeroGPURenderManager()
  11. {
  12. StaticUpdater.Instance.AddRenderUpdateCallBack(Update);
  13. }
  14. public void AddHeroGpuRender(HeroGPUMono gpuMono)
  15. {
  16. if (gpuRenderMap.TryGetValue(gpuMono.gameObject.name, out BetterList<HeroGPUMono> list))
  17. {
  18. list.Add(gpuMono);
  19. }
  20. else
  21. {
  22. list = new BetterList<HeroGPUMono>();
  23. list.Add(gpuMono);
  24. gpuRenderMap.Add(gpuMono.gameObject.name, list);
  25. }
  26. }
  27. public void RemoveHeroGpuRender(HeroGPUMono gpuMono)
  28. {
  29. if (gpuRenderMap.TryGetValue(gpuMono.gameObject.name, out BetterList<HeroGPUMono> list))
  30. {
  31. list.Remove(gpuMono);
  32. }
  33. }
  34. public void Update()
  35. {
  36. for (gpuRenderMap.Begin(); gpuRenderMap.Next();)
  37. {
  38. int count = gpuRenderMap.Value.Count;
  39. if (count <= 0)
  40. {
  41. continue;
  42. }
  43. MaterialPropertyBlock _materialPropertyBlock = new MaterialPropertyBlock();
  44. RenderParams rp = new RenderParams(gpuRenderMap.Value[0].Material);
  45. rp.matProps = _materialPropertyBlock;
  46. rp.shadowCastingMode= UnityEngine.Rendering.ShadowCastingMode.On;
  47. rp.receiveShadows = false;
  48. Matrix4x4[] instData = new Matrix4x4[count];
  49. Matrix4x4[] animtionStata = new Matrix4x4[count];
  50. float[] enableAnimations = new float[count];
  51. for (int i = 0; i < count; i++)
  52. {
  53. HeroGPUMono heroGPUMono = gpuRenderMap.Value[i];
  54. instData[i] = heroGPUMono.rootTrans.localToWorldMatrix;
  55. animtionStata[i] = heroGPUMono.animtionState;
  56. enableAnimations[i] = 1;
  57. }
  58. _materialPropertyBlock.SetFloatArray(enableShaderId, enableAnimations);
  59. _materialPropertyBlock.SetMatrixArray(animtionStateId, animtionStata);
  60. Graphics.RenderMeshInstanced(rp, gpuRenderMap.Value[0].Mesh, 0, instData);
  61. }
  62. }
  63. }
  64. }