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

コロナによる需要変化 コロナパンデミックの影響で、人々は外に出られなくなり、自宅で過ごす時間が増えました。 この自粛ムードの中、下記のようなビジネスの需要変化が引き起こされています。 【利用者減少】 ...

2

米国レストランの決済時に毎日お世話になっていた「Square」のビジネスモデルについて本日はふれていきたいと思います。 「Square」とは、ネットにつながったモバイル端末と専用のカードリーダーを用意 ...

3

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

4

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

5

ナイキのSNKRSが、なぜこれほどまでに人気なのか?調べてみました。 きっかけは米国での友達との会話。彼は自分のシューズをみせて、「これ20万円もしたんだぜ。」と語ってくれました。 あまり靴に興味がな ...

-Blockchain, code, Metaverse, VR
-, ,

Copyright© BUSINESS HACKER , 2021 All Rights Reserved Powered by AFFINGER5.