using UnityEngine; using UnityEngine.Rendering; namespace Thousandto.Launcher.ExternalLibs { /// /// 一个简单的扭曲效果脚本 /// [RequireComponent(typeof(Camera))] public class DistortEffectSimpleScript: MonoBehaviour { //触发事件 private const CameraEvent CN_TRIGGER_EVENT = CameraEvent.BeforeImageEffects; [Range(0.0f, 1.0f)] public float DistortTimeFactor = 0.15f; //扭曲的强度 [Range(0.0f, 0.2f)] public float DistortStrength = 0.01f; //噪声图 public Texture NoiseTexture = null; private Camera _camera; private CommandBuffer _cmd; private Material _mat; private void Start() { InitCamera(); InitMat(); InitCmd(); } private void OnEnable() { if (_cmd != null && _camera != null) { _camera.AddCommandBuffer(CN_TRIGGER_EVENT, _cmd); } RefreshMat(); } private void OnDisable() { if (_cmd != null && _camera != null) { _camera.RemoveCommandBuffer(CN_TRIGGER_EVENT, _cmd); } } private void OnDestroy() { if (_cmd != null) { if (_camera != null) { _camera.RemoveCommandBuffer(CN_TRIGGER_EVENT, _cmd); } _cmd.Release(); _cmd = null; } if (_mat != null) { GameObject.Destroy(_mat); _mat = null; } } private void OnValidate() { RefreshMat(); } private void InitCamera() { _camera = GetComponent(); _camera.forceIntoRenderTexture = true; } private void InitCmd() { if (_cmd == null) { _cmd = new CommandBuffer(); _cmd.name = "DistortEffect"; var _tmpTexID = Shader.PropertyToID("_TmpTex"); _cmd.GetTemporaryRT(_tmpTexID, -1, -1,0,FilterMode.Bilinear); _cmd.SetRenderTarget(_tmpTexID); _cmd.SetGlobalTexture(CmdBufferUtils.MainTexID, BuiltinRenderTextureType.CameraTarget); _cmd.DrawMesh(CmdBufferUtils.QuadMesh, Matrix4x4.identity, CmdBufferUtils.BlitMat, 0, 0); _cmd.SetRenderTarget(BuiltinRenderTextureType.CameraTarget); _cmd.SetGlobalTexture(CmdBufferUtils.MainTexID, _tmpTexID); _cmd.DrawMesh(CmdBufferUtils.QuadMesh, Matrix4x4.identity, _mat,0,0); _cmd.ReleaseTemporaryRT(_tmpTexID); if (_camera != null) { _camera.AddCommandBuffer(CN_TRIGGER_EVENT, _cmd); } } } private void InitMat() { var sh = RuntimeUtilities.FindShader("Hidden/Ares/PostEffect/DistortEffect"); if (sh != null) { _mat = new Material(sh); _mat.hideFlags = HideFlags.DontSave; RefreshMat(); } else { Debug.LogError("没有找到Shader:Hidden/Ares/PostEffect/DistortEffect"); } } private void RefreshMat() { if (_mat != null) { _mat.SetVector("_Params", new Vector4(DistortTimeFactor, DistortStrength, 0, 0)); _mat.SetTexture("_NoiseTex", NoiseTexture); } } private void OnPostEffectActive(int val) { if (_camera != null && _cmd != null) { //根据激活状态来处理 if (val > 0) { _camera.RemoveCommandBuffer(CN_TRIGGER_EVENT, _cmd); _camera.AddCommandBuffer(CN_TRIGGER_EVENT, _cmd); } else { _camera.RemoveCommandBuffer(CN_TRIGGER_EVENT, _cmd); } } } } }