正文
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[]; //接收的数据,必须为字节
byte[] sendData=new byte[]; //发送的数据,必须为字节
int recvLen; //接收的数据长度
Thread connectThread; //连接线程 //初始化
void InitSocket()
{
//定义侦听端口,侦听任何IP
ipEnd=new IPEndPoint(IPAddress.Any,);
//定义套接字类型,在主线程中定义
socket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
//服务端需要绑定ip
socket.Bind(ipEnd);
//定义客户端
IPEndPoint sender=new IPEndPoint(IPAddress.Any,);
clientEnd=(EndPoint)sender;
print("waiting for UDP dgram"); //开启一个线程连接,必须的,否则主线程卡死
connectThread=new Thread(new ThreadStart(SocketReceive));
connectThread.Start();
} void SocketSend(string sendStr)
{
//清空发送缓存
sendData=new byte[];
//数据类型转换
sendData=Encoding.ASCII.GetBytes(sendStr);
//发送给指定客户端
socket.SendTo(sendData,sendData.Length,SocketFlags.None,clientEnd);
} //服务器接收
void SocketReceive()
{
//进入接收循环
while(true)
{
//对data清零
recvData=new byte[];
//获取客户端,获取客户端数据,用引用给客户端赋值
recvLen=socket.ReceiveFrom(recvData,ref clientEnd);
print("message from: "+clientEnd.ToString()); //打印客户端信息
//输出接收到的数据
recvStr=Encoding.ASCII.GetString(recvData,,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[]; //接收的数据,必须为字节
byte[] sendData=new byte[]; //发送的数据,必须为字节
int recvLen; //接收的数据长度
Thread connectThread; //连接线程 //初始化
void InitSocket()
{
//定义连接的服务器ip和端口,可以是本机ip,局域网,互联网
ipEnd=new IPEndPoint(IPAddress.Parse("127.0.0.1"),);
//定义套接字类型,在主线程中定义
socket=new Socket(AddressFamily.InterNetwork,SocketType.Dgram,ProtocolType.Udp);
//定义服务端
IPEndPoint sender=new IPEndPoint(IPAddress.Any,);
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[];
//数据类型转换
sendData=Encoding.ASCII.GetBytes(sendStr);
//发送给指定服务端
socket.SendTo(sendData,sendData.Length,SocketFlags.None,ipEnd);
} //服务器接收
void SocketReceive()
{
//进入接收循环
while(true)
{
//对data清零
recvData=new byte[];
//获取客户端,获取服务端端数据,用引用给服务端赋值,实际上服务端已经定义好并不需要赋值
recvLen=socket.ReceiveFrom(recvData,ref serverEnd);
print("message from: "+serverEnd.ToString()); //打印服务端信息
//输出接收到的数据
recvStr=Encoding.ASCII.GetString(recvData,,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(,,,),editString);
if(GUI.Button(new Rect(,,,),"send"))
SocketSend(editString);
} // Update is called once per frame
void Update()
{ } void OnApplicationQuit()
{
SocketQuit();
}
}