EveryDay.DevUp

[Unity] AssetPostprocessor (어셋 포스트 프로세서) - 어셋을 코드로 관리하기 본문

Unity/최적화

[Unity] AssetPostprocessor (어셋 포스트 프로세서) - 어셋을 코드로 관리하기

EveryDay.DevUp 2020. 6. 11. 21:48

게임 개발을 여러사람이 진행할 경우, 숙련도에 따라 어셋을 임포트할 때 정해둔 규칙을 따르지 않는 실수가 발생할 수 있다.
예를들어 ui 텍스쳐를 임포트할 때 read/write 옵션을 꺼야하는데 끄는 경우가 있을 수 있고, 텍스쳐 포맷을 잘 못 설정하는 경우가 발생할 수 있다.

개발 과정 중에 체크를 할 수 있다면 다행이지만, 사람은 누구나 실수를 할 수 있기 때문에 코드로 사람의 실수를 방어 할 필요가 있다.

프로젝트마다 정하는 규칙이 다르기때문에 해당 코드를 일반화하기는 어려울 것이다. 그래서 Unity는 어셋이 변경이 될 때 콜백을 받을 수 있도록 하였다.

콜백을 받으려면 AssetPostProcessor를 상속받아, 변경이 발생했을 때 콜백을 받을 수 있도록 어셋의 타입에 따른 함수를 정의하면 된다.

using UnityEditor;
using UnityEngine;

public class CheckAssetInvalid : AssetPostprocessor
{
	void OnPostprocessTexture(Texture2D texture)
	{
		TextureImporter textureImporter = (TextureImporter)assetImporter;

		if( textureImporter != null )
		{
			/// texture에 readable이 켜져있다면 끄도록 설정
			if( textureImporter.isReadable )
			{
				textureImporter.isReadable = false;
				Debug.LogWarning( " textureImporter.isReadable " );
			}

			/// texture에 경로가 "Assets/Texture/BG"라면 mipmap옵션을 켜줌
			if( assetPath.StartsWith( "Assets/Texture/BG" ) )
			{
				if( textureImporter.mipmapEnabled == false )
				{
					textureImporter.mipmapEnabled = true;
					Debug.LogWarning( " textureImporter.mipmapEnabled " );
				}
			}
		}
	}
}

[ Read/Write Enabled 를 해도 CheckAssetInvalid 코드에 의해 강제로 다시 false로 돌아감 ]
[ Asset의 Path로 구분하여 각기 다른 체크 사항을 설정할 수 있음 ]

Unity에서는 AssetPostprocessor의 다음과 같은 함수를 제공하고 있다. 

: 함수의 규칙을 간단히 살펴보면 OnPost는 변경이 완료 될 때 OnPre는 변경이 일어나기 직전이라는 것을 알 수 있고 OnPost/Pre Process뒤에는 Asset 의 타입이 오는 것을 알 수 있다.

: OnPost함수만을 사용해도 충분히 원하는 형태의 어셋 체크가 가능할 것으로 생각된다.

● Unity 에서 가이드하는 일반적인 어셋의 규칙

▶ Textures (텍스쳐 )

: Read/Write Enable 플래그는 옵션이 켜져있을 때 텍스쳐가 GPU 메모리, CPU가 접근 가능한 메모리에 중복으로 올라가기 때문에 메모리가 이중으로 소모된다. 텍스쳐 데이터를 조작하는 경우가 아니면 옵션을 꺼야 한다.

: 변동이 적은 Z뎁스를 가지는 경우 ( 예를 들어 UI ) 밉맵을 비활성화하면 활성화 했을 때보다 1/3의 메모리를 절약할 수 있다.

: 텍스쳐 압축은 프로젝트의 따라 다를 수 있지만, 하나의 프로젝트안에서는 대부분 압축 포맷이 동일하기 때문에 규칙을 정해서 압축을 할 수 있는게 좋다

: 텍스쳐의 크기를 제한하여, 비정상적으로 큰 텍스쳐가 생기지 않도록 한다.

▶ 모델

: 모델의 경우 Read/Write Enable 옵션이 켜져있는 것이 디폴트이기 때문에, 메시를 수정하지 않는 모델이라면 끌 수 있도록 설정하는 것이 좋다.

: 애니매이션이 필요하지 않는 모델이라면 모델의 리그를 비활성화 한다.

: 메시 렌더러에 불필요한 설정이 켜져 있는 경우 ( 쉐도우 캐스팅, 라이트 프로프 샘플링 ) 끌 수 있도록 한다.

▶ 오디오

: 프로젝트에서 정한 오디오의 비트레이트의 크기에 맞추어 비트레이트를 조절할 수 있도록 한다.

: 프로젝트에서 정한 오디오의 압축 포맷을 사용할 수 있도록 한다.

참고 자료 : https://docs.unity3d.com/kr/530/ScriptReference/AssetPostprocessor.html

 

Unity - 스크립팅 API: AssetPostprocessor

During model import the functions are called in the the following order: - OnPreprocessModel is called at the very beginning and you can override ModelImporter settings that are used for the whole model import process. - Once Meshes and Materials are impor

docs.unity3d.com

참고 자료 : https://docs.unity3d.com/kr/current/Manual/BestPracticeUnderstandingPerformanceInUnity4.html

 

에셋 검사 - Unity 매뉴얼

실제 프로젝트에서 발생하는 문제는 대부분, 임시로 “테스트”하기 위한 변경을 방치하거나 지친 개발자의 클릭 실수로 성능 저하를 유발하는 에셋을 추가하거나, 기존 에셋의 임포트 설정을

docs.unity3d.com