com.unity.netcode.gameobjects
com.unity.netcode.gameobjects copied to clipboard
SpawnManager.InstantiateAndSpawn doesn't Instantiate on Server
Description
SpawnManager.InstantiateAndSpawn doesn't instantiate the prefab when run on a server.
Reproduce Steps
- Add a cube to the scene with a Network Object component
- Create a prefab from that cube and add it to the Network Prefab list; remove the original from the scene
- Add an empty to the scene and add the following component:
using Unity.Netcode;
using UnityEngine;
[RequireComponent(typeof(NetworkObject))]
public class Spawner : NetworkBehaviour
{
public NetworkObject prefab;
public override void OnNetworkSpawn()
{
if (!IsServer)
{
return;
}
NetworkManager.SpawnManager.InstantiateAndSpawn(prefab);
NetworkManager.SpawnManager.InstantiateAndSpawn(prefab);
}
}
- Assign the cube prefab to the
Spawnercomponent - Start the project as a server (not host)
Actual Outcome
The cube prefab never gets instantiated, causing:
- No cubes get added to the scene/hierarchy
- (Inside the Editor only) The first
InstantiateAndSpawncauses the errorTransform resides in a Prefab asset and cannot be set to prevent data corruption - The second
InstatiateAndSpawncauses the errorSpawnStateException: Object is already spawned
Expected Outcome
Two cubes spawn.
Environment
- OS: Windows 10 (22H2)
- Unity Version: 2022.3.7f1
- Netcode Version: Release 1.8.1
@AsmPrgmC3 Indeed this does look like a bug and we need to make sure our integration tests includes testing server only. Unless you are using overrides for your prefabs, you can set forceOverride to true and it should when running as a server:
using Unity.Netcode;
using UnityEngine;
[RequireComponent(typeof(NetworkObject))]
public class Spawner : NetworkBehaviour
{
public NetworkObject prefab;
public override void OnNetworkSpawn()
{
if (!IsServer)
{
return;
}
NetworkManager.SpawnManager.InstantiateAndSpawn(prefab, forceOverride: true);
NetworkManager.SpawnManager.InstantiateAndSpawn(prefab, forceOverride: true);
}
}
This would be a temporary work around until the next update. The fix for this is pretty simple so I am going to go out on a limb and say the fix will be in the next update (whatever version we end up with that proceeds v1.9,1).
Thank you for the detailed information! ๐
@AsmPrgmC3 ์ค์ ๋ก ์ด๊ฒ์ ๋ฒ๊ทธ์ฒ๋ผ ๋ณด์ด๊ณ ํตํฉ ํ ์คํธ์ ํ ์คํธ ์๋ฒ๋ง ํฌํจ๋๋๋ก ํด์ผ ํฉ๋๋ค. ํ๋ฆฌํน์ ์ค๋ฒ๋ผ์ด๋๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ, forceOverride๋ฅผ true๋ก ์ค์ ํ ์ ์์ผ๋ฉฐ ์๋ฒ๋ก ์คํํ ๋ ์ค์ ํด์ผ ํฉ๋๋ค.
using Unity.Netcode; using UnityEngine; [RequireComponent(typeof(NetworkObject))] public class Spawner : NetworkBehaviour { public NetworkObject prefab; public override void OnNetworkSpawn() { if (!IsServer) { return; } NetworkManager.SpawnManager.InstantiateAndSpawn(prefab, forceOverride: true); NetworkManager.SpawnManager.InstantiateAndSpawn(prefab, forceOverride: true); } }์ด๊ฒ์ ๋ค์ ์ ๋ฐ์ดํธ๊น์ง ์์๋ก ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ์ ๋๋ค. ์ด ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ์ฑ ์ ๋งค์ฐ ๊ฐ๋จํ๋ฏ๋ก, ์ ๋ ๋ค์ ์ ๋ฐ์ดํธ( v1.9,1๋ก ์งํ๋ ๋ฒ์ )์ ํด๊ฒฐ์ฑ ์ด ํฌํจ๋ ๊ฒ์ด๋ผ๊ณ ๋จ์ธํฉ๋๋ค.
์์ธํ ์ ๋ณด ๊ฐ์ฌํฉ๋๋ค! ๐
I tested it, but it doesn't seem to have been fixed yet. Still have same bug. i have to set true for forceOverride parameter when running server.