【Unity】 Render Streaming 云渲染环境搭建及与WEB端通信

1、导入云渲染包

输入:[email protected]

2、搭建云渲染场景

创建空物体,随便起名,我叫RenderStreaming。不创建也行,可以把组件放在摄像机上(不推荐)

在RenderStreaming中添加SignalingManager、Broadcast、 VideoStreamSender三个组件。

在SignalingManager中引入Broadcast。

在Broadcast中引入VideoStreamSender。

VideoStreamSender的配置看图。

我这里添加了两个Broadcast,是因为交互和通信放一起会冲突,谁在后面谁失效,还没查到原因。

3、通信

创建新脚本,我起名DBBrowserInputChannelReceiver

using System.Collections;
using System.Collections.Generic;
using System.Text;
using Unity.RenderStreaming;
using Unity.RenderStreaming.Samples;
using UnityEngine;
public class DBBrowserInputChannelReceiver : DataChannelBase
{
    public GameObject[] targets;
    protected override void OnMessage(byte[] bytes)
    {
        if (bytes.Length > 0)
        {
            int code = bytes[0]; // 第一个字节为通讯类型标记
            if (code == 6) // 我们自定义的字符串通讯类型标记
            {
                string message = UTF8Encoding.UTF8.GetString(bytes, 1, bytes.Length - 1); // 去掉数据流第一个标记字节,剩余字节通过UTF8编码转化回字符串,对应JS的UTF8编码函数unescape(encodeURIComponent(str))
                Debug.Log("WEB按钮点击发送的消息:" + message);
                //foreach (GameObject go in targets)
                //{
                //    go.SendMessage("OnNetMessage", message); // 将数据通过Unity的SendMessage发送给处理节点
                //}
                //if (code <= 5)
                //{
                //    base.OnMessage(bytes); // 通过基类处理默认类型消息
                //}
            }
        }
    }
}

将脚本拖到RenderStreaming空物体,并加到一个Broadcast中。

4、WEB端场景交互

在RenderStreaming中添加InputReceiver组件。

创建Input Acyions ,我起名CameraControls。

添加内容,每个操作配置看下图。

创建控制脚本,我起名CameraController

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class CameraController : MonoBehaviour
{
    public Transform cameraObject;
    public Transform target;

    public float x_Speed = 100;
    public float y_Speed = 100;
    public float xMinLimit = 5;
    public float xMaxLimit = 80;
    public float mmSpeed = 0.1f;
    public float distance = 100;
    public float minDistance = 20;
    public float maxDistance = 300;
    public bool isNeedDamping = true;
    public float damping = 8f;
    public float x_OriginAngle = 30f;
    public float y_OriginAngle = 0f;

    Vector2 inputMovement;
    Vector2 inputScroll;
    bool isPress = false;
    void LateUpdate()
    {
        if (isPress)
        {
            y_OriginAngle += inputMovement.x * x_Speed * Time.deltaTime;
            x_OriginAngle -= inputMovement.y * y_Speed * Time.deltaTime;
            x_OriginAngle = ClampAngle(x_OriginAngle, xMinLimit, xMaxLimit);
        }
        distance += inputScroll.y * mmSpeed;
        //将值限制在最小浮点值与最大浮点值之间。float value, float min, float max
        distance = Mathf.Clamp(distance, minDistance, maxDistance);
        Quaternion rotation = Quaternion.Euler(x_OriginAngle, y_OriginAngle, 0.0f);
        Vector3 disVector = new Vector3(0.0f, 0.0f, -distance);
        Vector3 position = rotation * disVector + target.position;
        if (isNeedDamping)
        {
            cameraObject.rotation = Quaternion.Lerp(cameraObject.rotation, rotation, Time.deltaTime * damping);
            cameraObject.position = Vector3.Lerp(cameraObject.position, position, Time.deltaTime * damping);
        }
        else
        {
            cameraObject.rotation = rotation;
            cameraObject.position = position;
        }
    }
    static float ClampAngle(float angle, float min, float max)
    {
        if (angle < -360)
            angle += 360;
        if (angle > 360)
            angle -= 360;
        return Mathf.Clamp(angle, min, max);
    }
    public void MousePress(InputAction.CallbackContext obj)
    {
        isPress = obj.performed;
    }
    public void MouseMove(InputAction.CallbackContext obj)
    {
        inputMovement = obj.ReadValue<Vector2>();
    }
    public void MouseScroll(InputAction.CallbackContext obj)
    {
        inputScroll = obj.ReadValue<Vector2>();
    }
}

把CameraControls拖到InputReceiver的Actions中

把CameraController拖到RenderStreaming中,

展开InputReceiver的Events,给配置好的三个操作绑定CameraController脚本,并选择脚本方法。

将InputReceiver加到另一个Broadcast中。

5、启动UNITY,打开http://localhost:890/multiplay/index.html

搞定!!

猜你喜欢

转载自blog.csdn.net/u013179508/article/details/142565232