1
1
using System ;
2
2
using System . Collections ;
3
3
using System . Collections . Generic ;
4
- using System . Linq ;
5
4
using Unity . Netcode ;
6
- using UnityEditor ;
7
- using UnityEditor . SceneManagement ;
8
5
using UnityEngine ;
9
6
10
7
namespace Unity . Multiplayer . Samples . Utilities
@@ -14,36 +11,14 @@ namespace Unity.Multiplayer.Samples.Utilities
14
11
/// marked by a special tag, collects their Transform data, destroys their prefab instance, and performs the dynamic
15
12
/// spawning of said objects during Netcode for GameObject's (Netcode) OnNetworkSpawn() callback.
16
13
/// </summary>
17
- [ RequireComponent ( typeof ( NetcodeHooks ) ) ]
18
- public class NetworkObjectSpawner : MonoBehaviour
14
+ public class NetworkObjectSpawner : NetworkBehaviour
19
15
{
20
- [ SerializeField ]
21
- NetcodeHooks m_NetcodeHooks ;
22
-
23
- [ SerializeField ]
24
- SpawnObjectData m_SpawnObjectDataPrefab ;
25
-
26
16
[ SerializeField ]
27
17
List < SpawnObjectData > m_SpawnObjectData ;
28
18
29
- const string k_NetworkObjectSpawnerCollectableTag = "NetworkObjectSpawnerCollectable" ;
30
-
31
- void Awake ( )
32
- {
33
- m_NetcodeHooks . OnNetworkSpawnHook += OnNetworkSpawn ;
34
- }
35
-
36
- void OnDestroy ( )
37
- {
38
- if ( m_NetcodeHooks )
39
- {
40
- m_NetcodeHooks . OnNetworkSpawnHook -= OnNetworkSpawn ;
41
- }
42
- }
43
-
44
- void OnNetworkSpawn ( )
19
+ public override void OnNetworkSpawn ( )
45
20
{
46
- if ( ! NetworkManager . Singleton . IsServer )
21
+ if ( ! IsServer )
47
22
{
48
23
enabled = false ;
49
24
return ;
@@ -75,63 +50,5 @@ void SpawnNetworkObjects()
75
50
Destroy ( m_SpawnObjectData [ i ] . gameObject ) ;
76
51
}
77
52
}
78
-
79
- #if UNITY_EDITOR
80
- public void CollectTaggedPrefabInstances ( )
81
- {
82
- var prefabStage = PrefabStageUtility . GetPrefabStage ( gameObject ) ;
83
-
84
- var root = prefabStage . prefabContentsRoot ;
85
-
86
- var networkObjects = root . GetComponentsInChildren < NetworkObject > ( ) ;
87
- var taggedNetworkObjects = networkObjects . Where ( obj => obj . CompareTag ( k_NetworkObjectSpawnerCollectableTag ) ) ;
88
-
89
- foreach ( var editorOnlyObject in taggedNetworkObjects )
90
- {
91
- var pathToPrefab = PrefabUtility . GetPrefabAssetPathOfNearestInstanceRoot ( editorOnlyObject ) ;
92
- var original =
93
- PrefabUtility . GetCorrespondingObjectFromSourceAtPath ( editorOnlyObject , pathToPrefab ) ;
94
-
95
- var instantiated = PrefabUtility . InstantiatePrefab ( m_SpawnObjectDataPrefab . gameObject ) ;
96
- var instantiatedPrefab = instantiated as GameObject ;
97
-
98
- if ( instantiatedPrefab )
99
- {
100
- instantiatedPrefab . transform . SetPositionAndRotation ( editorOnlyObject . transform . position ,
101
- editorOnlyObject . transform . rotation ) ;
102
-
103
- instantiatedPrefab . transform . localScale = editorOnlyObject . transform . lossyScale ;
104
- instantiatedPrefab . transform . SetParent ( root . gameObject . transform ) ;
105
-
106
- var spawnedObjectData = instantiatedPrefab . GetComponent < SpawnObjectData > ( ) ;
107
- spawnedObjectData . prefabReference = original . gameObject ;
108
- instantiatedPrefab . name += $ "({ original . name } )";
109
-
110
- m_SpawnObjectData . Add ( spawnedObjectData ) ;
111
-
112
- // destroy scene prefab instance
113
- DestroyImmediate ( editorOnlyObject . gameObject , true ) ;
114
-
115
- PrefabUtility . SaveAsPrefabAsset ( root , prefabStage . assetPath , out var success ) ;
116
- }
117
- }
118
- }
119
- }
120
-
121
- [ CustomEditor ( typeof ( NetworkObjectSpawner ) ) ]
122
- public class NetworkObjectSpawnerEditor : Editor
123
- {
124
- public override void OnInspectorGUI ( )
125
- {
126
- DrawDefaultInspector ( ) ;
127
-
128
- var networkObjectSpawner = ( NetworkObjectSpawner ) target ;
129
- if ( PrefabStageUtility . GetCurrentPrefabStage ( ) &&
130
- GUILayout . Button ( "Collect tagged prefab instances" ) )
131
- {
132
- networkObjectSpawner . CollectTaggedPrefabInstances ( ) ;
133
- }
134
- }
135
53
}
136
- #endif
137
54
}
0 commit comments