using FishNet; using FishNet.Managing.Scened; using FishNet.Object; using UnityEngine; using UnityEngine.EventSystems; public class SceneLoader : MonoBehaviour, IPointerClickHandler { [SerializeField] private string sceneName; [SerializeField] public bool SceneStack; private int _stackedSceneHandle; private void Start() { InstanceFinder.SceneManager.OnLoadEnd += SceneManager_OnLoadEnd; } private void OnDestroy() { if (InstanceFinder.SceneManager != null) InstanceFinder.SceneManager.OnLoadEnd -= SceneManager_OnLoadEnd; } private void OnTriggerEnter(Collider other) { var nob = other.GetComponent(); if (nob != null && nob.IsOwner) LoadScene(nob); } public void OnPointerClick(PointerEventData eventData) { var nob = eventData.pointerCurrentRaycast.gameObject.GetComponent(); if (nob != null && nob.IsOwner) LoadScene(nob); } private void SceneManager_OnLoadEnd(SceneLoadEndEventArgs data) { if (!data.QueueData.AsServer) return; if (!SceneStack) return; if (_stackedSceneHandle != 0) return; if (data.LoadedScenes.Length > 0) _stackedSceneHandle = data.LoadedScenes[0].handle; } private void LoadScene(NetworkObject nob) { var sceneLoadData = new SceneLoadData(SceneLookupData.CreateData(sceneName)); sceneLoadData.ReplaceScenes = ReplaceOption.All; sceneLoadData.Options.AllowStacking = SceneStack; InstanceFinder.SceneManager.LoadConnectionScenes(nob.Owner, sceneLoadData); } public void UnloadScene() { // if (_stackedScenceHandle == 0) // return; // InstanceFinder.SceneManager.UnloadScene(_stackedScenceHandle); // _stackedScenceHandle = 0; } }