evershade/Assets/Scripts/SceneLoader.cs

67 lines
1.9 KiB
C#

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<NetworkObject>();
if (nob != null && nob.IsOwner) LoadScene(nob);
}
public void OnPointerClick(PointerEventData eventData)
{
var nob = eventData.pointerCurrentRaycast.gameObject.GetComponent<NetworkObject>();
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;
}
}