//tips
//unity/webview実装
Unityにて既存のecサイトをそのまま表示する機能があるということだったのでそちらの機能を実装し、表示したecサイトで注文してみる。
取引内容は既存のecサイトに保存されるのでこの場合はunityからwebページに取引履歴などを移す必要はなさそう。
Webviewのプラグインとして下記をインストールする。
https://github.com/gree/unity-webview
その上で下記のスクリプトを空オブジェクトにアタッチするとgoogleの画面を表示することができた。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class WebViewSample : MonoBehaviour
{
WebViewObject webViewObject;
void Start()
{
webViewObject = (new GameObject("WebViewObject")).AddComponent<WebViewObject>();
webViewObject.Init(
ld: (msg) => Debug.Log(string.Format("CallOnLoaded[{0}]", msg)),
enableWKWebView: true);
#if UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX
webViewObject.bitmapRefreshCycle = 1;
#endif
// お好きなMarginにしてください
webViewObject.SetMargins(100, 100, 100, 100);
webViewObject.SetVisibility(true);
// お好きなURLにしてください
webViewObject.LoadURL("https://www.google.co.jp");
}
void OnGUI()
{
GUI.enabled = webViewObject.CanGoBack();
if (GUI.Button(new Rect(10, 10, 80, 80), "<"))
{
// ブラウザ:前のページへ
webViewObject.GoBack();
}
GUI.enabled = true;
GUI.enabled = webViewObject.CanGoForward();
if (GUI.Button(new Rect(100, 10, 80, 80), ">"))
{
// ブラウザ:次のページへ
webViewObject.GoForward();
}
GUI.enabled = true;
}
}
アマゾンのhttps://www.amazon.co.jp/にURLを変更し、画面上のボタンのクリックと検索箇所へのクリックと文言入力で商品を確定。
購入時にアカウントのパスワードなどを入力すると商品を購入できてしまった。
画面が下にスクロールできない、検索欄への入力、クリック対応がもっさりするなどの問題はあったが無事に電子書籍を購入することに成功した。
ただ、スクロールはできるようにしたいので方法を模索する。
https://answers.unity.com/questions/253289/strange-scrolling-behavior-of-a-native-web-view-on.html?fbclid=IwAR27rMUV_egKLhosExOAxK1FR2vGYSqzhEa9ltD06hujDzRVHC5_jcC3zqU
https://www.facebook.com/groups/unityuserj/permalink/501211973272081/?comment_id=501470499912895&comment_tracking=%7B%22tn%22%3A%22R%22%7D
Webviewの仕組みがわかっていないとスクロール内容の変更も難しそうなのでまずはスクリプトの理解から入る。
まずはWebViewObjectの作成時の(new GameObject("WebViewObject”))の意味から入る。
GameObject 変数名 = new GameObject("オブジェクト名");
でHierarchyに空のオブジェクトが作られる。オブジェクトの名前はカッコ内の名前となる。
webViewObject = (new GameObject("WebViewObject")).AddComponent<WebViewObject>();でWebViewObjectという空のオブジェクトをスタート時に生成し、そこにWebViewObjectをアタッチしている。このWebViewObjectはインストールしたプラグインに含まれている別途スクリプト。そちらの内容も適宜参照する。
続く、下記についても確認する。webViewObject.Init((msg)=>{コールバック時の処理});という処理はWebの更新状態を取得するためにInit()でldのコールバックを登録しているもので、更新が完了したというコールバックを行なっている。
webViewObject.Init(
ld: (msg) => Debug.Log(string.Format("CallOnLoaded[{0}]", msg)),
enableWKWebView: true);
Initってなんぞと思い、WebViewObjectスクリプトの方を確認したところきちんとpublic void Init(で定義されていた。
その中ではプラットフォームごとに処理を変更するプラットフォーム依存コンパイルを使用しており、スマートフォン専用の処理をUnityエディタ上でもテストできるような仕様にすることができる。
#if プラットフォーム名 処理 #endif
の形で表し、下記のようにすることでプラットフォームごとに違う内容を実行できる。
#if UNITY_EDITOR
//Unityエディタのみで実行したい処理を記述
#endif
#if UNITY_IOS
//iOSのみで実行したい処理を記述
#endif
https://docs.unity3d.com/ja/2018.4/Manual/PlatformDependentCompilation.html
https://qiita.com/Ubermensch/items/75072ef89249cb3b30e7
#elifは下記のようになるので覚えておく。
if 条件式A:
#条件式Aが真の時、処理Aが実行されます。
処理A
elif 条件式B:
#条件式Aが偽かつ条件式Bが真の時、処理Bが実行されます。
処理B
現在UNITY_EDITOR_OSXで開発を行なっているのでそちらの分岐処理内部を確認していく。
_CWebViewPlugin_InitStatic(
Application.platform == RuntimePlatform.OSXEditor,
SystemInfo.graphicsDeviceType == GraphicsDeviceType.Metal);
_CWebViewPlugin_InitStaticは下記のように定義されており、引数をとっていることがわかる。
[DllImport("WebView")]
private static extern IntPtr _CWebViewPlugin_InitStatic(
bool inEditor, bool useMetal);
Application.platformは実行時のプラットフォームを判別することが出来るためboolの引数部分に対応させている。
https://docs.unity3d.com/ja/2018.4/ScriptReference/Application-platform.html
Metalの方は描画のタイプでAppleによって提供されている描画用のapiのよう。
https://qiita.com/shu223/items/b95e97d50c738ba6c39a
それらを確認した上でCallback型に値を代入していっている。
Callback型は初期から設定されているわけではなくusing Callback = System.Action<string>;として宣言して使用していた。
コールバックの際に一般的に使用されるdelegateのコールバックの型の定義と変数の定義は、System.Actionを使うことで1行で記述することができるよう。
次に行なっているのは下記。
{
var uri = new Uri(_CWebViewPlugin_GetAppPath());
var info = File.ReadAllText(uri.LocalPath + "Contents/Info.plist");
if (Regex.IsMatch(info, @"<key>CFBundleGetInfoString</key>\s*<string>Unity version [5-9]\.[3-9]")
&& !Regex.IsMatch(info, @"<key>NSAppTransportSecurity</key>\s*<dict>\s*<key>NSAllowsArbitraryLoads</key>\s*<true/>\s*</dict>")) {
Debug.LogWarning("<color=yellow>WebViewObject: NSAppTransportSecurity isn't configured to allow HTTP. If you need to allow any HTTP access, please shutdown Unity and invoke:</color>\n/usr/libexec/PlistBuddy -c \"Add NSAppTransportSecurity:NSAllowsArbitraryLoads bool true\" /Applications/Unity/Unity.app/Contents/Info.plist");
}
}
CWebViewPlugin_GetAppPath()は
[DllImport("WebView")]
private static extern string _CWebViewPlugin_GetAppPath();
ここはAPIの中に定義されているWebViewからメソッドを呼び出しているのか。
https://qiita.com/mitsu_at3/items/94807ee0b3bf34ffb6b2
Github上にwebviewの存在を発見できたが暗号化されているのか中身は確認できない
https://github.com/gree/unity-webview/tree/master/dist/package/Assets/Plugins/WebView.bundle/Contents/MacOS
どちらにせよここで新たなuriが作成され、そのパスの情報でエラーか否かを判断している。
その後webviewに情報を代入。
webView = _CWebViewPlugin_Init(
name,
transparent,
zoom,
Screen.width,
Screen.height,
ua
#if UNITY_EDITOR
, separated
最後に下記で画面表示の調整をしている。これがwebViewObject.Initの内容。
下記も詳しく見ていく。まずはEvaluateJSとはなんぞやというところ。
EvaluateJS(@"(function() {
var vsync = 1000 / 60;
var t0 = window.performance.now();
window.requestAnimationFrame = function(callback, element) {
var t1 = window.performance.now();
var duration = t1 - t0;
var d = vsync - ((duration > vsync) ? duration % vsync : duration);
var id = window.setTimeout(function() {t0 = window.performance.now(); callback(t1 + d);}, d);
return id;
};
})()");
rect = new Rect(0, 0, Screen.width, Screen.height);
OnApplicationFocus(true);
同じスクリプトないで下記のように定義されていた。
public void EvaluateJS(string js)
{
#elif UNITY_EDITOR_OSX || UNITY_STANDALONE_OSX || UNITY_IPHONE
if (webView == IntPtr.Zero)
return;
_CWebViewPlugin_EvaluateJS(webView, js);
}
IntPtrとは、C++で作成した配列を返すDLLをUnity(C#)で適切に受け取るためのもので、0 に初期化されたポインタまたはハンドルを表す読み取り専用フィールド。0以外の値に設定されているかどうかを効率的に判断できる。
[DllImport("WebView")]
private static extern void _CWebViewPlugin_EvaluateJS(
IntPtr instance, string url);
ここまでで関係ありそうな部分がなかったが、スクロールができないのは、やはり画面表示部分が固定になってしまっているのだろうか。unity側に表示部分を作りそちらに組み込みその中でスクロール表示もできないか検証してみる。
https://hirokuma.blog/?p=3304
下記の方も同一githubを用いて実験しているようなので参考までに。
http://oredon.guitarkouza.net/blog/2016/05/unity3d-webview-save.php