概述(Overview)
VideoExtensions 是一个非常轻量的静态扩展类,位于 PFGameFramework.Library 命名空间。
目前仅提供一个方法,用于在 WebGL 平台 或带有系统浏览器能力的环境下,通过 Application.OpenURL 调用系统默认播放器打开并播放指定的视频文件。
核心用途:
- 在 WebGL 构建中播放 StreamingAssets 目录下的 .mp4 视频
- 在 Windows/Mac 桌面构建中打开本地视频文件(通过默认播放器)
适用场景:
- 教学视频、操作演示视频、实验录像播放
- WebGL 项目中需要调用外部播放器的视频展示
- 避免在 Unity 内嵌 VideoPlayer 组件(节省性能或兼容性考虑)
当前限制:
- 只支持 .mp4 格式(硬编码后缀)
- 路径固定为 StreamingAssets/
- 仅通过系统浏览器/播放器播放(非 Unity 内嵌播放)
方法一览(API Index)
| 方法名 | 类型 | 返回类型 | 主要功能 | 典型用途 |
|---|---|---|---|---|
| PlayVideoToWeb | static | void | 在系统浏览器中打开并播放 StreamingAssets 中的 .mp4 视频 | WebGL 视频播放、外部播放器调用 |
方法详情
PlayVideoToWeb
/// <summary>
/// 在网页端(WebGL)或系统浏览器中调用默认播放器打开并播放指定的 .mp4 视频文件。
/// 视频文件必须位于 StreamingAssets 目录下。
/// </summary>
/// <param name="fileName">视频文件名(不含 .mp4 后缀)</param>
/// <remarks>
/// 实际打开的路径为:Application.streamingAssetsPath + "/" + fileName + ".mp4"
/// 在 WebGL 中会触发浏览器打开新标签页或直接播放
/// 在桌面平台会调用系统默认视频播放器
/// </remarks>
public static void PlayVideoToWeb(string fileName)
调用示例:
// 播放 StreamingAssets/MyDemo.mp4
VideoExtensions.PlayVideoToWeb("MyDemo");
// 带按钮触发示例
playButton.onClick.AddListener(() =>
{
VideoExtensions.PlayVideoToWeb("OperationGuide");
});
文件放置位置(项目结构):
Assets/
StreamingAssets/
MyDemo.mp4
OperationGuide.mp4
Tutorial1.mp4
在代码中只需传入文件名(不带后缀):
PlayVideoToWeb("Tutorial1"); // 打开 StreamingAssets/Tutorial1.mp4
使用注意事项
-
平台差异
- WebGL:调用 Application.OpenURL 会让浏览器尝试打开或播放视频(取决于浏览器设置)
- Windows/Mac:会调用系统默认视频播放器(如 Windows Media Player、VLC、QuickTime)
- Android/iOS:行为可能不一致,建议测试(可能打开浏览器或系统播放器)
-
文件路径限制
- 必须放在 StreamingAssets 文件夹
- 路径固定为 Application.streamingAssetsPath + "/" + fileName + ".mp4"
- 不支持子文件夹(如 StreamingAssets/videos/xxx.mp4)
-
文件格式
- 当前硬编码为 .mp4
- 如需支持其他格式(.webm、.mov 等),可修改方法或增加重载
-
WebGL 特殊性
- WebGL 构建中 Application.OpenURL 会打开新标签页或触发下载
- 浏览器可能直接内嵌播放,也可能提示下载(取决于文件头和浏览器策略)
-
错误处理
- 当前方法没有异常捕获
- 建议在实际使用时添加 try-catch:
try
{
VideoExtensions.PlayVideoToWeb("GuideVideo");
}
catch (Exception e)
{
Debug.LogError($"打开视频失败: {e.Message}");
}
改进建议
以下是当前实现可优化的方向:
-
支持子文件夹
C#
public static void PlayVideoToWeb(string relativePath, string fileName) { string fullPath = $"{Application.streamingAssetsPath}/{relativePath}/{fileName}.mp4"; Application.OpenURL(fullPath); } -
支持多种格式
C#
public static void PlayVideoToWeb(string fileName, string extension = ".mp4") { Application.OpenURL($"{Application.streamingAssetsPath}/{fileName}{extension}"); } -
添加回调或完成检测
- 由于 Application.OpenURL 是系统调用,无法直接获取播放完成事件
- 可考虑结合 UniTask 等待一段时间后执行后续逻辑
-
WebGL 更友好方案
- 在 WebGL 中使用 标签 + JavaScript 桥接实现内嵌播放
- 或使用 Unity 的 VideoPlayer 组件(推荐替代方案)
-
错误提示
- 在 WebGL 中可通过 JS 桥接检测文件是否存在