Unity Network 聊天在unity中是怎样实现的呢?下面我们就来具体了解学习Unity Network 聊天的实现。

1,首先建立一个新项目,文件夹名为chat。
2,给接收请求的脚本所绑定的对象,添加网络视图组件(听起来有点绕口)。我们的服务器脚本是绑定在主摄像机上的,所以点击主摄像机,在菜单上选择component-->miscellaneous-->Net work View。

3,服务器端程序:(C# 脚本)

  1. [csharp] view plaincopy
  2. using UnityEngine;
  3. using System.Collections;
  4. public class server : MonoBehaviour {
  5. int Port = 10100;
  6. string Message = "";
  7. //声明一个二维向量
  8. Vector2 Sc;
  9. //OnGUI方法,所有GUI的绘制都需要在这个方法中实现
  10. void OnGUI(){
  11. //Network.peerType是端类型的状态:
  12. //即disconnected, connecting, server 或 client四种
  13. switch(Network.peerType){
  14. //禁止客户端连接运行, 服务器未初始化
  15. case NetworkPeerType.Disconnected:
  16. StartServer();
  17. break;
  18. //运行于服务器端
  19. case NetworkPeerType.Server:
  20. OnServer();
  21. break;
  22. //运行于客户端
  23. case NetworkPeerType.Client:
  24. break;
  25. //正在尝试连接到服务器
  26. case NetworkPeerType.Connecting:
  27. break;
  28. }
  29. }
  30. void StartServer(){
  31. //当用户点击按钮的时候为true
  32. if (GUILayout.Button("创建服务器")) {
  33. //初始化本机服务器端口,第一个参数就是本机接收多少连接
  34. NetworkConnectionError error = Network.InitializeServer(12,Port,false);
  35. //连接状态
  36. switch(error){
  37. case NetworkConnectionError.NoError:
  38. break;
  39. default:
  40. Debug.Log("服务端错误"+error);
  41. break;
  42. }
  43. }
  44. }
  45. void OnServer(){
  46. GUILayout.Label("服务端已经运行,等待客户端连接");
  47. //Network.connections是所有连接的玩家, 数组[]
  48. //取客户端连接数.
  49. int length = Network.connections.Length;
  50. //按数组下标输出每个客户端的IP,Port
  51. for (int i=0; i<length; i++)
  52. {
  53. GUILayout.Label("客户端"+i);
  54. GUILayout.Label("客户端ip"+Network.connections[i].ipAddress);
  55. GUILayout.Label("客户端端口"+Network.connections[i].port);
  56. GUILayout.Label("-------------------------------");
  57. }
  58. //当用户点击按钮的时候为true
  59. if (GUILayout.Button("断开服务器")){
  60. Network.Disconnect();
  61. }
  62. //创建开始滚动视图
  63. Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(280),GUILayout.Height(400));
  64. //绘制纹理, 显示内容
  65. GUILayout.Box(Message);
  66. //结束滚动视图, 注意, 与开始滚动视图成对出现
  67. GUILayout.EndScrollView();
  68. }
  69. //接收请求的方法. 注意要在上面添加[RPC]
  70. [RPC]
  71. void ReciveMessage(string msg, NetworkMessageInfo info){
  72. //刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中
  73. Message = "发送端"+info.sender  +"消息"+msg;
  74. //+"时间"+info.timestamp +"网络视图"+info.networkView
  75. }
  76. // Use this for initialization
  77. void Start () {
  78. }
  79. // Update is called once per frame
  80. void Update () {
  81. }
  82. }
4,把脚本拖拽到主摄像机上,绑定。
5,运行程序 File---->Build settings---->Build And Run,选择Web Player
6,服务器端建立完毕,保持服务器端的运行状态。

7,简单起见,我们这里不新建项目。先把摄像机上的服务器脚本删掉,再把下面的客户端脚本拖拽上去。

客户端代码:
  1. [csharp] view plaincopy
  2. using UnityEngine;
  3. using System.Collections;
  4. public class client : MonoBehaviour {
  5. //要连接的服务器地址
  6. string IP = "127.0.0.1";
  7. //要连接的端口
  8. int Port = 10100;
  9. //聊天信息
  10. string Message = "";
  11. //声明一个二维向量
  12. Vector2 Sc;
  13. void OnGUI(){
  14. //端类型的状态
  15. switch(Network.peerType){
  16. //禁止客户端连接运行, 服务器未初始化
  17. case NetworkPeerType.Disconnected:
  18. StartConnect();
  19. break;
  20. //运行于服务器端
  21. case NetworkPeerType.Server:
  22. break;
  23. //运行于客户端
  24. case NetworkPeerType.Client:
  25. OnClient();
  26. break;
  27. //正在尝试连接到服务器
  28. case NetworkPeerType.Connecting:
  29. break;
  30. }
  31. }
  32. void StartConnect(){
  33. if (GUILayout.Button("连接服务器")){
  34. NetworkConnectionError error = Network.Connect(IP,Port);
  35. //连接状态
  36. switch(error){
  37. case NetworkConnectionError.NoError:
  38. break;
  39. default:
  40. Debug.Log("客户端错误"+error);
  41. break;
  42. }
  43. }
  44. }
  45. void OnClient(){
  46. //创建开始滚动视图
  47. Sc = GUILayout.BeginScrollView(Sc,GUILayout.Width(280),GUILayout.Height(400));
  48. //绘制纹理, 显示内容
  49. GUILayout.Box(Message);
  50. //文本框
  51. Message = GUILayout.TextArea(Message);
  52. if (GUILayout.Button("发送")){
  53. //发送给接收的函数, 模式为全部, 参数为信息
  54. networkView.RPC("ReciveMessage", RPCMode.All, Message);
  55. }
  56. //结束滚动视图, 注意, 与开始滚动视图成对出现
  57. GUILayout.EndScrollView();
  58. }
  59. //接收请求的方法. 注意要在上面添加[RPC]
  60. [RPC]
  61. void ReciveMessage(string msg, NetworkMessageInfo info){
  62. //刚从网络接收的数据的相关信息,会被保存到NetworkMessageInfo这个结构中
  63. Message = "发送端"+info.sender  +"消息"+msg;
  64. }
  65. // Use this for initialization
  66. void Start () {
  67. }
  68. // Update is called once per frame
  69. void Update () {
  70. }
  71. }

服务端运行状态:

Unity Network 聊天

客户端运行状态:

Unity Network 聊天