using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Rendering; //https://docs.unity3d.com/ScriptReference/Rendering.RenderTargetIdentifier.html // Unit效果之一,镜头效果,通过command buffer实现 public class UnitLensEffect : UnitComponent { private List renderers; private static ObjectPool m_CommandBufferPool; private List m_Effects; private CommandBuffer m_CommandBuffer; static UnitLensEffect() { m_CommandBufferPool = new ObjectPool(null, null); } public override void Initialize() { base.Initialize(); renderers = new List(); m_Effects = new List(); } public override void OnPostInitialize() { base.OnPostInitialize(); IBodyRendererAgent body = owner.unitRender.body; if (body == null || body.renderers == null) return; for (int i = 0; i < body.renderers.Length; ++i) { var renderer = body.renderers[i]; if (renderer == null) continue; RendererProxy proxy = renderer.renderer.gameObject.GetOrAddComponent(); proxy.Initialize(renderer); proxy.onWillRenderObject = OnWillRenderObj; proxy.onRenderObject = OnRenderObj; renderers.Add(proxy); } m_CommandBuffer = ClaimCommandBuffer(); m_CommandBuffer.name = "Unit Render"; MainCamera.Instance.lensEffectHandler.onPreCull += OnWillRenderUnit; MainCamera.Instance.lensEffectHandler.onPostRender += OnRenderUnit; ///// m_Effects.Add(LensEffect.MotionBlur()); } public override void Release() { base.Release(); MainCamera.Instance.lensEffectHandler.onPreRender -= OnWillRenderUnit; MainCamera.Instance.lensEffectHandler.onPostRender -= OnRenderUnit; } private void OnWillRenderUnit() { IBodyRendererAgent body = owner.unitRender.body; if (body == null || body.renderers == null) return; if (m_Effects == null || m_Effects.Count == 0) return; m_CommandBuffer.Clear(); for (int i = 0; i < m_Effects.Count; ++i) { m_Effects[i].beforeIterate(m_CommandBuffer); for (int j = 0; j < body.renderers.Length; ++j) { var renderer = body.renderers[j]; if (renderer == null) continue; m_Effects[i].iterate(m_CommandBuffer,renderer); } m_Effects[i].afterIterate(m_CommandBuffer); } MainCamera.Instance.camera.AddCommandBuffer(CameraEvent.AfterImageEffectsOpaque, m_CommandBuffer); } private void OnRenderUnit() { MainCamera.Instance.camera.RemoveCommandBuffer(CameraEvent.AfterImageEffectsOpaque, m_CommandBuffer); for(int i = 0; i < m_Effects.Count; ++i) { m_Effects[i].finishRender?.Invoke(); } } private void OnWillRenderObj(BodyPartRenderer renderer) { } private void OnRenderObj(BodyPartRenderer renderer) { } static CommandBuffer ClaimCommandBuffer() { CommandBuffer cb = m_CommandBufferPool.Get(); cb.Clear(); return cb; } static void ReleaseCommandBuffer(ref CommandBuffer cb) { m_CommandBufferPool.Release(cb); cb = null; } }