본문 바로가기
Works/Unity 3D

SoulLike 만들기 (3) -Postprocessing

by Vader87 2021. 8. 22.
반응형

게임 시작과 게임 오버시 효과를 추가한다.

FadeIn, FadeOut, GrayScale? 등의 효과를 Darksoul 영상을 참고하여 구현한다.

Postprocessing 적용이 필요하다.

Multi Scene 을 활용한 구조를 적용해 보려고 했는데 AddtiveScene 의 Camera 가 이전 Scene 의 Camera 를 가려버리는 이슈가 발생했다.

https://forum.unity.com/threads/how-to-set-up-a-camera-so-that-it-doesnt-clear-the-color-buffer.837961/

 

How to set up a camera so that it doesn't clear the color buffer?

Hello, I'm using Unity 2019.3.3f and the latest Universal RP 7.2.1. I have a camera stack set up - the base camera renders my level (layer Default),...

forum.unity.com

Camera 의 Background Type 에서 Uninitialized 를 설정하고 Editor 에서 원하는 결과대로 나오기에 기본 Camera 의 don't clear 와 같은 세팅이라고 생각했는데, Unity 쪽의 설명에 의하면 다른 기능이고 Divice 의 결과물이 다를 수 있는 것은 의도된 것이라 한다.

Renderer Type 이 Base 가 되는 Camera 는 무조건 한개만 존재해야 되고 이외에는 Override 로 설정해 Base Camera 의 Stack 에 추가해 사용해야 한다.

근데 URP 를 추가하고 작업을 하다보면 이 내용 말고도 Editor 와 Divice 에서 노출되는 결과가 다른 Case 가 많아서 애를 많이 먹게 되더라.

Color Filter 을 조절해 FadeIn, FadeOut 효과를 구현 하였고, Saturation 값을 조절해 화면을 회색으로 전환하는 효과를 구현 하였다.

public class InGameMain : MonoSingleton<InGameMain>
{
    [SerializeField]
    private Volume _postProcess = null;

    private ColorAdjustments _colorAdjustments = null;
    
    ...
    
    private void InitPostProcess()
    {
        var volumeProfile = _postProcess?.profile;
        if (!volumeProfile)
            throw new System.NullReferenceException(nameof(VolumeProfile));

        if (!volumeProfile.TryGet(out _colorAdjustments))
            throw new System.NullReferenceException(nameof(ColorAdjustments));
    }
    
    ...

    private IEnumerator RunFade(Color from, Color to)
    {
        var current = from;

        _colorAdjustments?.colorFilter.Override(current);

        var time = 0f;
        var r = 0f;

        while (time < FADE_TIME)
        {
            r = time / FADE_TIME;
            current = Color.Lerp(from, to, r);
            _colorAdjustments?.colorFilter.Override(current);

            yield return null;

            time += Time.deltaTime;
        }

        current = to;
        _colorAdjustments?.colorFilter.Override(current);

        _corRunFade = null;
    }
    
    ...
    
    public void NewGame()
    {
        _colorAdjustments?.saturation.Override(COLOR_ADJUSTMENTS_NEWGAME);
        ...
    }

    public void GameOver()
    {
        _colorAdjustments?.saturation.Override(COLOR_ADJUSTMENTS_GAMEOVER);
        ...
    }
}

 

참고로, Postprocessing 이 적용되는 카메라를 구분하고 싶으면 Volume Component 가 추가된 GameObject 의 Layer 를 설정하고 Camera 의 Volume Mask Layer 를 동일하게 변경한다.

하고싶은 것.

결과물. Saturation 값 조정이 UICamera 에는 적용되지 않아 UI 는 붉은색이 제대로 나오는 것을 볼 수 있다.

반응형

댓글