123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420 |
- using System;
- using UnityEngine;
- using Vuplex.WebView.Internal;
- namespace Vuplex.WebView {
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- [HelpURL("https://developer.vuplex.com/webview/CanvasWebViewPrefab")]
- public partial class CanvasWebViewPrefab : BaseWebViewPrefab {
- public override event EventHandler<ClickedEventArgs> Clicked {
- add {
- if (_native2DModeActive) {
- _logNative2DModeWarning("The CanvasWebViewPrefab.Clicked event is not supported in Native 2D Mode.");
- }
- base.Clicked += value;
- }
- remove {
- base.Clicked -= value;
- }
- }
- public override event EventHandler<ScrolledEventArgs> Scrolled {
- add {
- if (_native2DModeActive) {
- _logNative2DModeWarning("The CanvasWebViewPrefab.Scrolled event is not supported in Native 2D Mode.");
- }
- base.Scrolled += value;
- }
- remove {
- base.Scrolled -= value;
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- [Label("Native 2D Mode (Android, iOS, WebGL, and UWP only)")]
- [Tooltip("Native 2D Mode positions a native 2D webview in front of the Unity game view instead of rendering web content as a texture in the Unity scene. Native 2D Mode provides better performance on iOS and UWP, because the default mode of rendering web content to a texture is slower. \n\nImportant notes:\n• Native 2D Mode is only supported for Android (non-Gecko), iOS, WebGL, and UWP. For the other 3D WebView packages, the default render mode is used instead.\n• Native 2D Mode requires that the canvas's render mode be set to \"Screen Space - Overlay\".")]
- [HideInInspector]
- [Header("Platform-specific")]
- public bool Native2DModeEnabled;
-
-
-
-
-
-
-
-
-
-
-
-
- [Label("Native On-Screen Keyboard (Android and iOS only)")]
- [Tooltip("Determines whether the operating system's native on-screen keyboard is automatically shown when a text input in the webview is focused. The native on-screen keyboard is only supported for the following packages:\n• 3D WebView for Android (non-Gecko)\n• 3D WebView for iOS")]
- public bool NativeOnScreenKeyboardEnabled = true;
-
-
-
-
-
-
-
-
-
- [Label("Initial Resolution (px / Unity unit)")]
- [Tooltip("You can change this to make web content appear larger or smaller. Note that This property is ignored when running in Native 2D Mode.")]
- [HideInInspector]
- public float InitialResolution = 1;
-
-
-
-
-
-
- [HideInInspector]
- [Tooltip("Determines the scroll sensitivity. Note that This property is ignored when running in Native 2D Mode.")]
- public float ScrollingSensitivity = 15;
- public override bool Visible {
- get {
- var native2DWebView = _getNative2DWebViewIfActive();
- if (native2DWebView != null) {
- return native2DWebView.Visible;
- }
- return base.Visible;
- }
- set {
- var native2DWebView = _getNative2DWebViewIfActive();
- if (native2DWebView != null) {
- native2DWebView.SetVisible(value);
- return;
- }
- base.Visible = value;
- }
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public static CanvasWebViewPrefab Instantiate() {
- return Instantiate(new WebViewOptions());
- }
-
-
-
-
- public static CanvasWebViewPrefab Instantiate(WebViewOptions options) {
- var prefabPrototype = (GameObject) Resources.Load("CanvasWebViewPrefab");
- var gameObject = (GameObject) Instantiate(prefabPrototype);
- var canvasWebViewPrefab = gameObject.GetComponent<CanvasWebViewPrefab>();
- canvasWebViewPrefab._options = options;
- return canvasWebViewPrefab;
- }
-
-
-
-
-
- public static CanvasWebViewPrefab Instantiate(IWebView webView) {
- var prefabPrototype = (GameObject) Resources.Load("CanvasWebViewPrefab");
- var gameObject = (GameObject) Instantiate(prefabPrototype);
- var canvasWebViewPrefab = gameObject.GetComponent<CanvasWebViewPrefab>();
- canvasWebViewPrefab.SetWebViewForInitialization(webView);
- return canvasWebViewPrefab;
- }
- [Obsolete("CanvasWebViewPrefab.Init() has been removed. The CanvasWebViewPrefab script now initializes itself automatically, so Init() no longer needs to be called.", true)]
- public void Init() {}
- [Obsolete("CanvasWebViewPrefab.Init() has been removed. The CanvasWebViewPrefab script now initializes itself automatically, so Init() no longer needs to be called.", true)]
- public void Init(WebViewOptions options) {}
- [Obsolete("CanvasWebViewPrefab.Init() has been removed. The CanvasWebViewPrefab script now initializes itself automatically, so Init() no longer needs to be called. Please use CanvasWebViewPrefab.SetWebViewForInitialization(IWebView) instead.", true)]
- public void Init(IWebView webView) {}
- RectTransform _cachedRectTransform;
- Canvas _canvas {
- get {
- if (_canvasGetter == null) {
- _canvasGetter = new CachingGetter<Canvas>(GetComponentInParent<Canvas>, 1, this);
- }
- return _canvasGetter.GetValue();
- }
- }
- CachingGetter<Canvas> _canvasGetter;
- bool _native2DModeActive {
- get {
- var webViewWith2DMode = WebView as IWithNative2DMode;
- return webViewWith2DMode != null && webViewWith2DMode.Native2DModeEnabled;
- }
- }
- RectTransform _rectTransform {
- get {
- if (_cachedRectTransform == null) {
- _cachedRectTransform = GetComponent<RectTransform>();
- }
- return _cachedRectTransform;
- }
- }
- bool _setCustomPointerInputDetector;
-
-
- partial void OnInit();
- bool _canNative2DModeBeEnabled(bool logWarnings = false) {
- if (_canvas?.renderMode == RenderMode.WorldSpace) {
- if (logWarnings) {
- _logNative2DModeWarning("CanvasWebViewPrefab.Native2DModeEnabled is enabled but the canvas's render mode is set to World Space, so Native 2D Mode will not be enabled. In order to use Native 2D Mode, please switch the canvas's render mode to \"Screen Space - Overlay\" or \"Screen Space - Camera\".");
- }
- return false;
- }
- if (XRUtils.XRSettings.enabled) {
- if (logWarnings) {
- _logNative2DModeWarning("CanvasWebViewPrefab.Native2DModeEnabled is enabled but XR is enabled, so Native 2D Mode will not be enabled.");
- }
- return false;
- }
- return true;
- }
- protected override Vector2 _convertRatioPointToUnityUnits(Vector2 point) {
-
- return Vector2.Scale(point, _rectTransform.rect.size);
- }
- protected override float _getInitialResolution() {
- return InitialResolution;
- }
- IWithNative2DMode _getNative2DWebViewIfActive() {
- var webViewWith2DMode = WebView as IWithNative2DMode;
- if (webViewWith2DMode != null && webViewWith2DMode.Native2DModeEnabled) {
- return webViewWith2DMode;
- }
- return null;
- }
- protected override bool _getNativeOnScreenKeyboardEnabled() {
- return NativeOnScreenKeyboardEnabled;
- }
- protected override float _getScrollingSensitivity() {
- return ScrollingSensitivity;
- }
- Rect _getScreenSpaceRect() {
- var canvas = _canvas;
- if (canvas == null) {
- WebViewLogger.LogError("Unable to determine the screen space rect for Native 2D Mode because the CanvasWebViewPrefab is not placed in a Canvas. Please place the CanvasWebViewPrefab as the child of a Unity UI Canvas.");
- return Rect.zero;
- }
- var worldCorners = new Vector3[4];
- _rectTransform.GetWorldCorners(worldCorners);
- var topLeftCorner = worldCorners[1];
- var bottomRightCorner = worldCorners[3];
- if (canvas.renderMode != RenderMode.ScreenSpaceOverlay) {
- var camera = canvas.worldCamera;
- if (camera == null) {
- WebViewLogger.LogError("Unable to determine the screen space rect for Native 2D Mode because the Canvas's render camera is not set. Please set the Canvas's \"Render Camera\" setting or change its render mode to \"Screen Space - Overlay\".");
- } else {
- topLeftCorner = camera.WorldToScreenPoint(topLeftCorner);
- bottomRightCorner = camera.WorldToScreenPoint(bottomRightCorner);
- }
- }
- var x = topLeftCorner.x;
- var y = Screen.height - topLeftCorner.y;
- var width = bottomRightCorner.x - topLeftCorner.x;
- var height = topLeftCorner.y - bottomRightCorner.y;
- return new Rect(x, y, width, height);
- }
- Rect? _getScreenSpaceRectIfNative2DModeIsEnabled() {
- if (!Native2DModeEnabled) {
- return null;
- }
- if (_canNative2DModeBeEnabled(true)) {
- return _getScreenSpaceRect();
- }
- return null;
- }
- protected override ViewportMaterialView _getVideoLayer() {
- return transform.Find("VideoLayer").GetComponent<ViewportMaterialView>();
- }
- protected override ViewportMaterialView _getView() {
- return transform.Find("CanvasWebViewPrefabView").GetComponent<ViewportMaterialView>();
- }
- void _initCanvasPrefab() {
- OnInit();
- Initialized += _logNative2DRecommendationIfNeeded;
- _init(_rectTransform.rect.size, _getScreenSpaceRectIfNative2DModeIsEnabled());
- }
- void _logNative2DModeWarning(string message) {
- WebViewLogger.LogWarning(message + " For more info, please see this article: <em>https://support.vuplex.com/articles/native-2d-mode</em>");
- }
- void _logNative2DRecommendationIfNeeded(object sender, EventArgs eventArgs) {
- var webViewWith2DMode = WebView as IWithNative2DMode;
- if (_canNative2DModeBeEnabled() && webViewWith2DMode != null && !webViewWith2DMode.Native2DModeEnabled) {
- WebViewLogger.LogTip("This platform supports Native 2D Mode, so consider enabling CanvasWebViewPrefab.Native2DModeEnabled for best results. For more info, see https://support.vuplex.com/articles/native-2d-mode .");
- }
- }
- void OnDisable() {
-
-
- var native2DWebView = _getNative2DWebViewIfActive();
- if (native2DWebView != null) {
- native2DWebView.SetVisible(false);
- }
- }
- void OnEnable() {
-
-
- var native2DWebView = _getNative2DWebViewIfActive();
- if (native2DWebView != null) {
- native2DWebView.SetVisible(true);
- }
- }
- protected override void _setVideoLayerPosition(Rect videoRect) {
- var videoRectTransform = _videoLayer.transform as RectTransform;
-
- videoRectTransform.anchoredPosition = Vector2.Scale(Vector2.Scale(videoRect.position, _rectTransform.rect.size), new Vector2(1, -1));
- videoRectTransform.sizeDelta = Vector2.Scale(videoRect.size, _rectTransform.rect.size);
- }
- void Start() {
- _initCanvasPrefab();
- }
- void Update() {
- if (WebView == null) {
- return;
- }
-
- var native2DWebView = _getNative2DWebViewIfActive();
- if (native2DWebView != null) {
- var screenSpaceRect = _getScreenSpaceRect();
- if (native2DWebView.Rect != screenSpaceRect) {
- native2DWebView.SetRect(screenSpaceRect);
- }
- return;
- }
-
- var rect = _rectTransform.rect;
- if (WebView.Size != rect.size) {
- WebView.Resize(rect.width, rect.height);
- }
- }
- }
- }
|