• 3-0) 유니티 에디터 -> Live2D 모델 -> 움직임이 안되는 버그(?)
    • 그냥, 빌드한번 하고 나면... (뭔가가 재조정 되는지) 그후엔 잘됨.
  • 3-1) 캔버스 UI 한 곳으로 모으기
    • Canvas 오브젝트의 "Render Mode" 를 'World Space' 으로 하니...
    • 응??? "Screen Space - Camera" 으로 ???
    • 하위의 UI 오브젝트들에 Canvas 컴포넌트 추가하여~ 우선순위 셋팅.
  • 3-2) 비디오 및 오디오 재생
    • 1안 : VideoPlayer vid 및 RawImage raw -> raw.texture = vid.texture -> vid.Play() 
    • 2안
      • Video Player 오브젝트 : "Render Mode" 를 'Texture' 으로 && "Audio Output" 을 'Audio Source' 으로
      • Texture 에셋 : 하나 생성한다. (wrap 등등 제공되는 옵션 활용가능!)
      • Audio Source 오브젝트 :  연결 및 튜닝
      • Raw Image 오브젝트 : 연결 및 튜닝
  • 3-3) Update 와 LateUpdate
    • https://docs.unity3d.com/kr/2021.3/Manual/ExecutionOrder.html
    • ...
  • 3-4) 타임 클래스
    • https://docs.unity3d.com/ScriptReference/Time.html 
    • Time.time=상대시간?, Time.deltaTime=프레임간 상대시간,Time.timeScale=상대시간 속도,
    • Time.unscaledTime=절대시간, Time.unscaledDeltaTime=프레임간 절대시간, 
    • Time.fixedDeltaTime=..., Time.fixedDeltaTime=TimeManager->FixedUpdate 호출주기,
      • 물리 효과와 다른 "고정 프레임율" 를 위한 업데이트 호출 ???
    • Time.timeSinceLevelLoad = 씬을 불러올때마다 초기화
    • Time.smoothDeltaTime = 과부하 -> 프레임 드랍 -> 델타커지는 현상을 스무스하게 해주는 !!!
    • Time.realtimeSinceStartup = 현실시간 (시스템 타이머로 계산되어~ 게임 비활성에도 흐름)
    • Time.frameCount
  • 3-5) timeScale 과 fps 
    •     x1     : (0)    (1)      (2)     (3)     (4)     (5)
    •     x2    : (0)(1)(2)(3)(4)(5)(6)(7)(8)(9)(10)
    • fps 30 :  [*]               [*]                [*]
    • fps 60 :  [*]    [*]       [*]     [*]      [*]      [*]
    • 즉, 2배 빨리하고 & 프레임을 2배 더 쌤플링하면~ 똑같은 절대시간동안에 2배 더 가져올수있다! 
  • 3-6) 각종 Wait ...
    • https://docs.unity3d.com/ScriptReference/WaitForEndOfFrame.html
      • yield return null : 다음 프레임까지 대기
      • yield return new WaitForSeconds(flaot) : 지정한 초 만큼 대기
      • yield return new WaitFixedUpdate() : 다음 FixedUpdate 까지 대기
      • yield return new WaitForEndOfFrame() : 모든 랜더링 작업이 끝날 때까지 대기
      • yield return startCoroutiune(string) : 다른 코루틴이 끝날 때까지 대기
      • yield return new www(string) : 웹 통신 작업이 끝날 때까지 대기
      • yield return new AsyncIoeration : 비동기 작업이 끝날 때까지 대기 (씬 로딩)
    • 서로다른 코루틴에서 WaitForEndOfFrame 할때, 한쪽이 밀리면? 다른쪽도 영향을 받는다?
    • StartCoroutine(aaa()) ->  aaa loop -> StartCoroutine(bbb()) : bbb() 가 느린게 왜? 영향을 주지???
      • bbb() ccc() ddd() ... -> ccc, ddd, ... 들은 자기할일 다하고 대기중 -> bbb 는 계속일중 이라면,
      • -> bbb 가 다 끝날때 까지~ 전체블락? 화면 랜더링이 안되는 식으로... 전체 LifeCycle 이 멈춤?
  • 3-7) 일시정지 
    • https://bluemeta.tistory.com/3
    • https://nanalistudios.tistory.com/11
  • 3-8) batchmode resolution
    • https://docs.unity3d.com/2021.3/Documentation/Manual/PlayerCommandLineArguments.html
    • 게임설정과 상관없이... 640 x 360 으로 고정되나 ???
    • Standalone Player 실행에서 -screen-width -screen-height 등의 옵션이 안먹이나...
    • 옛날엔 왜 해상도가 적용안되는 이슈를... 어떻게 해결했었다고 생각했던거지???
  • 3-9) Transparent Background Capture2 
    • https://gamedevbeginner.com/how-to-capture-the-screen-in-unity-3-methods
      • 메인 카메라 셋팅으로~
      • Culling Mask 에서 필요한 것들을 선택?
      • Clear 에서 DepthOnly 를 해라고 하는데... 잘안되 -> Color 한뒤~ 백그라운드를 직접 투명으로 함.
    • 여기에서도 "Unity Recorder" 는 editor 에서만 돌아가는데... 오히려 화면관련 작업에는 player 보다 더 좋다고 함!!
    • (왜냐면 실게임시에는 오히려! 다른 퍼포먼스도 고려해야 해서, 화면관련 작업에 특화 시킬수없는거 같다고)
    • Movie 으로 손쉽게 녹화 해도되고, Image Sequence 으로 더 원천적인 접근을 해도 됨.
    • 끝으로~ 다른 대안 : https://www.wildmagegames.com/ultimate-screenshot-creator-unity-3d-asset 등등등
  • 3-10) Unity Recorder
    • https://docs.unity3d.com/2021.3/Documentation/Manual/EditorCommandLineArguments.html
      • 음... 진짜 녹화를 전문적으로 할것이면, editor 으로 처리하는게 맞는듯! ㅎㄷㄷ
    • webm 등등 영상관련 다양한 기능 다 제공될듯?!
    • https://rainyrizzle.github.io/en/AdvancedManual/AD_UnityRecorder.html
    • https://matthewminer.com/2022/03/13/custom-encoder-for-unity-recorder
  • 3-11) ScreenShot
    • https://docs.unity3d.com/ScriptReference/ScreenCapture.html
    • https://docs.unity3d.com/ScriptReference/Time-captureDeltaTime.html
    • CaptureScreenshot : captureDeltaTime 을 사용해, 편하게 연사 가능? -> 투명배경처리 안되나?
    • CaptureScreenshotAsTexture : Texture2D 를 손쉽게? 최적화된?
    • CaptureScreenshotIntoRenderTexture : 이미지가... 뒤짐힘!? (단순 TextureFormat.ARGB32 RGBA32 실수?!)
      • (https://gist.github.com/unitycoder/9fbd682f7d250c016d6cc0d306290966 같이 픽셀계산은 너무 느렸음...)
  • 3-12) 비동기 프레임 캡쳐 처리를 위한 고민...
    • https://medium.com/google-developers/real-time-image-capture-in-unity-458de1364a4c
    • https://light11.hatenadiary.com/entry/2021/01/18/203431
    • .ReadPixels() 자체가 오래걸림 (C# Async File I/O 큰의미 없다?)
    • CopyTexture() 활용 -> 잘안됬음....
    • AsyncOperation 은 -> 음... 이건 아닌가?
    • AsyncGPUReadback 활용 -> 음... Request() 호출자체가 느림 -> 이게 무신 비동기 ??? ㅎㅎ;;;
      • //RenderTexture textureR = new RenderTexture(Screen.width, Screen.height, 24, RenderTextureFormat.ARGB32);
      • RenderTexture textureR = RenderTexture.GetTemporary(Screen.width, Screen.height, 24, RenderTextureFormat.ARGB32);
      • ScreenCapture.CaptureScreenshotIntoRenderTexture(textureR);
      • AsyncGPUReadback.Request(textureR, 0, TextureFormat.RGBA32, AsyncReadAndWrite);
      • ...
    • ;;;
  • 3-13) Frame By Frame Capture
    • n배속으로 동시에 여러게의 어플리케이션 띄우기 -> 렌더링 과부화가 일어나면서? 프레임드랍 이슈가 나지 않을까?
    • 그래서 안전하게... 프레임 단위로~ "프레임 대기 -> 일시정지 -> 캡쳐 -> 재개" 식으로 생각 했는데...
    • IEnumerator Speak(JObject sentence)
      {
      	float duration = (float)sentence["duration"];
      	float silence = (float)sentence["silence"];
      	// (4.12 + 0.5) * 30fps = 138.6장
      
      	int totalFrames = (int)((duration + silence) * 30);
      	for (int i = 0; i < totalFrames; ++i)
      	{
          	// 한 프레임 확보?
          	yield return new WaitForEndOfFrame();
              Pause();
      		yield return StartCoroutine(Capture(i));
              Resume();
      	}
      	
          yield break;
      }
      
      IEnumerator Capture(int i)
      {
      	Texture2D textureDD = ScreenCapture.CaptureScreenshotAsTexture();
      	byte[] bytes = textureDD.EncodeToPNG();
          string path = string.Format("{0:D4}", i) + ".png";
          File.WriteAllBytes(path, bytes);
          Texture2D.Destroy(textureDD);
          
          yield return new WaitForEndOfFrame();
      	yield return new WaitForEndOfFrame(); // 왜 두번하면 잘되는 느낌일까 ???
          
          yield break;
      }
    • ... 
  • 3-13) Frame By Frame Capture2
    • void Pause()
      {
          //Debug.Log("Pause() : frameCount=" + Time.frameCount);
      
          Time.timeScale = 0.0f;
          Time.fixedDeltaTime = 0.0f;
          //AudioListener.pause = true;
          audioSource.Pause();
          audioSource.pitch = 0.0f;
          audioSource.UnPause();
      }
      
      void Resume()
      {
          //Debug.Log("Resume() : frameCount=" + Time.frameCount);
      
          Time.timeScale = 1.0f * speed;
          Time.fixedDeltaTime = 0.02f * speed;
          //AudioListener.pause = false;
          //audioSource.Pause();
          audioSource.pitch = 1.0f * speed;
          //audioSource.UnPause();
      }
    • "일시정지 -> 재개" 반복을 하다보면... 오디오가 밀릴는 버그가 없을까?
      • audio 기능으론... Pause() 및 UnPause() 및 pitch = 0.0f 있었음! (pitch = -1.0f 하면 역재생 ㅎㄷㄷ)
      • 비디오 프래임 갯수를 정해놓고 처리하는 방식이라... 오디오 렌더링의 측면으로 영향을주는것 일까? 
    • 결과적으로 너무 비효율적임! 이 아이디어는 실패!!!
  • 3-14) Time-Scaled Frame Capture
    • 렌더링 과정에서 Texture2D 로 가져오게되면... 무조건 느리게 됨!!!
    • 즉, List<Texture2D> buffer; 를 쓰면 -> 딱 2배속 까지 렌더링 되는 수준
    • 그래서 RenderTexture 를 바로 메모리에 적제 하는식으로 코딩 해야함 -> 결과적으로 30배속도 된다고 함! ㅎㄷㄷ
    • 이후~ List<RenderTexture> buffer; 처리까지 빨리 해야됨
      • convert() -> Texture2D :  ???
      • encode() -> PNG : UniTask 으로 병렬처리?
    • ...

-끝-

'게임' 카테고리의 다른 글

unity4  (0) 2023.05.22
Live2D Cubism Components  (0) 2023.03.15
Live2D Cubism SDK  (0) 2022.10.28
Live2D Cubism  (0) 2022.08.28
Ready Player ME  (0) 2022.08.27

+ Recent posts