forked from Unity-Technologies/com.unity.netcode.gameobjects
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPostProcessScene.cs
More file actions
60 lines (48 loc) · 1.77 KB
/
PostProcessScene.cs
File metadata and controls
60 lines (48 loc) · 1.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System.Collections.Generic;
using System.Linq;
using MLAPI;
using UnityEditor.Callbacks;
using UnityEngine;
namespace UnityEditor
{
public class NetworkScenePostProcess : MonoBehaviour
{
[PostProcessScene(int.MaxValue)]
public static void ProcessScene()
{
List<NetworkedObject> traverseSortedObjects = MonoBehaviour.FindObjectsOfType<NetworkedObject>().ToList();
traverseSortedObjects.Sort((x, y) =>
{
List<int> xSiblingIndex = x.TraversedSiblingIndex();
List<int> ySiblingIndex = y.TraversedSiblingIndex();
while (xSiblingIndex.Count > 0 && ySiblingIndex.Count > 0)
{
if (xSiblingIndex[0] < ySiblingIndex[0])
return -1;
if (xSiblingIndex[0] > ySiblingIndex[0])
return 1;
xSiblingIndex.RemoveAt(0);
ySiblingIndex.RemoveAt(0);
}
return 0;
});
for (ulong i = 0; i < (ulong)traverseSortedObjects.Count; i++)
traverseSortedObjects[(int)i].NetworkedInstanceId = i;
}
}
internal static class PrefabHelpers
{
internal static List<int> TraversedSiblingIndex(this NetworkedObject networkedObject)
{
List<int> paths = new List<int>();
Transform transform = networkedObject.transform;
while (transform != null)
{
paths.Add(transform.GetSiblingIndex());
transform = transform.parent;
}
paths.Reverse();
return paths;
}
}
}