You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
HighGroundRoyaleFusion/Assets/Photon/Fusion/Runtime/FusionAddressablePrefabsPre...

42 lines
1.6 KiB
C#

namespace Fusion {
using System.Collections.Generic;
using UnityEngine;
#if FUSION_ENABLE_ADDRESSABLES && !FUSION_DISABLE_ADDRESSABLES
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
#endif
public class FusionAddressablePrefabsPreloader : MonoBehaviour {
#if FUSION_ENABLE_ADDRESSABLES && !FUSION_DISABLE_ADDRESSABLES
private List<AsyncOperationHandle<GameObject>> _handles = new List<AsyncOperationHandle<GameObject>>();
private async System.Threading.Tasks.Task Start() {
var config = NetworkProjectConfig.Global;
// there are a few ways to load an asset with Addressables (by label, by IResourceLocation, by address etc.)
// but it seems that they're not fully interchangeable, i.e. loading by label will not make loading by address
// be reported as done immediately; hence the only way to preload an asset for Quantum is to replicate
// what it does internally, i.e. load with the very same parameters
foreach (var (id, source) in config.PrefabTable.GetEntries()) {
if (source is NetworkPrefabSourceAddressable addressable) {
// we can't just LoadAssetAsync() because source does it, too:
// https://forum.unity.com/threads/1-15-1-assetreference-not-allow-loadassetasync-twice.959910/
var key = addressable.Address.RuntimeKey;
var handle = Addressables.LoadAssetAsync<GameObject>(key);
await handle.Task;
_handles.Add(handle);
}
}
}
private void OnDestroy() {
foreach (var handle in _handles) {
Addressables.Release(handle);
}
}
#endif
}
}