Summary
-
스크린 이펙트
(포스트 프로세싱)를 간단히 적용할 수 있게 해주는 애셋입니다. -
게임 오브젝트의 단순 활성화/비활성화 방식으로 스크린 이펙트를 적용/해제합니다.
-
시간에 따른 마테리얼 프로퍼티의 값 변화
애니메이션
을 쉽게 제작할 수 있습니다. -
유니티
타임라인
에도 손쉽게 연동할 수 있습니다. -
유니티 기본 렌더 파이프라인(Built-in Render Pipeline)에서 사용할 수 있습니다.
- SRP, URP, HDRP에서는 사용할 수 없습니다.
테스트 완료 에디터 버전
- 2018.3.14f1
- 2019.4.9f1
- 2020.3.14f1
- 2020.3.17f1
- 2021.1.16f1
Preview
[1] Demo 1 - 운석 낙하
- 사용된 스크린 이펙트
Demo 1 다운로드
[2] Demo 2 - 눈 깜빡깜빡
- 사용된 스크린 이펙트
[3] Component Preview
Download & Import
Screen Effect Controller
-
첨부 파일을 다운로드하고, 유니티 프로젝트가 켜져 있는 상태에서 실행합니다.
-
임포트 창이 나타나면
Import
버튼을 클릭하여 프로젝트에 임포트합니다.
추가 : 스크린 이펙트 쉐이더 모음집
-
지금까지 직접 만든 스크린 이펙트 쉐이더들을 모아 놓았습니다.
-
추후 조금씩 업데이트할 예정입니다.
스크린 이펙트 쉐이더 작성 방법
-
스크린 이펙트를 적용하기 위해서는 일정 조건에 부합하는 쉐이더를 작성해야 합니다.
-
스크린 이펙트는 다음과 같은 방식으로 적용됩니다.
- 쉐이더로부터
_MainTex
텍스쳐 프로퍼티가 있는지 확인합니다. _MainTex
텍스쳐 프로퍼티에 현재 렌더링되는 화면의 색상이 입력됩니다.- 이 때, 스크린의 UV가 해당 텍스쳐의 UV로 사용됩니다.
- 프래그먼트 쉐이더의 최종 출력이 화면에 렌더링됩니다.
- 정리하자면, 쉐이더의
_MainTex
프로퍼티에 스크린 색상이 입혀지고, 프래그먼트 쉐이더의 연산 결과가 다시 스크린에 입혀지는 간단한 흐름입니다.
[1] Image Effect Shader(Script)
-
유니티 엔진의
Project
윈도우에서 우클릭 -Create
-Shader
-Image Effect Shader
를 통해 새로운 이미지 이펙트 쉐이더를 생성합니다. -
그러면 다음과 같이 단순히 화면의 색상이 반전되는 프래그먼트 쉐이더를 확인할 수 있습니다.
1
2
3
4
5
6
7
fixed4 frag (v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
// just invert the colors
col.rgb = 1 - col.rgb;
return col;
}
_MainTex
를 샘플링하여 얻은 색상을 기반으로 연산을 적용하고,frag
함수의 리턴으로 내보냄으로써 원하는 스크린 효과를 만들 수 있습니다.
[2] Amplify Shader
- 유니티 엔진의
Project
윈도우에서 우클릭 -Create
-Amplify Shader
-Legacy
-Unlit
을 통해 새로운 쉐이더를 생성합니다.
에디터의 좌측 옵션에서 다음과 같이 설정합니다.
- Cull Mode :
Off
- ZWrite Mode :
Off
- ZTest Mode :
Always
-
새로운
Texture Sample
노드를 생성합니다. (단축키 :T
) -
이름을
MainTex
로 변경합니다. -
MainTex
노드의RGBA
출력을 마스터 노드의Frag Color
에 연결합니다. -
MainTex
노드의 색상을 기반으로 연산을 적용한 뒤Frag Color
에 최종 색상을 넣어주면 원하는 스크린 효과를 만들 수 있습니다.
사용 방법
[1] 스크린 이펙트 추가, 적용하기
-
하이라키 창에서 우클릭 -
Effects
-Screen Effect
를 클릭합니다. -
새로운 게임오브젝트가 생성되며,
ScreenEffect
컴포넌트가 추가됩니다. -
씬에 존재하는 카메라에
ScreenEffectController
컴포넌트가 자동으로 추가됩니다. -
생성된
ScreenEffect
컴포넌트의 Effect Material에 스크린 이펙트로 적용할 마테리얼을 넣어줍니다. -
해당 게임오브젝트를 활성화/비활성화 하거나 On/Off 버튼을 클릭함으로써 해당 스크린 이펙트를 적용/해제 할 수 있습니다.
[2] 하이라키 표시
- 현재 활성화된 스크린 이펙트는 하이라키 좌측에 하늘색 아이콘이 표시됩니다.
- 마테리얼 등록 시 쉐이더 이름이 게임오브젝트 이름에 함께 표시됩니다. (
Screen Effect [ShaderName]
) - 게임오브젝트 이름 우측에는 이펙트 적용 우선순위가 표시됩니다.
- 가장 우측에는 ON/OFF 버튼이 표시되며, 이를 클릭하여 간단히 활성화/비활성화할 수있습니다.
[3] 옵션 설정
- 마테리얼이 등록되지 않은 경우
- 마테리얼이 등록된 경우
- 지속 시간을 설정한 경우
- 시간 계산 방식을
프레임
으로 설정하고,기준 FPS 사용
에 체크한 경우
- On/Off 스위치
- 게임 오브젝트를 활성화/비활성화 합니다.
- 영어/한글 버튼
- 표시할 언어를 영어 또는 한글로 변경합니다.
- 이펙트 마테리얼
- 스크린 이펙트로 적용할 마테리얼을 등록합니다.
- 에러가 발생하거나 쉐이더에 변경사항이 생겼을 때
Reload
버튼을 클릭하면 데이터가 다시 로드됩니다.
- 우선순위
- 여러 개의 스크린 이펙트가 적용될 때, 이펙트가 적용될 순서를 결정합니다.
- 우선순위 값이 작을수록 화면에 먼저 적용됩니다.
- 우선순위 값은 하이라키의 ON/OFF 버튼 왼쪽에 표시됩니다.
- 시간 계산 방식
- 적용될 시간 계산 방식을
프레임
/시간(초)
중에 결정합니다. 프레임
을 선택한 경우, 매 프레임마다 애니메이션이 갱신됩니다.시간(초)
을 선택한 경우, 기기의 성능에 관계 없이 실제 시간을 기준으로 시간이 계산됩니다.
- 적용될 시간 계산 방식을
- 지속 시간
- 스크린 이펙트가 활성화된 이후 유지될 시간을 설정합니다.
- 0을 입력할 경우, 항상 지속되지만 프로퍼티 애니메이션을 사용할 수 없습니다.
- 지속 시간 변경 시 동작
- 프로퍼티 애니메이션이 존재하는 경우, 지속 시간을 변경했을 때 동작을 지정합니다.
시간 비율 유지
- 시간 비율을 유지한 채로 각 애니메이션 키의 시간 값을 변경합니다.
- 예시 : 지속 시간이 2초, 애니메이션 키가 0초, 1초, 2초에 있었을 경우, 지속 시간을 4초로 변경하면 각각 0초, 2초, 4초로 변경됩니다.
시간 값 유지
- 각 애니메이션 키의 시간 값을 그대로 유지한 채로 전체 지속 시간만 변경합니다.
- 지속 시간을 감소시켰을 경우, 지속 시간보다 큰 시간 값을 갖는 애니메이션 키는 제거됩니다.
- 예시 : 지속 시간이 4초, 애니메이션 키가 0초, 1초, 2초, 3초, 4초에 있었을 경우, 지속 시간을 2초로 변경하면 3초, 4초의 애니메이션 키는 제거됩니다.
- 기준 FPS 사용
- 시간 계산 방식을
프레임
으로 설정한 경우 사용할 수 있습니다. 기준 FPS 사용
에 체크 해제한 경우, 기기의 성능에 따라 다른 결과를 나타낼 수 있습니다.기준 FPS 사용
에 체크한 경우, 기기의 성능에 관계 없이 일정한 시간 동안 지속됩니다.
- 시간 계산 방식을
- 기준 FPS
- 시간 계산 방식을
프레임
으로 설정하고기준 FPS 사용
에 체크한 경우 설정할 수 있습니다. - 프레임 계산을 실제 시간에 동기화하기 위한
기준 FPS
값을 설정합니다. - 예를 들어 지속 프레임이
120프레임
, 기준 FPS가60
인 경우 기기의 성능에 관계 없이 항상2초
동안 지속됩니다. - 타임라인을 사용할 때, 타임라인의
Frame Rate
와 동일하게 설정하면 됩니다.
- 시간 계산 방식을
- 종료 동작
- 지속 시간이 모두 진행되고 수행될 동작을 선택합니다.
마지막 상태 유지
를 선택할 경우, 설정된 시간까지 진행되면 그 상태를 계속 유지합니다.비활성화
를 선택할 경우, 설정된 시간까지 진행되면 게임오브젝트가 비활성화됩니다.파괴
를 선택할 경우, 설정된 시간까지 진행되면 게임오브젝트가 파괴됩니다.반복
을 선택할 경우, 설정된 시간까지 진행되면 처음부터 다시 진행되며, 계속 반복합니다.
[4] 마테리얼 프로퍼티 목록
- 해당 마테리얼이 갖고 있는 프로퍼티의 목록을 표시합니다.
-
해당 이펙트 마테리얼의 프로퍼티 값을 언제든 수정할 수 있습니다.
[R]
버튼을 클릭할 경우 해당 프로퍼티의 값을 초기값으로 변경합니다.-
각 프로퍼티마다 우측의
[+]
버튼을 클릭하여 프로퍼티 애니메이션을 생성할 수 있습니다. - 애니메이션이 활성화된 프로퍼티의
[E]
버튼을 클릭할 경우, 애니메이션이 동작하지 않도록 비활성화합니다. - 애니메이션이 비활성화된 프로퍼티의
[D]
버튼을 클릭할 경우, 애니메이션이 동작하도록 활성화합니다. -
애니메이션이 등록된 프로퍼티의
[-]
버튼을 클릭할 경우, 해당 프로퍼티의 애니메이션이 제거됩니다. - 애니메이션이 존재하지 않는 프로퍼티는 하얀색으로 표시됩니다.
- 애니메이션이 존재하며, 활성화된 프로퍼티는 하늘색으로 표시됩니다.
- 애니메이션이 존재하지만 비활성화된 프로퍼티는 회색으로 표시됩니다.
[5] 프로퍼티 애니메이션
-
정해진 지속 시간 동안, 시간 진행에 따른 마테리얼 프로퍼티의 값 변화를 애니메이션으로 정의합니다.
-
타이틀 바의 좌측에는 프로퍼티의 이름과 타입이 표시됩니다.
Enabled
/Disabled
버튼을 클릭하여 애니메이션을 활성화/비활성화 할 수 있습니다.- 활성화된 애니메이션은 타이틀 바가 하늘색으로 표시됩니다.
-
비활성화된 애니메이션은 타이틀 바가 검은색으로 표시됩니다.
[-]
버튼을 클릭하여 해당 프로퍼티 애니메이션을 제거할 수 있습니다.
[5-1] 애니메이션 키 목록
- 애니메이션을 이루는 애니메이션 키 목록을 표시합니다.
- 쉐이더에서 직접 정의하기 힘든, 시간에 따른 값의 변화를 애니메이션을 통해 손쉽게 정의할 수 있습니다.
애니메이션 표시
/애니메이션 숨기기
버튼을 클릭하여 애니메이션 키 목록을 표시하거나 숨길 수 있습니다.- 각 애니메이션 키 사이사이의
[+]
버튼을 클릭하여, 해당 위치에 새로운 애니메이션 키를 추가할 수 있습니다. -
각 애니메이션 키 우측의
[-]
버튼을 클릭하여, 해당 키를 제거할 수 있습니다. - 각 애니메이션 키 우측의
[C]
버튼을 클릭할 경우, 해당 키의 프로퍼티 값을 복사합니다. - 이후
[P]
버튼을 누를 경우, 복사된 값을 해당 키에 붙여넣습니다. (타입이 일치해야 합니다.)
-
애니메이션 키의 사이에서, 해당 프로퍼티의 값은 선형 보간되어 적용됩니다.
-
예를 들어 위 애니메이션의 경우,
Range
프로퍼티의 값이 시간에 따라 다음과 같이 변화합니다.0.0초
~1.0초
: 값이0.0
에서부터0.5
까지 순차적으로 증가합니다.1.0초
~2.0초
: 값이0.5
에서부터0.0
까지 순차적으로 감소합니다.2.0초
~2.5초
: 값이0.0
에서부터1.0
까지 순차적으로 증가합니다.2.5초
~4.0초
: 값이1.0
에서부터0.0
까지 순차적으로 감소합니다.
[5-2] 애니메이션 그래프
-
현재 등록된 애니메이션 정보에 따라, 해당 프로퍼티 값의 변화를 그래프를 통해 시각적으로 확인할 수 있습니다.
-
그래프 내에 반투명한 실선을 통해 애니메이션 키가 표시됩니다.
-
그래프 하단에 각 키의
인덱스
또는시간
/프레임
이 표시됩니다. -
그래프 좌측 상단의 버튼을 클릭하여
인덱스
를 표시할지,시간
/프레임
을 표시할지 결정할 수 있습니다.
-
Vector
,Color
타입의 경우,X
,Y
,Z
,W
값의 변화를 각각의 그래프로 확인할 수 있습니다. -
X
,Y
,Z
,W
또는R
,G
,B
,A
토글 버튼을 클릭하여, 원하는 요소의 그래프만 필터링하여 표시할 수 있습니다.
추가 기능 : 키 이동, 추가, 삭제
- 그래프 하단의 키 부분을 마우스 좌클릭 및 드래그하여 좌우로 이동할 수 있습니다.
Control
키를 누른 채로 드래그할 경우, 시간은0.1
초, 프레임은10
단위로 이동합니다.Shift
키를 누른 채로 드래그할 경우, 시간은0.05
초, 프레임은5
단위로 이동합니다.
- 그래프 하단의 키 부분을 마우스 우클릭하여 해당 키를 제거할 수 있습니다.
- 그래프 하단에서 키가 없는 부분을 마우스 우클릭하여 새로운 키를 추가할 수 있습니다.
[5-3] 애니메이션 그라디언트
-
Color
타입의 경우, 우측 상단의그라디언트
/그래프
버튼을 클릭하여 색상 표시 방법을 변경할 수 있습니다. -
애니메이션 키의 개수가 8개를 초과하는 경우,
그라디언트
로 표시할 수 없습니다.
[6] 플레이모드 기능
-
지속 시간이 0보다 큰 경우에만 표시됩니다.
-
유니티 에디터가 플레이모드에 진입한 경우,
에디터 기능
탭에서 현재 경과 시간을 실시간으로 확인할 수 있습니다.
편집 모드
에 체크한 경우 시간 진행이 일시 정지되며, 슬라이더를 조작하여 원하는 시간으로 이동할 수 있습니다.
-
편집 모드
에 체크된 상태에서 각 애니메이션 그래프를 클릭하여 원하는 시간으로 이동할 수 있습니다. -
편집 모드
가 아닌 상태에서 각 애니메이션 그래프를 클릭한 경우,편집 모드
로 진입하며 시간 진행이 정지됩니다.
Animator Event Controller와 연동하기(예시)
- Animator Event Controller
- https://rito15.github.io/posts/unity-animator-event-controller/
- 애니메이터의 애니메이션 클립마다 원하는 프레임에 이펙트를 생성할 수 있는 애셋입니다.
[1] 스크린 이펙트 준비
-
하이라키 우클릭 -
Effects
-Screen Effect
를 통해 새로운 스크린 이펙트를 생성합니다. -
화면을 흔드는 효과가 구현된 Screen Shake 마테리얼을
이펙트 마테리얼
에 넣어줍니다. -
지속 시간을
0.3초
로 지정하고, 종료 동작을파괴
로 설정합니다. -
마테리얼 프로퍼티 목록에서 각 프로퍼티들을 원하는 값으로 설정합니다.
-
종료 동작이
파괴
이므로 게임 시작 후0.3초
가 지나면 게임오브젝트가 파괴됩니다.
따라서 원본 오브젝트가 파괴되지 않도록Off
를 클릭하여 게임오브젝트를 비활성화 상태로 만들어줍니다. -
비활성화 상태로 씬에 그대로 두어도 되고, 따로 프리팹으로 추출해도 됩니다.
[2] 애니메이션 제작
-
Sphere가 공중으로 뛰어올랐다가 바닥으로 착지하기를 반복하는 간단한 애니메이션을 제작합니다.
-
Animator Controller
를 생성하여 제작한 애니메이션 클립을 추가하고 시작 애니메이션으로 설정합니다. -
게임오브젝트에
Animator
컴포넌트를 추가하고,Controller
를 등록해줍니다.
[3] 애니메이터 이벤트 생성
Animator
컴포넌트에 우클릭하여Add Animator Event Controller
를 클릭하면Animator Event Controller
컴포넌트가 추가됩니다.
-
[+]
버튼을 클릭하여 새로운 이벤트를 추가합니다. -
프리팹 오브젝트
에 위에서 생성한Screen Shake
게임오브젝트를 드래그하여 넣어줍니다. -
생성 프레임을 알맞게 설정합니다. (땅에 찍는 순간인
79
프레임으로 설정하였습니다.)
[4] 결과 확인
- Sphere가 땅에 찍을 때마다
Screen Shake
이펙트 게임오브젝트가 생성되고,0.3초
후에 파괴되며 그동안 스크린 이펙트가 적용되는 것을 확인할 수 있습니다.
데모 씬 다운로드
-
반드시 Animator-Event-Controller 를 프로젝트에 임포트 완료한 상태에서 아래의 데모 씬을 임포트 해야 합니다.
타임라인과 연동하기(예시)
-
이 애셋은 게임오브젝트 활성화/비활성화 동작에 따라 스크린 이펙트가 적용/해제됩니다.
-
따라서 타임라인의
Activation Track
을 통해 편리하게 사용할 수 있습니다.
[1] Meteor 이펙트
-
파티클 시스템을 통해, 운석들이 낙하하는 이펙트를 제작합니다.
-
대략 2~3초간 지속됩니다.
[2] 스크린 이펙트 : Shake
-
화면이 흔들리는 단순한 이펙트입니다.
-
타임라인과 연동할 예정이므로, 시간 계산 방식을
프레임
으로 설정하고기준 FPS
를60
으로 지정합니다. -
타임라인에 의해 활성화/비활성화가 제어되므로 종료 동작 무엇이든 상관 없지만, 일단
비활성화
로 설정합니다. -
0프레임부터 180프레임까지
Shake Intensity
값이0
부터0.2
까지 증가하도록 애니메이션을 설정합니다. -
시간 흐름에 따라 흔들리는 강도가 점차 강해집니다.
-
Meteor
이펙트의 첫 운석이 땅에 처음 부딪히는 순간부터 마지막 운석이 부딪히는 순간까지Shake
이펙트가 동작하도록 할 예정이며, 구체적인 시간 조정은 타임라인 구성과 함께 할 것이므로, 일단 지속 시간을180
프레임으로 설정합니다.
[3] 스크린 이펙트 : Hexagonal Pattern
-
https://rito15.github.io/posts/unity-amplify-screen-hexagons/
-
마찬가지로 지속 시간은
180
프레임으로 대강 설정합니다. -
Hexagon
이펙트가Shake
이펙트로 인해 흔들리지 않도록, 우선순위를1
로 설정합니다. -
운석이 떨어지기 전에 이 스크린 이펙트가 화면 가장자리에서부터 화면을 뒤덮고,
운석이 모두 떨어지고 나서 화면에서 부드럽게 사라지도록 애니메이션을 제작할 것입니다. -
이펙트의 영역 크기에 영향을 주는 프로퍼티는
Area Range
,Area Power
입니다. -
두 프로퍼티에 대해 애니메이션을 제작합니다.
-
우선,
마테리얼 프로퍼티 목록
에서 두 프로퍼티의 우측[+]
버튼을 각각 클릭하여 애니메이션을 추가합니다. -
애니메이션 확인 및 수정은 플레이모드에 진입 후,
에디터 기능
-편집 모드
를 설정하여 진행하는 것이 좋습니다.
Area Range
프로퍼티에 대한 애니메이션을 위와 같이 제작합니다.
- 마찬가지로
Area Power
프로퍼티 애니메이션을 위와 같이 제작합니다.
- 위와 같은 결과를 확인할 수 있습니다.
[4] 타임라인 제작
-
빈 게임 오브젝트를 만들고, 이름을
Timeline
으로 변경합니다. -
Window
-Sequencing
-Timeline
을 통해 타임라인 윈도우를 엽니다. -
생성한 빈 게임오브젝트를 클릭한 상태로 타임라인 윈도우에서
Create
버튼을 클릭하여 새로운 타임라인 애셋을 생성합니다.
[+]
버튼을 클릭하여Activation Track
세 개를 생성합니다.
- 각각 씬에 있는
Meteor
,Shake
,Hexagon
이펙트 게임오브젝트들을 넣어줍니다.
-
각 트랙을 선택하여, 시작 프레임은
60
, 지속 프레임은180
으로 설정합니다. -
이 상태를 기점으로, 원하는 결과를 얻을 때까지
Shake
,Hexagon
이펙트의 시작 프레임과 지속 프레임을 변경하며 테스트합니다. -
트랙의 지속 프레임을 수정할 때마다, 해당
Screen Effect
의 지속 프레임도 함께 변경해주어야 합니다.
Screen Effect
의Activation Track
종료 부분이 타임라인의 마지막 시점과 일치하는 경우, 타임라인 종료와 동시에 다시 활성화되는 경우가 있습니다.
- 이럴 때는 위와 같이 타임라인의 눈금자 부분을 우클릭하여
Duration Mode
-Fixed Length
로 설정하고,
- 파란 선을 드래그하여 여유 있게 약간 우측으로 이동시켜주면 됩니다.
[5] 최종 결과
Meteor
- 시작 :60
, 지속 :180
(60 ~ 240)Shake
- 시작 :100
, 지속 :120
(100 ~ 220)Hexagon
- 시작 :40
, 지속 :220
(40 ~ 260)
Future Works
- SRP 지원
- 애니메이션 그라디언트 뷰 : 키 개수가 8개를 초과하는 경우에도 표시할 수 있는 커스텀 그라디언트 필드 구현