Unity Render Streaming实现自定义数据传输

这篇具有很好参考价值的文章主要介绍了Unity Render Streaming实现自定义数据传输。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

Uinity Render Streaming中已有的脚本实现了Video和Audio的收发和InputSystem相关事件的收发,那么如何简单的实现自定义的数据收发呢?(本文实现的是Unity端到Unity端的数据收发)

一、总体思路

关于Unity Render Streaming包,其自身提供了与信令服务器建立连接的基础件脚本RenderStreaming.cs,还提供了一系列的创建连接的示例脚本:SingleConnection(建立一对一收发来连接)、Broadcast.cs(向外广播连接)等。
Unity Render Streaming实现自定义数据传输
个人收发数据的具体实现其实只需要自己编写收发的Channel脚本,在Channel中规定收发相关的操作即可。具体如上图所示,使用SingleConnection组件建立一个一对一的连接,然后在该连接上定义了两个数据通道,一个是Send Channel,用于发送本地数据;另一个是Receive Channel,用于接收远端数据。然后需要将SingleConnection挂载到Render Streaming上使用信令服务器去建立该连接。
Unity Render Streaming实现自定义数据传输
总体的工程实现如上图所示,在名为GameMannager的Empty Object上挂载与传输相关的各种组件,然后定义了两个按钮。Strat按钮用于建立连接,Send按钮用于发送指定字符串。

二、管理脚本Test实现

using System;
using System.Collections;
using System.Linq;
using UnityEngine;
using UnityEngine.UI;

namespace Unity.RenderStreaming.Samples
{
    class Test : MonoBehaviour
    {

        [SerializeField] RenderStreaming renderStreaming;//renderStreaming
        [SerializeField] GameObject StartBtn;//建立连接按钮
        [SerializeField] GameObject SendBtn;//发送字符串按钮
        [SerializeField] SendChannel SendCahnnel;//发送信道
        [SerializeField] ReceiveChannel ReceiveChannel;//接受信道
        [SerializeField] SingleConnection singleConnection;//SingleConnection

        private RenderStreamingSettings settings;

        private void Awake()
        {
            StartBtn.SetActive(true);
            SendBtn.SetActive(false);
            //在awake中获取renderStreaming的配置
            settings = SampleManager.Instance.Settings;
        }

        private void Start()
        {
        	//先将RenderStreaming运行起来
            if (renderStreaming.runOnAwake)
                return;
            renderStreaming.Run(signaling: settings?.Signaling);
        }

        //按下start按钮
        public void OnClickButtonStart()
        {
            StartBtn.SetActive(false);
            SendBtn.SetActive(true);
            singleConnection.CreateConnection("12345");//建立ConnectionID为12345的连接
        }

		//按下Send按钮
        public void SendMsg()
        {
            var channel = transform.GetComponent<SendChannel>();
            //调用Send Channel的SendInstantiate方法发送Send A Message字符串
            channel.SendInstantiate("Send A Message");
        }

    }
}

Test脚本中主要实现了UI交互功能,点击Start按钮后建立一个具有收发双信道的连接,点击Send就执行Send Channel的对应方法,发送字符串。

三、自定义Sned Channel

using System;
using UnityEngine;
using UnityEngine.Events;

namespace Unity.RenderStreaming.Samples
{
    //发送消息的类型
    enum SMsgType
    {
        Instantiate = 0,
        Transform = 1,
        Animator = 2,
        RigBody = 3
    }

    [Serializable]
    class SMsg
    {
        public SMsgType type;//发送的类型
        public string argument;//数据
    }

    class SendChannel : DataChannelBase
    {

        public void SendInstantiate(string text)
        {
            var msg = new SMsg
            {
                type = SMsgType.Instantiate,
                argument = text
            };
            //将Message发送出去
            Send(JsonUtility.ToJson(msg));
        }

        public void SendTransform(string text)
        {
            var msg = new SMsg
            {
                type = SMsgType.Transform,
                argument = text
            };
            //将Message发送出去
            Send(JsonUtility.ToJson(msg));
        }

        public void SendAnimator(string text)
        {
            var msg = new SMsg
            {
                type = SMsgType.Animator,
                argument = text
            };
            //将Message发送出去
            Send(JsonUtility.ToJson(msg));
        }

        public void SendRigbody(string text)
        {
            var msg = new SMsg
            {
                type = SMsgType.RigBody,
                argument = text
            };
            //将Message发送出去
            Send(JsonUtility.ToJson(msg));
        }
    }
}

Send Channel脚本内,可以自定义发送数据类型然后调用Send函数进行法总。注意SendChannel class是继承自Render Streaming的DataChannelBase的。

四、自定义Receive Channel

using System;
using UnityEngine;
using UnityEngine.Events; 

namespace Unity.RenderStreaming.Samples
{

    class ReceiveChannel : DataChannelBase
    {
        //重写OnMessage用于接受数据
        protected override void OnMessage(byte[] bytes)
        {
            //将数据转为string类型
            string str = System.Text.Encoding.UTF8.GetString(bytes);
            //Debug.Log(str);
            //再将string转会Message类型
            var message = JsonUtility.FromJson<SMsg>(str);
            switch (message.type)
            {
                case SMsgType.Instantiate:
                    Debug.Log("Instantiate" + str);
                    break;
                case SMsgType.Animator:
                    Debug.Log("AnimAtor" + str);
                    break;
                case SMsgType.Transform:
                    Debug.Log("Transform" + str);
                    break;
                case SMsgType.RigBody:
                    Debug.Log("Rigbody" + str);
                    break;
                    return;
            }
        }
    }
}

ReceiveChannel也是继承自DataChannelBase类,其主要是override了OnMessage方法。OnMessage方法会被接收信道自动调用,我们只需要在其内部规定接收到数据之后怎么处理数据即可。代码中是将所有接收到的字符串打印在Unity的调试控制台上(Console)。

注意事件

Unity Render Streaming实现自定义数据传输
Unity Render Streaming实现自定义数据传输
需要将发送信道设置为Local本地信道,接受信道设置为Remote远程信道。
Unity Render Streaming实现自定义数据传输
StartButton的On Click()列表中需要添加Test.cs中的OnClickButtonStart方法的触发。
Unity Render Streaming实现自定义数据传输
SendButton的On Click()列表中需要添加Test.cs中的SendMsg方法的触发。文章来源地址https://www.toymoban.com/news/detail-469834.html

到了这里,关于Unity Render Streaming实现自定义数据传输的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity】 Render Streaming 云渲染基本环境搭建及应用(尽量详细,欢迎补充)

    演示所使用的版本: 电脑Win10系统 Unity:2022.3.0 RenderStreaming:3.1.0-exp.6         WebRTC:3.0.0-pre.5(Pre-release)  RenderStreaming WebServer:3.1.0-exp.6 目录 1.安装RenderStreaming 2.安装WebRTC 3.在使用前请确保已安装web服务器和Node.js (1)Node.js的安装和配置 以下是打开“系统属性”界面的补充方

    2024年02月16日
    浏览(32)
  • Unity使用webSocket与服务器通信(三)——C#服务端(Fleck)与Unity客户端( NativeWebSocket)传输多种数据数据

    1、字符串数据 简单的字符串:比如登录请求信息,登录结果返回的信息。 用json系列化的字符串:比如上传一个表到服务器,让它写入到数据库中。 读取文件的时候,读取的是string内容。 2、二进制数据 比如传输的是文件:例如myword.doc,myexcel.xls或者是assetboundle文件。 比如

    2023年04月08日
    浏览(33)
  • 如何实现网络数据传输

    目录 前言 1.理解源IP地址和目的IP地址 2.理解端口号 2.1端口号与进程pid的关系 2.2源端口号和目的端口号 3.协议 3.1TCP协议 3.2认识UDP协议 4.网络字节序 5.socket编程接口 总结         在上一篇文章网络框架中给大家对网络的整体进行了一个宏观的介绍,这篇文章中我们进一步来

    2024年02月13日
    浏览(35)
  • FPGA(Verilog)实现uart传输协议传输数据(含仿真)

    目录 实现功能: 1.接收uart串行数据,输出并行数据(1byte)。 2.输入并行数据(1byte),输出uart串行数据。 3.完成uart传输的1次环回。 uart协议的1帧数据传输 模块封装-port设置 Verilog代码实现 1.uart接收模块:接收串行数据,输出并行数据和其有效标志。 仿真结果: 2.uart发送模块:接收

    2024年04月16日
    浏览(34)
  • Android实现与PHP后端的交互(数据传输,文件传输)(超详细/附源码)

    为方便大家浏览,源码先行奉上 github源码链接 https://github.com/Recycle1/Android-connect-PHP csdn源码链接 https://download.csdn.net/download/weixin_52263647/87751491 在Android开发中,经常涉及与服务器端交互的过程,在现在的APP制作中,经常利用互联网通信,从云端获取图片,数据等信息,本篇文

    2024年01月19日
    浏览(26)
  • 手机如何实现边充电边传输数据?

    日常我们在手机连接电脑或者U盘传输数据的时候,虽然都是传输数据,但是主从关系是不同的,在手机连接电脑的时候可以同时给手机充电,而连接U盘的时候是手机提供电力给U盘,造成这种区别到底是由什么控制呢?   首先我们要知道数据和供电是两个角色,数据和供电都

    2024年02月09日
    浏览(34)
  • 物联网安全:实现数据传输安全的关键技术

    物联网(Internet of Things, IoT)是指通过互联网将物体和日常生活中的各种设备(如传感器、电子标签、智能手机、电子产品等)互联互通,实现人机交互、物物交互和人物交互的大规模网络。随着物联网技术的发展,物联网设备的数量日益增加,这些设备在各个行业中扮演着越来越

    2024年02月19日
    浏览(35)
  • 前后端数据加密传输(附go语言实现)

    一般的对外服务都是需要服务器支持 https 传输的,那既然有了 https ,数据已经加密了,为什么还要做这个事情呢? 现在大多数应用服务都是使用的前后端分离的方式来开发的,以后端提供的接口来进行业务数据交互。相信有过 web 开发经验的都打开过浏览器的调试控制台,

    2024年02月08日
    浏览(35)
  • 【Flink数据传输(一)】NetworkStack架构概述:实现tm之间的数据交换

    NetworkStack提供了高效的网络I/O和反压控制 除了各个组件之间进行RPC通信之外,在Flink集群中TaskManager和TaskManager节点之间也会发生数据交换,尤其当用户提交的作业涉及Task实例运行在不同的TaskManager上时。Task实例之间的数据交换主要借助Flink中的NetworkStack实现。NetworkStack不仅提

    2024年03月25日
    浏览(33)
  • C# 使用FTP上传文件、下载文件,实现数据传输

    上传文件的方法调用: 下载文件方法:

    2024年02月14日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包