简单学过Socket的人都知道用Socket完成一个完整的游戏非常的困难,但如果只是想简单的完成一个传输,unity已经写好了一个非常实用的东西NetworkManager
对于初学者来说他还有一个很方便的ui和上面那个脚本放在一起就会出现一个效果
这里不做介绍,可以自己尝试,我们先来简单说明一下NMS(NetworkManagerScript)的组件有什么作用。
首先看到DontDestroyOnLoad,我们的脚本是添加在某个东西上的,然而切换场景的时候就会被Destroy掉,选了勾之后运行就会出现一个来防止被摧毁。
然后是officeScene和OnlineScene这其实是提供了一个简单的场景切换功能,office指的是没有建立连接时显示的场景,Online则是连接成功之后的场景,当然你自己做服务器创建主机的时候也算。
然后是SpawnInfo这个名字是真的奇怪,居然叫卵生,我也不是很懂到底是翻译的锅还是unity官方乱来,这里面的player Prefab顾名思义就是生成一个预设体,而且是只在联网状态下生成,所以预设体必须加入一个组件
才可以正常生成。
接下来我们来说说代码页的常规操作,我们以前实用Socket来实现连接的时候非常的麻烦而且还要写异步。
Server代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Net;
using System.Net.Sockets;
public class NetManagerScript : MonoBehaviour {
private byte[] buffer = new byte[1024];
// Use this for initialization
void Start () {
//开启异步
System.Action async= StartServer;
async.BeginInvoke(CloseAsync,async);
}
// Update is called once per frame
void Update () {
}
//开启服务器
private void StartServer()
{
//打开socket服务端接口, ipv4 stream流式传输 Tcp协议
Socket server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
//终端:IP+Port(端口)
IPEndPoint endPoint = new IPEndPoint(IPAddress.Any, 8888);
//绑定终端
server.Bind(endPoint);
//开启监听
server.Listen(10);
//开启异步监听
server.BeginAccept(AsynvAccept,server);
//不知道客户端会发送多少数据所以给的大一点
}
//关闭异步
void CloseAsync(System.IAsyncResult result)
{
//AsyncState指的就是BeginInvoke(CloseAsync,async)的async
System.Action async = result.AsyncState as System.Action;
async.EndInvoke(result);
}
//异步接受的回调
//异步接受客户端
void AsynvAccept(System.IAsyncResult result)
{
//获取服务器对象和客户端对象
Socket server = result.AsyncState as Socket;
Socket client = server.EndAccept(result);
//再次开启异步
server.BeginAccept(AsynvAccept, server);
//获取长度
//异步接受信息
client.BeginReceive(buffer,0,buffer.Length,SocketFlags.None, AsyncReceive, client);
string msg = System.Text.Encoding.UTF8.GetString(buffer);
Debug.Log("server ok");
}
//异步接受客户端信息
void AsyncReceive(System.IAsyncResult result)
{
Socket client = result.AsyncState as Socket;
//把b