Web browser inside Unity Editor

Лучший способ помочь другим, поделиться своими находками.

Web browser inside Unity Editor

Сообщение maxim rouf 06 июн 2014, 15:45

Добрый день, товарищи.
Выдалось время поковырять Editor рефлектором и как результат - web окно внутри Unity Editor.

Скрытый текст:
Изображение


Скрипт для любопытных тоже прикладываю.
Очень много лишнего внутри, если кто нибудь очистит его от мусора и варнингов, буду благодарен. ))
У вас нет доступа для просмотра вложений в этом сообщении.
Последний раз редактировалось maxim rouf 11 июн 2014, 16:43, всего редактировалось 1 раз.
Аватара пользователя
maxim rouf
UNIт
 
Сообщения: 87
Зарегистрирован: 23 июн 2009, 01:47
Откуда: Москва

Re: Web browser inside Unity Editor

Сообщение DbIMok 06 июн 2014, 16:00

типа

?
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.7k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Web browser inside Unity Editor

Сообщение maxim rouf 06 июн 2014, 22:01

Нет. Тут чувствуется системный подход.. а я как обезьяна, рандомно перебираю методы.
Аватара пользователя
maxim rouf
UNIт
 
Сообщения: 87
Зарегистрирован: 23 июн 2009, 01:47
Откуда: Москва

Re: Web browser inside Unity Editor

Сообщение Avatarchik 11 июн 2014, 14:58

Вот когда-то на просторах находил:
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEditor;
using System;
using System.Reflection;

public class WebWindow : EditorWindow {
       
        static Rect windowRect = new Rect(100,100,800,600);
        static BindingFlags fullBinding = BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;
        static StringComparison ignoreCase = StringComparison.CurrentCultureIgnoreCase;
       
        object webView;
        dynamic x;
        Type webViewType;
        MethodInfo doGUIMethod;
        MethodInfo loadURLMethod;
        MethodInfo focusMethod;
        MethodInfo unFocusMethod;
       
        Vector2 resizeStartPos;
        Rect resizeStartWindowSize;
        MethodInfo dockedGetterMethod;
       
        string urlText = "http://www.google.com";
       

        [MenuItem ("Tools/Web Window %#w")]
    static void Load() {
        WebWindow window = WebWindow.GetWindow<WebWindow>();
                //window.Show();
                window.Init();
    }
       
        void Init() {
                //Set window rect
                this.position = windowRect;
                //Get WebView type
                webViewType = GetTypeFromAllAssemblies("WebView");
                //Init web view
                InitWebView();
                //Get docked property getter MethodInfo
                dockedGetterMethod = typeof(EditorWindow).GetProperty("docked", fullBinding).GetGetMethod(true);
        }
       
        private void InitWebView() {
                webView = ScriptableObject.CreateInstance(webViewType);
                webViewType.GetMethod("InitWebView").Invoke(webView, new object[] {(int)position.width,(int)position.height,false});
                webViewType.GetMethod("set_hideFlags").Invoke(webView, new object[] {13});
               
                loadURLMethod = webViewType.GetMethod("LoadURL");
                loadURLMethod.Invoke(webView, new object[] {urlText});
                webViewType.GetMethod("SetDelegateObject").Invoke(webView, new object[] {this});
               
                doGUIMethod = webViewType.GetMethod("DoGUI");
                focusMethod = webViewType.GetMethod("Focus");
                unFocusMethod = webViewType.GetMethod("UnFocus");
               
                this.wantsMouseMove = true;
        }
       
        void OnGUI() {
                if(GUI.GetNameOfFocusedControl().Equals("urlfield"))
                        unFocusMethod.Invoke(webView, null);
               
                bool isDocked = (bool)(dockedGetterMethod.Invoke(this, null));
                Rect webViewRect = new Rect(0,20,position.width,position.height - ((isDocked) ? 20 : 40));
                if(Event.current.isMouse && Event.current.type == EventType.MouseDown && webViewRect.Contains(Event.current.mousePosition)) {
                        GUI.FocusControl("hidden");
                        focusMethod.Invoke(webView, null);
                }
               
                //Hidden, disabled, button for taking focus away from urlfield
                GUI.enabled = false;
                GUI.SetNextControlName("hidden");
                GUI.Button(new Rect(-20,-20,5,5), string.Empty);
                GUI.enabled = true;
               
                //URL Label
                GUI.Label(new Rect(0,0,30,20), "URL:");
               
                //URL text field
                GUI.SetNextControlName("urlfield");
                urlText = GUI.TextField(new Rect(30,0, position.width-30, 20), urlText);
               
                //Focus on web view if return is pressed in URL field
                if(Event.current.isKey && Event.current.keyCode == KeyCode.Return && GUI.GetNameOfFocusedControl().Equals("urlfield")) {
                        loadURLMethod.Invoke(webView, new object[] {urlText});
                        GUI.FocusControl("hidden");
                        focusMethod.Invoke(webView, null);
                }
               
                //Web view
                if(webView != null)
                        doGUIMethod.Invoke(webView, new object[] {webViewRect});
        }
       
        private void OnWebViewDirty() {
                this.Repaint();
        }
       
        public static Type GetTypeFromAllAssemblies(string typeName) {
                Assembly[] assemblies = System.AppDomain.CurrentDomain.GetAssemblies();
                foreach(Assembly assembly in assemblies) {
                        Type[] types = assembly.GetTypes();
                        foreach(Type type in types) {
                                if(type.Name.Equals(typeName, ignoreCase) || type.Name.Contains('+' + typeName)) //+ check for inline classes
                                        return type;
                        }
                }
                return null;
        }
       
        void OnDestroy() {
                //Destroy web view
                webViewType.GetMethod("DestroyWebView", fullBinding).Invoke(webView, null);
        }
}
 
У вас нет доступа для просмотра вложений в этом сообщении.
Добавить ava-karaban в Skype
Аватара пользователя
Avatarchik
UNITрон
 
Сообщения: 274
Зарегистрирован: 04 апр 2009, 15:36
Откуда: Украина(Донецк)
  • ICQ

Re: Web browser inside Unity Editor

Сообщение maxim rouf 11 июн 2014, 16:03

Лучше спрячь его. Этот скрипт два года как не работает, а новую версию Юньки вообще крашит.
Аватара пользователя
maxim rouf
UNIт
 
Сообщения: 87
Зарегистрирован: 23 июн 2009, 01:47
Откуда: Москва

Re: Web browser inside Unity Editor

Сообщение Avatarchik 11 июн 2014, 16:15

На 4.3 все работает,так что может кому пригодиться
Изображение
Добавить ava-karaban в Skype
Аватара пользователя
Avatarchik
UNITрон
 
Сообщения: 274
Зарегистрирован: 04 апр 2009, 15:36
Откуда: Украина(Донецк)
  • ICQ

Re: Web browser inside Unity Editor

Сообщение Diab10 11 июн 2014, 17:03

Спс, пригодится :)
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023


Вернуться в Исходники (Копилка)

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3


cron