遠端修改遊戲配置
關於修改遊戲配置這點,如果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(); } }