Minor fix
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using Darkmatter.Core.Contracts.Services.Capture;
|
||||
@@ -10,6 +11,19 @@ namespace Darkmatter.Services.Capture
|
||||
public async UniTask<byte[]> CapturePngAsync(GameObject captureObject, float scale,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var paperCanvas = GetRootCanvas(captureObject);
|
||||
var disabledCanvases = DisableOtherRootCanvases(paperCanvas);
|
||||
var cam = Camera.main;
|
||||
CameraClearFlags prevFlags = default;
|
||||
Color prevBg = default;
|
||||
if (cam != null)
|
||||
{
|
||||
prevFlags = cam.clearFlags;
|
||||
prevBg = cam.backgroundColor;
|
||||
cam.clearFlags = CameraClearFlags.SolidColor;
|
||||
cam.backgroundColor = new Color(0f, 0f, 0f, 0f);
|
||||
}
|
||||
|
||||
await UniTask.WaitForEndOfFrame(cancellationToken);
|
||||
|
||||
var fullScreen = ScreenCapture.CaptureScreenshotAsTexture();
|
||||
@@ -48,9 +62,35 @@ namespace Darkmatter.Services.Capture
|
||||
finally
|
||||
{
|
||||
Object.Destroy(fullScreen);
|
||||
foreach (var c in disabledCanvases) if (c != null) c.enabled = true;
|
||||
if (cam != null)
|
||||
{
|
||||
cam.clearFlags = prevFlags;
|
||||
cam.backgroundColor = prevBg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static Canvas GetRootCanvas(GameObject go)
|
||||
{
|
||||
if (go == null) return null;
|
||||
var c = go.GetComponentInParent<Canvas>();
|
||||
return c != null ? c.rootCanvas : null;
|
||||
}
|
||||
|
||||
private static List<Canvas> DisableOtherRootCanvases(Canvas keep)
|
||||
{
|
||||
var disabled = new List<Canvas>();
|
||||
var all = Object.FindObjectsByType<Canvas>(FindObjectsSortMode.None);
|
||||
foreach (var c in all)
|
||||
{
|
||||
if (c == null || !c.isRootCanvas || c == keep || !c.enabled) continue;
|
||||
c.enabled = false;
|
||||
disabled.Add(c);
|
||||
}
|
||||
return disabled;
|
||||
}
|
||||
|
||||
private static Rect ComputeCropRect(GameObject target, int screenW, int screenH)
|
||||
{
|
||||
if (target == null || target.transform is not RectTransform rt)
|
||||
|
||||
Reference in New Issue
Block a user