将服务器和客户端封装为一个网络管理类
一、可以创建服务器,关闭服务器
二、乐意连接和断开服务器
三、客户端连接后实例化一个对象
四、客户端能够控制玩家移动并同步至服务器
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相同使得对象只能被它的所属者控制
测试结果: