如何在Unity的新UNET中使用多个玩家预制件?

4

有人在新的Unity UNET网络中成功实现多个玩家预制件(例如不同的角色类别和不同的预制件)吗?

2个回答

5

终于让它工作了!非常感谢@ClausKleber在http://forum.unity3d.com/threads/how-to-set-individual-playerprefab-form-client-in-the-networkmanger.348337/#post-2256378提供的答案。

下面是编辑后的工作版本,可以使用网络管理器HUD创建和加入。

using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using UnityEngine.UI;

public class NetManagerCustom : NetworkManager
{
    // in the Network Manager component, you must put your player prefabs 
    // in the Spawn Info -> Registered Spawnable Prefabs section 
    public short playerPrefabIndex;


    public override void OnStartServer()
    {
        NetworkServer.RegisterHandler(MsgTypes.PlayerPrefab, OnResponsePrefab);
        base.OnStartServer();
    }

    public override void OnClientConnect(NetworkConnection conn)
    {
        client.RegisterHandler(MsgTypes.PlayerPrefab, OnRequestPrefab);
        base.OnClientConnect(conn);
    }

    private void OnRequestPrefab(NetworkMessage netMsg)
    {
        MsgTypes.PlayerPrefabMsg msg = new MsgTypes.PlayerPrefabMsg();
        msg.controllerID = netMsg.ReadMessage<MsgTypes.PlayerPrefabMsg>().controllerID;
        msg.prefabIndex = playerPrefabIndex;
        client.Send(MsgTypes.PlayerPrefab, msg);
    }

    private void OnResponsePrefab(NetworkMessage netMsg)
    {
        MsgTypes.PlayerPrefabMsg msg = netMsg.ReadMessage<MsgTypes.PlayerPrefabMsg>();  
        playerPrefab = spawnPrefabs[msg.prefabIndex];
        base.OnServerAddPlayer(netMsg.conn, msg.controllerID);
        Debug.Log(playerPrefab.name + " spawned!");
    }

    public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
    {
        MsgTypes.PlayerPrefabMsg msg = new MsgTypes.PlayerPrefabMsg();
        msg.controllerID = playerControllerId;
        NetworkServer.SendToClient(conn.connectionId, MsgTypes.PlayerPrefab, msg);
    }

    // I have put a toggle UI on gameObjects called PC1 and PC2 to select two different character types.
    // on toggle, this function is called, which updates the playerPrefabIndex
    // The index will be the number from the registered spawnable prefabs that 
    // you want for your player
    public void UpdatePC ()
    {
        if (GameObject.Find("PC1").GetComponent<Toggle>().isOn)
        {
            playerPrefabIndex = 3;
        }
        else if (GameObject.Find("PC2").GetComponent<Toggle>().isOn)
        {
            playerPrefabIndex= 4;
        }
    }
}

MsgTypes 未定义。 - Muhammad Faizan Khan
MsgTypes 未定义,您在哪里调用了 updatePC? - Muhammad Faizan Khan

0
创建一个新类,该类派生自内置的NetworkManager脚本。在其中,只需添加一些支持字段和OnServerAddPlayer()的重写即可。
[SerializeField] Vector3 playerSpawnPos;
[SerializeField] GameObject character1;
[SerializeField] GameObject character2;
// etc.

GameObject chosenCharacter; // character1, character2, etc.

// Instantiate whichever character the player chose and was assigned to chosenCharacter
public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId) {

    var player = (GameObject)GameObject.Instantiate(chosenCharacter, playerSpawnPos, Quaternion.identity);
    NetworkServer.AddPlayer(conn, player, playerControllerId);

}

参考资料:http://docs.unity3d.com/Manual/UNetManager.html


谢谢回复。 - Justin Hirsch
我更新了代码,使用了一个chosenCharacter,你可以在玩家选择角色时设置它,不管你是怎么做的。这样有帮助吗? - user3071284
你试过这段代码吗?我认为chosenCharacter每次都与主机相同。 - user1924375

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接