Skip to content

Commit d08ea77

Browse files
networkobject spawner to work in prefab isolation mode
1 parent 9557ed2 commit d08ea77

File tree

9 files changed

+302
-2
lines changed

9 files changed

+302
-2
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
%YAML 1.1
2+
%TAG !u! tag:unity3d.com,2011:
3+
--- !u!1 &643456379411443853
4+
GameObject:
5+
m_ObjectHideFlags: 0
6+
m_CorrespondingSourceObject: {fileID: 0}
7+
m_PrefabInstance: {fileID: 0}
8+
m_PrefabAsset: {fileID: 0}
9+
serializedVersion: 6
10+
m_Component:
11+
- component: {fileID: 336282144275813181}
12+
- component: {fileID: -8472638279017472308}
13+
m_Layer: 0
14+
m_Name: NetworkObjectSpawnData
15+
m_TagString: Untagged
16+
m_Icon: {fileID: 0}
17+
m_NavMeshLayer: 0
18+
m_StaticEditorFlags: 0
19+
m_IsActive: 1
20+
--- !u!4 &336282144275813181
21+
Transform:
22+
m_ObjectHideFlags: 0
23+
m_CorrespondingSourceObject: {fileID: 0}
24+
m_PrefabInstance: {fileID: 0}
25+
m_PrefabAsset: {fileID: 0}
26+
m_GameObject: {fileID: 643456379411443853}
27+
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
28+
m_LocalPosition: {x: 0, y: 0, z: 0}
29+
m_LocalScale: {x: 1, y: 1, z: 1}
30+
m_ConstrainProportionsScale: 0
31+
m_Children: []
32+
m_Father: {fileID: 0}
33+
m_RootOrder: 0
34+
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
35+
--- !u!114 &-8472638279017472308
36+
MonoBehaviour:
37+
m_ObjectHideFlags: 0
38+
m_CorrespondingSourceObject: {fileID: 0}
39+
m_PrefabInstance: {fileID: 0}
40+
m_PrefabAsset: {fileID: 0}
41+
m_GameObject: {fileID: 643456379411443853}
42+
m_Enabled: 1
43+
m_EditorHideFlags: 0
44+
m_Script: {fileID: 11500000, guid: 27ddf7e7d1875d544ab28d60350d6f3d, type: 3}
45+
m_Name:
46+
m_EditorClassIdentifier:
47+
prefabReference: {fileID: 0}

Assets/Prefabs/Game/NetworkObjectSpawnData.prefab.meta

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
%YAML 1.1
2+
%TAG !u! tag:unity3d.com,2011:
3+
--- !u!1 &721719496969292127
4+
GameObject:
5+
m_ObjectHideFlags: 0
6+
m_CorrespondingSourceObject: {fileID: 0}
7+
m_PrefabInstance: {fileID: 0}
8+
m_PrefabAsset: {fileID: 0}
9+
serializedVersion: 6
10+
m_Component:
11+
- component: {fileID: 5747206859721612921}
12+
- component: {fileID: -5484724568297991178}
13+
- component: {fileID: 2681238421323495432}
14+
- component: {fileID: -6110993549598497440}
15+
m_Layer: 0
16+
m_Name: NetworkObjectSpawner
17+
m_TagString: Untagged
18+
m_Icon: {fileID: 0}
19+
m_NavMeshLayer: 0
20+
m_StaticEditorFlags: 0
21+
m_IsActive: 1
22+
--- !u!4 &5747206859721612921
23+
Transform:
24+
m_ObjectHideFlags: 0
25+
m_CorrespondingSourceObject: {fileID: 0}
26+
m_PrefabInstance: {fileID: 0}
27+
m_PrefabAsset: {fileID: 0}
28+
m_GameObject: {fileID: 721719496969292127}
29+
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
30+
m_LocalPosition: {x: 0, y: 0, z: 0}
31+
m_LocalScale: {x: 1, y: 1, z: 1}
32+
m_ConstrainProportionsScale: 0
33+
m_Children: []
34+
m_Father: {fileID: 0}
35+
m_RootOrder: 0
36+
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
37+
--- !u!114 &-5484724568297991178
38+
MonoBehaviour:
39+
m_ObjectHideFlags: 0
40+
m_CorrespondingSourceObject: {fileID: 0}
41+
m_PrefabInstance: {fileID: 0}
42+
m_PrefabAsset: {fileID: 0}
43+
m_GameObject: {fileID: 721719496969292127}
44+
m_Enabled: 1
45+
m_EditorHideFlags: 0
46+
m_Script: {fileID: 11500000, guid: d5a57f767e5e46a458fc5d3c628d0cbb, type: 3}
47+
m_Name:
48+
m_EditorClassIdentifier:
49+
GlobalObjectIdHash: 951099334
50+
AlwaysReplicateAsRoot: 0
51+
DontDestroyWithOwner: 0
52+
AutoObjectParentSync: 1
53+
--- !u!114 &2681238421323495432
54+
MonoBehaviour:
55+
m_ObjectHideFlags: 0
56+
m_CorrespondingSourceObject: {fileID: 0}
57+
m_PrefabInstance: {fileID: 0}
58+
m_PrefabAsset: {fileID: 0}
59+
m_GameObject: {fileID: 721719496969292127}
60+
m_Enabled: 1
61+
m_EditorHideFlags: 0
62+
m_Script: {fileID: 11500000, guid: 6aedfcf74b3f4f248897af16490caa9d, type: 3}
63+
m_Name:
64+
m_EditorClassIdentifier:
65+
--- !u!114 &-6110993549598497440
66+
MonoBehaviour:
67+
m_ObjectHideFlags: 0
68+
m_CorrespondingSourceObject: {fileID: 0}
69+
m_PrefabInstance: {fileID: 0}
70+
m_PrefabAsset: {fileID: 0}
71+
m_GameObject: {fileID: 721719496969292127}
72+
m_Enabled: 1
73+
m_EditorHideFlags: 0
74+
m_Script: {fileID: 11500000, guid: 40102bedb931e0b4ab8087df94ede8b5, type: 3}
75+
m_Name:
76+
m_EditorClassIdentifier:
77+
m_NetcodeHooks: {fileID: 2681238421323495432}
78+
m_SpawnObjectDataPrefab: {fileID: -8472638279017472308, guid: 95f831895b23a9e429f2b9fe75f9747d, type: 3}
79+
m_SpawnObjectData: []

Assets/Prefabs/Game/NetworkObjectSpawner.prefab.meta

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,129 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using Unity.Netcode;
5+
using UnityEditor;
6+
using UnityEditor.SceneManagement;
7+
using UnityEngine;
8+
9+
namespace Unity.Multiplayer.Samples.Utilities
10+
{
11+
/// <summary>
12+
/// Custom spawning component to be added to a scene GameObject. This component collects NetworkObjects in a scene
13+
/// marked by a special tag, collects their Transform data, destroys their prefab instance, and performs the dynamic
14+
/// spawning of said objects during Netcode for GameObject's OnNetworkSpawn() callback.
15+
/// </summary>
16+
[RequireComponent(typeof(NetcodeHooks))]
17+
public class NetworkObjectSpawner : MonoBehaviour
18+
{
19+
[SerializeField]
20+
NetcodeHooks m_NetcodeHooks;
21+
22+
[SerializeField]
23+
SpawnObjectData m_SpawnObjectDataPrefab;
24+
25+
[SerializeField]
26+
List<SpawnObjectData> m_SpawnObjectData;
27+
28+
const string k_NetworkObjectSpawnerCollectableTag = "NetworkObjectSpawnerCollectable";
29+
30+
void Start()
31+
{
32+
m_NetcodeHooks.OnNetworkSpawnHook += OnNetworkSpawn;
33+
}
34+
35+
void OnDestroy()
36+
{
37+
if (m_NetcodeHooks)
38+
{
39+
m_NetcodeHooks.OnNetworkSpawnHook -= OnNetworkSpawn;
40+
}
41+
}
42+
43+
void OnNetworkSpawn()
44+
{
45+
if (!NetworkManager.Singleton.IsServer)
46+
{
47+
enabled = false;
48+
return;
49+
}
50+
51+
SpawnNetworkObjects();
52+
}
53+
54+
void SpawnNetworkObjects()
55+
{
56+
for (int i = m_SpawnObjectData.Count - 1; i >= 0; i--)
57+
{
58+
var spawnedGameObject = Instantiate(m_SpawnObjectData[i].prefabReference,
59+
m_SpawnObjectData[i].transform.position,
60+
m_SpawnObjectData[i].transform.rotation);
61+
62+
spawnedGameObject.transform.localScale = m_SpawnObjectData[i].transform.lossyScale;
63+
var spawnedNetworkObject = spawnedGameObject.GetComponent<NetworkObject>();
64+
spawnedNetworkObject.Spawn();
65+
66+
Destroy(m_SpawnObjectData[i].gameObject);
67+
}
68+
}
69+
70+
#if UNITY_EDITOR
71+
[ContextMenu("Collect")]
72+
public void Collect()
73+
{
74+
var prefabStage = PrefabStageUtility.GetPrefabStage(gameObject);
75+
76+
var root = prefabStage.prefabContentsRoot;
77+
78+
var networkObjects = root.GetComponentsInChildren<NetworkObject>();
79+
var taggedNetworkObjects = networkObjects.Where(obj => obj.CompareTag(k_NetworkObjectSpawnerCollectableTag));
80+
81+
foreach (var editorOnlyObject in taggedNetworkObjects)
82+
{
83+
var pathToPrefab = PrefabUtility.GetPrefabAssetPathOfNearestInstanceRoot(editorOnlyObject);
84+
var original =
85+
PrefabUtility.GetCorrespondingObjectFromSourceAtPath(editorOnlyObject, pathToPrefab);
86+
87+
var instantiated = PrefabUtility.InstantiatePrefab(m_SpawnObjectDataPrefab.gameObject);
88+
var instantiatedPrefab = instantiated as GameObject;
89+
90+
if (instantiatedPrefab)
91+
{
92+
instantiatedPrefab.transform.SetPositionAndRotation(editorOnlyObject.transform.position,
93+
editorOnlyObject.transform.rotation);
94+
95+
instantiatedPrefab.transform.localScale = editorOnlyObject.transform.lossyScale;
96+
instantiatedPrefab.transform.SetParent(root.gameObject.transform);
97+
98+
var spawnedObjectData = instantiatedPrefab.GetComponent<SpawnObjectData>();
99+
spawnedObjectData.prefabReference = original.gameObject;
100+
instantiatedPrefab.name += $"({original.name})";
101+
102+
m_SpawnObjectData.Add(spawnedObjectData);
103+
104+
// destroy scene prefab instance
105+
DestroyImmediate(editorOnlyObject.gameObject, true);
106+
107+
PrefabUtility.SaveAsPrefabAsset(root, prefabStage.assetPath, out var success);
108+
}
109+
}
110+
}
111+
}
112+
113+
[CustomEditor(typeof(NetworkObjectSpawner))]
114+
public class NetworkObjectSpawnerEditor : Editor
115+
{
116+
public override void OnInspectorGUI()
117+
{
118+
DrawDefaultInspector();
119+
120+
var networkObjectSpawner = (NetworkObjectSpawner)target;
121+
if (PrefabStageUtility.GetCurrentPrefabStage() &&
122+
GUILayout.Button("Collect tagged prefab instances"))
123+
{
124+
networkObjectSpawner.Collect();
125+
}
126+
}
127+
}
128+
#endif
129+
}

Packages/com.unity.multiplayer.samples.coop/Utilities/Net/NetworkObjectSpawner.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using UnityEngine;
2+
3+
namespace Unity.Multiplayer.Samples.Utilities
4+
{
5+
public class SpawnObjectData : MonoBehaviour
6+
{
7+
public GameObject prefabReference;
8+
}
9+
}

Packages/com.unity.multiplayer.samples.coop/Utilities/Net/SpawnObjectData.cs.meta

Lines changed: 11 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

ProjectSettings/TagManager.asset

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
version https://git-lfs.github.com/spec/v1
2-
oid sha256:1c302ed0d6f2d3598ddfed9e8f6c6ed93834c7b722df1a4de68c0f52cfab278d
3-
size 653
2+
oid sha256:1ee65c231d68b7b0c9b8b6e81f6f20e57876baa2db37ceb3119ff37e45a19394
3+
size 689

0 commit comments

Comments
 (0)