远程修改游戏配置
关于修改游戏配置这点,如果pc还好
但是在移动端,比较麻烦,比如游戏换ip地址了,可能需要重新打包了
那能不能动态修改,这里有个思路
以udp举例
在客户端里面写一个udp服务,在游戏第一界面打开,比如在登录界面
那么切换这个界面,就可以把这个服务给关掉了。消耗也不大
写个udp的客户端,给游戏客户端的udp服务发消息
客户端根据收到的消息来修改自己的配置,保存于本地
下次启动游戏,那么配置就生效了
其实就是相当于把客户端写了一个服务器功能
让2者处于同一网络下,就可以连接了,比如wifi下
server
- using UnityEngine;
- using System.Collections;
- //引入库
- using System.Net;
- using System.Net.Sockets;
- using System.Text;
- using System.Threading;
- public class UdpServer:MonoBehaviour
- {
- //以下默认都是私有的成员
- Socket socket; //目标socket
- EndPoint clientEnd; //客户端
- IPEndPoint ipEnd; //侦听端口
- string recvStr; //接收的字符串
- string sendStr; //发送的字符串
- byte[] recvData=new byte[1024]; //接收的数据,必须为字节
- byte[] sendData=new byte[1024]; //发送的数据,必须为字节
- int recvLen; //接收的数据长度
- Thread connectThread; //连接线程
- //初始化
- void InitSocket()
- {
- //定义侦听端口,侦听任何IP
- ipEnd=new IPEndPoint(IPAddress.Any,8001);
- //定义套接字类型,在主线程中定义
- socket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
- //服务端需要绑定ip
- socket.Bind(ipEnd);
- //定义客户端
- IPEndPoint sender=new IPEndPoint(IPAddress.Any,0);
- clientEnd=(EndPoint)sender;
- print("waiting for UDP dgram");
- //开启一个线程连接,必须的,否则主线程卡死
- connectThread=new Thread(new ThreadStart(SocketReceive));
- connectThread.Start();
- }
- void SocketSend(string sendStr)
- {
- //清空发送缓存
- sendData=new byte[1024];
- //数据类型转换
- sendData=Encoding.ASCII.GetBytes(sendStr);
- //发送给指定客户端
- socket.SendTo(sendData,sendData.Length,SocketFlags.None,clientEnd);
- }
- //服务器接收
- void SocketReceive()
- {
- //进入接收循环
- while(true)
- {
- //对data清零
- recvData=new byte[1024];
- //获取客户端,获取客户端数据,用引用给客户端赋值
- recvLen=socket.ReceiveFrom(recvData,ref clientEnd);
- print("message from: "+clientEnd.ToString()); //打印客户端信息
- //输出接收到的数据
- recvStr=Encoding.ASCII.GetString(recvData,0,recvLen);
- print(recvStr);
- //将接收到的数据经过处理再发送出去
- sendStr="From Server: "+recvStr;
- SocketSend(sendStr);
- }
- }
- //连接关闭
- void SocketQuit()
- {
- //关闭线程
- if(connectThread!=null)
- {
- connectThread.Interrupt();
- connectThread.Abort();
- }
- //最后关闭socket
- if(socket!=null)
- socket.Close();
- print("disconnect");
- }
- // Use this for initialization
- void Start()
- {
- InitSocket(); //在这里初始化server
- }
- // Update is called once per frame
- void Update()
- {
- }
- void OnApplicationQuit()
- {
- SocketQuit();
- }
- }
client
- using UnityEngine;
- using System.Collections;
- //引入库
- using System.Net;
- using System.Net.Sockets;
- using System.Text;
- using System.Threading;
- public class UdpClient:MonoBehaviour
- {
- string editString="hello wolrd"; //编辑框文字
- //以下默认都是私有的成员
- Socket socket; //目标socket
- EndPoint serverEnd; //服务端
- IPEndPoint ipEnd; //服务端端口
- string recvStr; //接收的字符串
- string sendStr; //发送的字符串
- byte[] recvData=new byte[1024]; //接收的数据,必须为字节
- byte[] sendData=new byte[1024]; //发送的数据,必须为字节
- int recvLen; //接收的数据长度
- Thread connectThread; //连接线程
- //初始化
- void InitSocket()
- {
- //定义连接的服务器ip和端口,可以是本机ip,局域网,互联网
- ipEnd=new IPEndPoint(IPAddress.Parse("127.0.0.1"),8001);
- //定义套接字类型,在主线程中定义
- socket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
- //定义服务端
- IPEndPoint sender=new IPEndPoint(IPAddress.Any,0);
- serverEnd=(EndPoint)sender;
- print("waiting for sending UDP dgram");
- //建立初始连接,这句非常重要,第一次连接初始化了serverEnd后面才能收到消息
- SocketSend("hello");
- //开启一个线程连接,必须的,否则主线程卡死
- connectThread=new Thread(new ThreadStart(SocketReceive));
- connectThread.Start();
- }
- void SocketSend(string sendStr)
- {
- //清空发送缓存
- sendData=new byte[1024];
- //数据类型转换
- sendData=Encoding.ASCII.GetBytes(sendStr);
- //发送给指定服务端
- socket.SendTo(sendData,sendData.Length,SocketFlags.None,ipEnd);
- }
- //服务器接收
- void SocketReceive()
- {
- //进入接收循环
- while(true)
- {
- //对data清零
- recvData=new byte[1024];
- //获取客户端,获取服务端端数据,用引用给服务端赋值,实际上服务端已经定义好并不需要赋值
- recvLen=socket.ReceiveFrom(recvData,ref serverEnd);
- print("message from: "+serverEnd.ToString()); //打印服务端信息
- //输出接收到的数据
- recvStr=Encoding.ASCII.GetString(recvData,0,recvLen);
- print(recvStr);
- }
- }
- //连接关闭
- void SocketQuit()
- {
- //关闭线程
- if(connectThread!=null)
- {
- connectThread.Interrupt();
- connectThread.Abort();
- }
- //最后关闭socket
- if(socket!=null)
- socket.Close();
- }
- // Use this for initialization
- void Start()
- {
- InitSocket(); //在这里初始化
- }
- void OnGUI()
- {
- editString=GUI.TextField(new Rect(10,10,100,20),editString);
- if(GUI.Button(new Rect(10,30,60,20),"send"))
- SocketSend(editString);
- }
- // Update is called once per frame
- void Update()
- {
- }
- void OnApplicationQuit()
- {
- SocketQuit();
- }
- }