Unity3D笔记——UDP 广播和异步接受

⭐Unity 搭建UDP服务器(广播消息、接收客户端消息) 简单明了的Unity的UDP服务器 阅读详情

前言:Unity3D笔记是我平时做一些好玩的测试和研究,记录的笔记。会比较详细也可能随口一提就过了。 所以大家见谅了,内容一般都会是原创的(非原创我会注明转载)。由于很多内容其他的朋友也肯定研究发表过,大家用于指出错误。

前段时间,公司有一个针对游乐园的项目。项目是基于安卓3399板子的,会检测一些红外的触碰来替代鼠标当作输入。本来以为那么就 Launcher 里有个服务,检测到有触碰那么转换下屏幕坐标之后模拟鼠标点击就可以了。可是真是用的时候发现了一些局限性:
1.鼠标点击是单一事件,不可能同一时间点击多个地方。
2.延迟其实有点大,虽然就零点几秒。但是我们的项目对延迟比较看重。

所以提出了第二个方案:红外检测到数据后Launcher的服务通过坐标转换成屏幕坐标,通过UDP全网广播,游戏和桌面监听(桌面也需要通过触碰打开游戏等等)。所以就需要我专门做一个unity能用的UDP监听功能,并转换成输入。

一.UDP广播

为了测试,我也做了一个简单的UDP的广播代码;

 //服务器端Scoket对象;
    UdpClient client;

    private IPEndPoint endpoint;

void Start()
    {
        //绑定UdpClient 端口,8866
        client = new UdpClient(new IPEndPoint(IPAddress.Any, 8866));

        //全网(255,255,255,255)
        endpoint = new IPEndPoint(IPAddress.Parse("255.255.255.255"), 0);

        //每秒都发送
        InvokeRepeating("Send",1,1);
    }


    void Send()
    {
        string dataStr = "[{\"x\":732.8001098632813,\"y\":1000.0156860351563},{\"x\":817.5443725585938,\"y\":379.5652160644531},{\"x\":956.8383178710938,\"y\":538.0902099609375}]";

        byte[] SendData = System.Text.Encoding.UTF8.GetBytes(dataStr);

        //发送,不需要异步。因为是广播,并且不关心有没有接受
        client.Send(SendData, SendData.Length, endpoint);
    }

备注:上面的代码就做了个简单功能:向全网每秒广播信息。端口号是:8866

二.游戏这边需要接受数据了。UDP异步接受

有几点需求:
1.单纯接受8866端口的数据就可以。
2.将byte数据转换成坐标数据。
3.接受到数据,才会触发游戏一些输入机制。所以需要异步接收(防止卡死)

unity这边的接受代码:

 //服务器端Scoket对象;
    private Socket ServerSocket;

    private IPEndPoint Clients;

    private IPEndPoint Server;

    private EndPoint epSender;

    //发送数据的字符数组
    private byte[] SendData = new byte[1024];

    //接受数据的字符数组
    private byte[] ReceiveData = new byte[1024];


    // Use this for initialization
    void Start()
    {
        //服务器Socket对象实例化
        ServerSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);

        //服务器的IP和端口
        Server = new IPEndPoint(IPAddress.Any, 8866);

        //Socket对象跟服务器端的IP和端口绑定
        ServerSocket.Bind(Server);

        //客户端的IP和端口,端口 0 表示任意端口
        Clients = new IPEndPoint(IPAddress.Any, 0);

        //实例化客户端 终点
        epSender = (EndPoint)Clients;

        ServerSocket.BeginReceiveFrom(ReceiveData, 0, ReceiveData.Length, SocketFlags.None, ref epSender, new AsyncCallback(ReceiveFromClients), epSender);

    }

    /// <summary>
    /// 异步接受,处理数据
    /// </summary>
    /// <param name="iar"></param>
    private void ReceiveFromClients(IAsyncResult iar)
    {
        int reve = ServerSocket.EndReceiveFrom(iar, ref epSender);

        //数据处理
        string str = System.Text.Encoding.UTF8.GetString(ReceiveData, 0, reve);

       //每次接受到数据就传给ServerInput做处理。
        ServerInput.GetInstance().AnalyzeJsonData(str);

        ServerSocket.BeginReceiveFrom(ReceiveData, 0, ReceiveData.Length, SocketFlags.None, ref epSender, new AsyncCallback(ReceiveFromClients), epSender);

    }

下面这句是每次启动异步接受的代码。

ServerSocket.BeginReceiveFrom(ReceiveData, 0, ReceiveData.Length, SocketFlags.None, ref epSender, new AsyncCallback(ReceiveFromClients), epSender);

下面的是:每次接受到数据后就将数据传给serverInput做处理。

 //数据处理
        string str = System.Text.Encoding.UTF8.GetString(ReceiveData, 0, reve);

       //每次接受到数据就传给ServerInput做处理。
        ServerInput.GetInstance().AnalyzeJsonData(str);

ServerInput代码:我们的协议是json格式的。所以这里做了个json的转换。和一个公开的事件:ServerInputEvent 每次接受到数据都会传给这个事件。游戏里哪里需要 直接注册这个事件就可以用了。
(注意:安卓的OpenOL的屏幕坐标系和unity的坐标系是上下反的。所以要处理下:Screen.height-(int)jObject[“y”])

 public event Action<List<Vector2>> ServerInputEvent;

    private static ServerInput instance = null;
    public static ServerInput GetInstance() { return instance ?? new ServerInput(); }

    ServerInput() { instance = this; }

    /// <summary>
    /// 处理服务器传来的json信息,传给事件
    /// </summary>
    /// <param name="jsonData"></param>
    public void AnalyzeJsonData(string jsonData) {

        try
        {
            List<Vector2> posList = new List<Vector2>();
            JArray jsonObj = JArray.Parse(jsonData);

            foreach (JObject jObject in jsonObj)
            {
                //Debug.Log(jObject["x"]);
                //Debug.Log(jObject["y"]);

                Vector2 pos = new Vector2((int)jObject["x"],Screen.height-(int)jObject["y"]);
                posList.Add(pos);

            }
            if (ServerInputEvent != null)
                ServerInputEvent(posList);
        }
        catch (Exception)
        {

            throw;
        }
    } 

**最后附上test代码: 简单的打印到屏幕中
备注下(异步接受是子线程的,所以不能直接给UI赋值 所以转到主线程的Update.涉及到物理系统也一样)**

[SerializeField]
    private Text text;

    string str = null;

    // Use this for initialization
    void Start () {
        //向ServerInputEvent事件注册
        ServerInput.GetInstance().ServerInputEvent += attack;
    }

    private void Update()
    {
        text.text = str;
    }

    //这边写游戏内容的控制
    void attack(List<Vector2> pos) {

        str = "";

        foreach (var item in pos)
        {
            print(item);
            str = str + "  " + "(" + item.x.ToString() + "," + item.y.ToString()+ ")";
        }
    }

这里写图片描述

最后附上项目:
链接:https://pan.baidu.com/s/1cK0UXC 密码:9gw0

UnitySocket异步通信 Socket 套接字 一个ip和一个端口组成一个Socket 属C/S架构 具有长连接和实时性(强联网) 客户端服务端都用Socket来声明 Socket类型又分为多种 常用有Stream流传输和Dgram打包传输 流传输对应协议类型的TCP(传输控制协议)Dgram打包传输对应协议类型的UDP(用户数据报协议) TCP和UDP都是传输协议 双方通信时都需要端口的开放 TCP是可靠的传输 收发数据... 阅读详情

相关推荐

Unity UDP局域网广播 组播 Android

Unity Android程序,想实现一个局域网会议程序。 一个程序创建好房间后,需要让其他客户端知道,就需要不断往局域网发消息 开始想使用广播,后来改成组播。这里说一下这两种方式吧 一、广播 广播会往局域网所有客户端发送一次消息。 _socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, Protocol...

BDDNH的博客 3145

unityUDP广播

udp广播代码, private UdpClient m_udpClient; private IPEndPoint endPoint; private IPEndPoint m_ipEndPoint; private IPAddress m_UpdReceiveDataIP; 创建UDP客户端: public void CreatUDP() { m_udpClient = new UdpClient(7055); endPoint = new IPEndPoint(IPAddre

weixin_42796768的博客 1124

Unity3D实时通信实战:Socket.IO客户端集成与多人在线同步指南

实时网络通信是现代游戏和应用开发的核心技术,它基于WebSocket等双向通信协议,实现了服务器与客户端之间的低延迟、全双工数据交换。其技术价值在于突破了传统HTTP请求-响应模式的限制,支持服务器主动推送和高效的双向数据流,为实时互动场景提供了基础支撑。在应用场景上,实时通信广泛用于多人在线游戏、实时数据监控、虚拟社交空间和即时通讯等领域。本文聚焦于Unity3D开发环境,深入探讨如何利用socket.io-client-unity3d库,高效集成Socket.IO协议,解决实时通信中的连接管理、数据序列

weixin_30684743的博客 1018

Unity3D笔记——TCP简单服务器和客户端的连接和异步接受

前言:Unity3D笔记是我平时做一些好玩的测试和研究,记录的笔记。会比较详细也可能随口一提就过了。 所以大家见谅了,内容一般都会是原创的(非原创我会注明转载)。由于很多内容其他的朋友也肯定研究发表过,大家请指出错误。公司需要做个简单的答题游戏,然后是局域网的四台固定设备,互相组队开始比赛答题。然后肯定需要用到网络啦,想啦下,需要有房间的思想。为了节约成本,就让其中先开局当服务器(房间),再用UD...

YYL_Debug的博客 2977

Unity3D服务器AStar寻路与客户端同步显示验证架构详解

在游戏开发中,寻路算法是实现智能移动的核心技术,而AStar算法因其高效和灵活被广泛应用。其原理是通过评估节点代价,在网格或导航网格中寻找最优路径。在网络游戏中,将寻路逻辑置于服务器端,能确保所有客户端基于同一套规则计算路径,从而维护游戏状态的权威性和一致性,有效防止作弊。这一技术方案对于保障多人在线游戏的公平体验至关重要,尤其在MMORPG、MOBA等需要复杂地形交互的场景中。本文聚焦于服务器AStar寻路与客户端同步显示验证的完整实现,深入探讨了客户端预测、插值及纠错机制,以解决网络延迟带来的操作响应与

weixin_34320159的博客 424

工业仿真与Unity3D实时可视化集成:构建数字孪生的数据桥接实战

在工业数字化转型中,实时3D可视化是连接复杂仿真数据与直观认知的关键技术。其核心原理在于通过高效的数据通信协议,将仿真计算产生的时序状态与事件数据,同步驱动3D场景中的实体对象,实现虚实状态的精准映射。这项技术的核心价值在于打通了设计、仿真与运维的壁垒,为虚拟调试、操作培训和预测性维护等应用场景提供了沉浸式的交互界面。本文聚焦于工业仿真平台与Unity3D引擎的深度集成,详细阐述了以“数据桥接”为核心的松耦合架构设计,并深入探讨了模型优化、网络通信选型及数据驱动同步等工程实践,为构建高性能工业数字孪生应用提

weixin_30530939的博客 439

Unity3D笔记——解决Unity官方《Tanks》同时启动会创建两个服务器问题

前言:Unity3D笔记是我平时做一些好玩的测试和研究,记录的笔记。会比较详细也可能随口一提就过了。 所以大家见谅了,内容一般都会是原创的(非原创我会注明转载)。由于很多内容其他的朋友也肯定研究发表过,大家请指出错误。       公司一个同事在用Unet的时候,是参考unity 的官方教程《Tanks》的。然后发现一个小问题:在局域网中,当两台电脑同时按下(接近的时间按下)play的时候,会一起...

YYL_Debug的博客 885

Unity3D中实现Socket异步聊天室项目

网络通信是多人在线游戏的灵魂,它允许来自世界各地的玩家通过互联网相互连接、交换信息并共同享受游戏体验。要实现这一点,游戏服务器必须能够处理来自不同客户端的请求,同时确保所有玩家的数据实时、准确地同步。网络通信涉及到的技术包括数据传输、网络协议、连接管理、数据包处理等。游戏开发者在设计通信机制时,需要考虑的关键因素包括延迟、带宽、可靠性和安全性。

weixin_42584507的博客 1118

为什么要用MotionFramework?10个理由让你爱上这款Unity3D游戏框架

在Unity3D游戏开发的道路上,选择合适的框架往往决定了项目的开发效率与上限。MotionFramework是一套基于Unity3D引擎的开源游戏框架,它遵循**轻量化、易用性、低耦合、扩展性强**的设计理念,已被应用于多款商业化游戏项目,是创业团队、独立开发者乃至初学者都值得一试的Unity3D游戏框架。本文将从10个角度,告诉你为什么MotionFramework值得被认真考虑。 [![M

gitblog_00512的博客 420

Unity3D多人游戏开发实战教程

Unity3D是一个功能强大的游戏开发引擎,它支持2D、3D、VR以及AR游戏的开发,并且提供了丰富的工具和组件来帮助开发者快速构建游戏原型。作为开发多人游戏的基石,Unity3D提供了物理引擎、动画系统、粒子系统等核心功能,这些都是构建高质量多人游戏所必需的。多人游戏的开发引入了网络编程的概念,意味着需要处理客户端与服务器之间的通信。开发者需要了解网络协议、数据同步机制、延迟处理等关键问题。

weixin_32311823的博客 1479

Unity3D帧同步网络游戏实战:客户端与服务器端开发

Unity引擎中的Unet框架为开发多人在线游戏提供了方便的网络架构。它允许开发者轻松地实现客户端和服务器之间的通信,同时还提供了很多网络相关的功能,比如RPC(远程过程调用)、网络状态同步等。Unet框架支持帧同步和状态同步两种模式,开发者可以根据实际需要选择合适的同步模式。

weixin_28999139的博客 1289

Unity3D TCP聊天应用开发:从Socket通信到C/S架构实战

网络通信是实时交互应用的核心骨架,其基础在于理解客户端-服务器(C/S)模型与Socket编程原理。TCP协议通过三次握手建立可靠连接,确保数据有序、完整传输,为聊天、指令同步等场景提供稳定保障。在Unity3D中实现网络功能,需掌握多线程或异步编程,以处理网络IO操作,避免阻塞主线程。通过设计应用层消息协议(如长度+内容的格式)解决TCP粘包问题,并利用心跳机制维护连接活性。本文以构建一个完整的TCP聊天室为例,详解服务器端监听、连接管理、消息广播,以及Unity客户端的连接、数据收发与UI交互,涵盖**

weixin_30905981的博客 284

海康威视iVMS-4200在银河麒麟系统部署全攻略与疑难排解

在信创国产化进程中,软件兼容性是关键挑战之一。以安防监控领域广泛使用的海康威视iVMS-4200客户端为例,其从Windows环境迁移到银河麒麟等国产操作系统时,面临架构适配、依赖库匹配等核心兼容性问题。这涉及到跨平台软件部署的通用原理:不同CPU架构(如ARM的飞腾、x86的兆芯)和操作系统底层API的差异,要求软件必须进行针对性编译和优化。解决这类问题的技术价值在于保障专业软件在国产化环境中的稳定运行,是信创产业落地的重要环节。具体到应用场景,如在基于银河麒麟V10的安防监控项目中,通过获取对应架构的.

weixin_33423874的博客 1412

Unity3D开源项目精选:从架构到渲染,十大工具提升开发效率

在游戏开发与实时3D应用构建中,架构设计与性能优化是核心挑战。通过依赖注入、响应式编程等软件工程原理,开发者能够实现代码解耦与可维护性提升,这在大型项目管理中尤为重要。其技术价值在于提供经过实战检验的最佳实践,显著减少重复开发工作。在Unity3D生态中,开源项目如UniRx和Zenject等框架,将上述理论转化为高效工具,广泛应用于游戏逻辑处理、UI系统构建等场景。本文聚焦于通过“awesome-unity3d”清单筛选出的十个关键项目,涵盖架构、渲染、网络同步及资源管理等领域,其中Unity Rende

weixin_34151004的博客 302

/lib//libclntsh.so: file format not recognized; treating as linker script

centos7.7+oracle19.3 建库过程报错:预检查都是通过的 /oracle/product/19.3.0/db_1/lib/libasmperl19.a -Wl,--no-whole-archive -lclntsh -lclntshcore -lasmclntsh19 -lhasgen19 -lskgxp19 -locr19 -lcell19 -lirc INFO: /usr/bin/ld:/home/app/oracle/product/19.3.0/db_1/li...

sqlora的专栏 9914

VSCode + Latex 配置

1. 安装VSCode VSCode下载 next,next就安装好了。 2. 配置VSCode 2.1 安装LaTeX Workshop插件 install,安装LaTeX Workshop插件 2.2 修改 user setting 点击左下角,进入用户设置 点击上图标记的部分,选择 打开settings.json 具体配置文件如下: { "latex-workshop.la...

一只特立独行的猪 10万+

Tcp网络通讯详解

Tcp通讯 一款网络游戏分为客户端和服务端两个部分, 客户端程序运行在用户的电脑或手机上,服务端程序运行在游戏运营商的服务器上。多个客户端通过网络与服务端通信。TCP 连接指的是一种游戏中常用的网络通信协议, 与之对应的还有UDP 协议、KCP 协议、HTTP 协议等。本片文章只讨论Tcp通讯。 先来认识Socket 网络上的两个程序通过一个双向的通信连接实现数据交换, 这个连接的一端称为一...

司军礼的博客 2982

GNSS - PPP软件 - GAMP 在VS2019/2022下完成调试、跑通程序(超详细!)

WIN32;_DEBUG;_CONSOLE;O_WARNINGS;ENAGLO;ENACMP;ENAGAL;ENAQZS;NFREQ=3。

qq_43381998的博客 8246

C++面试准备(一)

自我介绍:是谁?本科专业?研究生专业?研究方向?学过的课程?做过的项目?获奖情况?兴趣爱好? 项目介绍:参与项目?负责部分?怎么实现的?结果怎样? 基础知识: 计算机网络 操作系统 游戏基础 计算机网络 1.聊天室要用什么协议?tcp还是udp,原因。 答:TCP面向连接,可靠,数据流 。UDP无连接,不可靠,数据报。UDP无连接,代表了它快速,资源消耗小。UDP虽然描述是不可靠...

团子7号 1085

FileZilla Server目录显示失败的处理方法

这两天河南大暴雨挺严重导致多处停电,我远在郑州机房的服务器也断网连不上了。一直到今天下午才恢复,影响较大,有些客户要数据,可是数据因为断网拿不到。于是我想,要是能把服务器的数据备份到其他地方,比如我的本机或者另外一台电脑该多好。 于是今天一整天我都在找远程备份数据的方法,把一台服务器上的数据实时同步到另外一台上。或者两台服务器互相同步。 找了半天发现了FreeFileSync这个宝藏软件,它的原理很简单是通过ftp传输数据。 我得先在服务器上安装个ftp服务,首选filezilla server,安..

两天打鱼三天晒网 4452

Autosar软件组件分析及ARXML文件分析

Autosar软件组件分析及ARXML文件分析

专注汽车软件开发、AutoSAR、车载以太网、SOA、EE架构。 3600

Unity3D多人斗地主游戏开发:从网络同步到毕设实现

网络游戏开发的核心在于客户端与服务器之间的实时状态同步,这直接决定了多人在线对战的流畅性与公平性。其基本原理通常采用权威服务器架构,由服务器统一验证并广播游戏逻辑,客户端则负责发送操作指令与渲染表现。这一技术方案能有效防止作弊,保障游戏核心规则的正确执行,是构建稳定可玩联机体验的基石。在Unity3D引擎中,借助Mirror等网络框架,开发者可以高效实现房间管理、玩家匹配、卡牌数据同步等关键功能。本文聚焦于斗地主这一经典棋牌游戏,深入探讨如何将上述网络同步原理与游戏状态机、牌型判断等具体逻辑结合,解决联机开

weixin_33693070的博客 373

【产品经理修炼之道】-如何搭建企业级账务系统?

笔者公司的业务模式具有一定的独特性,不同于我们常见的市面上供应链类公司的进销存模式。公司主要为各大银行和金融机构提供信贷领域的风控服务,客户主要通过请求公司的数据产品接口产生费用,可以简单地理解为请求一次接口收费0.5元,一个月若是有1w人请求同一个接口则公司需要收费5000元。

xiaoli8748的专栏 5404

Unity实现Udp服务端的基本功能

Unity实现Udp服务端的基本功能 在之前的博客中我写了简单实现Udp通信客户端的Demo,在实际项目中,我们有时候也要写Udp服务端的功能,以便于接收客户端发送过来的信号。在这篇博客中我简要介绍下Udp服务端的实现方法。 步骤 1.为了能够方便实现动态修改Udp服务端Ip和端口号功能,在这里首先加一个读取配置文件的功能,首先在工程中新建一个StreamingAssets文件夹,在里面新建一个Config.txt文件,如下图所示: ...

波波斯维奇 3620

Unreal从入门到精通之 UE4 vs UE5 VR性能优化实战

这篇文章分享了UE5 VR项目的性能优化经验。作者通过对比UE4和UE5的VR模板性能,发现UE5默认帧率只有45FPS,远低于UE4的100FPS。主要性能瓶颈来自Lumen全局光照、虚拟阴影贴图等新特性。文章详细列出了12项关键优化设置,包括禁用Lumen、关闭虚拟阴影、使用前向渲染等,并分析了各项调整对性能的影响程度。特别指出删除默认的VolumetricCloud可立即提升5帧。最后建议根据场景需求平衡画质与性能,对于高帧率要求的VR项目,可能需要谨慎使用UE5或关闭其部分高级渲染功能。

TxNet 1379

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

上一篇: Unity3D笔记——常用语言标签属性 (Attribute)——上
下一篇: Unity3D笔记——unity2d Sprite 泛白
YYL_Debug
博客等级 码龄10年 14粉丝 8原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值