UGUI雷達(dá)圖《三》--- 圓形Image

  • 今天我們來(lái)實(shí)現(xiàn)一個(gè)圓形Image桂肌,如下圖。(哈永淌,這次其實(shí)不是畫雷達(dá)圖了崎场,而是畫圓形Icon,不過其原理和之前的雷達(dá)圖是一樣的遂蛀,而且這里用到了前2篇沒講到的UV谭跨。所以這里列為這個(gè)系列的第三篇!)

    圓形Icon.png

  • 實(shí)現(xiàn)步驟

  1. 因?yàn)槲覀兪窃谠璉mage上進(jìn)行修改。所以這里新建一個(gè)腳本PolygonImage繼承至Image.
    為啥不叫CirecleImage(圓形Image)李滴,而是叫PolygonImage(多邊形Image)呢螃宙。因?yàn)槲覀兤鋵?shí)是把一個(gè)正方形分成正多邊形,當(dāng)邊數(shù)越多所坯,其實(shí)就越趨近圓污呼。比如到正50邊形就很圓了..

  2. 接著我們定義兩個(gè)屬性:半徑和邊數(shù)

        //邊數(shù)
        public int lineCount = 5;
        //半徑
        public float radius = 100;
  1. 取寬和高較小的一邊的一半,作為半徑
    這里因?yàn)镮mage及其基類并不是繼承至UnityEngine.Object包竹。lineCount屬性無(wú)法在Inspector顯示燕酷。
    所以這里在update()里讓lineCount等于z坐標(biāo)。所以相當(dāng)于也可以在Inspector里改變邊數(shù)了周瞎。這里只是方便演示苗缩,實(shí)際使用可以注釋掉。
        protected void Update()
        {
            //取邊長(zhǎng)小的一邊作為半徑
            radius = Mathf.Min(rectTransform.rect.width,rectTransform.rect.height)/2;
            
            //因?yàn)榛怚mage不繼承UnityEngine.Object,
            //所以lineCount無(wú)法序列化,所以這里通過lineCount等于z坐標(biāo)的方式声诸。來(lái)間接實(shí)現(xiàn)在Inspector面板修改邊數(shù)的功能
            lineCount = Mathf.Max(3,(int)transform.localPosition.z);
            SetAllDirty();
        }

4.添加頂點(diǎn)和三角形
這里添加頂點(diǎn)和三角形和之前講的一樣酱讶。唯一不同的就是加入了UV,UV的范圍是0~1彼乌。所以這里我們可以用x坐標(biāo)和寬度的比值泻肯,y坐標(biāo)和高度的比值,再加上0.5偏移慰照。即可算出UV

        protected override void OnPopulateMesh(VertexHelper vh)
        {
            //添加頂點(diǎn)
            AddAllVert(vh);
            //添加三角形
            AddTriangle(vh);
        }

        private void AddAllVert(VertexHelper vh)
        {
            vh.Clear();
            //計(jì)算每個(gè)角的弧度
            float baseRad = (float)Math.PI * 2 / lineCount;

            for (int i = 0; i < lineCount; i++)
            {
                //計(jì)算當(dāng)前的弧度
                var rad = i * baseRad;
                
                //根據(jù)弧度換算坐標(biāo)
                var x = Mathf.Sin(rad) * radius;
                var y = Mathf.Cos(rad) * radius;
                Vector2 pos = new Vector2(x,y);

                //根據(jù)坐標(biāo)計(jì)算UV 
               var uvX = x / rectTransform.rect.width + 0.5f;
               var uvY = y / rectTransform.rect.height + 0.5f;

                var uv = new Vector2(uvX,uvY);
                
                AddVert(vh,pos,uv);
            }
        }
        
            
        private void AddVert(VertexHelper vh,Vector2 pos,Vector2 uv)
        {
            vh.AddVert(pos,color,uv);
        }

        private void AddTriangle(VertexHelper vh)
        {
            for (int i = 0; i < lineCount-1; i++)
            {
                vh.AddTriangle(0,i,i+1);
            }
        }

這樣就OK了灶挟。回到Unity,新建一個(gè)UI空物體毒租,掛上該腳本稚铣,給上圖標(biāo)。修改Z坐標(biāo)墅垮,即可出現(xiàn)多邊形Image,邊數(shù)越多就越圓惕医。如下圖

多邊形.gif

最后,附上完整代碼

using System;

namespace UnityEngine.UI
{   
    public class PolygonImage : Image
    {    
        //邊數(shù)
        public int lineCount = 5;
        //半徑
        public float radius = 100;
        
        protected void Update()
        {
            //取邊長(zhǎng)小的一邊作為半徑
            radius = Mathf.Min(rectTransform.rect.width,rectTransform.rect.height)/2;
            
            //因?yàn)榛怚mage不繼承UnityEngine.Object,
            //所以lineCount無(wú)法序列化,所以這里通過等于z坐標(biāo)的方式算色。來(lái)間接實(shí)現(xiàn)在Inspector面板修改邊數(shù)的功能
            lineCount = Mathf.Max(3,(int)transform.localPosition.z);
            SetAllDirty();
        }

        protected override void OnPopulateMesh(VertexHelper vh)
        {
            //添加頂點(diǎn)
            AddAllVert(vh);
            //添加三角形
            AddTriangle(vh);
        }

        private void AddAllVert(VertexHelper vh)
        {
            vh.Clear();
            //計(jì)算每個(gè)角的弧度
            float baseRad = (float)Math.PI * 2 / lineCount;

            for (int i = 0; i < lineCount; i++)
            {
                //計(jì)算當(dāng)前的弧度
                var rad = i * baseRad;
                
                //根據(jù)弧度換算坐標(biāo)
                var x = Mathf.Sin(rad) * radius;
                var y = Mathf.Cos(rad) * radius;
                Vector2 pos = new Vector2(x,y);

                //根據(jù)坐標(biāo)計(jì)算UV 
               var uvX = x / rectTransform.rect.width + 0.5f;
               var uvY = y / rectTransform.rect.height + 0.5f;

                var uv = new Vector2(uvX,uvY);
                
                AddVert(vh,pos,uv);
            }
        }
        
            
        private void AddVert(VertexHelper vh,Vector2 pos,Vector2 uv)
        {
            vh.AddVert(pos,color,uv);
        }

        private void AddTriangle(VertexHelper vh)
        {
            for (int i = 0; i < lineCount-1; i++)
            {
                vh.AddTriangle(0,i,i+1);
            }
        }
    }
}

好抬伺,這次就到這里了~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市灾梦,隨后出現(xiàn)的幾起案子峡钓,更是在濱河造成了極大的恐慌齐鲤,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件椒楣,死亡現(xiàn)場(chǎng)離奇詭異给郊,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捧灰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門淆九,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人毛俏,你說(shuō)我怎么就攤上這事炭庙。” “怎么了煌寇?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵焕蹄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我阀溶,道長(zhǎng)腻脏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任银锻,我火速辦了婚禮永品,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘击纬。我一直安慰自己鼎姐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布更振。 她就那樣靜靜地躺著炕桨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肯腕。 梳的紋絲不亂的頭發(fā)上献宫,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音乎芳,去河邊找鬼遵蚜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛奈惑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播睡汹,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肴甸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了囚巴?” 一聲冷哼從身側(cè)響起原在,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤友扰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后庶柿,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體村怪,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年浮庐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了甚负。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡审残,死狀恐怖梭域,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搅轿,我是刑警寧澤病涨,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站璧坟,受9級(jí)特大地震影響既穆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜雀鹃,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一循衰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧褐澎,春花似錦会钝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至俭正,卻和暖如春奸鬓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背掸读。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工串远, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人儿惫。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓澡罚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親肾请。 傳聞我的和親對(duì)象是個(gè)殘疾皇子留搔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355