Unity
本身提供了打开外部浏览器的方法:
Application.OpenURL("https://blog.csdn.net/linxinfa");
但有些情况,可能不想使用外部浏览器。在PC
端,有一些第三方库实现了浏览器功能,但是库文件非常大,可以参见我之前这篇文章:《Unity内嵌浏览器插件(Android、iOS、Windows)》
能否利用Windows
的API
自制一个迷你浏览器呢?
本文我就教你通过Windows
窗体应用工程来实现迷你浏览器功能。
创建Windows
窗体应用(.NET Framework
)。
添加WebBrowser
控件。
然后调用Navigate
接口,参数就是url
this.webBrowser1.Navigate("https://blog.csdn.net/linxinfa");
由于我们的这个窗体程序是要给Unity
调用的,所以需要接收命令行参数。
修改Program.cs
,添加args
并传给Form1
。
static class Program
{
///
/// 应用程序的主入口点。
///
[STAThread]
static void Main(string[] args)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
if (args.Length == 0)
Application.Run(new Form1());
else
Application.Run(new Form1(args));
}
}
在Form1.cs
中,实现两个构造函数
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.Text = "内置浏览器";
this.webBrowser1.Navigate("https://blog.csdn.net/linxinfa");
}
public Form1(string[] args)
{
InitializeComponent();
this.Text = "内置浏览器";
//命令含参数
string url = args[0];
this.webBrowser1.Navigate(url);
}
}
点击启动,测试正常。
解决方案选择Release
点击生成解决方案
即可在工程目录中bin/Release
中生成exe
文件,只有9KB
,不错。
通过命令行启动exe
,并传递参数www.baidu.com
,如下,可以正常显示。
我已把上面的这个Demo
上传到CODE CHINA
,感兴趣的同学可以下载下来学习。
地址:https://codechina.csdn.net/linxinfa/windows-mini-webbrowser
如果你只是纯粹想下载exe
,可以直接点这个链接:https://codechina.csdn.net/linxinfa/windows-mini-webbrowser/-/raw/master/winform_webbrowser/bin/Release/winform_webbrowser.exe
将上面的exe
拷贝到Unity
工程中的StreamingAssets
目录。
制作个简单的按钮UI
,创建一个Main.cs
脚本,挂到Canvas
上,绑定按钮。
Main.cs
代码如下
using UnityEngine;
using UnityEngine.UI;
using System.IO;
using System.Diagnostics;
public class Main : MonoBehaviour
{
public Button browserBtn;
// Start is called before the first frame update
void Start()
{
//按钮被点击
browserBtn.onClick.AddListener(() =>
{
//exe路径
var exePath = Path.Combine(Application.streamingAssetsPath, "winform_webbrowser.exe");
//打开迷你浏览器exe,参数是url
string url = "https://blog.csdn.net/linxinfa";
Process pro = Process.Start(exePath, url);
/*
pro.WaitForExit();
int Result = pro.ExitCode; //exe退出回传值
if (Result == 1)//接收到exe退出代码"1"
{
}
*/
});
}
}
有没有办法实现c#与js代码交互呢?有。例子如下:
c#
代码如下
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WinFormPractice
{
//注意要加ComVisible,否则会编译失败
[ComVisible(true)]
public partial class FormBrowserJs : Form
{
public FormBrowserJs()
{
InitializeComponent();
//访问html
webBrowser.Navigate(Path.Combine(Application.StartupPath, "HTMLBrowserJs.html"));
//注册监听
webBrowser.ObjectForScripting = this;
}
//js调用c#
public void ShowMsgForJs(string msg)
{
infoLabel.Text += $"{msg}\r\n";
}
//c#调用js
private void BtnSend_Click(object sender, EventArgs e)
{
try
{
webBrowser.Document.InvokeScript("ShowMsgForCSharp", new []{
"hello world" });
}
catch(Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
HTMLBrowserJs.html
代码如下
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>title>
<script>
//alert ("准备就绪");
window.external.ShowMsgForJs("准备就绪");
function ShowMsgForCSharp(str) {
var msg = "收到消息:" + str;
//1、调用 C# 方法;
window.external.ShowMsgForJs(msg);
//2、改变网页内容;
document.getElementById("info").innerHTML += msg + "
";
//3、弹窗;
alert(msg);
}
script>
head>
<body>
<div> 通过 WebBrowser 让 JS 与 C# 代码交互 测试页 div>
<div id="info">div>
body>
html>