1、导入云渲染包
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
搞定!!