diff --git a/ADOFAIRenderer.csproj b/ADOFAIRenderer.csproj
index ce4984d..8bbe202 100644
--- a/ADOFAIRenderer.csproj
+++ b/ADOFAIRenderer.csproj
@@ -82,6 +82,9 @@
$(ADOFAI_PATH)\A Dance of Fire and Ice_Data\Managed\Newtonsoft.Json.dll
+
+ $(ADOFAI_PATH)\A Dance of Fire and Ice_Data\Managed\UniTask.dll
+
diff --git a/Core/PostRenderHook.cs b/Core/PostRenderHook.cs
index 2a86d4d..e8e49a9 100644
--- a/Core/PostRenderHook.cs
+++ b/Core/PostRenderHook.cs
@@ -1,5 +1,5 @@
-using System.Collections;
using System.Reflection;
+using Cysharp.Threading.Tasks;
using HarmonyLib;
using UnityEngine;
@@ -9,6 +9,7 @@ namespace ADOFAIRenderer.Core;
internal class PostRenderHook : MonoBehaviour
{
private FieldInfo? _camQuadMeshField;
+ private MeshRenderer? _camQuadMeshRenderer;
private void Awake()
{
@@ -20,15 +21,17 @@ internal class PostRenderHook : MonoBehaviour
if (RenderManager.Instance)
RenderManager.Instance.OnLastUpdate();
- StartCoroutine(PostFrameCoroutine());
+ PostFrameAsync().Forget();
}
- private IEnumerator PostFrameCoroutine()
+ private async UniTaskVoid PostFrameAsync()
{
- yield return new WaitForEndOfFrame();
+ await UniTask.WaitForEndOfFrame(this, destroyCancellationToken);
- var val = (MeshRenderer)_camQuadMeshField!.GetValue(scrCamera.instance);
- if (RenderManager.Instance)
- RenderManager.Instance.OnPostFrame(val.sharedMaterial.mainTexture as RenderTexture);
+ if (!_camQuadMeshRenderer && scrCamera.instance)
+ _camQuadMeshRenderer = _camQuadMeshField?.GetValue(scrCamera.instance) as MeshRenderer;
+
+ if (RenderManager.Instance && _camQuadMeshRenderer)
+ RenderManager.Instance.OnPostFrame(_camQuadMeshRenderer.sharedMaterial.mainTexture as RenderTexture);
}
-}
\ No newline at end of file
+}
diff --git a/Patch/Game/EndscreenLanternsPatch.cs b/Patch/Game/EndscreenLanternsPatch.cs
index 5ddb24d..86e69aa 100644
--- a/Patch/Game/EndscreenLanternsPatch.cs
+++ b/Patch/Game/EndscreenLanternsPatch.cs
@@ -40,7 +40,6 @@ public static class EndscreenLanternsPatch
for (var i = 0; i < lampSequencesArray.Length; i++)
{
var item = lampSequencesArray.GetValue(i);
- if (item == null) continue;
try
{
var killMethod = item.GetType().GetMethod("Kill", new[] { typeof(bool) });
diff --git a/Patch/Game/scnGamePatch.cs b/Patch/Game/scnGamePatch.cs
index 52dcd5c..34bdb3b 100644
--- a/Patch/Game/scnGamePatch.cs
+++ b/Patch/Game/scnGamePatch.cs
@@ -78,10 +78,8 @@ public static class scnGamePatch
{
// Remove FFmpeg player if it was attached previously
var oldPlayer = __instance.videoBG.gameObject.GetComponent();
- if (oldPlayer != null)
- {
- Object.Destroy(oldPlayer);
- }
+ if (oldPlayer) Object.Destroy(oldPlayer);
+
// Re-enable native player component
__instance.videoBG.enabled = true;
return true; // Execute original
@@ -125,8 +123,7 @@ public static class scnGamePatch
__instance.videoBG.enabled = false;
// Add or retrieve our custom FFmpeg video background player
- var player = __instance.videoBG.gameObject.GetComponent();
- if (player == null)
+ if (!__instance.videoBG.gameObject.TryGetComponent(out var player))
{
player = __instance.videoBG.gameObject.AddComponent();
}
@@ -134,7 +131,7 @@ public static class scnGamePatch
var isLooping = __instance.levelData.miscSettings.GetBool("loopVideo");
// Initialize player. If targetTexture is null (CameraFarPlane mode), it will build a quad in front of targetCamera.
- player.Init(videoPath, __instance.videoBG.targetTexture, isLooping, targetCamera, __instance.videoBG.gameObject);
+ player.Init(videoPath, __instance.videoBG?.targetTexture, isLooping, targetCamera, __instance.videoBG.gameObject);
return false; // Skip original UpdateVideo
}