[ * 필자 Unity 버전 == 2020.3.6f1 ]
https://docs.unity3d.com/kr/2021.1/Manual/class-SpriteAtlas.html
Sprite Atlas - 여러 개의 sprite(texture)를 하나의 texture로 결합해주는 아주 소듕한 Asset
* Sprite를 많이 사용하는 프로젝트에 용의 -> 2D 프로젝트가 아무래도 더 많이 사용하겠지
Unity는 scene의 각 texture에 대해 rendering 할 때마다 draw call을 발행
-> 많은 texture가 포함된 프로젝트의 경우 많은 draw call이 발생 -> 성능 저하
=> Sprite Atlas를 통해 여러 개의 draw call을 발생하는 대신 단일 texture를 호출 -> 하나의 draw call
https://docs.unity3d.com/kr/current/Manual/DrawCallBatching.html
* Draw call
- 간단히 게임 개발 성능에 있어서 굉장히 중요한 요소로서 cpu가 gpu에게 오브젝트를 그려달라고 명령하는 것
- 각기 다른 texture면 하나당 한번의 draw call이 발생
=> 여러 texture을 한 texture에 모아 두고 사용하면 한 번의 draw call로 여러 texture사용 가능
==> sprite atlas and sprite sheet 사용해야 함
Sprite Atlas 간단히 살펴보자
먼저
https://docs.unity3d.com/2021.1/Documentation/Manual/SpritePacker.html
Atlas를 플레이 모드와 빌드에 사용하기 위해 설정
* 아래 보이는 V2는 아직 version 2인데 아직 실험적이어서 안정화될 때 까 진 V1 사용하는 게 좋을 듯
2D SpriteShape package가 있어야 Create sprite atlas asset을 할 수 있음
8개의 sprite를 배치한 상태
Stats를 클릭하여 상태를 보면 Batches 부분이 9로 된 것을 볼 수 있음 (1개는 배경)
* 잠시 알고 집 고갈 것 == Batch - Draw Call을 하면서 생기는 모든 작업들을 통합한 것
예전에는 Batches가 아니라 DrawCall을 보여줬는데 변경됨 -> 어쨌든 draw call을 줄여야 -> Batches도 줄일 수 있음
이제 Sprite Atlas를 만들어서 효과를 보도록 하자
Package를 잘 추가했으면 이렇게 Create menu에 보일 것
만든 atlas에 sprite를 추가하는데
하나하나 추가하지 말고 Inspector window lock 걸고 옮기고 싶은 거 통째로 편하게 옮기자
* 한 폴더 안에 있는 sprite들을 모두 옮기려면 그냥 폴더 하나를 drag and drop해도 됨 (물론 sprite sheet도 가능)
* 기본 sprite 설정 당연히 가능하고 Preview로 미리 보기!
여기서 Atlas의 property를 보면 (sprite atlas 매뉴얼에 설명이 친절하게 되어있지만)
Type
- 타입을 Master 또는 Variant로 설정
- Master가 default
- Variant의 경우 Unity가 추가 프로퍼티 설정을 표시합니다. (해상도 적용하기에 유리)
https://docs.unity3d.com/kr/2021.1/Manual/MasterVariantAtlases.html
* 마스터 아틀라스의 콘텐츠 복사본을 받아 자체 콘텐츠로 사용
위처럼 처음에 만든 Test_SpriteAtlas를 가져와서 Scale을 낮춰서 사용
Include in Build
- 빌드에 포함시키려면 체크
Allow Rotation
- Unity가 sprite를 sprite atlas에 패킹할 때 sprite가 회전하도록 허용하려면 체크
- 결합된 texture의 sprite 밀도를 극대화 가능
- But sprite atlas에 canvas ui 요소 texture가 있는 경우 이 옵션을 비활성화하라고 권유함
[ 패킹하는 동안 Unity가 sprite atlas의 texture를 회전할 때 씬의 방향도 같이 회전할 수 있다고 함 ]
Tight Packing
- 기본 직사각형 outline대신에 해당 sprite outline에 따라 sprite를 패킹하려면 체크
- 결합된 texture의 sprite 밀도를 극대화 가능
Padding - sprite atlas의 개별 sprite texture 사이에 있는 픽셀 수를 정의- sprite atlas에서 인접해 있는 sprite 간의 픽셀 중복을 방지하는 버퍼 역할
Read/Write Enabled
- 스크립트 함수(예: Texture2D.SetPixels 및 기타 Texture2D 함수)에서 텍스처 데이터에 액세스하도록 허용하려면 이 체크박스를 선택합니다. 이 프로퍼티를 활성화하면 Unity가 텍스처 데이터의 복사본을 생성합니다. 이 작업은 텍스처 에셋에 필요한 메모리 양을 두 배로 만들기 때문에 성능에 부정적 영향을 미칠 수 있습니다. 이 프로퍼티는 기본적으로 비활성화되어 있습니다. Unity는 다른 압축된 텍스처 타입을 읽을 수 없으므로 이 프로퍼티는 압축되지 않았거나 DXT 압축 방식으로 압축된 텍스처에만 유효합니다
Generate Mip Maps
- Mipmap 생성을 활성화하려면 체크
*https://docs.unity3d.com/kr/530/Manual/class-TextureImporter.html
[ Mipmap은 점진적으로 더 작게 한 사진 이미지를 여러 개 모은 목록이며, 이를 통해 실시간 3D 엔진의 퍼포먼스를 최적화합니다. 카메라에서 멀리 떨어진 오브젝트는 텍스처 작은 것을 사용합니다. 밉맵을 사용하면 33% 많은 메모리를 사용하지만, 사용하지 않으면 퍼포먼스의 손실이 현저해집니다. 게임의 텍스처에서는 항상 밉맵을 사용해야 하며, 유일한 예외는 작아질 수 없는 텍스처입니다 (예를 들어 .GUI 텍스처). ]
* 여러 사이즈의 texture을 통해 큰 사이즈를 굳이 사용할 필요가 없을 때 작은 사이즈를 사용할 수 있는 것
But 위 설명처럼 메모리 사용량은 증가하고 퍼포먼스는 좋아지는 이상한..? 홀홀
sRGB
- 감마 공간에 텍스처를 저장하려면 체크
* 감마 보정 시 원래 색보다 어둡게 처리되기 때문에 이미지 자체를 밝게 저장하기 위해
자세한 내용은
https://everyday-devup.tistory.com/60
을 참고
-> 너무 자세하게 잘 정리 해두심
Filter Mode
- 변환 과정에서 스트레치 될 때 Unity가 패킹된 텍스처를 필터링하는 방식을 선택
https://docs.unity3d.com/kr/current/Manual/class-TextureImporter.html
Point - 텍스처를 가까이에서 보면 블럭 현상이 나타남
Bilinear - 텍스처를 가까이에서 보면 흐릿하게 보임
Trilinear - 바이리니어와 유사하게 텍스처가 서로 다른 MIP 레벨 간에 흐릿하게 보임
Objects For Packing
- Unity가 이 리스트의 모든 항목을 현재 선택된 sprite atlas로 패킹함
wow 길다 길어..
+
* 뭐 이렇게 까진 거의 안 하겠지만 각 sprite에서 Sprite Editor - custom outline을 통해 빈 부분을 더 줄여줄 수 있긴 함
(물론 Tight Packing 체크되어있을 경우)
어쨌든 sprite atlas 만들고 나니 8개에 대한 sprite의 밴치가 1로 준거 확인
+
https://docs.unity3d.com/kr/2021.1/Manual/FrameDebugger.html
* Window - Analysis - Frame Debugger를 통해 draw call을 볼 수 있는데
위처럼 draw call의 정보를 볼 수 있고 프레임 재생을 제어할 수 있음
간단한 느낌은 이 정도이고
sprite atlas vs sprite sheet
이 내용도 좀 알아야 하는데 글을 보면 일단 둘 다 비슷한 느낌인데 가장 유심히 본 답변은
=>
/*
스프라이트 시트와 텍스처 아틀라스는 거의 동일합니다. 둘 다 비트맵 이미지 파일(jpg, png 등)이며 일반적으로 그리드에 여러 개의 작은 이미지가 포함되어 있으며 좌표로 개별 이미지를 찾는 소프트웨어/게임 엔진을 사용하여 인덱싱 되고 표시됩니다. 또한 둘 다 단일 파일의 관리 및 로드만 요구하여 리소스 관리를 단순화하고 드로우 콜을 줄이는 역할을 합니다.
이 시트/아틀라스에는 캐릭터의 프레임별 애니메이션(일반적으로 "스프라이트 시트"에 사용됨)과 벽의 텍스처로 타일링될 이미지(일명 "텍스처 아틀라스")가 있습니다.
차이점은 일반적으로 구현되는 방식인 것 같습니다. 다른 답변에서 알 수 있듯이 스프라이트 시트는 애니메이션이나 버튼용 2D 게임에서 자주 사용되는 반면 텍스처 아틀라스의 이미지는 메쉬 개체의 텍스처로 사용됩니다.
컨텍스트와 이미지에 표시되는 내용이 중요하지만 프로그램이 이미지를 관리하고 조작하는 방식도 중요합니다. 게임 엔진에서 스프라이트 시트로 사용되는 이미지 파일은 개별 이미지를 차례로 재생하여 애니메이션을 만들 수 있습니다. 그러나 동일한 엔진의 텍스처 아틀라스와 동일한 이미지 파일을 메시의 타일과 동일하게 사용하여 벽돌 벽을 만들 수 있습니다.
*/
요 답변이었다.
이렇게 길 줄 몰 랐 어
+
https://docs.unity3d.com/2021.1/Documentation/ScriptReference/U2D.SpriteAtlas.html
C# calss 내용!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.U2D; //SpriteAtlas class 사용
public class SpriteAtlasTest_ : MonoBehaviour
{
public SpriteAtlas _SA;
public Image testImg;
public Sprite bindsp;
[SerializeField]Sprite[] sp;
private void Start()
{
sp = new Sprite[_SA.spriteCount];
testImg.sprite = _SA.GetSprite("player_fly_f01");
_SA.GetSprites(sp);
StartCoroutine("showsprite", sp);
}
IEnumerator showsprite(Sprite[] sp)
{
foreach (Sprite _sp in sp)
{
testImg.sprite = _sp;
yield return new WaitForSeconds(1f);
}
}
}
간단히 사용해본.. 근데 이따위로 코드 짜면 안됨
'Unity > 개념 및 분석' 카테고리의 다른 글
Unity Presets_사전 설정_자주 사용하는 거 미리미리 설정해버려 (0) | 2021.07.13 |
---|---|
Unity ScriptableObject 간단 정리 (0) | 2021.07.12 |
Visual Effect Graph( -> Create VFX) 간단한 개념 (1) | 2021.07.06 |
Unity Timeline [간단한 사용방법부터 Custom Playable까지] (0) | 2021.07.02 |
Unity Cinemachine [코딩 없는 카메라 연출] (0) | 2021.06.30 |