Blockchain code Metaverse VR

Unity×VR×Blockchain(239)

スポンサーリンク

//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

【Unity】プラットフォームごとに処理を変更する方法

#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からメソッドを呼び出しているのか。

C#からDLL関数の呼び出し

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

人気の記事

1

皆さん、ついに、エアラインでも、サブスクリプションが始まったのはご存じですか? まだ実験段階ですが、ANAが、定額全国住み放題サービスを提供する「ADDress」と組んで、国内線を4回まで定額利用可能 ...

2

無料でネットショップを開けるアプリとして多くの人に驚きを与えたBASE株式会社が、2019年10月25日東証マザーズに上場しました。2020年2月時点で90万店を超えるショップを抱えるまでに成長してい ...

3

2011年にサービスを開始してから圧倒的な成長率を誇るインテリア通販サイト 【FLYMEe/フライミー】を皆さんご存じでしょうか。 「自分のイメージするインテリア、本当に欲しいインテリアがどこにあるの ...

4

ついに、noteの月間アクティブユーザー数が4400万人(2020年3月時点)に到達しました。 そもそも、「note」とは、クリエイターが、文章やマンガ、写真、音声を投稿することができ、ユーザーはその ...

5

ボードゲームカフェが1日2回転で儲かるという記事をみつけたので興味を持ち、調べてみました。 まずは、需要がどれくらいあるのか、市場のようすからみていきましょう。 世界最大のボードゲーム市場はドイツで、 ...

-Blockchain, code, Metaverse, VR
-, ,

Copyright© BUSINESS HUNTER , 2023 All Rights Reserved Powered by AFFINGER5.