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
67 lines (56 loc) · 1.95 KB
/
PostProcessScene.cs
File metadata and controls
67 lines (56 loc) · 1.95 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
61
62
63
64
65
66
67
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()
{
// find all scene objects that have not been spawned yet
// TODO: long term, replace the means of finding candidate objects to repace FindObjectsOfType
var traverseSortedObjects = FindObjectsOfType<NetworkObject>().Where(x => x.IsSceneObject == null).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].NetworkInstanceId = i;
}
}
}
internal static class PrefabHelpers
{
internal static List<int> TraversedSiblingIndex(this NetworkObject networkObject)
{
var paths = new List<int>();
var transform = networkObject.transform;
while (transform != null)
{
paths.Add(transform.GetSiblingIndex());
transform = transform.parent;
}
paths.Reverse();
return paths;
}
}
}