우당탕탕 개발일지
[Unity] ScreenShot 촬영 및 저장하기 본문
Unity 에서 제공하는 라이브러리인 ScreenCapture를 이용해 스크린샷을 찍고, 이를 저장하는 기능을 만들어보자. ScreenCapture의 공식 문서는 아래에 있다.
https://docs.unity3d.com/ScriptReference/ScreenCapture.CaptureScreenshot.html
private IEnumerator MakeScreenShot(Action<Texture2D> handler)
{
//close UI
yield return new WaitForEndOfFrame();
Texture2D screenShot = ScreenCapture.CaptureScreenshotAsTexture();
Texture2D newScreenShot = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
newScreenShot.SetPixels(screenShot.GetPixels());
newScreenShot.Apply();
//open UI
handler?.Invoke(newScreenShot);
}
스크린샷을 찍기 직전, 게임UI를 숨기고 Frame만큼의 딜레이를 준 후 스크린샷을 찍는것을 알 수 있다. 인게임만 스크린샷을 찍고싶기때문.
var texture = ScreenCapture.CaptureScreenshotAsTexture();
을 통해 texture를 얻을 수 있다. 그러나 나의 경우 유니티 에러인지 스크린샷이 뿌옇게 나오는 현상이 발생했다. 이를 해결하기 위해 새로운 newScreenShot
을 만들어 뿌연 현상을 제거하였다.
Texture 를 Sprite로 변경
Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f));
갤러리에 저장
PC와 모바일디바이스일대 서로 다르게 저장하는것을 구현하였다.
public void SaveGallery(Texture2D texture)
{
string timestamp = System.DateTime.Now.ToString("yyyy-MM-dd-HH-mm-ss");
string fileName = "BAMBOO-SCREENSHOT-" + timestamp + ".png";
#if UNITY_EDITOR
SaveGalleryForPC(fileName, texture);
#elif UNITY_IPHONE || UNITY_ANDROID
SaveGalleryForMobile(fileName, texture);
#else
SaveGalleryForPC(fileName,texture);
#endif
}
private void SaveGalleryForPC(string fileName, Texture2D texture)
{
var png = texture.EncodeToPNG();
string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads");
File.WriteAllBytes(path + fileName, png);
}
private void SaveGalleryForMobile(string fileName, Texture2D texture)
{
string albumName = "BAMBOO";
NativeGallery.Permission permission = NativeGallery.CheckPermission(NativeGallery.PermissionType.Write, NativeGallery.MediaType.Image);
if (permission == NativeGallery.Permission.Denied)
{
if (NativeGallery.CanOpenSettings())
{
NativeGallery.OpenSettings();
}
}
NativeGallery.SaveImageToGallery(texture, albumName, fileName, (success, path) =>
{
Debug.Log(success);
Debug.Log(path);
});
// cleanup
UnityEngine.Object.Destroy(texture);
}
'Unity' 카테고리의 다른 글
[Build Err] ClassNotFoundException: com.google.android.gms.ads.initialization (0) | 2024.11.14 |
---|---|
[Unity] 스크린샷 및 갤러리에 저장하기 (0) | 2024.05.08 |
[Unity] CSV 파일 파싱 및 자동 인스턴스화 구현 (advanced) (2) | 2024.03.06 |
[Unity] 카메라 Drag 이동/줌 및 Scroll 줌 구현 (0) | 2024.03.05 |
[Unity] IOS BuildErr : GoogleService-Info.plist file missing REVERSED_CLIENT_ID (0) | 2024.02.26 |