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