Unity-Technologies / com.unity.netcode.gameobjects

Netcode for GameObjects is a high-level netcode SDK that provides networking capabilities to GameObject/MonoBehaviour workflows within Unity and sits on top of underlying transport layer.
MIT License
2.15k stars 435 forks source link

Player spawn ignores position and rotation (connection approval) #3074

Closed SubatomicPlanets closed 3 weeks ago

SubatomicPlanets commented 1 month ago

When using connection approval and setting the players position and rotation, it doesn't work correctly. It always spawns at 0,0,0 with rotation 0,0,0.

I upgraded from 1.7.1 to 2.0.0, and everything seems to be working fine (not a complex project) except for the spawning of players. Obviously they should spawn at the position and rotation that I set.

Example:

Transform spawner = GameObject.FindGameObjectWithTag("Spawner").transform;
response.Approved = true;
response.CreatePlayerObject = true;
response.Position = spawner.position;
response.Rotation = spawner.rotation;

When adding Debug.Log to check the position and rotation, it prints the expected values (in my case, somewhere around 30, 60, 50 for position). This means the Transform spawner was found, and all of this is working. But when the player spawns, it's always at 0,0,0.

I tried different player prefabs and different settings, but nothing worked. I also just created a new project with the Bootstrap sample and just added this code to the BootstrapManager:

private void ApprovalCheck(NetworkManager.ConnectionApprovalRequest request, NetworkManager.ConnectionApprovalResponse response)
{
    response.Approved = true;
    response.CreatePlayerObject = true;
    response.Position = Vector3.one;
    Debug.Log(response.Position); //prints 1,1,1
    response.Rotation = Quaternion.identity;
}

and networkManager.ConnectionApprovalCallback += ApprovalCheck; before it starts the host on line 21. Then I also enabled connection approval on the network manager in the scene. I would expect the player to spawn at 1,1,1 but it spawns at 0,0,0.

I use Netcode 2.0.0 and Unity 6000.0.20f1 on Windows

SubatomicPlanets commented 1 month ago

I looked around the code trying to see what I could change and I think it might actually be a really simple fix. In the GetNetworkObjectToSpawn method in NetworkSpawnManager.cs on line 756 it says this: networkObject = UnityEngine.Object.Instantiate(networkPrefabReference).GetComponent<NetworkObject>(); I believe the fix could be as simple as changing this line to this: networkObject = UnityEngine.Object.Instantiate(networkPrefabReference, position, rotation).GetComponent<NetworkObject>();

I tested it using multiplayer play mode and it seemed to work.

NoelStephensUnity commented 1 month ago

You are indeed correct on this regression bug. I will have a PR up for this hopefully by today/tomorrow and it will be included in the v2.0.1 update.

Thank you for the follow up and the investigation you did (helped me quickly verify the bug with your findings).

SubatomicPlanets commented 1 month ago

Okay, great! Do you have any idea of when v2.0.1 will release?

NoelStephensUnity commented 1 month ago

Soon... I am not allowed to discuss actual dates but I can say within a few weeks from today. Until then, you can always replace your com.unity.netcode.gameobjects manifest.json file entry with this: "com.unity.netcode.gameobjects":"https://github.com/Unity-Technologies/com.unity.netcode.gameobjects.git?path=com.unity.netcode.gameobjects#develop-2.0.0",

That will provide you with the most recent fixes that have been merged for NGO v2. Once the new package update is released you can just update to that via the package manager.

SubatomicPlanets commented 3 weeks ago

This is now fixed in the newest version, closing this issue.