UnityRenderStreaming发送端

看了一下官方的demo,一个基本的发送端需要有RenderStreaming、Broadcast、CameraStreamer、AudioStreaming、InputSystemChannelReceiver(或者WebBrowserInputChannelReceiver)几个基本的脚本,下面搭建一个发送端测试一下.

新建一个场景Custom,由于项目中较多用到UGUI,新建一个UGUI的button,用来响应用户端点击btn,在主相机上挂在这些脚本:

 可以根据需要选择websocket或者http通信,然后把对应的脚本拖拽赋值.

注意,如果接收端是web页面,就使用WebBrowserInputChannelReceiver脚本接收web页面的交互操作.这里先测试exe接收端,使用了InputSystemChannelReceiver.

注意要设置Canvas的渲染模式为ScreenSpace-Camera,并指定推送视频流的相机,这样才能把UI也转换到视频流中.

UGUI的交互,需要用到一个新的EventSystem,新建一个CustomEventSystem脚本,代码如下:

using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.LowLevel;

public class CustomEventSystem : EventSystem
{
    protected override void Awake()
    {
        base.Awake();
        unsafe
        {
            InputSystem.onDeviceCommand += InputSystemOnDeviceCommand;
        }
    }

    private static unsafe long? InputSystemOnDeviceCommand(InputDevice device, InputDeviceCommand* command)
    {
        if (command->type != QueryCanRunInBackground.Type)
        {
            // return null is skip this evaluation
            return null;
        }

        ((QueryCanRunInBackground*)command)->canRunInBackground = true;
        return InputDeviceCommand.GenericSuccess;
    }

    protected override void OnApplicationFocus(bool hasFocus)
    {
        //Do not change focus flag on eventsystem
    }
}

 把unity自带的EventSystem移除,挂载CustomEventSystem:

新建一个Custom脚本处理一下用户端的交互:

using Unity.RenderStreaming;
using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.UI;

public class Custom : MonoBehaviour
{
    //ugui按钮点击测试
    public Button btn;

    //获取用户端交互 --exe
    private InputSystemChannelReceiver receiver;
    //获取用户端交互 --web
    //private WebBrowserInputChannelReceiver receiver;
    //鼠标交互
    private Mouse m_mouse;
    //触屏交互
    private Touchscreen m_screen;
    //键盘交互
    private Keyboard m_keyboard;
    //鼠标位置
    private Vector2 mousePos;

    private void Awake()
    {
        receiver = GetComponent<InputSystemChannelReceiver>();
        //绑定设备响应事件
        receiver.onDeviceChange += OnDeviceChange;
        btn.onClick.AddListener(OnClickBtn);
    }

    /// <summary>
    /// 点击按钮
    /// </summary>
    private void OnClickBtn ()
    {
        Debug.Log("----------->>>>>>>>>OnClickBtn");
    }

    /// <summary>
    /// 网页端有交互变动
    /// </summary>
    /// <param name="device">交互设备</param>
    /// <param name="change">变化类型</param>
    private void OnDeviceChange (InputDevice device, InputDeviceChange change)
    {
        switch (change)
        {
            //添加设备
            case InputDeviceChange.Added:
                SetDevice(device, true);
                return;
            //移除设备
            case InputDeviceChange.Removed:
                SetDevice(device, false);
                return;
        }
    }
    

    private void SetDevice (InputDevice device, bool add)
    {
        switch (device)
        {
            case Mouse mouse:
                m_mouse = add ? mouse : null;
                break;
            case Keyboard keyboard:
                m_keyboard = add ? keyboard : null;
                break;
            case Touchscreen screen:
                m_screen = screen;
                break;
        }
    }
    /// <summary>
    /// 按下鼠标左键
    /// </summary>
    private void OnLeftMouseBtnPress ()
    {
        Debug.Log("----------->>>>>>>>>OnLeftMouseBtnPress");
    }
    /// <summary>
    /// 按下鼠标左键并拖拽
    /// </summary>
    private void OnLeftMouseBtnPressDrag()
    {
        Debug.Log("----------->>>>>>>>>OnLeftMouseBtnPressDrag");
    }
    /// <summary>
    /// 松开鼠标左键
    /// </summary>
    private void OnLeftMouseBtnRelease()
    {
        Debug.Log("----------->>>>>>>>>OnLeftMouseBtnRelease");
    }

    private void FixedUpdate()
    {
        if (m_mouse != null)
        {
            if (m_mouse.leftButton.wasPressedThisFrame)
            {
                mousePos = m_mouse.position.ReadValue();
                OnLeftMouseBtnPress();
            }
            else if (m_mouse.leftButton.isPressed && mousePos != m_mouse.position.ReadValue())
            {
                mousePos = m_mouse.position.ReadValue();
                OnLeftMouseBtnPressDrag();
            }
            else if (m_mouse.leftButton.wasReleasedThisFrame)
            {
                mousePos = Vector2.zero;
                OnLeftMouseBtnRelease();
            }
        }

        if (m_screen != null)
        {
            Debug.Log("----------->>>>>>>>>m_screen.touches.Count: " + m_screen.touches.Count);
        }
    }
}

这里先写几个比较常用的鼠标点击,拖拽和touch打印一下,发送端搭建完毕,后面再搭建一下用户端,看看能不能跑通.

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Unity Render Streaming是一种基于WebRTC技术的Unity游戏流媒体解决方案,可以将Unity游戏实时流式传输到Web浏览器或移动设备上,实现远程游戏体验。它可以帮助游戏开发者更好地扩展游戏的受众群体,提高游戏的可玩性和用户体验。 ### 回答2: Unity Render Streaming 是 Unity 提供的一种技术,可以让开发者将自己的 Unity 技术应用直接实时传输到云,并流式呈现到终设备上。Render Streaming 通过网络传输将渲染的内容发送到客户,实现高效的游戏和图形应用程序的云渲染和实时传输。 Unity Render Streaming 提供了许多优势。首先,它允许用户在强大的云服务器上进行高品质的实时渲染,提供了更高的计算能力和渲染性能。这意味着开发者可以在低或移动设备上运行高质量的游戏和图形应用,无需本地设备强大的计算能力。 其次,Render Streaming 具有可扩展性。通过在云服务器上实时渲染游戏和图形应用程序,可以无缝地扩展应用的用户数。无论是少数用户还是大量用户,Render Streaming 都可以提供稳定的渲染和传输性能。 此外,Unity Render Streaming 支持多个平台和终设备,包括PC、移动设备以及虚拟现实(VR)和增强现实(AR)设备。这意味着开发者可以在不同的设备上实时渲染和流式呈现他们的应用。 总之,Unity Render Streaming 是一个强大的技术,为开发者提供了实时渲染和流式传输应用程序的能力。通过利用云计算和强大的云服务器,开发者可以实现更高质量的游戏和图形应用,并将其传输到各种终设备上,为用户提供更好的用户体验。 ### 回答3: Unity Render Streaming是由Unity Technologies开发的一种流媒体技术,它使开发人员能够实时将游戏内容流式传输到许多不同设备上。这项技术可以通过将游戏内容流式传输到云来实现,然后用户可以通过网络直接访问游戏而无需下载或安装任何东西。 Unity Render Streaming支持多种平台,包括PC、手机和VR设备。通过这种技术,用户可以在他们自己的设备上体验高质量的游戏内容,而无需购买昂贵的游戏硬件或升级自己的设备。 使用Unity Render Streaming,开发人员可以实现多人在线游戏体验,用户可以与其他玩家交互、竞争或合作。这种技术还可以用于创建分屏合作游戏,让多个玩家同时在同一场景中进行游戏。 Unity Render Streaming还具有实时性能优化功能,可以根据用户的网络连接情况自动调整游戏内容的质量。这意味着即使在网络较差的情况下,用户仍然可以获得流畅的游戏体验。 总之,Unity Render Streaming是一项强大的技术,它可以实现高质量的流媒体游戏体验,为用户带来更多便利和乐趣。随着这项技术的不断发展,我们可以期待看到更多创新的游戏体验和交互方式的出现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值