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

当前版本的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
}

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

  1. Unity内嵌网页插件

    Unity内嵌网页插件 这里我用到的内嵌插件是EmbeddedBrowser3.1.0版本,这是一个收费插件,笔者大大百度了好久,哈哈哈,最后还是选择掏钱买了一份,主要是实在是白嫖不到啊,倒是找到一个 ...

  2. Unity 内嵌网页

    uniwebview 官网 http://uniwebview.onevcat.com/reference/class_uni_web_view.html http://uniwebview.onev ...

  3. unity 内嵌网页简单流程(3D WebView 3.14.1)

    我是用于 web 平台 特此记录. 3D WebView 主要实现在unity 中制作网页浏览器! 可使用平台(很强大,其他类似插件都有平台缺陷):Android . iOS.UWP(Hololens ...

  4. Unity中内嵌网页插件UniWebView使用总结

    一.目前有三种方式可以实现在Unity工程中实现内嵌网页的功能: 1.  UnityWebCore:只支持Windows平台,调用浏览器内核,将网页渲染到mesh,作为gameObject. 2.  ...

  5. Unity发布内嵌网页的PC客户端

    Unity开发PC客户端内嵌网页的工具名为:SimpleWebView,资源本人已经上传至CSDN共享:MAC.android.ios端需要用的插件为UniWebView,鉴于UniWebView教程 ...

  6. 移动端app内嵌网页开发框架

    框架技术栈 之前开发过一个项目,app内嵌网页应用使用Antd mobile + React + mobx + webpack的技术栈来开发.记录一下对于移动端开发中特殊的一些点: 自适应布局 我们在 ...

  7. WPF应用程序内嵌网页

    WPF应用程序内嵌网页 原文:WPF应用程序内嵌网页 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/shaynerain/article/details/ ...

  8. Java-Swing内嵌网页判断网址类型

    最近开发了一个项目,用Swing窗口界面内嵌网页,然后从记事本中获取到网址,页面显示网址内容,然后人工点击单选按钮判断所打开的网站是什么类型,将对应类型的网址添加到对应的记事本中,然后自动获取下一个网 ...

  9. 微信小程序与内嵌网页交互实现支付功能

    上个月,小程序开放了新功能,支持内嵌网页,所以我就开始了小程序内嵌网页之路,之前我只是个小安卓. 内嵌网页中可使用JSSDK 1.3.0提供的接口,可坑就来了,居然不支持支付接口的调用,经过一番研究, ...

  10. 微信小程序与H5内嵌网页交互实现地图定位功能

    小程序中有很多好用的API,整个项目我们是用vue实现的,使用小程序的内嵌网页功能完成交互. 使用小程序的< web-view >标签将vue项目在小程序中运行.大概的背景就是这样.接下来 ...

最新文章

  1. “AI李佳琦”:“哦买尬,买它!”,清北中科院CMU争相角逐
  2. 2014年中回首与展望
  3. oracle查看执行最慢与查询次数最多的sql语句
  4. Atitit. Atiposter 发帖机 新特性 poster new feature   v7 q39
  5. hadoop安装与配置
  6. oracle部署--安装oracle软件与部署单实例数据库
  7. LeetCode 840. 矩阵中的幻方(数学)
  8. leveldb 文档 impl.html 阅读记录
  9. php怎么像git那样做diff,Git 基本操作
  10. 继iptables之后的新一代包过滤框架是nftables
  11. 最全计算机基础知识竞赛试题及答案,计算机基础知识竞赛试题.doc
  12. 斯坦纳树算法概述及习题
  13. 支招功能最强人工智能围棋软件_AI智能棋盘全新上线,围棋的奥秘原来在这里?...
  14. 神鬼传奇客户端解包图片(ui\common)
  15. 2020年了,简单聊一聊木东居士的那些事~
  16. HTMLCSS仿京东详情页静态页面制作总结
  17. 【文智背后的奥秘】系列篇——结构化抽取平台
  18. 推荐几款可以直接在手机上编程的app(包含Java、C、Python等)
  19. C语言中逗号运算符和逗号表达式
  20. 6580 8.1 mtp模式,查看手机容量大小修改

热门文章

  1. ps2模拟器bios3dm_龙漫ps2模拟器最新版 - 模拟器综合讨论区 - 3DMGAME论坛 - Powered by Discuz!...
  2. java8新特性 lambda Stream map(函数式编程)
  3. dda c语言计算机图形学,计算机图形学 DDA算法中点画线算法Bresen
  4. SVM 多分类 -SVM分类opencv3.0源代码
  5. 2021-10-20
  6. 数据密集型系统设计pdf下载
  7. 2022美国大学生数学建模竞赛(美赛)思路代码
  8. SQL alter操作
  9. H5页面在自己APP中图标显示正常,接入钉钉请求.woff图标字体报错
  10. 【windows10】对系统盘瘦身