在上一个例子基础上,我们构建一个聊天室程序。
1,首先建立一个新项目,文件夹名为chat。
2,给接收请求的脚本所绑定的对象,添加网络视图组件(听起来有点绕口)。我们的服务器脚本是绑定在主摄像机上的,所以点击主摄像机,在菜单上选择component-->miscellaneous-->Net work View。
3,服务器端程序:(C# 脚本)
using UnityEngine;
using System.Collections;
public class server : MonoBehaviour {
int Port = 10100;
string Message = "";
//声明一个二维向量
Vector2 Sc;
//OnGUI方法,所有GUI的绘制都需要在这个方法中实现
void OnGUI(){
//Network.peerType是端类型的状态:
//即disconnected, connecting, server 或 client四种
switch(Network.peerType){
//禁止客户端连接运行, 服务器未初始化
case NetworkPeerType.Disconnected:
StartServer();
break;
//运行于服务器端
case NetworkPeerType.Server:
OnServer();
break;
//运行于客户端
case NetworkPeerType.Client:
break;
//正在尝试连接到服务器
case NetworkPeerType.Connecting:
break;
}
}
void StartServer(){
//当用户点击按钮的时候为true
if (GUILayout.Button("创建服务器")) {
//初始化本机服务器端口,第一个参数就是本机接收多少连接
NetworkConnectionError error = Network.InitializeServer(12,Port,false);
//连接状态
switch(error){
case NetworkConnectionError.NoError:
break;
default:
Debug.Log("服务端错误"+error);
break;
}
}
}
void OnServer(){
GUILayout.Label("服务端已经运行,等待客户端连接");
//Network.connections是所有连接的玩家, 数组[]
//取客户端连接数.
int length = Network.connections.Length;
//按数组下标输出每个客户端的IP,Port
for (int i=0; i<length; i++)
{
GUILayout.Label("客户端"+i);
GUILayout.Label("客户端ip"+Network.connections[i].ipAddress);
GUILayout.Label("客户端端口"+Network.connections[i].port);
GUILayout.Label("-------------------------------");
}
//当用户点击按钮的时候为true
if (GUILayout.Button("断开服务器")){
Network.Disconnect();
}
//创建开始滚动视图
Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(280),GUILayout.Height(400));
//绘制纹理, 显示内容
GUILayout.Box(Message);
//结束滚动视图, 注意, 与开始滚动视图成对出现
GUILayout.EndScrollView();
}
//接收请求的方法. 注意要在上面添加[RPC]
[RPC]
void ReciveMessage(string msg, NetworkMessageInfo info){
//刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中
Message = "发送端"+info.sender +"消息"+msg;
//+"时间"+info.timestamp +"网络视图"+info.networkView
}
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
4,把脚本拖拽到主摄像机上,绑定。
5,运行程序 File---->Build settings---->Build And Run,选择Web Player
6,服务器端建立完毕,保持服务器端的运行状态。
7,简单起见,我们这里不新建项目。先把摄像机上的服务器脚本删掉,再把下面的客户端脚本拖拽上去。
客户端代码:
using UnityEngine;
using System.Collections;
public class client : MonoBehaviour {
//要连接的服务器地址
string IP = "127.0.0.1";
//要连接的端口
int Port = 10100;
//聊天信息
string Message = "";
//声明一个二维向量
Vector2 Sc;
void OnGUI(){
//端类型的状态
switch(Network.peerType){
//禁止客户端连接运行, 服务器未初始化
case NetworkPeerType.Disconnected:
StartConnect();
break;
//运行于服务器端
case NetworkPeerType.Server:
break;
//运行于客户端
case NetworkPeerType.Client:
OnClient();
break;
//正在尝试连接到服务器
case NetworkPeerType.Connecting:
break;
}
}
void StartConnect(){
if (GUILayout.Button("连接服务器")){
NetworkConnectionError error = Network.Connect(IP,Port);
//连接状态
switch(error){
case NetworkConnectionError.NoError:
break;
default:
Debug.Log("客户端错误"+error);
break;
}
}
}
void OnClient(){
//创建开始滚动视图
Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(280),GUILayout.Height(400));
//绘制纹理, 显示内容
GUILayout.Box(Message);
//文本框
Message = GUILayout.TextArea(Message);
if (GUILayout.Button("发送")){
//发送给接收的函数, 模式为全部, 参数为信息
networkView.RPC("ReciveMessage", RPCMode.All, Message);
}
//结束滚动视图, 注意, 与开始滚动视图成对出现
GUILayout.EndScrollView();
}
//接收请求的方法. 注意要在上面添加[RPC]
[RPC]
void ReciveMessage(string msg, NetworkMessageInfo info){
//刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中
Message = "发送端"+info.sender +"消息"+msg;
}
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}
服务端运行状态:
客户端运行状态:
附注: 本文大部分代码出自《Unity 3D 游戏开发》,作者宣雨松。