Unity工作隨記_UGUI雷達圖

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using System.Collections.Generic;
using System;

/// <summary>
/// 繪製五邊形雷達圖,可轉換多邊形雷達圖
/// 以下是五邊形的頂點示意圖,012爲一個三角形,023爲一個三角形,034爲一個三角形,
/// 045爲一個三角形,051爲一個三角形,五個三角形拼接變成五邊形
/// 
///         3
/// 
/// 1       0        5
/// 
///     2       4
/// </summary>
public class UGUIDrawRadar : Graphic
{
    //頂點的座標,頂點數量必須大於2
    public List<Vector2> vertexList = new List<Vector2>();
    //雷達圖的五個分數    
    public float[] score = new float[5];
    //雷達圖的半徑
    public float radius = 5f;

    //雷達圖最大分數 
    float maxScore =100;
    //雷達圖最小分數 
    float minScore = 0;


    /// <summary>
    /// 
    /// </summary>
    /// <param name="vh"></param>
    protected override void OnPopulateMesh(VertexHelper vh)
    {
        base.OnPopulateMesh(vh);
        List<UIVertex> targetVertexList = new List<UIVertex>();
        int triangleCount = vertexList.Count - 2;
        //三角形 構成
        for (int i = 0; i < triangleCount; i++)
        {
            for (int j = 0; j < 3; j++)     //三角形的三個點
            {
                UIVertex vertex = new UIVertex();
                if (j == 0)
                {
                    vertex.position = vertexList[0];
                }
                else
                {
                    vertex.position = vertexList[i + j];

                }
                vertex.color = color;
                targetVertexList.Add(vertex);
            }
        }
        //最後一個三角形 051 
        for (int k = 0; k < 3; k++)
        {
            UIVertex vertex = new UIVertex();
            if (k == 0)
            {
                vertex.position = vertexList[0];
            }
            else if (k == 1)
            {
                vertex.position = vertexList[1];
            }
            else if (k == 2)
            {
                vertex.position = vertexList[5];
            }
            vertex.color = color;

            targetVertexList.Add(vertex);
        }
        vh.Clear();
        vh.AddUIVertexTriangleStream(targetVertexList);
    }
    /// <summary>
    /// 設置雷達圖繪製頂點
    /// </summary>
    void SetVertex()
    {
        vertexList.Clear();
        vertexList.Add(Vector2.zero); 
        for (int i = 0; i < score.Length; i++)
        {
            var angle = i*2*Mathf.PI/5;//角度換算
            vertexList.Add(new Vector2(radius * Mathf.Sin(angle) * ResetScore(score[i]), radius * Mathf.Cos(angle) * ResetScore(score[i])) );
        }
    }

    /// <summary>
    /// 分數限制
    /// </summary>
    /// <param name="sco"></param>
    /// <returns></returns>
    float ResetScore(float sco)
    {
        float score;
        score = sco;
        if (sco > maxScore) {
            score = maxScore;
        }
        if (sco < minScore)
        {
            score = minScore;
        }
        return score;
    }
    /// <summary>
    /// 設置雷達圖的五個分數
    /// </summary>
    /// <param name="scores_00"></param>
    /// <param name="scores_01"></param>
    /// <param name="scores_02"></param>
    /// <param name="scores_03"></param>
    /// <param name="scores_04"></param>
    public void SetScores(float scores_00, float scores_01, float scores_02,float scores_03, float scores_04)
    {
        score[0] = scores_00;
        score[1] = scores_01;
        score[2] = scores_02;
        score[3] = scores_03;
        score[4] = scores_04;
        SetVertex();
       // Debug.Log("SetScores");
    }
    /// <summary>
    /// 雷達圖截屏
    /// </summary>
    public void CaptureScreen()
    {
        Application.CaptureScreenshot(string.Format("{0}\\最終分數_{1}x{2}_{3}.png", Application.streamingAssetsPath, Screen.width, Screen.height, ReturnDate()));
       Debug.Log("截圖放在" + Application.streamingAssetsPath + "路徑下");
    }
    /// <summary>
    /// 截圖時間
    /// </summary>
    /// <returns></returns>
    string ReturnDate()
    {
        string data;
        string dataYear;
        string dataMonth;
        string dataDay;
        string dataHour;
        string dataMin;
        string dataSecond;

        dataYear = System.DateTime.Now.Year.ToString();
        dataDay = System.DateTime.Now.Day.ToString();
        dataMonth = System.DateTime.Now.Month.ToString();
        dataHour = System.DateTime.Now.Hour.ToString();
        dataMin = System.DateTime.Now.Minute.ToString();
        dataSecond = System.DateTime.Now.Second.ToString();

        data = dataYear + "_" + dataMonth + "_" + dataDay + "_" + dataHour + "" + dataMin + "" + dataSecond;
        return data;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章