Files
ichni_Creator_Studio/Packages/NBPostProcessing/Runtime/NBPostProcessingController.cs
2025-07-14 04:22:50 -04:00

602 lines
21 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using UnityEngine;
// using Sirenix.OdinInspector;
#if CINIMACHINE_3_0
using Unity.Cinemachine;
#endif
// using Unity.Cinemachine.Editor;
#if UNITY_EDITOR
using UnityEditor.AnimatedValues;
using UnityEditor;
#endif
[ExecuteInEditMode]
public class NBPostProcessingController : MonoBehaviour
{
#if UNITY_EDITOR
public AnimBool[] AnimBools = new AnimBool[10];
#endif
// [ShowInInspector][ReadOnly]
//[SerializeField]
public NBPostProcessingManager _manager;
public int index
{
get
{
return _index;
}
}
// [ShowInInspector][ReadOnly]
private int _index;
public void SetIndex(int controllerIndex)
{
_index = controllerIndex;
}
// [OnValueChanged("SetScreenCenterPos")]
// [LabelText("自定义屏幕中心")]
public Vector2 customScreenCenterPos = new Vector2(0.5f, 0.5f);
private Vector2 _lastCustomScreenCenterPos = new Vector2(0.5f, 0.5f);
// [OnValueChanged("SetToggles")]
// [ToggleGroup("chromaticAberrationToggle", "色散")]
// [OnValueChanged("InitAllSettings")]
public bool chromaticAberrationToggle = false;
// [OnValueChanged("SetUVFromDistort")]
// [LabelText("色散UV跟随后处理扭曲")]
// [ToggleGroup("chromaticAberrationToggle")]
public bool caFromDistort = false;
// [LabelText("色散强度")]
// [ToggleGroup("chromaticAberrationToggle")]
public float chromaticAberrationIntensity = 0.2f;
// [HideIf("caFromDistort")]
// [LabelText("色散位置")]
// [ToggleGroup("chromaticAberrationToggle")]
public float chromaticAberrationPos = 0.5f;
// [HideIf("caFromDistort")]
// [LabelText("色散过渡范围")]
// [ToggleGroup("chromaticAberrationToggle")]
public float chromaticAberrationRange = 0.5f;
// [OnValueChanged("SetToggles")]
// [ToggleGroup("distortSpeedToggle", "扭曲")]
public bool distortSpeedToggle = false;
// [ToggleGroup("distortSpeedToggle")]
// [LabelText("后处理走常规屏幕坐标")]
// [OnValueChanged("SetUVFromDistort")]
public bool distortScreenUVMode = false;
// [LabelText("后处理扭曲")]
// [ToggleGroup("distortSpeedToggle")]
// [OnValueChanged("InitAllSettings")]
public Texture2D distortSpeedTexture;
// [LabelText("扭曲贴图中间值")]
// [ToggleGroup("distortSpeedToggle")]
// [OnValueChanged("SetTexture")]
public float distortTextureMidValue = 1;
// [LabelText("扭曲贴图ST")]
// [ToggleGroup("distortSpeedToggle")]
public Vector4 distortSpeedTexSt = new Vector4(30,1,0,0);
// [LabelText("扭曲强度")]
// [ToggleGroup("distortSpeedToggle")]
public float distortSpeedIntensity = 1f;
// [HideIf("distortScreenUVMode")]
// [LabelText("扭曲位置")]
// [ToggleGroup("distortSpeedToggle")]
public float distortSpeedPosition = 0.5f;
// [HideIf("distortScreenUVMode")]
// [LabelText("扭曲范围")]
// [ToggleGroup("distortSpeedToggle")]
public float distortSpeedRange = 1f;
// [LabelText("扭曲纹理流动X")]
// [ToggleGroup("distortSpeedToggle")]
public float distortSpeedMoveSpeedX = 0.1f;
// [LabelText("扭曲纹理流动Y")]
// [ToggleGroup("distortSpeedToggle")]
public float distortSpeedMoveSpeed = -0.5f;//因为老的做法是没有X偏移的只有Y的偏移不改变量兼容老做法。
private readonly int _distortSpeedTextureID = Shader.PropertyToID("_SpeedDistortMap");
private readonly int _distortSpeedTextureStID = Shader.PropertyToID("_SpeedDistortMap_ST");
// [ToggleGroup("radialBlurToggle", "径向模糊")]
// [OnValueChanged("InitAllSettings")]
public bool radialBlurToggle = false;
// [OnValueChanged("SetUVFromDistort")]
// [ToggleGroup("radialBlurToggle")] [LabelText("径向模糊跟随后处理扭曲")]
public bool radialBlurFromDistort = false;
// [ToggleGroup("radialBlurToggle")]
// [LabelText("采样次数")]
[Range(1,12)]
public int radialBlurSampleCount = 4;
// [ToggleGroup("radialBlurToggle")]
// [LabelText("强度")]
public float radialBlurIntensity = 1;
// [HideIf("radialBlurFromDistort")]
// [LabelText("位置")]
// [ToggleGroup("radialBlurToggle")]
public float radialBlurPos = 0.5f;
// [HideIf("radialBlurFromDistort")]
// [LabelText("过度范围")]
// [ToggleGroup("radialBlurToggle")]
public float radialBlurRange = 0.5f;
#if CINIMACHINE_3_0
// [OnValueChanged("SetToggles")]
// [ToggleGroup("cameraShakeToggle", "震屏")]
// [OnValueChanged("InitAllSettings")]
public bool cameraShakeToggle = false;
// [ToggleGroup("cameraShakeToggle")]
// [LabelText("绑定Cinemachine相机")]
// [OnValueChanged("InitCinemachineCamera")]
public CinemachineCamera cinemachineCamera;
// [ToggleGroup("cameraShakeToggle")]
// [LabelText("相机震动强度")]
public float cameraShakeIntensity;
#endif
// [ToggleGroup("overlayTextureToggle", "肌理叠加图")]
// [OnValueChanged("InitAllSettings")]
public bool overlayTextureToggle = false;
// [LabelText("肌理图极坐标模式")] [ToggleGroup("overlayTextureToggle")]
// [OnValueChanged("SetTexture")]
public bool overlayTexturePolarCoordMode = false;
// [ToggleGroup("overlayTextureToggle")]
// [LabelText("肌理图")]
// [OnValueChanged("SetTexture")]
public Texture2D overlayTexture;
private readonly int _overlayTextureID = Shader.PropertyToID("_TextureOverlay");
private readonly int _overlayTextureStID = Shader.PropertyToID("_TextureOverlay_ST");
private readonly int _textureOverlayAnimProperty = Shader.PropertyToID("_TextureOverlayAnim");
private readonly int _textureOverlayMaskProperty = Shader.PropertyToID("_TextureOverlayMask");
private readonly int _textureOverlayMaskStProperty = Shader.PropertyToID("_TextureOverlayMask_ST");
// [LabelText("肌理图缩放平移")] [ToggleGroup("overlayTextureToggle")]
public Vector4 overlayTextureSt = new Vector4(1, 1, 0, 0);
// [LabelText("肌理图偏移动画")] [ToggleGroup("overlayTextureToggle")]
public Vector2 overlayTextureAnim = new Vector2(0, 0);
// [LabelText("肌理图强度")] [ToggleGroup("overlayTextureToggle")]
public float overlayTextureIntensity = 1f;
// [LabelText("肌理图蒙板")] [ToggleGroup("overlayTextureToggle")]
// [OnValueChanged("SetTexture")]
public Texture2D overlayMaskTexture;
// [LabelText("肌理图蒙板缩放平移")] [ToggleGroup("overlayTextureToggle")]
public Vector4 overlayMaskTextureSt;
// [ToggleGroup("flashToggle", "反闪")]
// [OnValueChanged("InitAllSettings")]
public bool flashToggle = false;
// [LabelText("反转度")] [ToggleGroup("flashToggle")]
public float flashInvertIntensity = 1f;
// [LabelText("饱和度")] [ToggleGroup("flashToggle")]
public float flashDeSaturateIntensity = 1f;
// [LabelText("对比度")] [ToggleGroup("flashToggle")]
public float flashContrast = 1f;
public Color flashColor = new Color(1f,1f,1f,1f);
// [ToggleGroup("vignetteToggle", "暗角")]
// [OnValueChanged("InitAllSettings")]
public bool vignetteToggle = false;
// [ToggleGroup("vignetteToggle")]
// [LabelText("暗角颜色")]
public Color vignetteColor = Color.black;
private readonly int _vignetteColorID = Shader.PropertyToID("_VignetteColor");
// [ToggleGroup("vignetteToggle")]
// [LabelText("暗角强度")]
public float vignetteIntensity = 1;
// [ToggleGroup("vignetteToggle")]
// [LabelText("暗角圆度")]
public float vignetteRoundness = 1;
// [ToggleGroup("vignetteToggle")]
// [LabelText("暗角平滑度")]
public float vignetteSmothness = 10;
public void InitController()
{
if (this.isActiveAndEnabled == false)
{
return;
}
_manager = NBPostProcessingManager.Instance;
_manager.InitController(this);
InitAllSettings();
}
void InitAllSettings()
{
SetScreenCenterPos();
SetToggles();
SetUVFromDistort();
SetTexture();
#if CINIMACHINE_3_0
InitCinemachineCamera();
#endif
}
void SetScreenCenterPos()
{
NBPostProcessingManager.customScreenCenterPos = customScreenCenterPos;
_lastCustomScreenCenterPos = customScreenCenterPos;
}
void SetUVFromDistort()
{
NBPostProcessingManager.isDistortScreenUVMode = distortScreenUVMode;
NBPostProcessingManager.isCaByDistort = caFromDistort;
NBPostProcessingManager.isRadialBlurByDistort = radialBlurFromDistort;
}
private void SetTexture()
{
if(NBPostProcessingManager.material == null) return;
if (distortSpeedToggle)
{
if (distortSpeedTexture != null)
{
NBPostProcessingManager.material.SetTexture(_distortSpeedTextureID, distortSpeedTexture);
NBPostProcessingManager.distortTextureMidValue = distortTextureMidValue;
}
else
{
NBPostProcessingManager.material.SetTexture(_distortSpeedTextureID, null);
}
}
if (overlayTextureToggle)
{
if (overlayTexturePolarCoordMode)
{
NBPostProcessingManager.flags.SetFlagBits(NBPostProcessFlags.FLAG_BIT_OVERLAYTEXTURE_POLLARCOORD);
}
else
{
NBPostProcessingManager.flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_OVERLAYTEXTURE_POLLARCOORD);
}
if (overlayTexture)
{
Debug.Log("SetOverlayTexture");
NBPostProcessingManager.material.SetTexture(_overlayTextureID,overlayTexture);
}
else
{
Debug.Log("ClearOverlayTexture");
NBPostProcessingManager.material.SetTexture(_overlayTextureID,null);
}
if (overlayMaskTexture)
{
Debug.Log("SetOverlayMaskTexture");
NBPostProcessingManager.material.SetTexture(_textureOverlayMaskProperty,overlayMaskTexture);
NBPostProcessingManager.flags.SetFlagBits(NBPostProcessFlags.FLAG_BIT_OVERLAYTEXTURE_MASKMAP);
}
else
{
Debug.Log("ClearOverlayMaskTexture");
NBPostProcessingManager.flags.ClearFlagBits(NBPostProcessFlags.FLAG_BIT_OVERLAYTEXTURE_MASKMAP);
}
}
}
private void SetToggles()
{
SetBit(ref NBPostProcessingManager.chromaticAberrationToggles,index,chromaticAberrationToggle);
SetBit(ref NBPostProcessingManager.distortSpeedToggles,index,distortSpeedToggle);
#if CINIMACHINE_3_0
SetBit(ref PostProcessingManager.cameraShakeToggles,index,cameraShakeToggle);
#endif
SetBit(ref NBPostProcessingManager.overlayTextureToggles,index,overlayTextureToggle);
SetBit(ref NBPostProcessingManager.flashToggles,index,flashToggle);
SetBit(ref NBPostProcessingManager.radialBlurToggles,index,radialBlurToggle);
SetBit(ref NBPostProcessingManager.vignetteToggles,index,vignetteToggle);
#if UNITY_EDITOR
SetTexture();
#endif
}
private void ClearToggles()
{
SetBit(ref NBPostProcessingManager.chromaticAberrationToggles,index,false);
SetBit(ref NBPostProcessingManager.distortSpeedToggles,index,false);
#if CINIMACHINE_3_0
SetBit(ref PostProcessingManager.cameraShakeToggles,index,false);
#endif
SetBit(ref NBPostProcessingManager.overlayTextureToggles,index,false);
SetBit(ref NBPostProcessingManager.flashToggles,index,false);
SetBit(ref NBPostProcessingManager.radialBlurToggles,index,false);
SetBit(ref NBPostProcessingManager.vignetteToggles,index,false);
}
private bool _lastChormaticAberrationToggle = false;
private bool _lastDistortSpeedToggle = false;
#if CINIMACHINE_3_0
private bool _lastCamerashakeToggle = false;
#endif
private bool _lastOverlayTextureToggle = false;
private bool _lastFlashToggle= false;
private bool _lastRadialBlurToggle= false;
private bool _lastVignetteToggle= false;
bool checkIfToggleChanged(ref bool lastTogggle, bool currentToggle)
{
if (lastTogggle != currentToggle)
{
lastTogggle = currentToggle;
return true;
}
else
{
return false;
}
}
private static void SetBit(ref int bit, int index,bool bitToggle)
{
if (bitToggle)
{
bit |= (1 << index);
}
else
{
bit &= ~(1 << index);
}
}
// [LabelText("跳过数值锁定")] public bool isSkipUpdate = false;
#if UNITY_EDITOR
// [Button("选择当前Manager")]
void FindManager()
{
UnityEditor.Selection.activeObject = _manager.gameObject;
}
#if CINIMACHINE_3_0
// [Button("选择当前VituralCamera")]
public void FindVirtualCamera()
{
UnityEditor.Selection.activeObject = _manager.currentVirtualCamera;
}
public void InitCinemachineCamera()
{
if (cinemachineCamera)
{
// _perlin = ;
if (!cinemachineCamera.gameObject.TryGetComponent<CinemachineBasicMultiChannelPerlin>(out var _perlin))
{
_perlin = cinemachineCamera.gameObject.AddComponent<CinemachineBasicMultiChannelPerlin>();
}
if (_perlin)
{
_perlin.NoiseProfile =
UnityEditor.AssetDatabase.LoadAssetAtPath<NoiseSettings>(
"Packages/com.xuanxuan.nb.postprocessing/3DPostionShake.asset");
_perlin.FrequencyGain = 5f; //做一个自定义
_perlin.AmplitudeGain = 0f; //一开始先不要震动
}
#if UNITY_EDITOR
if (_manager)
{
_manager.currentVirtualCamera = cinemachineCamera;
}
#endif
}
}
#endif
#endif
private void OnEnable()
{
// Debug.Log("InitController");
InitController();
#if UNITY_EDITOR
// 注册编辑器帧更新事件
EditorApplication.update += ControllerEditorUpdate;
_manager.ReRegistEditorUpdate();//保证Manager的注册在最后
#endif
}
private void OnDisable()
{
// Debug.Log("EndController");
EndController();
#if UNITY_EDITOR
// 注册编辑器帧更新事件
EditorApplication.update -= ControllerEditorUpdate;
#endif
}
bool isFirstUpdate = true;
// Update is called once per frame
void Update()
{
if (isFirstUpdate)
{
isFirstUpdate = false;
return;
}
if(!NBPostProcessingManager.material) return;
//#if UNITY_EDITOR
//Odin的ToggleGroup和OnValueChange功能冲突导致不一定生效。不好调试。所以用手动的方式更新。
bool isToggleChanged = false;
isToggleChanged |= checkIfToggleChanged(ref _lastChormaticAberrationToggle, chromaticAberrationToggle);
isToggleChanged |= checkIfToggleChanged(ref _lastDistortSpeedToggle, distortSpeedToggle);
#if CINIMACHINE_3_0
isToggleChanged |= checkIfToggleChanged(ref _lastCamerashakeToggle, cameraShakeToggle);
#endif
isToggleChanged |= checkIfToggleChanged(ref _lastOverlayTextureToggle, overlayTextureToggle);
isToggleChanged |= checkIfToggleChanged(ref _lastFlashToggle, flashToggle);
isToggleChanged |= checkIfToggleChanged(ref _lastRadialBlurToggle, radialBlurToggle);
isToggleChanged |= checkIfToggleChanged(ref _lastVignetteToggle, vignetteToggle);
if (isToggleChanged)
{
SetToggles();
}
//#endif
if (customScreenCenterPos != _lastCustomScreenCenterPos)
{
SetScreenCenterPos();
}
if (chromaticAberrationToggle)
{
NBPostProcessingManager.chromaticAberrationIntensity =
Mathf.Max(NBPostProcessingManager.chromaticAberrationIntensity, chromaticAberrationIntensity);
NBPostProcessingManager.chromaticAberrationPos =
Mathf.Max(NBPostProcessingManager.chromaticAberrationPos, chromaticAberrationPos);
NBPostProcessingManager.chromaticAberrationRange =
Mathf.Max(NBPostProcessingManager.chromaticAberrationRange, chromaticAberrationRange);
}
if (distortSpeedToggle)
{
if (index == NBPostProcessingManager.laseUpdateControllerIndex)
{
//只有这里才会更新Scale
NBPostProcessingManager.material.SetVector(_distortSpeedTextureStID, distortSpeedTexSt);
}
NBPostProcessingManager.distortSpeedIntensity =
Mathf.Max(NBPostProcessingManager.distortSpeedIntensity, distortSpeedIntensity);
NBPostProcessingManager.distortSpeedPosition =
Mathf.Max(NBPostProcessingManager.distortSpeedPosition, distortSpeedPosition);
NBPostProcessingManager.distortSpeedRange =
Mathf.Max(NBPostProcessingManager.distortSpeedRange, distortSpeedRange);
NBPostProcessingManager.distortSpeedMoveSpeedX =
Mathf.Abs(NBPostProcessingManager.distortSpeedMoveSpeedX) > Mathf.Abs(distortSpeedMoveSpeedX)
? NBPostProcessingManager.distortSpeedMoveSpeedX
: distortSpeedMoveSpeedX;
NBPostProcessingManager.distortSpeedMoveSpeedY =
Mathf.Abs(NBPostProcessingManager.distortSpeedMoveSpeedY) > Mathf.Abs(distortSpeedMoveSpeed)
? NBPostProcessingManager.distortSpeedMoveSpeedY
: distortSpeedMoveSpeed;
}
#if CINIMACHINE_3_0
if (cameraShakeToggle)
{
PostProcessingManager.cameraShakeIntensity =
Mathf.Max(PostProcessingManager.cameraShakeIntensity, cameraShakeIntensity);
}
#endif
if (overlayTextureToggle)
{
if (index == NBPostProcessingManager.laseUpdateControllerIndex)
{
NBPostProcessingManager.material.SetVector(_overlayTextureStID, overlayTextureSt);
NBPostProcessingManager.material.SetVector(_textureOverlayMaskStProperty, overlayMaskTextureSt);
NBPostProcessingManager.material.SetVector(_textureOverlayAnimProperty,overlayTextureAnim);
}
NBPostProcessingManager.overlayTextureIntensity = Mathf.Max(NBPostProcessingManager.overlayTextureIntensity,
overlayTextureIntensity);
}
if (flashToggle)
{
NBPostProcessingManager.flashDesaturateIntensity =
Mathf.Max(NBPostProcessingManager.flashDesaturateIntensity, flashDeSaturateIntensity);
NBPostProcessingManager.flashInvertIntensity =
Mathf.Max(NBPostProcessingManager.flashInvertIntensity, flashInvertIntensity);
NBPostProcessingManager.flashContrast =
Mathf.Max(NBPostProcessingManager.flashContrast, flashContrast);
NBPostProcessingManager.flashColor = flashColor;
}
if (radialBlurToggle)
{
NBPostProcessingManager.radialBlurIntensity =
Mathf.Max(NBPostProcessingManager.radialBlurIntensity, radialBlurIntensity);
NBPostProcessingManager.radialBlurSampleCount = Mathf.Max(NBPostProcessingManager.radialBlurSampleCount,
radialBlurSampleCount);
NBPostProcessingManager.radialBlurPos = Mathf.Max(NBPostProcessingManager.radialBlurPos, radialBlurPos);
NBPostProcessingManager.radialBlurRange = Mathf.Max(NBPostProcessingManager.radialBlurRange, radialBlurRange);
}
if (vignetteToggle)
{
NBPostProcessingManager.vignetteIntensity =
Mathf.Max(NBPostProcessingManager.vignetteIntensity, vignetteIntensity);
NBPostProcessingManager.vignetteRoundness = Mathf.Max(NBPostProcessingManager.vignetteRoundness, vignetteRoundness);
NBPostProcessingManager.vignetteSmothness = Mathf.Max(NBPostProcessingManager.vignetteSmothness, vignetteSmothness);
if (index == NBPostProcessingManager.laseUpdateControllerIndex)
{
NBPostProcessingManager.material.SetColor(_vignetteColorID,vignetteColor);
}
}
}
void EndController()
{
ClearToggles();
_manager.EndController(this);
}
#if UNITY_EDITOR
[UnityEditor.MenuItem("GameObject/创建NB后处理特效")]
static void CreatMenu()
{
GameObject Effect = new GameObject();
Effect.name = "NBPostprocessController";
NBPostProcessingController controller = Effect.AddComponent<NBPostProcessingController>();
UnityEditor.Selection.activeObject = Effect;
}
void ControllerEditorUpdate()
{
if (!Application.isPlaying)
{
Update();
}
}
#endif
}