UI를 Unity로 캡처하지 않는 방법
물론 화면의 UI가 표시된 상태에서만 캡처할 수 있습니다.
이렇게 되면 포획 버튼으로 촬영할 때 촌스러운 이미지가 된다.
그걸 해결할 방법과 스크립트를 만들어 봤어요.
① UI 객체를 숨기고 캡처한 후 표시
처음 생각난 방법.
가벼운 것 같지만 이 방법을 눌렀을 때 사용자의 디스플레이에서 사라집니다
나는 반드시 서류를 검사함으로써 포획이 끝난 상황을 확인해야 한다고 생각한다
설치하기 전에 멈췄습니다.
②Camera→RenderTexture→Texture 2D→PNG
이것은 이번에 실시한 방법이다.
Canvas의 Render Mode가 "Screen Space-Overlay"인 경우
"UI를 촬영한 카메라와 게임한 카메라가 다르다"는 성질을 이용하다
Camera의 영상을 잠시 RenderTexture로 변환
→렌더링을 Texture 2D로 변환
→ Texture 2D를 PNG로 변환
→ 파일 쓰기
- 간섭 객체 삭제
이런 방법.
아래 사이트 등을 참고하면서 각본을 만들었다.
https://docs.unity3d.com/ScriptReference/Texture2D.EncodeToPNG.html
http://blog.livedoor.jp/ituki_yu/archives/27225941.html
ScreenShot.cs
using System.Collections;
using System.IO;
using System;
using UnityEngine.UI;
using UnityEngine;
public class ScreenShot : MonoBehaviour {
public Camera ArCam;
public void CaptchaScreen()
{
Texture2D screenShot = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
RenderTexture rt = new RenderTexture(screenShot.width, screenShot.height, 24);
RenderTexture prev = ArCam.targetTexture;
ArCam.targetTexture = rt;
ArCam.Render();
ArCam.targetTexture = prev;
RenderTexture.active = rt;
screenShot.ReadPixels(new Rect(0, 0, screenShot.width, screenShot.height), 0, 0);
screenShot.Apply();
byte[] bytes = screenShot.EncodeToPNG();
UnityEngine.Object.Destroy(screenShot);
string fileName = "cap_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".png";
File.WriteAllBytes(Application.persistentDataPath + "/" + fileName, bytes);
}
}
버튼과 결합하면, 이런 느낌의 포획은 촬영할 수 있다.
↓ 결과
※ 포획된 내용에 연연하지 마세요.
총결산
이러한 방법으로 UI 제외 캡처를 일시적으로 만들 수 있습니다.
스마트폰만 쓰면 동작이 한순간에 멈춘다.셔터 같은 동작까지 더하면 동작이 멈추는 것에 신경 쓰지 않을지도 모른다.
더 똑똑한 방법이 있을지도 몰라...?
Reference
이 문제에 관하여(UI를 Unity로 캡처하지 않는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/SARU_KABUTO/items/5a7d5178797614df896b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
이것은 이번에 실시한 방법이다.
Canvas의 Render Mode가 "Screen Space-Overlay"인 경우
"UI를 촬영한 카메라와 게임한 카메라가 다르다"는 성질을 이용하다
Camera의 영상을 잠시 RenderTexture로 변환
→렌더링을 Texture 2D로 변환
→ Texture 2D를 PNG로 변환
→ 파일 쓰기
- 간섭 객체 삭제
이런 방법.
아래 사이트 등을 참고하면서 각본을 만들었다.
https://docs.unity3d.com/ScriptReference/Texture2D.EncodeToPNG.html
http://blog.livedoor.jp/ituki_yu/archives/27225941.html
ScreenShot.cs
using System.Collections;
using System.IO;
using System;
using UnityEngine.UI;
using UnityEngine;
public class ScreenShot : MonoBehaviour {
public Camera ArCam;
public void CaptchaScreen()
{
Texture2D screenShot = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
RenderTexture rt = new RenderTexture(screenShot.width, screenShot.height, 24);
RenderTexture prev = ArCam.targetTexture;
ArCam.targetTexture = rt;
ArCam.Render();
ArCam.targetTexture = prev;
RenderTexture.active = rt;
screenShot.ReadPixels(new Rect(0, 0, screenShot.width, screenShot.height), 0, 0);
screenShot.Apply();
byte[] bytes = screenShot.EncodeToPNG();
UnityEngine.Object.Destroy(screenShot);
string fileName = "cap_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".png";
File.WriteAllBytes(Application.persistentDataPath + "/" + fileName, bytes);
}
}
버튼과 결합하면, 이런 느낌의 포획은 촬영할 수 있다.↓ 결과
※ 포획된 내용에 연연하지 마세요.
총결산
이러한 방법으로 UI 제외 캡처를 일시적으로 만들 수 있습니다.
스마트폰만 쓰면 동작이 한순간에 멈춘다.셔터 같은 동작까지 더하면 동작이 멈추는 것에 신경 쓰지 않을지도 모른다.
더 똑똑한 방법이 있을지도 몰라...?
Reference
이 문제에 관하여(UI를 Unity로 캡처하지 않는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/SARU_KABUTO/items/5a7d5178797614df896b
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(UI를 Unity로 캡처하지 않는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/SARU_KABUTO/items/5a7d5178797614df896b텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)