Веб-браузер в приложении Oculus Go VR, созданный с помощью Unity - PullRequest
0 голосов
/ 28 ноября 2018

В настоящее время я пытаюсь найти способ использовать веб-браузер в приложении VR.По сути, цель состоит в том, чтобы открыть страницу типа https://stackoverflow.com на панели и сделать ее прокручиваемой через контроллер Oculus Go.

Я уже провел некоторые исследования плагинов для достижения этой цели, например this , но ни один из них, похоже, не работает на Oculus Go.

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

Из того, что я смог найти, лучшее решение - этот плагин для 3D-браузера .Он не медленный и не глючит, как другие варианты, которые я пробовал, и просто работает, помещая сборник в вашу сцену, которую вы можете щелкнуть и прокрутить.

void CreateWebView(float width, float height, Vector3 position) {
    var prefab = WebViewPrefab.Instantiate(width, height);
    prefab.transform.position = position;
    prefab.transform.LookAt(Camera.main.transform);
    prefab.Initialized += (sender, args) => prefab.WebView.LoadUrl("https://stackoverflow.com");
}
0 голосов
/ 01 декабря 2018

Это - репозиторий, который я сделал в надежде, что мы сможем реализовать хороший внутриигровой браузер.Это немного глючно / медленно, но работает (в большинстве случаев).

Используется плагин Java, который отображает Android WebView в Bitmap путем переопределения метода Draw представления, преобразует этов PNG и передает его в единство RawImage.Есть много работы, поэтому не стесняйтесь ее улучшать!

enter image description here

Как его использовать:

В репо вы можете найти плагин (unitylibrary-debug.aar), который нужно импортировать вАктивы / Плагины / Android / и BrowserView.cs и UnityThread.cs, которые можно использовать для преобразования Android WebView в текстуру, которую может отображать RawImage в Unity.Заполните BrowserView.cs открытые поля соответствующим образом.Убедитесь, что в настройках проигрывателя Unity для вашего уровня API установлено значение 25.

Примеры кода

Здесь переопределяется метод WebView Draw для создания растрового изображения и PNG, а также init-с нужными переменными:

public class BitmapWebView extends WebView{

    private void init(){
        stream = new ByteArrayOutputStream();
        array = new ReadData(new byte[]{});
        bm = Bitmap.createBitmap(outputWindowWidth,
             outputWindowHeight, Bitmap.Config.ARGB_8888);
        bmCanvas = new Canvas(bm);
   }


    @Override
    public void draw( Canvas ){
        // draw onto a new canvas  
        super.draw(bmCanvas);
        bm.compress(Bitmap.CompressFormat.PNG, 100, stream);

        array.Buffer = stream.toByteArray();
        UnityBitmapCallback.onFrameUpdate(array,
            bm.getWidth(),
            bm.getHeight(),
            canGoBack,
            canGoForward );
        stream.reset();

    }
}  
// you need this class to communicate properly with unity
public class ReadData {
    public byte[] Buffer;
    public ReadData(byte[] buffer) {
        Buffer=buffer;
    }
}

Затем мы передаем png в единицу RawImage.Вот принимающая сторона Unity:

// class used for the callback with the texture
class AndroidBitmapPluginCallback : AndroidJavaProxy
{
    public AndroidBitmapPluginCallback() : base("com.unityexport.ian.unitylibrary.PluginInterfaceBitmap") { }
    public BrowserView BrowserView;

    public void onFrameUpdate(AndroidJavaObject jo, int width, int height, bool canGoBack, bool canGoForward)
        {
        AndroidJavaObject bufferObject = jo.Get<AndroidJavaObject>("Buffer");
        byte[] bytes = AndroidJNIHelper.ConvertFromJNIArray<byte[]>(bufferObject.GetRawObject());
        if (bytes == null)
            return;
        if (BrowserView != null)
        {
            UnityThread.executeInUpdate(()=> BrowserView.SetTexture(bytes,width,height,canGoBack,canGoForward));
        }
        else
            Debug.Log("TestAndroidPlugin is not set");

    }
 }


public class BrowserView : MonoBehaviour {
// Browser view needs a RawImage component to display webpages


   void Start () {
        _imageTexture2D = new Texture2D(Screen.width, Screen.height, TextureFormat.ARGB32, false);
        _rawImage = gameObject.GetComponent<RawImage>();
        _rawImage.texture = _imageTexture2D;

        #if !UNITY_EDITOR && UNITY_ANDROID
        // Get your Java class and create a new instance
        var tempAjc = new AndroidJavaClass("YOUR_LIBRARY.YOUR_CLASS")
        _ajc = tempAjc.CallStatic<AndroidJavaObject>("CreateInstance"); 
        // send the callback object to java to get frame updates
        AndroidBitmapPluginCallback androidPluginCallback = new AndroidBitmapPluginCallback {BrowserView = this};
        _ajc.Call("SetUnityBitmapCallback", androidPluginCallback);
        #endif

    }
   // Android callback to change our browser view texture
    public void SetTexture( byte[] bytes, int width, int height, bool canGoBack, bool canGoForward)
    {

        if (width != _imageTexture2D.width || height != _imageTexture2D.height)
            _imageTexture2D = new Texture2D(width, height, TextureFormat.ARGB32, false);

        _imageTexture2D.LoadImage(bytes);
        _imageTexture2D.Apply();
        _rawImage.texture = _imageTexture2D;
    }
}
...