201 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			201 lines
		
	
	
		
			7.7 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using FishNet.Object;
 | |
| using FishNet.Serializing.Helping;
 | |
| using System.Collections.Generic;
 | |
| using System.IO;
 | |
| using UnityEngine.SceneManagement;
 | |
| 
 | |
| namespace FishNet.Managing.Scened
 | |
| {
 | |
|     /// <summary>
 | |
|     /// Data about which scenes to load.
 | |
|     /// </summary>
 | |
|     public class SceneLoadData
 | |
|     {
 | |
|         /// <summary>
 | |
|         /// When specified this scene will be set as the active scene after loading occurs.
 | |
|         /// </summary>
 | |
|         public SceneLookupData PreferredActiveScene = null;
 | |
|         /// <summary>
 | |
|         /// SceneLookupData for each scene to load.
 | |
|         /// </summary>
 | |
|         public SceneLookupData[] SceneLookupDatas = new SceneLookupData[0];
 | |
|         /// <summary>
 | |
|         /// NetworkObjects to move to the new scenes. Objects will be moved to the first scene.
 | |
|         /// </summary>
 | |
|         public NetworkObject[] MovedNetworkObjects = new NetworkObject[0];
 | |
|         /// <summary>
 | |
|         /// How to replace current scenes with new ones. When replacing scenes the first scene loaded will be set as the active scene, and the rest additive.
 | |
|         /// </summary>
 | |
|         public ReplaceOption ReplaceScenes = ReplaceOption.None;
 | |
|         /// <summary>
 | |
|         /// Parameters which may be set and will be included in load callbacks.
 | |
|         /// </summary>
 | |
|         public LoadParams Params = new LoadParams();
 | |
|         /// <summary>
 | |
|         /// Additional options to use for loaded scenes.
 | |
|         /// </summary>
 | |
|         public LoadOptions Options = new LoadOptions();
 | |
| 
 | |
|         public SceneLoadData() { }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="scene">Scene to load.</param>
 | |
|         public SceneLoadData(Scene scene) : this(new Scene[] { scene }, null) { }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="sceneName">Scene to load by name.</param>
 | |
|         public SceneLoadData(string sceneName) : this(new string[] { sceneName }, null) { }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="sceneHandle">Scene to load by handle.</param>
 | |
|         public SceneLoadData(int sceneHandle) : this(new int[] { sceneHandle }, null) { }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="sceneHandle">Scene to load by handle.</param>
 | |
|         /// <param name="sceneName">Scene to load by name.</param>
 | |
|         public SceneLoadData(int sceneHandle, string sceneName) : this(new SceneLookupData(sceneHandle, sceneName)) { }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="sceneLookupData">Scene to load by SceneLookupData.</param>
 | |
|         public SceneLoadData(SceneLookupData sceneLookupData) : this(new SceneLookupData[] { sceneLookupData }) { }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="scenes">Scenes to load.</param>
 | |
|         public SceneLoadData(List<Scene> scenes) : this(scenes.ToArray(), null) { }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="sceneNames">Scenes to load by name.</param>
 | |
|         public SceneLoadData(List<string> sceneNames) : this(sceneNames.ToArray(), null) { }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="sceneHandles">Scenes to load by handle.</param>
 | |
|         public SceneLoadData(List<int> sceneHandles) : this(sceneHandles.ToArray(), null) { }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="scenes">Scenes to load.</param>
 | |
|         public SceneLoadData(Scene[] scenes) : this(scenes, null) { }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="sceneNames">Scenes to load by name.</param>
 | |
|         public SceneLoadData(string[] sceneNames) : this(sceneNames, null) { }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="sceneHandles">Scenes to load by handle.</param>
 | |
|         public SceneLoadData(int[] sceneHandles) : this(sceneHandles, null) { }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="sceneLookupDatas">Scenes to load by SceneLookupDatas.</param>
 | |
|         public SceneLoadData(SceneLookupData[] sceneLookupDatas) : this(sceneLookupDatas, null) { }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="scene">Scene to load.</param>
 | |
|         /// <param name="movedNetworkObjects">NetworkObjects to move to the first specified scene.</param>
 | |
|         public SceneLoadData(Scene scene, NetworkObject[] movedNetworkObjects)
 | |
|         {
 | |
|             SceneLookupData data = SceneLookupData.CreateData(scene);
 | |
|             Construct(new SceneLookupData[] { data }, movedNetworkObjects);
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="scenes">Scenes to load.</param>
 | |
|         /// <param name="movedNetworkObjects">NetworkObjects to move to the first specified scene.</param>
 | |
|         public SceneLoadData(Scene[] scenes, NetworkObject[] movedNetworkObjects)
 | |
|         {
 | |
|             SceneLookupData[] datas = SceneLookupData.CreateData(scenes);
 | |
|             Construct(datas, movedNetworkObjects);
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="sceneNames">Scenes to load by Name.</param>
 | |
|         /// <param name="movedNetworkObjects">NetworkObjects to move to the first specified scene.</param>
 | |
|         public SceneLoadData(string[] sceneNames, NetworkObject[] movedNetworkObjects)
 | |
|         {
 | |
|             SceneLookupData[] datas = SceneLookupData.CreateData(sceneNames);
 | |
|             Construct(datas, movedNetworkObjects);
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="sceneHandles">Scenes to load by handle.</param>
 | |
|         /// <param name="movedNetworkObjects">NetworkObjects to move to the first specified scene.</param>
 | |
|         public SceneLoadData(int[] sceneHandles, NetworkObject[] movedNetworkObjects)
 | |
|         {
 | |
|             SceneLookupData[] datas = SceneLookupData.CreateData(sceneHandles);
 | |
|             Construct(datas, movedNetworkObjects);
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// 
 | |
|         /// </summary>
 | |
|         /// <param name="sceneLookupDatas">Scenes to load by SceneLookupDatas.</param>
 | |
|         /// <param name="movedNetworkObjects">NetworkObjects to move to the first specified scene.</param>
 | |
|         public SceneLoadData(SceneLookupData[] sceneLookupDatas, NetworkObject[] movedNetworkObjects)
 | |
|         {
 | |
|             Construct(sceneLookupDatas, movedNetworkObjects);
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Called at the end of every constructor.
 | |
|         /// </summary>
 | |
|         private void Construct(SceneLookupData[] datas, NetworkObject[] movedNetworkObjects)
 | |
|         {
 | |
|             SceneLookupDatas = datas;
 | |
|             if (movedNetworkObjects == null)
 | |
|                 movedNetworkObjects = new NetworkObject[0];
 | |
|             MovedNetworkObjects = movedNetworkObjects;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets the first Scene in SceneLookupDatas.
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         public Scene GetFirstLookupScene()
 | |
|         {
 | |
|             foreach (SceneLookupData sld in SceneLookupDatas)
 | |
|             {
 | |
|                 Scene result = sld.GetScene(out _);
 | |
|                 if (!string.IsNullOrEmpty(result.name))
 | |
|                     return result;
 | |
|             }
 | |
| 
 | |
|             return default;
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Returns if any data is invalid, such as null entries.
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         internal bool DataInvalid()
 | |
|         {
 | |
|             //Null values.
 | |
|             if (Params == null || MovedNetworkObjects == null || SceneLookupDatas == null ||
 | |
|                 Options == null)
 | |
|                 return true;
 | |
|             //No lookups.
 | |
|             if (SceneLookupDatas.Length == 0)
 | |
|                 return true;
 | |
| 
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
| 
 | |
|     }
 | |
| 
 | |
| 
 | |
| } |