Unity 多端游戏画面同步
客户端的代码
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 多端游戏画面同步相关推荐
- Unity移动端游戏性能优化简谱之 以引擎模块为划分的CPU耗时调优
<Unity移动端游戏性能优化简谱>从Unity移动端游戏优化的一些基础讨论出发,例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题,并展示了如何使用UWA的性能 ...
- Unity移动端游戏性能优化简谱之 常见游戏内存控制
<Unity移动端游戏性能优化简谱>从Unity移动端游戏优化的一些基础讨论出发,例举和分析了近几年基于Unity开发的移动端游戏项目中最为常见的部分性能问题,并展示了如何使用UWA的性能 ...
- unity 手写板 截取游戏画面 识别手写文字 全家桶
要求离线识别,不能接外网 识别手写文字分为3步 第一步,做手写板 第二步,截取游戏画面 第三步,识别 第一步,做个手写板 我们可以使用LineRender实现手写板功能 具体思想为,读取鼠标位置,当鼠 ...
- unity PC端与手机同步的调试
通过unity Remote实现在手机上调试PC端
- Unity游戏帧同步技术分享篇【01】帧同步解决方案概述
前言: 1.0 帧同步原理与简介 A.什么是帧同步? 帧同步是一种前后端数据同步的方式,一般应用于对实时性要求很高的网络游戏. 其基本实现流程及思路可以概括为: 1.所有客户端每帧上传操作指令集到服务 ...
- Unity游戏画面参数解析与应用:垂直同步、动态模糊、抗锯齿
前言 最近会在B站刷到一些关于 30帧暴涨90帧! 高 中 低端显卡运行3A大作优化指南[干货向] 游戏画质设置教程 等等这样关于画面与性能调整的的视频,看完之后受益良多,UP主们经过实际测试获取到宝 ...
- 高端游戏开发工具:Unity Pro 2019 Mac版
Unity Pro 2019 for Mac是专业的游戏开发工具,unity pro 2019 mac版具备最先进的游戏引擎之一,新版本提供了模块化组件系统.着色器可视化编程工具.可视乎开发环境.渲染 ...
- Unity3d游戏画面实时同步html5或WebGL中(基于FMETP STREAM)
一.准备画面发送端 1.新建unity3d工程(这里的版本为Unity3d2018.4.14),导入FMETP STREAM插件. 2.在场景创建空实体FMSocketIOManager,添加FMSo ...
- Unity NGUI高端游戏小地图6组图标Unity游戏素材资源(UGUI可用图片素材)
Unity NGUI高端游戏小地图6组图标Unity游戏素材资源(UGUI可用图片素材) 项目下载 Demo下载地址 效果图 例子场景 项目下载 Demo下载地址
- 【Unity Shaders】游戏性和画面特效——创建一个老电影式的画面特效
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
最新文章
- 如何用 StreamAPI 处理 BigDecimal 的 add 操作
- 看到他我一下子就悟了-- Lambda表达式
- Common BeanUtils 简介
- mysql建表的规则_MYSQL建表规则 - Love彼岸花开的个人空间 - OSCHINA - 中文开源技术交流社区...
- LeetCode 2130. 链表最大孪生和(链表快慢指针+反转链表+双指针)
- idea 中maven依赖报错3部曲
- 跟我一起写一个chrome扩展程序
- 从load加载数据类型是struct说起
- linux __setup
- 小学计算机图形组合教案,小学三年级信息技术下册组合图形名师公开课优质教案人教版...
- 無題(後改為總有那麼一句話)
- 3.配置阿里云镜像加速
- 数据可视化:Metabase
- 废旧笔记本打造黑群晖NAS,docker,软路由,实现我心目中的all in one,包含fx n1,玩客云老母鸡玩法
- 添加IIS FTP站点密码
- Docker read connection reset by peer
- 2020年7月19日训练总结
- 传奇单职业1.76御天战神强势来袭
- 通过js唤醒app或者跳转应用市场
- transition动画效果
热门文章
- 比较计算机动画与传统动画的异同,定格动画和传统动画有什么区别?基本一样吧?...
- jstl fn 函数
- 计算机里的wps云盘和网盘怎么删除,电脑里的wps网盘图标怎么删除?让你的云端文档更安全!...
- android格式化SD卡,获取其它程序的缓存大小,清理数据
- Tegra TK1中文输入法
- 论文笔记——Contextual Multi-armed Bandit Algorithm for Semiparametric(半参数) Reward Model
- windows oracle部署碰到的问题:ORA-12541: TNS: 无监听程序/未找到wfmlrsvcapp.ear/导入命令
- win7系统下装ubantu
- 机械键盘黑轴红轴青轴茶轴区别 机械键盘黑轴红轴青轴茶轴哪个好
- Hive 连接 secured ES 踩坑日记