Unity Network 聊天

2015年01月25日 11:27 0 点赞 0 评论 更新于 2025-11-21 15:24

在 Unity 中,如何实现网络聊天功能呢?下面我们将详细介绍 Unity Network 聊天功能的实现步骤。

1. 创建新项目

首先,建立一个新的 Unity 项目,将项目文件夹命名为 chat

2. 添加网络视图组件

为接收请求的脚本所绑定的对象添加网络视图组件。这里我们的服务器脚本绑定在主摄像机上,操作步骤如下:点击主摄像机,在菜单上选择 component -> miscellaneous -> Network View

3. 编写服务器端程序(C# 脚本)

以下是服务器端的 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 Network 聊天功能。你可以在客户端输入聊天信息并发送,服务器端和其他客户端都能接收到相应的消息。

作者信息

feifeila

feifeila

共发布了 3994 篇文章