如何通过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和电脑在同一局域网,且服务端已启动"); } } }
第三步:部署与测试
- 部署HoloLens应用:Unity切换平台到UWP,配置好HoloLens打包设置(比如选择Device作为部署目标),打包后部署到你的HoloLens设备上。
- 获取HoloLens的IP:在设备的设置→网络和Internet→WLAN→当前网络中查看IP地址,替换到编辑器脚本的
holoLensIP字段。 - 测试功能:确保电脑和HoloLens在同一局域网,运行编辑器场景,点击按钮,设备端应该就能播放视频了。
额外实用提示
- 防火墙设置:确保电脑和HoloLens的防火墙没有拦截TCP端口8888的通信。
- 指令扩展:如果以后需要暂停、停止这类功能,只需要在两端增加对应的指令判断即可。
- 替代方案:如果觉得TCP太繁琐,也可以试试用UnityWebRequest做简单的HTTP请求,或者微软的RPC方案,但TCP是最直接的点对点通信方式,很适合你的需求。
内容的提问来源于stack exchange,提问作者Mayoco
相关产品推荐
相关产品推荐

