溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Unity全局工具類有哪些

發(fā)布時間:2022-10-24 11:33:36 來源:億速云 閱讀:152 作者:iii 欄目:移動開發(fā)

今天小編給大家分享一下Unity全局工具類有哪些的相關知識點,內(nèi)容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

 一:系統(tǒng)工具

一:獲取本機IP地址

public static string GetLocalIP()
    {
        //Dns.GetHostName()獲取本機名Dns.GetHostAddresses()根據(jù)本機名獲取ip地址組
        IPAddress[] ips = Dns.GetHostAddresses(Dns.GetHostName());
        foreach (IPAddress ip in ips)
        {
            if (ip.AddressFamily == AddressFamily.InterNetwork)
            {
                return ip.ToString();  //ipv4
            }
        }
        return null;
    }

二:獲取本機MAC地址

public static string GetMacAddress()
    {
        try
        {
            NetworkInterface[] nis = NetworkInterface.GetAllNetworkInterfaces();
            for (int i = 0; i < nis.Length; i++)
            {
                if (nis[i].Name == "本地連接")
                {
                    return nis[i].GetPhysicalAddress().ToString();
                }
            }
            return "null";
        }
        catch
        {
            return "null";
        }
    }

三:獲取字符串的MD5  

// 計算字符串的MD5值
    public static string Md5String(string source)
    {
        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
        byte[] data = System.Text.Encoding.UTF8.GetBytes(source);
        byte[] md5Data = md5.ComputeHash(data, 0, data.Length);
        md5.Clear();

        string destString = "";
        for (int i = 0; i < md5Data.Length; i++)
        {
            destString += System.Convert.ToString(md5Data[i], 16).PadLeft(2, '0');
        }
        destString = destString.PadLeft(32, '0');
        return destString;
    }

四:計算文件的MD5  

public static string Md5File(string file)
    {
        try
        {
            FileStream fs = new FileStream(file, FileMode.Open);
            string size = fs.Length / 1024 + "";
            //Debug.Log("當前文件的大?。?nbsp; " + file + "===>" + (fs.Length / 1024) + "KB");
            System.Security.Cryptography.MD5 md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
            byte[] retVal = md5.ComputeHash(fs);
            fs.Close();

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < retVal.Length; i++)
            {
                sb.Append(retVal[i].ToString("x2"));
            }
            return sb + "|" + size;
        }
        catch (Exception ex)
        {
            throw new Exception("md5file() fail, error:" + ex.Message);
        }
    }

五:MD5的32位加密  

// MD5  32位加密
    public static string UserMd5(string str)
    {
        string cl = str;
        StringBuilder pwd = new StringBuilder();
        MD5 md5 = MD5.Create();//實例化一個md5對像
                               // 加密后是一個字節(jié)類型的數(shù)組,這里要注意編碼UTF8/Unicode等的選擇 
        byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(cl));
        // 通過使用循環(huán),將字節(jié)類型的數(shù)組轉(zhuǎn)換為字符串,此字符串是常規(guī)字符格式化所得
        for (int i = 0; i < s.Length; i++)
        {
            // 將得到的字符串使用十六進制類型格式。格式后的字符是小寫的字母,如果使用大寫(X)則格式后的字符是大寫字符
            pwd.Append(s[i].ToString("x2"));
            //pwd = pwd + s[i].ToString("X");
        }
        return pwd.ToString();
    }

六:字節(jié)的加密解密

public static void Encypt(ref byte[] targetData, byte m_key)
    {
        //加密,與key異或,解密的時候同樣如此
        int dataLength = targetData.Length;
        for (int i = 0; i < dataLength; ++i)
        {
            targetData[i] = (byte)(targetData[i] ^ m_key);
        }
    }

七:Base64編碼解碼

// Base64編碼
    public static string Encode(string message)
    {
        byte[] bytes = Encoding.GetEncoding("utf-8").GetBytes(message);
        return Convert.ToBase64String(bytes);
    }

    // Base64解碼
    public static string Decode(string message)
    {
        byte[] bytes = Convert.FromBase64String(message);
        return Encoding.GetEncoding("utf-8").GetString(bytes);
    }

八:隨機生成字符串

public static string RandomCharacters()
    {
        string str = string.Empty;
        long num2 = DateTime.Now.Ticks + 0;
        System.Random random = new System.Random(((int)(((ulong)num2) & 0xffffffffL)) | ((int)(num2 >> 1)));
        for (int i = 0; i < 20; i++)
        {
            char ch;
            int num = random.Next();
            if ((num % 2) == 0)
            {
                ch = (char)(0x30 + ((ushort)(num % 10)));
            }
            else
            {
                ch = (char)(0x41 + ((ushort)(num % 0x1a)));
            }
            str = str + ch.ToString();
        }
        return str;
    }

二:UI控件常用功能及事件監(jiān)聽

一:UI控件添加事件監(jiān)聽  

/// <summary>
    /// UGUI 控件添加事件監(jiān)聽
    /// </summary>
    /// <param name="target">事件監(jiān)聽目標</param>
    /// <param name="type">事件類型</param>
    /// <param name="callback">回調(diào)函數(shù)</param>
    public static void AddEventListener(this RectTransform target, EventTriggerType type, UnityAction<BaseEventData> callback)
    {
        EventTrigger trigger = target.GetComponent<EventTrigger>();
        if (trigger == null)
        {
            trigger = target.gameObject.AddComponent<EventTrigger>();
            trigger.triggers = new List<EventTrigger.Entry>();
        }

        //定義一個事件
        EventTrigger.Entry entry = new EventTrigger.Entry();
        //設置事件類型
        entry.eventID = type;
        //設置事件回調(diào)函數(shù)
        entry.callback = new EventTrigger.TriggerEvent();
        entry.callback.AddListener(callback);
        //添加事件到事件組
        trigger.triggers.Add(entry);
    }

二:UGUI按鈕添加移除點擊監(jiān)聽事件

// UGUI Button添加點擊事件監(jiān)聽
    public static void AddEventListener(this RectTransform target, UnityAction callback)
    {
        Button button = target.GetComponent<Button>();
        if (button)
        {
            button.onClick.AddListener(callback);
        }
        else
        {
            Debug.Log(target.name + " 丟失了組件 Button!");
        }
    }

// UGUI Button移除所有事件監(jiān)聽
    public static void RemoveAllEventListener(this RectTransform target)
    {
        Button button = target.GetComponent<Button>();
        if (button)
        {
            button.onClick.RemoveAllListeners();
        }
        else
        {
            Debug.Log(target.name + " 丟失了組件 Button!");
        }
    }

三:判定鼠標是否停留在ui控件上  

public static bool IsPointerOverUGUI()
    {
        if (EventSystem.current)
        {
            return EventSystem.current.IsPointerOverGameObject();
        }
        else
        {
            return false;
        }
    }

四:限制Text內(nèi)容的長度

// 限制Text內(nèi)容的長度在length以內(nèi),超過的部分用replace代替
    public static void RestrictLength(this Text tex, int length, string replace)
    {
        if (tex.text.Length > length)
        {
            tex.text = tex.text.Substring(0, length) + replace;
        }
    }

五:富文本限制Text內(nèi)指定內(nèi)容的大小顏色加粗斜體

// 限制Text中指定子字串的字體大小

    public static void ToRichSize(this Text tex, string subStr, int size)
    {
        if (subStr.Length <= 0 || !tex.text.Contains(subStr))
        {
            return;
        }

        string valueRich = tex.text;
        int index = valueRich.IndexOf(subStr);
        if (index >= 0) valueRich = valueRich.Insert(index, "<size=" + size + ">");
        else return;

        index = valueRich.IndexOf(subStr) + subStr.Length;
        if (index >= 0) valueRich = valueRich.Insert(index, "</size>");
        else return;

        tex.text = valueRich;
    }

    // 限制Text中指定子字串的字體顏色
    public static void ToRichColor(this Text tex, string subStr, Color color)
    {
        if (subStr.Length <= 0 || !tex.text.Contains(subStr))
        {
            return;
        }

        string valueRich = tex.text;
        int index = valueRich.IndexOf(subStr);
        if (index >= 0) valueRich = valueRich.Insert(index, "<color=" + color.ToHexSystemString() + ">");
        else return;

        index = valueRich.IndexOf(subStr) + subStr.Length;
        if (index >= 0) valueRich = valueRich.Insert(index, "</color>");
        else return;

        tex.text = valueRich;
    }

    // 限制Text中的指定子字串的字體加粗
    public static void ToRichBold(this Text tex, string subStr)
    {
        if (subStr.Length <= 0 || !tex.text.Contains(subStr))
        {
            return;
        }

        string valueRich = tex.text;
        int index = valueRich.IndexOf(subStr);
        if (index >= 0) valueRich = valueRich.Insert(index, "<b>");
        else return;

        index = valueRich.IndexOf(subStr) + subStr.Length;
        if (index >= 0) valueRich = valueRich.Insert(index, "</b>");
        else return;

        tex.text = valueRich;
    }

    // 限制Text中的指定子字串的字體斜體
    public static void ToRichItalic(this Text tex, string subStr)
    {
        if (subStr.Length <= 0 || !tex.text.Contains(subStr))
        {
            return;
        }

        string valueRich = tex.text;
        int index = valueRich.IndexOf(subStr);
        if (index >= 0) valueRich = valueRich.Insert(index, "<i>");
        else return;

        index = valueRich.IndexOf(subStr) + subStr.Length;
        if (index >= 0) valueRich = valueRich.Insert(index, "</i>");
        else return;

        tex.text = valueRich;
    }

    // 清除所有富文本樣式
    public static void ClearRich(this Text tex)
    {
        string value = tex.text;
        for (int i = 0; i < value.Length; i++)
        {
            if (value[i] == '<')
            {
                for (int j = i + 1; j < value.Length; j++)
                {
                    if (value[j] == '>')
                    {
                        int count = j - i + 1;
                        value = value.Remove(i, count);
                        i -= 1;
                        break;
                    }
                }
            }
        }
        tex.text = value;
    }

三:坐標系轉(zhuǎn)換

public enum UIType
    {
        /// <summary>
        /// 屏幕UI
        /// </summary>
        Overlay,
        /// <summary>
        /// 攝像機UI
        /// </summary>
        Camera,
        /// <summary>
        /// 世界UI
        /// </summary>
        World
    }

一:世界坐標轉(zhuǎn)換為UGUI坐標

/// <summary>
    /// 世界坐標轉(zhuǎn)換為UGUI坐標(只針對框架UI模塊下的UI控件)
    /// </summary>
    /// <param name="position">世界坐標</param>
    /// <param name="reference">參照物(要賦值的UGUI控件的根物體)</param>
    /// <param name="uIType">UI類型</param>
    /// <returns>基于參照物的局部UGUI坐標</returns>
    public static Vector2 WorldToUGUIPosition(this Vector3 position, RectTransform reference = null, UIType uIType = UIType.Overlay)
    {
        Vector3 screenPos;
        Vector2 anchoredPos = Vector2.zero;
        switch (uIType)
        {
            case UIType.Overlay:
                screenPos = Camera.main.WorldToScreenPoint(position);
                screenPos.z = 0;
                RectTransformUtility.ScreenPointToLocalPointInRectangle(reference, screenPos, null, out anchoredPos);
                break;
            case UIType.Camera:
                screenPos = Camera.main.WorldToScreenPoint(position);
                screenPos.z = 0;
                RectTransformUtility.ScreenPointToLocalPointInRectangle(reference, screenPos, Camera.main, out anchoredPos);
                break;
            case UIType.World:
                break;
        }
        return anchoredPos;
    }

二:屏幕坐標轉(zhuǎn)換為UGUI坐標

/// <summary>
    /// 屏幕坐標轉(zhuǎn)換為UGUI坐標(只針對框架UI模塊下的UI控件)
    /// </summary>
    /// <param name="position">屏幕坐標</param>
    /// <param name="reference">參照物(要賦值的UGUI控件的根物體)</param>
    /// <param name="uIType">UI類型</param>
    /// <returns>基于參照物的局部UGUI坐標</returns>
    public static Vector2 ScreenToUGUIPosition(this Vector3 position, RectTransform reference = null, UIType uIType = UIType.Overlay)
    {
        Vector2 anchoredPos = Vector2.zero;
        switch (uIType)
        {
            case UIType.Overlay:
                position.z = 0;
                RectTransformUtility.ScreenPointToLocalPointInRectangle(reference, position, null, out anchoredPos);
                break;
            case UIType.Camera:
                position.z = 0;
                RectTransformUtility.ScreenPointToLocalPointInRectangle(reference, position, Camera.main, out anchoredPos);
                break;
            case UIType.World:
                break;
        }
        return anchoredPos;
    }

四:查詢添加子物體

一:查找獲取子物體

//查找物體的方法
    public static Transform FindTheChild(GameObject goParent, string childName)
    {
        Transform searchTrans = goParent.transform.Find(childName);
        if (searchTrans == null)
        {
            foreach (Transform trans in goParent.transform)
            {
                searchTrans = FindTheChild(trans.gameObject, childName);
                if (searchTrans != null)
                {
                    return searchTrans;
                }
            }
        }
        return searchTrans;
    }

二:獲取某種類型的子物體

//獲取子物體的腳本
    public static T GetTheChildComponent<T>(GameObject goParent, string childName) where T : Component
    {
        Transform searchTrans = FindTheChild(goParent, childName);
        if (searchTrans != null)
        {
            return searchTrans.gameObject.GetComponent<T>();
        }
        else
        {
            return null;
        }
    }

三:查找兄弟物體

// 查找兄弟
    public static GameObject FindBrother(this GameObject obj, string name)
    {
        GameObject gObject = null;
        if (obj.transform.parent)
        {
            Transform tf = obj.transform.parent.Find(name);
            gObject = tf ? tf.gameObject : null;
        }
        else
        {
            GameObject[] rootObjs = UnityEngine.SceneManagement.SceneManager.GetActiveScene().GetRootGameObjects();
            foreach (GameObject rootObj in rootObjs)
            {
                if (rootObj.name == name)
                {
                    gObject = rootObj;
                    break;
                }
            }
        }
        return gObject;
    }

四:通過組件查找場景中所有的物體,包括隱藏和激活的

/// <summary>
    /// 通過組件查找場景中所有的物體,包括隱藏和激活的
    /// </summary>
    /// <typeparam name="T">組件類型</typeparam>
    /// <param name="Result">組件列表</param>
    public static void FindObjectsOfType<T>(List<T> Result) where T : Component
    {
        if (Result == null) Result = new List<T>();
        else Result.Clear();

        List<T> sub = new List<T>();
        GameObject[] rootObjs = SceneManager.GetActiveScene().GetRootGameObjects();
        foreach (GameObject rootObj in rootObjs)
        {
            rootObj.transform.GetComponentsInChildren(true, sub);
            Result.AddRange(sub);
        }
    }

五:通過Tag標簽查找

//通過Tag標簽查找場景中指定物
    public static GameObject FindObjectByTag(string tagName)
    {
        return GameObject.FindGameObjectWithTag(tagName);
    }

六:設置所有子物體的Layer

//設置所有子物體的Layer
    public static void SetLayer(int parentLayer, Transform childTrs)
    {
        childTrs.gameObject.layer = parentLayer;
        for (int i = 0; i < childTrs.childCount; i++)
        {
            Transform child = childTrs.GetChild(i);
            child.gameObject.layer = parentLayer;
            SetLayer(parentLayer, child);
        }
    }

五:文件IO操作

一:寫文件

//寫進去
    public static void WriteFile(string pathName, string info)
    {
        StreamWriter sw;
        FileInfo fi = new FileInfo(pathName);
        sw = fi.CreateText();
        sw.WriteLine(info);
        sw.Close();
        sw.Dispose();
    }

二:讀文件

//讀出來
    public static string ReadFile(string pathName)
    {
        StreamReader sr;
        FileInfo fi = new FileInfo(pathName);
        sr = fi.OpenText();
        string info = sr.ReadToEnd();
        sr.Close();
        sr.Dispose();
        return info;
    }

六:數(shù)學工具

一:幾率問題設置

/**加*/
    //rate:幾率數(shù)組(%),  total:幾率總和(100%)
    // Debug.Log(rand(new int[] { 10, 5, 15, 20, 30, 5, 5,10 }, 100));
    public static int rand(int[] rate, int total)
    {
        int r = UnityEngine.Random.Range(1, total + 1);
        int t = 0;
        for (int i = 0; i < rate.Length; i++)
        {
            t += rate[i];
            if (r < t)
            {
                return i;
            }
        }
        return 0;
    }
    /**減*/
    //rate:幾率數(shù)組(%),  total:幾率總和(100%)
    // Debug.Log(randRate(new int[] { 10, 5, 15, 20, 30, 5, 5,10 }, 100));
    public static int randRate(int[] rate, int total)
    {
        int rand = UnityEngine.Random.Range(0, total + 1);
        for (int i = 0; i < rate.Length; i++)
        {
            rand -= rate[i];
            if (rand <= 0)
            {
                return i;
            }
        }
        return 0;
    }

以上就是“Unity全局工具類有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI