私はスクリーンショットをとり、ファイルシステムに保存するコルーチンを持っています。しかし、コルーチンが実行されると、ゲームは一時的にフリーズし、event onFinishedScreenShot
は時期尚早に発火します。コルーチンがメインスレッドをブロックしています
私は、コルーチンは、「バックグラウンドスレッド上で」あったと思いました。
私のコードが終了すると、メインスレッドをブロックせずにスクリーンショットを保存し、event onFinishedScreenShot
火書き込みファイルAFTER を持って調整する方法はありますか?またはゲーム用のスクリーンショットを保存するより良い方法がありますか?あなたは、スクリプト内の循環参照を持っているので
MySingleton.cs
public event Action<string> onFinishedScreenShot;
public IEnumerator TakeScreenshot(string filename) {
Texture2D areaImage = new Texture2D(Screen.width, Screen.height, TextureFormat.RGB24, false);
yield return new WaitForEndOfFrame();
areaImage.ReadPixels(new Rect(0, 0, Screen.width, Screen.height), 0, 0, false);
areaImage.Apply();
byte[] bytes = areaImage.EncodeToPNG();
File.WriteAllBytes(filename, bytes);
if (onFinishedScreenShot != null) {
onFinishedScreenShot(filename);
}
}
AnotherClass.cs
private void Start() {
LoadTexture(someFileName);
}
public void SomeMethodInAnotherClass() {
StartCoroutine(MySingleton.TakeScreenshot(someFileName));
}
public void LoadTexture(string filename) {
if (!filename.Equals("NOT SET")) {
byte[] bytes = File.ReadAllBytes(GetSaveFilename(filename));
Texture2D texture = new Texture2D(500, 500, TextureFormat.DXT5, false);
texture.filterMode = FilterMode.Trilinear;
texture.LoadImage(bytes);
RectTransform rt = locationSnapShot.rectTransform;
Sprite sprite = Sprite.Create(texture, new Rect(0, 0, rt.rect.width, rt.rect.height), new Vector2(0.5f, 0.0f), 16.0f);
locationSnapShot.sprite = sprite;
Debug.Log("Removing event listener.");
MySingleton.onFinishedScreenShot -= LoadTexture;
} else {
Debug.Log("No screen shot. Listening for a change.");
MySingleton.onFinishedScreenShot += LoadTexture;
}
}
もう一度、あなたは私を理解して助けました!ありがとうございました! @Foggzie –
@ user-44651いつもお世話になります。 – Foggzie