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 }