借助ZFBrowser插件实现Unity内嵌网页的用户自定义

写过好几次的东西了,虽然没什么技术含量,但是还是记录下比较好

当前版本的BUG(没啥修复的头绪):多个窗口重叠时鼠标存在穿透

逻辑的话基本上是和界面一一对应的关系,右键菜单(RightMenuLogic),设置界面(SetPanelLogic)和窗口(BrowserItem),因为有多个,所以添加了一个管理类(BrowserManager)

界面截图:

1.右键菜单:

2.设置界面:

代码逻辑:

目录

界面截图:

代码逻辑:

BrowserManager:

 RightMenu:

SetPanel:

BrowserMsg:

JsonConfigParse:


代码逻辑主题的感觉不用怎么说,看就行了:

BrowserManager:

public static BrowserManager instance = null;

    public List<BrowserItem> itemList = new List<BrowserItem>();

    private List<BrowserMsg> msgList = new List<BrowserMsg>();

    private string path = Application.streamingAssetsPath + "/BrowserConfig.json";

    private GameObject itemPerfab;

    private RightMenuLogic rightMenu;

    private SetPanelLogic setPanel;

    public BrowserItem nowSelectedBrowser;

    private string nowSceneName;

    private int browserIndex = 0;

    private BrowserMsg emptyMsg = new BrowserMsg() { PosX = 0, PosY = 0, Width = 360, Height = 200,Url = "www.baidu.com" };

    void Awake()
    {
        instance = this;
    }

    void Start()
    {
        itemPerfab = GetComponentInChildren<BrowserItem>(true).gameObject;

        rightMenu = GetComponentInChildren<RightMenuLogic>(true);

        setPanel = GetComponentInChildren<SetPanelLogic>(true);

        nowSelectedBrowser = null;

        InitAllBrowser();
    }

    void OnDisable()
    {
        SaveAllBrowser();
    }

    void InitAllBrowser()
    {
        nowSceneName = SceneManager.GetActiveScene().name;

        msgList = JsonConfigParse.Parse_BrowserMsg(path);

        for (int i = 0; i < msgList.Count; i++)
        {
            if (msgList[i].SceneName == nowSceneName)
            {
                CreateBrowserItem(msgList[i]);
                browserIndex++;
            }
        }
    }

    void ClearAllBrowser()
    {
        for (int i = itemList.Count - 1; i >= 0; i--)
        {
            Destroy(itemList[i].gameObject);
            itemList.RemoveAt(i);
        }
    }

    void SaveAllBrowser()
    {
        List<BrowserMsg> saveMsgs = new List<BrowserMsg> ();

        for (int i = 0; i < itemList.Count; i++)
        {
            BrowserItem browserItem = itemList[i];
            saveMsgs.Add(new BrowserMsg() {
                browserName = browserItem.name,
                PosX = browserItem.RectTrans.anchoredPosition.x,
                PosY = browserItem.RectTrans.anchoredPosition.y,
                Width = browserItem.RectTrans.rect.width,
                Height = browserItem.RectTrans.rect.height,
                oldScreenWidth = Screen.width,
                oldScreenHeight = Screen.height,
                scaleCoe = browserItem.RectTrans.localScale.x,
                Url = browserItem.url,
                SceneName = nowSceneName
            });
        }

        JsonConfigParse.SaveJson_BrowserMsgs(path, saveMsgs);
    }

    void CreateBrowserItem(BrowserMsg msg)
    {
        BrowserItem item = Instantiate(itemPerfab, transform).GetComponent<BrowserItem>();

        item.transform.SetSiblingIndex(transform.childCount - 5);

        item.SetParamater(msg);

        item.gameObject.SetActive(true);

        itemList.Add(item);
    }

    public void CreateEmptyBorwser()
    {
        BrowserItem item = Instantiate(itemPerfab, transform).GetComponent<BrowserItem>();

        item.transform.SetSiblingIndex(transform.childCount - 5);

        item.gameObject.SetActive(true);

        emptyMsg.browserName = "browser" + (GetMaxBrowserIndex() + 1);

        emptyMsg.SceneName = nowSceneName;

        emptyMsg.oldScreenWidth = Screen.width;

        emptyMsg.oldScreenHeight = Screen.height;

        emptyMsg.scaleCoe = 1;

        item.SetParamater(emptyMsg);

        itemList.Add(item);

        JsonConfigParse.SaveJson_BrowserMsg(path, emptyMsg);
    }

    public void DeletBrowser()
    {
        if (nowSelectedBrowser == null) return;

        JsonConfigParse.DeletJson_BrowserMsg(path, nowSelectedBrowser.name);

        itemList.Remove(nowSelectedBrowser);

        Destroy(nowSelectedBrowser.gameObject);

        nowSelectedBrowser = null;
    }

    public void SetNowSelected(BrowserItem item, Vector2 mosuePos)
    {
        nowSelectedBrowser = item;

        rightMenu.Show(mosuePos);
    }

    public void ChangeNowSelectedMove(bool value)
    {
        if (nowSelectedBrowser == null) return;

        nowSelectedBrowser.ChangeMoveStatus(value);
    }

    public void ChangeNowSelectInput(bool value)
    {
        if (nowSelectedBrowser == null) return;

        nowSelectedBrowser.ChangeInputStatus(value);
    }

    public void ChangeSetPanelActive(bool value)
    {
        if (!value) setPanel.Hide();
        else setPanel.Show();
    }

    public void ChangeBrowser(string url, float lenght, float width)
    {
        if (nowSelectedBrowser == null) return;

        nowSelectedBrowser.UpdateParama(url, lenght, width);
    }

    public void SaveBrowser()
    {
        if (nowSelectedBrowser == null) return;

        JsonConfigParse.SaveJson_BrowserMsg(path, new BrowserMsg()
        {
            browserName = nowSelectedBrowser.name,
            PosX = nowSelectedBrowser.RectTrans.anchoredPosition.x,
            PosY = nowSelectedBrowser.RectTrans.anchoredPosition.y,
            Width = nowSelectedBrowser.RectTrans.rect.width,
            Height = nowSelectedBrowser.RectTrans.rect.height,
            oldScreenWidth = Screen.width,
            oldScreenHeight = Screen.height,
            scaleCoe = nowSelectedBrowser.RectTrans.localScale.x,
            Url = nowSelectedBrowser.url,
            SceneName = nowSceneName
        });
    }

    private int GetMaxBrowserIndex()
    {
        int nowIndex = 0;
        for (int i = 0; i < itemList.Count; i++)
        {
            nowIndex = int.Parse(itemList[i].name.Substring(7, itemList[i].name.Length - 7));
            browserIndex = browserIndex > nowIndex ? browserIndex : nowIndex;
        }

        return browserIndex;
    }

 RightMenu:

    private Button moveBtn, setBtn, saveBtn, deletBtn;

    private RectTransform rect;

    private float maxX;

    private float newPivotX, newPivotY;

    void Awake()
    {
        rect = GetComponent<RectTransform>();

        moveBtn = transform.Find("移动").GetComponent<Button>();
        setBtn = transform.Find("设置").GetComponent<Button>();
        saveBtn = transform.Find("保存").GetComponent<Button>();
        deletBtn = transform.Find("删除").GetComponent<Button>();

        moveBtn.onClick.AddListener(StartMove);
        setBtn.onClick.AddListener(OpenSet);
        saveBtn.onClick.AddListener(SaveBrowser);
        deletBtn.onClick.AddListener(DeletBrowser);

        maxX = Screen.width;
    }

    public void Show(Vector2 pos)
    {
        BrowserManager.instance.ChangeNowSelectInput(false);

        if (maxX - pos.x < rect.rect.width) { newPivotX = 1; }
        else { newPivotX = 0; }

        if (pos.y < rect.rect.height) { newPivotY = 0; }
        else  { newPivotY = 1; }

        rect.pivot = new Vector2(newPivotX, newPivotY);

        rect.anchoredPosition = pos;
    }

    public void Hide()
    {
        rect.pivot = new Vector2(0, 1);

        rect.anchoredPosition = Vector3.zero;

        BrowserManager.instance.ChangeNowSelectInput(true);
    }

    #region 方法组集合
    private void StartMove()
    {
        BrowserManager.instance.ChangeNowSelectedMove(true);
        Hide();
    }

    private void OpenSet()
    {
        Hide();
        BrowserManager.instance.ChangeSetPanelActive(true);
        BrowserManager.instance.ChangeNowSelectedMove(false);
    }

    private void SaveBrowser()
    {
        BrowserManager.instance.SaveBrowser();
        Hide();
    }

    private void DeletBrowser()
    {
        BrowserManager.instance.DeletBrowser();
        Hide();
    }
    #endregion

SetPanel:

    private InputField urlInput, lengthInput, widthInput;
    private Button cancleBtn, confirmBtn;
    private float screenWidth;
    private RectTransform rect;

    void Awake()
    {
        screenWidth = Screen.width;

        rect = GetComponent<RectTransform>();

        urlInput = transform.Find("网址输入框").GetComponent<InputField>();
        lengthInput = transform.Find("长度输入框").GetComponent<InputField>();
        widthInput = transform.Find("宽度输入框").GetComponent<InputField>();
        cancleBtn = transform.Find("取消").GetComponent<Button>();
        confirmBtn = transform.Find("确认").GetComponent<Button>();

        cancleBtn.onClick.AddListener(() =>
        {
            Hide();
        });

        confirmBtn.onClick.AddListener(() =>
        {
            BrowserManager.instance.ChangeBrowser(urlInput.text, float.Parse(lengthInput.text), float.Parse(widthInput.text));
            Hide();
        });
    }

    public void Show()
    {
        if (BrowserManager.instance.nowSelectedBrowser == null) return;

        BrowserManager.instance.ChangeNowSelectInput(false);

        BrowserManager.instance.ChangeNowSelectedMove(false);

        transform.localPosition = new Vector3(0, 0, 0);

        urlInput.text = BrowserManager.instance.nowSelectedBrowser.url;

        lengthInput.text = BrowserManager.instance.nowSelectedBrowser.RectTrans.rect.width.ToString();

        widthInput.text = BrowserManager.instance.nowSelectedBrowser.RectTrans.rect.height.ToString();
    }

    public void Hide()
    {
        rect.anchoredPosition = new Vector2(-screenWidth, 0);

        BrowserManager.instance.ChangeNowSelectInput(true);

        urlInput.text = "";

        lengthInput.text = "";

        widthInput.text = "";
    }

这些基本上算是主要的了,当然,自定义肯定是要有存储和读取的,我这里用的是json文件,解析代码如下,里面有一部分借鉴来的,但来源实在记不清了,作者看到后请留言,我会加上文章地址的。

BrowserMsg:

窗口信息的存储搞了个类

public class BrowserMsg
{
    public string browserName;

    public float PosX, PosY;

    public float Width, Height;

    public float oldScreenWidth, oldScreenHeight;

    public float scaleCoe;

    public string Url;

    public string SceneName;
}

JsonConfigParse:

public class JsonConfigParse
{
    /// <summary>
    /// 获取到本地的Json文件并且解析返回对应的json字符串
    /// </summary>
    /// <param name="filepath">文件路径</param>
    /// <returns></returns>
    public static string OpenJsonFile(string filepath)
    {
        string json = "";
        using (FileStream fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite))
        {
            using (StreamReader sr = new StreamReader(fs, Encoding.UTF8))
            {
                json = sr.ReadToEnd().ToString();
            }
        }
        return json;
    }

    /// <summary>
    /// 将序列化的json字符串内容写入Json文件,并且保存
    /// </summary>
    /// <param name="path">路径</param>
    /// <param name="jsonConents">Json内容</param>
    private static void WriteJsonFile(string path, string jsonConents)
    {
        File.WriteAllText(path, jsonConents, Encoding.UTF8);
    }

    #region 浏览器窗口数据
    public static List<BrowserMsg> Parse_BrowserMsg(string path)
    {
        List<BrowserMsg> msgs = new List<BrowserMsg>();
        string jsonStr = OpenJsonFile(path);
        if (jsonStr != "")
        {
            msgs = JsonConvert.DeserializeObject<List<BrowserMsg>>(jsonStr);
        }

        return msgs;
    }

    public static void SaveJson_BrowserMsg(string path, BrowserMsg msg)
    {
        List<BrowserMsg> msgs = new List<BrowserMsg>();
        string jsonStr = OpenJsonFile(path);
        if (jsonStr != "")
        {
            msgs = JsonConvert.DeserializeObject<List<BrowserMsg>>(jsonStr);
        }

        var result = msgs.Find(s => s.browserName == msg.browserName);
        if (result != null)
        {
            msgs.Remove(result);
        }
        msgs.Add(msg);

        WriteJsonFile(path, JsonConvert.SerializeObject(msgs));
    }

    public static void SaveJson_BrowserMsgs(string path, List<BrowserMsg> msgs)
    {
        WriteJsonFile(path, JsonConvert.SerializeObject(msgs));
    }

    public static void DeletJson_BrowserMsg(string path, string browserName)
    {
        List<BrowserMsg> msgs = new List<BrowserMsg>();
        string jsonStr = OpenJsonFile(path);
        if (jsonStr != "")
        {
            msgs = JsonConvert.DeserializeObject<List<BrowserMsg>>(jsonStr);
        }

        var result = msgs.Find(s => s.browserName == browserName);
        if (result != null)
        {
            msgs.Remove(result);
        }

        WriteJsonFile(path, JsonConvert.SerializeObject(msgs));
    }
    #endregion
}

猜你喜欢

转载自blog.csdn.net/qq_33325776/article/details/122624438