unity远程修改游戏配置
关于修改游戏配置这点,如果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(); } }