Unity3d 有没有办法使用C#脚本在unity中更改主摄像头的饱和度?

Unity3d 有没有办法使用C#脚本在unity中更改主摄像头的饱和度?,unity3d,camera,Unity3d,Camera,我试图创造一种效果,相机在短时间内变为黑白,然后在2019年恢复正常。有人知道如何使用C脚本实现这一点吗?我会在您的项目中设置。之后,您可以直接设置,其中包含饱和度字段 所附图像显示了如何创建后处理配置文件。创建对象后,按照Unity的文档中的步骤进行操作 设置后处理之后,我将继续介绍如何在运行时编辑这些值。要淡入淡出这些值,请使用 如果所有这些都太复杂,还可以使用创建一个简单的淡入淡出,以及使用淡入淡出颜色的图像对象。您可以使其从Color.Clear淡入Color.White和/或Color

我试图创造一种效果,相机在短时间内变为黑白,然后在2019年恢复正常。有人知道如何使用C脚本实现这一点吗?

我会在您的项目中设置。之后,您可以直接设置,其中包含
饱和度
字段

所附图像显示了如何创建
后处理配置文件
。创建对象后,按照Unity的文档中的步骤进行操作

设置后处理之后,我将继续介绍如何在运行时编辑这些值。要淡入淡出这些值,请使用

如果所有这些都太复杂,还可以使用创建一个简单的淡入淡出,以及使用淡入淡出颜色的图像对象。您可以使其从
Color.Clear
淡入
Color.White
和/或
Color.Black


另一个选项是a,但此解决方案比其他两个方案复杂得多。

您可以使用
OnRenderImage
方法将材质附加到相机,然后根据需要修改材质值。这将允许您添加任何类型的效果,只要您有必要的着色器

解决方案 将以下脚本附加到
相机
,参考
材料
,并根据需要修改值:

using UnityEngine;

[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
public class CameraEffect : MonoBehaviour
{
    public Material material;

    private void OnRenderImage(RenderTexture source, RenderTexture destination)
    {
        if (material == null)
        {
            Graphics.Blit(source, destination);
            return;
        }

        Graphics.Blit(source, destination, material);
    }
}
例子 下面是一个示例脚本和一个着色器,它允许您将
摄影机
视图淡入黑色并返回。脚本需要使用下面提供的着色器的
材质

脚本(.cs) 着色器(.Shader)
using System;
using System.Collections;
using UnityEngine;

public class FadeTest : MonoBehaviour
{
    [SerializeField]
    private CameraEffect effect = null;

    [SerializeField]
    private float speed = 1f;

    private void Start()
    {
        StartCoroutine(FadeOutAndIn(() => 
            Debug.Log("Screen is dark now, fading back in")));
    }

    public IEnumerator FadeOutAndIn(Action midpointAction)
    {
        yield return FadeTowards(0f);
        midpointAction?.Invoke();
        yield return FadeTowards(1f);
    }

    private IEnumerator FadeTowards(float target)
    {
        float value = effect.material.GetFloat("_Value");

        while (value != target)
        {
            value = Mathf.MoveTowards(value, target, Time.deltaTime * speed);
            effect.material.SetFloat("_Value", value);

            yield return new WaitForEndOfFrame();
        }
    }
}
Shader "Custom/Dark"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Value ("Value", Range(0.0, 1.0)) = 0.0
    }
    SubShader
    {
        // No culling or depth
        Cull Off ZWrite Off ZTest Always

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            sampler2D _MainTex;
            float _Value;

            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 col = tex2D(_MainTex, i.uv);
                col.rgb = col.rgb * _Value;
                return col;
            }
            ENDCG
        }
    }
}