前言
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)。文章来源:https://www.toymoban.com/news/detail-469834.html
注意事件
需要将发送信道设置为Local本地信道,接受信道设置为Remote远程信道。
StartButton的On Click()列表中需要添加Test.cs中的OnClickButtonStart方法的触发。
SendButton的On Click()列表中需要添加Test.cs中的SendMsg方法的触发。文章来源地址https://www.toymoban.com/news/detail-469834.html
到了这里,关于Unity Render Streaming实现自定义数据传输的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!