Unity网络基础--封装一个网络管理类

将服务器和客户端封装为一个网络管理类

一、可以创建服务器,关闭服务器
二、乐意连接和断开服务器
三、客户端连接后实例化一个对象
四、客户端能够控制玩家移动并同步至服务器

Server端UI搭建(Text:提示框)

这里写图片描述

Server端具体代码如下

pubulic class ServerScripts:MonoBehaviour{
    public Text warnningText;//提示框
    public GameObject cubePrefab;//预设体

    void Awake()
    {
        Application.runInBackground = true;
    }

    public void StarServerAction()
    {
        //1.判断当前网络状态
        if(Network.peerType == NetworkPeerType.Server){
            warnningText.text += "服务器已经开启\n";
            return;
        }
        //开启服务器
        //(最大连接数,端口号,是否Nat)
        Network.InitializeServer(15,23456,false);
    }
    //服务器创建成功后的回调
    void OnServerInitialized()
    {
        warnningText.text += "服务器创建成功\n";
    }
    //有新玩家加入后的回调
    void OnPlayerConnected()
    {
        warnningText.text += "有新玩家连人\n";
    }

    //玩家与服务器断开连接后调用--触发在客户端
    //player代表掉线的玩家
    /*
     * NetworkPlayer
     * ipAddress :内网IP
     * port: 内网端口
     * GUID:当前游戏中游戏玩家的唯一ID
     * externIP:外网IP
     * externPort:外网端口
     * */
    void OnPlayerDisconnected(NetworkPlayer player)
    {
        warnningText.text += player.ipAddress+":玩家与服务器连接断开\n";
    }
    //在服务器端创建对象
    public void CreateObjectAction()
    {
        Network.Instantiate (cubePrefab, Vector3.zero, Quaternion.identity, 0);
    }
}

服务器端代码工作做完后,在Unity中关联对应按钮触发的事件并添加好控件和预设体.

Client端UI搭建
这里写图片描述

Client端的实现

public class ClientScripts : MonoBehaviour {
    public InputField ipInput;//IP输入
    public InputField portInput;//端口输入
    public Text warnningText;//提示Text
    public GameObject cubePrefab;//预设体

    void Awake()
    {
        Application.runInBackground = true;
    }

    //连接服务器
    public void ConnectToServerAction()
    {
        //判断当前网络状态
        if (Network.peerType == NetworkPeerType.Client) {
            warnningText.text += "已经连接了服务器\n";
            return;
        }

        //判断IP地址和端口是否为空
        if (ipInput.text.Length > 0 && portInput.text.Length > 0) {
            //连接指定IP地址和端口号的服务器
            Network.Connect (ipInput.text, int.Parse (portInput.text));
        } else {
            warnningText.text += "IP地址和端口号不能为空\n";
        }
    }

    //客户端连接服务器成功后的回调
    void OnConnectedToServer()
    {
        warnningText.text += "成功连接服务器\n";
    }

    //客户端连接服务器失败后的回调
    void OnFailedToConnect()
    {
        warnningText.text += "连接服务器失败\n";
    }

    public void BreakConnectAction()
    {
        //断开与服务器的连接
        Network.Disconnect();
    }

    void OnDisconnectedFromServer()
    {
        warnningText.text += "与服务器连接断开\n";
    }
    public void CreateObjectAction()
    {
        /*
         *NetworkView : 网络预设体必须添加的组件
         *用于同步预设体的信息:transfrom。刚体,脚本,Animator
         *每一个组件只能同步以上中的一个
         *每个网络预设体可以添加多个NetworkView组件
         * */
         //创建网络对象
         //(网络对象的预设体)
         Network.Instantiate(cubePrefab,Vector3.zero,Quaternion.identity,0);
    }
}

最后还需要给cubePrefab预设体添加移动的脚本,通过判读预设体拥有者(NetworkView.owner)是否和当前Network.player相同使得对象只能被它的所属者控制
测试结果:
服务器测试

客户端测试

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值