NetWork网络_TCP_在unity中初步实现局域网互联效果<13/9/2017>
首先搭建界面,建立Canvas并且赋予两个按钮建立服务器和客户端的功能
为Canvas写一个脚本,实现点击事件和网络通讯速率的调整(能改善画面同步效果)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NetWork : MonoBehaviour
{
void Start()
{
Network.sendRate = 180;//网络通讯速率,稍微改善实际显示效果
}
public void MyClick()
{
Network.InitializeServer(20, 8899, false);
}
public void MyClick2()
{
//"127.0.0.1"默认指的本机IP,若要实现局域网连接(不能用"127..."),必须在cmd中ipconfig查询本机正确的ip地址
Network.Connect("192.168.90.110", 8899);
}
}
实现网络连接的回调函数方法,写在主摄像机上面,不能写在Canvas,因为我面我们会false掉Canvas
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class Connect : MonoBehaviour
{
public Text connected;
public GameObject canvas;
public GameObject plane;
public GameObject cube;
void OnServerInitialized()//回调函数,可以和关联的点击事件放在不同脚本中同样有效
{
connected.text = "Server initialized and ready";
}
void OnConnectedToServer()//在客户端使用
{
connected.text = "Connected to server";
canvas.gameObject.SetActive(false);
plane.gameObject.SetActive(true);
GameObject up = (GameObject)Network.Instantiate(cube, new Vector3(0, 7, 0), Quaternion.identity, 0);
up.AddComponent();
}
void OnPlayerConnected(NetworkPlayer player)//在服务器使用
{
canvas.gameObject.SetActive(false);
plane.gameObject.SetActive(true);
}
}
如果在客户端产生对象,并且给对象赋予组件,那么只能在客户端控制对象物体,服务器同此.
创建物体的预制体时就要加上刚体和碰撞体等组件,如果在代码中添加,若是客户端则服务器中不会跟着动,反之亦然.
然后控制的对象预制体得加上NetWork View组件.
额外写一个简单的控制脚本给预制体:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Move : MonoBehaviour
{
//一个普通的控制脚本
void Update()
{
float x = Input.GetAxis("Horizontal");
float y = Input.GetAxis("Vertical");
if (x != 0 || y != 0)
{
transform.position += new Vector3(x, 0, y) * Time.deltaTime;
}
if (Input.GetKeyDown(KeyCode.Space))
{
gameObject.GetComponent().velocity += new Vector3(0, 7, 0);
}
}
}
打包时记得勾上Run in background,实现后台运行,否则切出来窗口不被激活,局域网使用会出问题
1.开始执行,打开两个窗口
3.服务器建立成功,使用另一个开始连接
4.开始在客户端执行控制,局域网互联效果实现成功!