using FishNet.Object; using GameKit.Utilities; using System.Collections.Generic; using UnityEngine; using UnityEngine.SceneManagement; namespace FishNet.Utility.Extension { public static class Scenes { /// /// Gets all NetworkObjects in a scene. /// /// Scene to get objects in. /// True to only return the first NetworkObject within an object chain. False will return nested NetworkObjects. /// ListCache of found NetworkObjects. /// public static void GetSceneNetworkObjects(Scene s, bool firstOnly, ref List result) { List nobCacheA = CollectionCaches.RetrieveList(); List nobCacheB = CollectionCaches.RetrieveList(); List gameObjectCache = CollectionCaches.RetrieveList(); //Iterate all root objects for the scene. s.GetRootGameObjects(gameObjectCache); foreach (GameObject go in gameObjectCache) { //Get NetworkObjects within children of each root. go.GetComponentsInChildren(true, nobCacheA); //If network objects are found. if (nobCacheA.Count > 0) { //Add only the first networkobject if (firstOnly) { /* The easiest way to see if a nob is nested is to * get nobs in parent and if the count is greater than 1, then * it is nested. The technique used here isn't exactly fast but * it will only occur during scene loads, so I'm trading off speed * for effort and readability. */ foreach (NetworkObject nob in nobCacheA) { nob.GetComponentsInParent(true, nobCacheB); //No extra nobs, only this one. if (nobCacheB.Count == 1) result.Add(nob); } } //Not first only, add them all. else { result.AddRange(nobCacheA); } } } } } }