forked from cgvr/DeltaVR
deltavr multiplayer 2.0
This commit is contained in:
76
Assets/FishNet/Runtime/Utility/Extension/Scene.cs
Normal file
76
Assets/FishNet/Runtime/Utility/Extension/Scene.cs
Normal file
@@ -0,0 +1,76 @@
|
||||
using FishNet.Object;
|
||||
using FishNet.Utility.Performance;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.SceneManagement;
|
||||
|
||||
namespace FishNet.Utility.Extension
|
||||
{
|
||||
|
||||
public static class SceneFN
|
||||
{
|
||||
#region Private.
|
||||
|
||||
/// <summary>
|
||||
/// Used for performance gains when getting objects.
|
||||
/// </summary>
|
||||
private static List<GameObject> _gameObjectList = new List<GameObject>();
|
||||
/// <summary>
|
||||
/// List for NetworkObjects.
|
||||
/// </summary>
|
||||
private static List<NetworkObject> _networkObjectListA = new List<NetworkObject>();
|
||||
/// <summary>
|
||||
/// List for NetworkObjects.
|
||||
/// </summary>
|
||||
private static List<NetworkObject> _networkObjectListB = new List<NetworkObject>();
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// Gets all NetworkObjects in a scene.
|
||||
/// </summary>
|
||||
/// <param name="s">Scene to get objects in.</param>
|
||||
/// <param name="firstOnly">True to only return the first NetworkObject within an object chain. False will return nested NetworkObjects.</param>
|
||||
/// <param name="cache">ListCache of found NetworkObjects.</param>
|
||||
/// <returns></returns>
|
||||
public static void GetSceneNetworkObjects(Scene s, bool firstOnly, out ListCache<NetworkObject> nobCache)
|
||||
{
|
||||
nobCache = ListCaches.GetNetworkObjectCache();
|
||||
//Iterate all root objects for the scene.
|
||||
s.GetRootGameObjects(_gameObjectList);
|
||||
foreach (GameObject go in _gameObjectList)
|
||||
{
|
||||
|
||||
//Get NetworkObjects within children of each root.
|
||||
go.GetComponentsInChildren<NetworkObject>(true, _networkObjectListA);
|
||||
//If network objects are found.
|
||||
if (_networkObjectListA.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 _networkObjectListA)
|
||||
{
|
||||
nob.GetComponentsInParent<NetworkObject>(true, _networkObjectListB);
|
||||
//No extra nobs, only this one.
|
||||
if (_networkObjectListB.Count == 1)
|
||||
nobCache.AddValue(nob);
|
||||
}
|
||||
}
|
||||
//Not first only, add them all.
|
||||
else
|
||||
{
|
||||
nobCache.AddValues(_networkObjectListA);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user