Unity中内嵌网页插件 UniWebView 2.8使用

2016年10月24日 19:00 0 点赞 1 评论 更新于 2025-11-21 13:36

一、插件概述

UniWebView 2 是一款适用于 Android、iOS 和 Mac OS 的插件,在移动端使用效果最佳。它支持 WP8,但不支持 Windows 桌面系统,包括在编辑器状态下也无法使用。该插件适用于 Unity 4.x 版本,可在 Unity Asset Store 上获取,链接为:https://www.assetstore.unity3d.com/en/#!/content/32461。在 Unity 开发中,它主要用于实现活动功能,例如《阴阳师》手游就可能使用了该插件。不过,该插件的开发存在一定不便,由于不支持 Windows 下的 Editor 调试,开发者只能在 Mac 系统下进行调试。

二、使用思路

1. 下载与安装

插件的官网为:http://uniwebview.onevcat.com/。开发者需先从官网下载插件,然后将其安装并导入到 Unity 项目中。

2. 预制体与 URL 设置

UniWebView/Prefab 文件夹下拖拽 UniWebViewObject 预制体到场景中。在 Inspector 面板上设置 URL,但需要注意的是,在 Windows 系统上无法进行此设置。在 Mac 系统上,点击 Play 即可看到效果;而在 Windows 系统上,则需要将项目打包成移动包才能看到效果。

三、UniWebView 的工作方式

1. 组件设置

在 Mac 系统下,可以对 UniWebView 组件进行如下设置:

  • Insets:用于控制 Web 视图的大小。
  • Load On Start:可在 Start 函数中加载页面。
  • Auto Show WhenLoad Complete:页面加载完成时自动显示。

2. 其他重要功能

除了显示 Web 页面的基本功能外,UniWebView 还具备一些其他重要功能,如与 Unity 场景通信、侦听 Web 页事件以及执行 JavaScript 计算等。

3. 通过脚本加载并显示 Web 内容

假设在 UniWebView.cs 脚本所在的对象上有一个脚本,其中定义了如下字段:

private UniWebView _webView;

可以通过以下方式获取引用:

var _webView = gameObject.GetComponent<UniWebView>();

监听事件:

_webView.OnLoadComplete += OnLoadComplete;
_webView.OnReceivedMessage += OnReceivedMessage;
_webView.OnEvalJavaScriptFinished += OnEvalJavaScriptFinished;

设置 Web 页面的大小和要加载页面的 URL:

_webView.insets = new UniWebViewEdgeInsets(5, 5, 5, 5); // 距离全屏差 5 个像素
_webView.url = "http://uniwebview.onevcat.com/demo/index.html";

设置完成后,调用加载页面的函数:

_webView.Load();

页面加载成功或者失败的完成回调函数如下:

void OnLoadComplete(UniWebView webView, bool success, string errorMessage) {
if (success) {
// 显示加载完成的界面
webView.Show();
} else {
// 输出错误码
Debug.LogError("Something wrong in webview loading: " + errorMessage);
}
}

如果不想监听(即不处理失败检测)和自己处理 OnLoadComplete 事件,可以设置属性:

autoShowWhenLoadComplete = true;

此外,也可以先调用 Show() 函数,然后再调用 Load() 函数。

四、Web 页面和 Unity 游戏逻辑的通信

1. UniWebView 发送消息给 Unity

建议使用 URL 方案。UniWebView 将监听以 uniwebview:// 开始的 URL。如果玩家在 Web 页面点击了以该方案开头的 URL 链接,UniWebView 将会将其解析为一个 UniWebViewMessage 对象,并引发 OnReceivedMessage 事件。一个 UniWebViewMessage 对象包含一个路径字符串(其中包含 URL 和 args 参数字典)。

例如,当点击了链接 uniwebview://move?direction=up&distance=1,将被解析为:

path = "move";
args = {
"direction": "up",
"distance": "1"
};

在监听了 OnReceivedMessage 事件的回调中,会得到 UniWebViewMessage 对象,然后可以实现自己的逻辑:

void OnReceivedMessage(UniWebView webView, UniWebViewMessage message) {
Debug.Log(message.rawMessage);
if (string.Equals(message.path, "move")) {
// 实现自己的逻辑
}
}

(注:在游戏中,通常点击活动的每个标签或者 Button 时,可能涉及页面切换或 Button 的网络请求,都可以通过这种方式实现。不过,如果使用 C# 写逻辑,可能会失去一些热更新的优势。)