You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PC控制HoloLens应用?新手求Unity触发视频播放实现方案

嘿,作为刚入坑HoloLens开发的新手,想用TCP实现Unity编辑器触发设备端播放视频的需求其实挺清晰的,我来一步步给你捋明白怎么落地~

实现Unity编辑器触发HoloLens播放视频(TCP方案)

整体核心思路

本质是做一个点对点的指令通信:让Unity编辑器作为TCP客户端发送播放指令,HoloLens应用作为TCP服务端监听连接,收到指令后触发本地的视频播放逻辑。


第一步:搞定HoloLens端的服务端+视频播放逻辑

先处理设备侧的代码,需要两个核心模块:TCP服务端监听,以及收到指令后的视频播放执行。

1. 准备视频资源

把你的视频文件放到Unity项目的StreamingAssets文件夹(右键Project窗口创建,命名为StreamingAssets),这个文件夹打包后会被HoloLens正确识别访问。

2. 编写HoloLens端TCP服务端代码

创建一个C#脚本(比如HoloLensTCPServer.cs),挂载到场景中的任意GameObject上:

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using UnityEngine;
using UnityEngine.Video;

public class HoloLensTCPServer : MonoBehaviour
{
    private TcpListener _tcpListener;
    private NetworkStream _stream;
    private VideoPlayer _videoPlayer;

    [SerializeField] private int port = 8888; // 端口号,编辑器和设备端要保持一致
    [SerializeField] private VideoPlayer videoPlayer; // 拖入场景中的VideoPlayer组件

    private void Start()
    {
        // 初始化视频播放器,绑定路径
        _videoPlayer = videoPlayer;
        _videoPlayer.url = Application.streamingAssetsPath + "/your-video.mp4"; // 替换成你的视频文件名

        // 开子线程启动服务端,避免阻塞Unity主线程
        System.Threading.ThreadPool.QueueUserWorkItem(StartListening);
        Debug.Log("HoloLens TCP服务已启动,监听端口: " + port);
    }

    private void StartListening(object state)
    {
        try
        {
            _tcpListener = new TcpListener(IPAddress.Any, port);
            _tcpListener.Start();

            while (true)
            {
                // 等待编辑器客户端连接
                TcpClient client = _tcpListener.AcceptTcpClient();
                Debug.Log("已连接到Unity编辑器");

                _stream = client.GetStream();
                byte[] buffer = new byte[1024];
                int bytesRead = _stream.Read(buffer, 0, buffer.Length);
                string receivedCmd = Encoding.ASCII.GetString(buffer, 0, bytesRead);

                // 识别播放指令,注意要在主线程执行Unity API
                if (receivedCmd.Equals("PLAY_VIDEO", StringComparison.OrdinalIgnoreCase))
                {
                    UnityMainThreadDispatcher.Instance.Enqueue(() =>
                    {
                        if (!_videoPlayer.isPlaying)
                        {
                            _videoPlayer.Play();
                            Debug.Log("视频开始播放");
                        }
                    });
                }

                // 断开连接
                client.Close();
            }
        }
        catch (Exception e)
        {
            Debug.LogError("服务端出错: " + e.Message);
        }
    }

    private void OnDestroy()
    {
        _tcpListener?.Stop();
        _stream?.Close();
    }
}

小提示:代码里用到的UnityMainThreadDispatcher是用来解决子线程不能调用Unity API的问题,你可以自己实现一个简单的主线程调度器:创建一个单例GameObject,维护一个待执行的Action队列,在Update方法里逐个执行队列中的方法。

3. 配置VideoPlayer组件

在HoloLens场景里添加一个VideoPlayer组件,挂载到Plane/Quad这类平面载体上(作为视频的显示区域),然后把这个组件拖到HoloLensTCPServer脚本的videoPlayer字段上。


第二步:编写Unity编辑器端的客户端代码

创建一个C#脚本(比如EditorTCPClient.cs),挂载到编辑器场景中按钮所在的GameObject上:

using System;
using System.Net.Sockets;
using System.Text;
using UnityEngine;
using UnityEngine.UI;

public class EditorTCPClient : MonoBehaviour
{
    [SerializeField] private Button playButton; // 拖入你的按钮组件
    [SerializeField] private string holoLensIP = "192.168.1.100"; // 替换成你的HoloLens设备IP
    [SerializeField] private int port = 8888; // 和HoloLens端的端口保持一致

    private void Start()
    {
        // 给按钮绑定发送指令的逻辑
        playButton.onClick.AddListener(SendPlayCommand);
    }

    private void SendPlayCommand()
    {
        try
        {
            // 建立TCP连接并发送指令
            using (TcpClient client = new TcpClient())
            {
                client.Connect(holoLensIP, port);
                NetworkStream stream = client.GetStream();

                byte[] cmdBytes = Encoding.ASCII.GetBytes("PLAY_VIDEO");
                stream.Write(cmdBytes, 0, cmdBytes.Length);
                Debug.Log("已向HoloLens发送播放指令");
            }
        }
        catch (Exception e)
        {
            Debug.LogError("发送指令失败: " + e.Message);
            Debug.Log("请确认HoloLens和电脑在同一局域网,且服务端已启动");
        }
    }
}

第三步:部署与测试

  1. 部署HoloLens应用:Unity切换平台到UWP,配置好HoloLens打包设置(比如选择Device作为部署目标),打包后部署到你的HoloLens设备上。
  2. 获取HoloLens的IP:在设备的设置→网络和Internet→WLAN→当前网络中查看IP地址,替换到编辑器脚本的holoLensIP字段。
  3. 测试功能:确保电脑和HoloLens在同一局域网,运行编辑器场景,点击按钮,设备端应该就能播放视频了。

额外实用提示

  • 防火墙设置:确保电脑和HoloLens的防火墙没有拦截TCP端口8888的通信。
  • 指令扩展:如果以后需要暂停、停止这类功能,只需要在两端增加对应的指令判断即可。
  • 替代方案:如果觉得TCP太繁琐,也可以试试用UnityWebRequest做简单的HTTP请求,或者微软的RPC方案,但TCP是最直接的点对点通信方式,很适合你的需求。

内容的提问来源于stack exchange,提问作者Mayoco

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:12:35