【问题标题】:How to use multiple player prefabs for Unity's new UNET?如何为 Unity 的新 UNET 使用多个播放器预制件?
【发布时间】:2017-11-22 20:45:40
【问题描述】:

是否有人在新的 Unity UNET Networking 上使用多个播放器预制件(例如具有不同预制件的不同角色类)?

【问题讨论】:

    标签: unity3d unity-networking


    【解决方案1】:

    终于搞定了! 非常感谢@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 未定义
    • MsgTypes 未定义,你在哪里调用 updatePC
    【解决方案2】:

    创建一个派生自内置 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

    【讨论】:

    • 感谢您的回复。
    • 我更新了代码以使用一个 selectedCharacter,你可以在玩家选择一个角色时设置它,但是你正在这样做。这有帮助吗?
    • 你试过这个代码吗?我认为 selectedCharacter 每次都与主机相同。
    猜你喜欢
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-25
    相关资源
    最近更新 更多