简体   繁体   中英

Unity Mirror Networking InvalidCastException: Specified cast is not valid

I was trying to create a custom player spawner but keep running into the

"Specified cast is not valid

tried searching it online but all results were useless so hope someone here can help me.

The problem line:

NetworkServer.AddPlayerForConnection(conn, playerobject); 

....is were the error occurs. (Full error below)

Code:

public override void OnClientConnect(NetworkConnection conn)
{
    var connection = conn;
    connlist.Add(connection);

    if (!clientLoadedScene)
    {
        if (!NetworkClient.ready) NetworkClient.Ready();
        {
            GameObject playerobject = (GameObject)Instantiate(Player, new Vector3(0, 0, 0), new Quaternion(0, 0, 0, 0));
            playerobject.GetComponent<PlayerManager>().PlayerName = nameplayer;
            NetworkServer.AddPlayerForConnection(conn, playerobject);
            Debug.Log(nameplayer + " is spawned!");
        }
    }

    base.OnClientConnect(conn);
}

Error Full:

InvalidCastException: Specified cast is not valid. Mirror.NetworkIdentity.SetClientOwner (Mirror.NetworkConnection conn) (at Assets/Mirror/Runtime/NetworkIdentity.cs:250) Mirror.NetworkServer.AddPlayerForConnection (Mirror.NetworkConnection conn, UnityEngine.GameObject player) (at Assets/Mirror/Runtime/NetworkServer.cs:617) NetManager.OnClientConnect (Mirror.NetworkConnection conn) (at Assets/Scripts/NetManager.cs:58) Mirror.NetworkManager.OnClientAuthenticated (Mirror.NetworkConnection conn) (at Assets/Mirror/Runtime/NetworkManager.cs:1158) Mirror.NetworkManager.OnClientConnectInternal () (at Assets/Mirror/Runtime/NetworkManager.cs:1142) Mirror.LocalConnectionToServer.Update () (at Assets/Mirror/Runtime/LocalConnections.cs:84) Mirror.NetworkClient.NetworkLateUpdate () (at Assets/Mirror/Runtime/NetworkClient.cs:1249) Mirror.NetworkLoop.NetworkLateUpdate () (at Assets/Mirror/Runtime/NetworkLoop.cs:189)

I'm not exactly sure which line you're getting the error on but from what I can remember the Instantiate() method returns a GameObject so you wouldn't need to cast it, additionally you shouldn't be storing your connection var in a list if you intend to keep it, your revised code should be something like:

public override void OnClientConnect(NetworkConnection conn)
{
    connlist.Add(conn);

    if (!clientLoadedScene)
    {
        if (!NetworkClient.ready) NetworkClient.Ready();
        {
            var playerobject = Instantiate(Player, new Vector3(0, 0, 0), new Quaternion(0, 0, 0, 0));
            playerobject.GetComponent<PlayerManager>().PlayerName = nameplayer;
            NetworkServer.AddPlayerForConnection(conn, playerobject);
            Debug.Log(nameplayer + " is spawned!");
        }
    }

    base.OnClientConnect(conn);
}

我找到了一个解决方案,我将我的 Spawn 代码移到了一个函数,即 OnServerAddPlayer 而不是 OnClientConnect 它修复了所有问题并且效果惊人!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM