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

前言

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

一、总体思路

关于Unity Render Streaming包,其自身提供了与信令服务器建立连接的基础件脚本RenderStreaming.cs,还提供了一系列的创建连接的示例脚本:SingleConnection(建立一对一收发来连接)、Broadcast.cs(向外广播连接)等。
在这里插入图片描述
个人收发数据的具体实现其实只需要自己编写收发的Channel脚本,在Channel中规定收发相关的操作即可。具体如上图所示,使用SingleConnection组件建立一个一对一的连接,然后在该连接上定义了两个数据通道,一个是Send Channel,用于发送本地数据;另一个是Receive Channel,用于接收远端数据。然后需要将SingleConnection挂载到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)。

注意事件

在这里插入图片描述
在这里插入图片描述
需要将发送信道设置为Local本地信道,接受信道设置为Remote远程信道。
在这里插入图片描述
StartButton的On Click()列表中需要添加Test.cs中的OnClickButtonStart方法的触发。
在这里插入图片描述
SendButton的On Click()列表中需要添加Test.cs中的SendMsg方法的触发。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值