客户端的代码

using UnityEngine;
using System.Collections;
//引入库
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using UnityEngine.UI;
public class UdpClient : MonoBehaviour
{
    //以下默认都是私有的成员
    public static UdpClient Client;
    public bool isConnect=true;
    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; //连接线程
    public InputField IpAddress;
    public InputField Port;
    public Canvas UI;
    //初始化
    void InitSocket(string IP,int port)
    {
        //定义连接的服务器ip和端口,可以是本机ip,局域网,互联网
        ipEnd = new IPEndPoint(IPAddress.Parse(IP),port);
        //定义套接字类型,在主线程中定义
        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");
        SocketSend(Encoding.ASCII.GetBytes("hello"));
        UI.enabled = false;
    }

public void SocketSend(byte[] image)
    {
        //清空发送缓存
        sendData = new byte[1024];
        //数据类型转换
        sendData = image;
        //发送给指定服务端
        socket.SendTo(sendData, sendData.Length, SocketFlags.None, ipEnd);
    }
    //连接关闭
    void SocketQuit()
    {
        //关闭线程
        if (connectThread != null)
        {
            connectThread.Interrupt();
            connectThread.Abort();
        }
        //最后关闭socket
        if (socket != null)
            socket.Close();
    }
    public void Connect()
    {
        string IP = IpAddress.text;
        int port = int.Parse(Port.text);
        InitSocket(IP,port);
    }
    // Use this for initialization
    void Start()
    {
        Client = this;
       //InitSocket(); //在这里初始化
    }

// Update is called once per frame
    void Update()
    {

}

void OnApplicationQuit()
    {
        SocketQuit();
    }
}

服务端代码

using UnityEngine;
using System.Collections;
//引入库
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

public class UdpServer : MonoBehaviour
{
    public static UdpServer Server;
    public static byte[] image;
    //以下默认都是私有的成员
    public string IpAdress;//本机的IP地址
    public int port;//端口
    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; //连接线程
    float t = 0;
   
    void getIp()
    {
        IPHostEntry localhost = Dns.GetHostEntry(Dns.GetHostName());
        IPAddress localaddr = localhost.AddressList[0];
        IpAdress= localaddr.ToString();
    }
    //初始化
    void Start()
    {
        Server = this;
        getIp();
        InitSocket(); //在这里初始化server
    }

void InitSocket()
    {
        //定义侦听端口,侦听任何IP
        ipEnd = new IPEndPoint(IPAddress.Any, port);
        //定义套接字类型,在主线程中定义
        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();
    }

public void SocketSend(byte [] byimg)
    {
        //清空发送缓存
        sendData = new byte[1024];
        //数据类型转换
        sendData =byimg;
        //发送给指定客户端
        socket.SendTo(sendData, sendData.Length, SocketFlags.None, clientEnd);
    }

//服务器接收
    void SocketReceive()
    {
        //进入接收循环
        while (true)
        {
            //对data清零
            recvData = new byte[102400];
            //获取客户端,获取客户端数据,用引用给客户端赋值
            recvLen = socket.ReceiveFrom(recvData, ref clientEnd);
            image = recvData;
            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

// Update is called once per frame
    void Update()
    {
       
    }

void OnApplicationQuit()
    {
        SocketQuit();
    }
}

通过Texture2D来获取手机视频画面 我这里通过多个摄像头来生产RenderTexture

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class tex : MonoBehaviour
{
    // Start is called before the first frame update
    public RenderTexture rt;
    void Start()
    {
        
    }

// Update is called once per frame
    void Update()
    {
        byte[] by = getTexture2d(rt);
        try
        {   
                UdpClient.Client.SocketSend(by);
        }
        catch
        { 
        
        }
    }
    public byte[] getTexture2d(RenderTexture renderT)
    {
        if (renderT == null)
            return null;
        int width = renderT.width;
        int height = renderT.height;
        Texture2D tex2d = new Texture2D(width, height, TextureFormat.ARGB32, false);
        RenderTexture.active = renderT;
        tex2d.ReadPixels(new Rect(0, 0, width, height), 0, 0);
        tex2d.Apply();
        byte[] b = tex2d.EncodeToPNG();
        Debug.Log(b.Length);
        Destroy(tex2d);
        return b;
    }
}

服务端读取renderTexture映射道Sprie上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Servertex : MonoBehaviour
{
    // Start is called before the first frame update
    public Sprite sp;
    void Start()
    {
        
    }

// Update is called once per frame
    void Update()
    {
        try
        {
            sp.texture.LoadImage(UdpServer.image);
        }
        catch
        {

}
    }
}

Unity 多端游戏画面同步相关推荐

  1. Unity移动端游戏性能优化简谱之 以引擎模块为划分的CPU耗时调优

    <Unity移动端游戏性能优化简谱>从Unity移动端游戏优化的一些基础讨论出发,例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题,并展示了如何使用UWA的性能 ...

  2. Unity移动端游戏性能优化简谱之 常见游戏内存控制

    <Unity移动端游戏性能优化简谱>从Unity移动端游戏优化的一些基础讨论出发,例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题,并展示了如何使用UWA的性能 ...

  3. unity 手写板 截取游戏画面 识别手写文字 全家桶

    要求离线识别,不能接外网 识别手写文字分为3步 第一步,做手写板 第二步,截取游戏画面 第三步,识别 第一步,做个手写板 我们可以使用LineRender实现手写板功能 具体思想为,读取鼠标位置,当鼠 ...

  4. unity PC端与手机同步的调试

    通过unity Remote实现在手机上调试PC端

  5. Unity游戏帧同步技术分享篇【01】帧同步解决方案概述

    前言: 1.0 帧同步原理与简介 A.什么是帧同步? 帧同步是一种前后端数据同步的方式,一般应用于对实时性要求很高的网络游戏. 其基本实现流程及思路可以概括为: 1.所有客户端每帧上传操作指令集到服务 ...

  6. Unity游戏画面参数解析与应用:垂直同步、动态模糊、抗锯齿

    前言 最近会在B站刷到一些关于 30帧暴涨90帧! 高 中 低端显卡运行3A大作优化指南[干货向] 游戏画质设置教程 等等这样关于画面与性能调整的的视频,看完之后受益良多,UP主们经过实际测试获取到宝 ...

  7. 高端游戏开发工具:Unity Pro 2019 Mac版

    Unity Pro 2019 for Mac是专业的游戏开发工具,unity pro 2019 mac版具备最先进的游戏引擎之一,新版本提供了模块化组件系统.着色器可视化编程工具.可视乎开发环境.渲染 ...

  8. Unity3d游戏画面实时同步html5或WebGL中(基于FMETP STREAM)

    一.准备画面发送端 1.新建unity3d工程(这里的版本为Unity3d2018.4.14),导入FMETP STREAM插件. 2.在场景创建空实体FMSocketIOManager,添加FMSo ...

  9. Unity NGUI高端游戏小地图6组图标Unity游戏素材资源(UGUI可用图片素材)

    Unity NGUI高端游戏小地图6组图标Unity游戏素材资源(UGUI可用图片素材) 项目下载 Demo下载地址 效果图 例子场景 项目下载 Demo下载地址

  10. 【Unity Shaders】游戏性和画面特效——创建一个老电影式的画面特效

    本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...

最新文章

  1. 如何用 StreamAPI 处理 BigDecimal 的 add 操作
  2. 看到他我一下子就悟了-- Lambda表达式
  3. Common BeanUtils 简介
  4. mysql建表的规则_MYSQL建表规则 - Love彼岸花开的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. LeetCode 2130. 链表最大孪生和(链表快慢指针+反转链表+双指针)
  6. idea 中maven依赖报错3部曲
  7. 跟我一起写一个chrome扩展程序
  8. 从load加载数据类型是struct说起
  9. linux __setup
  10. 小学计算机图形组合教案,小学三年级信息技术下册组合图形名师公开课优质教案人教版...
  11. 無題(後改為總有那麼一句話)
  12. 3.配置阿里云镜像加速
  13. 数据可视化:Metabase
  14. 废旧笔记本打造黑群晖NAS,docker,软路由,实现我心目中的all in one,包含fx n1,玩客云老母鸡玩法
  15. 添加IIS FTP站点密码
  16. Docker read connection reset by peer
  17. 2020年7月19日训练总结
  18. 传奇单职业1.76御天战神强势来袭
  19. 通过js唤醒app或者跳转应用市场
  20. transition动画效果

热门文章

  1. 比较计算机动画与传统动画的异同,定格动画和传统动画有什么区别?基本一样吧?...
  2. jstl fn 函数
  3. 计算机里的wps云盘和网盘怎么删除,电脑里的wps网盘图标怎么删除?让你的云端文档更安全!...
  4. android格式化SD卡,获取其它程序的缓存大小,清理数据
  5. Tegra TK1中文输入法
  6. 论文笔记——Contextual Multi-armed Bandit Algorithm for Semiparametric(半参数) Reward Model
  7. windows oracle部署碰到的问题:ORA-12541: TNS: 无监听程序/未找到wfmlrsvcapp.ear/导入命令
  8. win7系统下装ubantu
  9. 机械键盘黑轴红轴青轴茶轴区别 机械键盘黑轴红轴青轴茶轴哪个好
  10. Hive 连接 secured ES 踩坑日记