日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 借助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 }

總結

以上是生活随笔為你收集整理的借助ZFBrowser插件实现Unity内嵌网页的用户自定义的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。