• 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();
        }
    }
  • 相关阅读:
    【原】费马小定理(Fermat little theorem)详解
    【原】水库抽样详解
    【原】模幂运算(Modular Exponentiation)算法
    【原】 POJ 3630 Phone List Trie树 解题报告
    【Joke】你可以去当程序员了
    【原】 POJ 3750 小孩报数问题 Joseph相关问题详解 解题报告
    【原】 POJ 3748 位操作 解题报告
    react 性能优化
    修改jsp文件,访问时没有变化。可能是修改了系统的时间,,,郁闷呢
    在Windows 7 下使用Visual Studio 2010 编写自动申请管理员权限运行的程序
  • 原文地址:https://www.cnblogs.com/sanyejun/p/10065253.html
Copyright © 2020-2023  润新知