关于修改游戏配置这点,如果pc还好

但是在移动端,比较麻烦,比如游戏换ip地址了,可能需要重新打包了

那能不能动态修改,这里有个思路

以udp举例

在客户端里面写一个udp服务,在游戏第一界面打开,比如在登录界面

那么切换这个界面,就可以把这个服务给关掉了。消耗也不大

写个udp的客户端,给游戏客户端的udp服务发消息

客户端根据收到的消息来修改自己的配置,保存于本地

下次启动游戏,那么配置就生效了

其实就是相当于把客户端写了一个服务器功能

让2者处于同一网络下,就可以连接了,比如wifi下

 

server

  1. using UnityEngine;
  2. using System.Collections;
  3. //引入库
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading;
  8. public class UdpServer:MonoBehaviour
  9. {
  10. //以下默认都是私有的成员
  11. Socket socket; //目标socket
  12. EndPoint clientEnd; //客户端
  13. IPEndPoint ipEnd; //侦听端口
  14. string recvStr; //接收的字符串
  15. string sendStr; //发送的字符串
  16. byte[] recvData=new byte[1024]; //接收的数据,必须为字节
  17. byte[] sendData=new byte[1024]; //发送的数据,必须为字节
  18. int recvLen; //接收的数据长度
  19. Thread connectThread; //连接线程
  20. //初始化
  21. void InitSocket()
  22. {
  23. //定义侦听端口,侦听任何IP
  24. ipEnd=new IPEndPoint(IPAddress.Any,8001);
  25. //定义套接字类型,在主线程中定义
  26. socket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
  27. //服务端需要绑定ip
  28. socket.Bind(ipEnd);
  29. //定义客户端
  30. IPEndPoint sender=new IPEndPoint(IPAddress.Any,0);
  31. clientEnd=(EndPoint)sender;
  32. print("waiting for UDP dgram");
  33. //开启一个线程连接,必须的,否则主线程卡死
  34. connectThread=new Thread(new ThreadStart(SocketReceive));
  35. connectThread.Start();
  36. }
  37. void SocketSend(string sendStr)
  38. {
  39. //清空发送缓存
  40. sendData=new byte[1024];
  41. //数据类型转换
  42. sendData=Encoding.ASCII.GetBytes(sendStr);
  43. //发送给指定客户端
  44. socket.SendTo(sendData,sendData.Length,SocketFlags.None,clientEnd);
  45. }
  46. //服务器接收
  47. void SocketReceive()
  48. {
  49. //进入接收循环
  50. while(true)
  51. {
  52. //对data清零
  53. recvData=new byte[1024];
  54. //获取客户端,获取客户端数据,用引用给客户端赋值
  55. recvLen=socket.ReceiveFrom(recvData,ref clientEnd);
  56. print("message from: "+clientEnd.ToString()); //打印客户端信息
  57. //输出接收到的数据
  58. recvStr=Encoding.ASCII.GetString(recvData,0,recvLen);
  59. print(recvStr);
  60. //将接收到的数据经过处理再发送出去
  61. sendStr="From Server: "+recvStr;
  62. SocketSend(sendStr);
  63. }
  64. }
  65. //连接关闭
  66. void SocketQuit()
  67. {
  68. //关闭线程
  69. if(connectThread!=null)
  70. {
  71. connectThread.Interrupt();
  72. connectThread.Abort();
  73. }
  74. //最后关闭socket
  75. if(socket!=null)
  76. socket.Close();
  77. print("disconnect");
  78. }
  79. // Use this for initialization
  80. void Start()
  81. {
  82. InitSocket(); //在这里初始化server
  83. }
  84. // Update is called once per frame
  85. void Update()
  86. {
  87. }
  88. void OnApplicationQuit()
  89. {
  90. SocketQuit();
  91. }
  92. }

 

client

  1. using UnityEngine;
  2. using System.Collections;
  3. //引入库
  4. using System.Net;
  5. using System.Net.Sockets;
  6. using System.Text;
  7. using System.Threading;
  8. public class UdpClient:MonoBehaviour
  9. {
  10. string editString="hello wolrd"; //编辑框文字
  11. //以下默认都是私有的成员
  12. Socket socket; //目标socket
  13. EndPoint serverEnd; //服务端
  14. IPEndPoint ipEnd; //服务端端口
  15. string recvStr; //接收的字符串
  16. string sendStr; //发送的字符串
  17. byte[] recvData=new byte[1024]; //接收的数据,必须为字节
  18. byte[] sendData=new byte[1024]; //发送的数据,必须为字节
  19. int recvLen; //接收的数据长度
  20. Thread connectThread; //连接线程
  21. //初始化
  22. void InitSocket()
  23. {
  24. //定义连接的服务器ip和端口,可以是本机ip,局域网,互联网
  25. ipEnd=new IPEndPoint(IPAddress.Parse("127.0.0.1"),8001);
  26. //定义套接字类型,在主线程中定义
  27. socket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
  28. //定义服务端
  29. IPEndPoint sender=new IPEndPoint(IPAddress.Any,0);
  30. serverEnd=(EndPoint)sender;
  31. print("waiting for sending UDP dgram");
  32. //建立初始连接,这句非常重要,第一次连接初始化了serverEnd后面才能收到消息
  33. SocketSend("hello");
  34. //开启一个线程连接,必须的,否则主线程卡死
  35. connectThread=new Thread(new ThreadStart(SocketReceive));
  36. connectThread.Start();
  37. }
  38. void SocketSend(string sendStr)
  39. {
  40. //清空发送缓存
  41. sendData=new byte[1024];
  42. //数据类型转换
  43. sendData=Encoding.ASCII.GetBytes(sendStr);
  44. //发送给指定服务端
  45. socket.SendTo(sendData,sendData.Length,SocketFlags.None,ipEnd);
  46. }
  47. //服务器接收
  48. void SocketReceive()
  49. {
  50. //进入接收循环
  51. while(true)
  52. {
  53. //对data清零
  54. recvData=new byte[1024];
  55. //获取客户端,获取服务端端数据,用引用给服务端赋值,实际上服务端已经定义好并不需要赋值
  56. recvLen=socket.ReceiveFrom(recvData,ref serverEnd);
  57. print("message from: "+serverEnd.ToString()); //打印服务端信息
  58. //输出接收到的数据
  59. recvStr=Encoding.ASCII.GetString(recvData,0,recvLen);
  60. print(recvStr);
  61. }
  62. }
  63. //连接关闭
  64. void SocketQuit()
  65. {
  66. //关闭线程
  67. if(connectThread!=null)
  68. {
  69. connectThread.Interrupt();
  70. connectThread.Abort();
  71. }
  72. //最后关闭socket
  73. if(socket!=null)
  74. socket.Close();
  75. }
  76. // Use this for initialization
  77. void Start()
  78. {
  79. InitSocket(); //在这里初始化
  80. }
  81. void OnGUI()
  82. {
  83. editString=GUI.TextField(new Rect(10,10,100,20),editString);
  84. if(GUI.Button(new Rect(10,30,60,20),"send"))
  85. SocketSend(editString);
  86. }
  87. // Update is called once per frame
  88. void Update()
  89. {
  90. }
  91. void OnApplicationQuit()
  92. {
  93. SocketQuit();
  94. }
  95. }

 

版权声明:本文为sanyejun原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/sanyejun/p/10065253.html