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(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2017-12-04 或与位运算实现2个参数合并与拆分