diff --git a/Assets/PerfectWorld/Resources/UI/PlayerPreviewPlaceholderRT.renderTexture b/Assets/PerfectWorld/Resources/UI/PlayerPreviewPlaceholderRT.renderTexture index 7592d2057b..156c3dcf16 100644 --- a/Assets/PerfectWorld/Resources/UI/PlayerPreviewPlaceholderRT.renderTexture +++ b/Assets/PerfectWorld/Resources/UI/PlayerPreviewPlaceholderRT.renderTexture @@ -16,7 +16,7 @@ RenderTexture: m_Height: 512 m_AntiAliasing: 1 m_MipCount: -1 - m_DepthStencilFormat: 0 + m_DepthStencilFormat: 90 m_ColorFormat: 12 m_MipMap: 0 m_GenerateMips: 1 diff --git a/Assets/PerfectWorld/Scripts/World/LitModelHolder.cs b/Assets/PerfectWorld/Scripts/World/LitModelHolder.cs index 305eb2e975..5bb46db8be 100644 --- a/Assets/PerfectWorld/Scripts/World/LitModelHolder.cs +++ b/Assets/PerfectWorld/Scripts/World/LitModelHolder.cs @@ -6,7 +6,7 @@ using BrewMonster.Scripts; using Cysharp.Threading.Tasks; using UnityEngine; -public class LitModelHolder : MonoBehaviour +public class LitModelHolder : MonoSingleton { [SerializeField] private AddressableObject[] addressableObjects; private CECHostPlayer _hostPlayer; @@ -23,7 +23,9 @@ public class LitModelHolder : MonoBehaviour [SerializeField] private int _maxUnloadsPerTick = 16; private int _scanIndex = 0; - private List _objectsToLoad = new List(); + + // this list is only available if we want to wait until all the objects are loaded. + private List _objectsToLoad = new List(); private List _objectsToUnload = new List(); private Vector3 _lastHostPos; @@ -80,7 +82,7 @@ public class LitModelHolder : MonoBehaviour await UniTask.DelayFrame(1); // wait for the host player to be initialized. - await TickStreaming(_hostPlayer.transform.position, immediateSqr, paddingSqr, destroyToken); + await TickStreaming(_hostPlayer.transform.position, immediateSqr, paddingSqr, true, destroyToken); } private async UniTask StreamByDistanceLoop(CancellationToken destroyToken) @@ -119,13 +121,13 @@ public class LitModelHolder : MonoBehaviour _hasLastHostPos = true; _lastHostPos = hostPos; - await TickStreaming(hostPos, immediateSqr, paddingSqr, destroyToken); + await TickStreaming(hostPos, immediateSqr, paddingSqr, false, destroyToken); await UniTask.Delay(intervalMs, cancellationToken: destroyToken); } } - private async UniTask TickStreaming(Vector3 hostPos, float immediateSqr, float paddingSqr, CancellationToken destroyToken) + private async UniTask TickStreaming(Vector3 hostPos, float immediateSqr, float paddingSqr, bool waitUntilFinished, CancellationToken destroyToken) { if (addressableObjects == null || addressableObjects.Length == 0) { @@ -160,6 +162,7 @@ public class LitModelHolder : MonoBehaviour if (!_currentObjectToCheck.IsLoaded && !_currentObjectToCheck.IsLoading) { _currentObjectToCheck.LoadAsset().Forget(); + _objectsToLoad.Add(_currentObjectToCheck); } } else if (distSqr > paddingSqr) @@ -176,6 +179,14 @@ public class LitModelHolder : MonoBehaviour { obj.UnloadAsset(); } + + while (!IsFinishedLoadingObjects() && waitUntilFinished) + { + await UniTask.DelayFrame(1, cancellationToken: destroyToken); + } + _objectsToLoad.Clear(); + + BMLogger.Log("[LitModelHolder] All objects are loaded."); } /// @@ -186,6 +197,30 @@ public class LitModelHolder : MonoBehaviour { return CECGameRun.Instance.GetHostPlayer(); } + + /// + /// Return True if all the objects that are needed to be loaded are loaded. + /// + /// + private bool IsFinishedLoadingObjects() + { + AddressableObject obj = null; + for (int i = 0; i < _objectsToLoad.Count; i++) + { + obj = _objectsToLoad[i]; + if (obj == null) + { + continue; + } + + if (!obj.IsLoaded && !obj.IsLoading) + { + return false; + } + } + + return true; + } private void OnDestroy() {