<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
覺得不好看可以自己調整
線狀圖一般由資料點和連線組成
在繪製連線之前,我們先標出資料點
這裡我選擇用Image圖片來繪製資料點
新建Canvas,新增空物體Graph
在Graph上新增空物體 GraphContainer 和 Image BackGround
在 GraphContainer 上新增 Image BackGround
修改兩個BackGround的大小和顏色製作背景
注意:這裡GraphContainer 錨點為左下角
左下角預設為原點(0,0),之後所有的圖形繪製都會在GraphContainer之內
在Graph上新建指令碼MyGraph
public class MyGraph : MonoBehaviour { [SerializeField] private Sprite circleSprite; //需要畫的影象,這裡賦值為了一個Unity自帶的圓形,也可改為其它圖形 private RectTransform graphContainer; //宣告一個 RectTransform,用於修改圖片的大小 private void Awake() { //獲取graphContainer的RectTransform並賦值,為內側的小矩形,會作為我們的畫板 graphContainer = transform.Find("GraphContainer").GetComponent<RectTransform>(); CreateCircle(new Vector2(200, 200)); //在(200,200)的地方建立圓,用於測試 } private void CreateCircle(Vector2 anchoredPosition) { GameObject gameObject = new GameObject("circle", typeof(Image)); //生成新物體,該物體包含一個圖片元件 gameObject.transform.SetParent(graphContainer, false); //將圖片設為graphContainer的子物體 gameObject.GetComponent<Image>().sprite = circleSprite; //將圖片賦值為Inspector中設定的圖片 //獲取新建圖片物體的RectTransform並賦值 RectTransform rectTransform = gameObject.GetComponent<RectTransform>(); rectTransform.anchoredPosition = anchoredPosition; //設定圖片位置 rectTransform.sizeDelta = new Vector2(20, 20); //設定圖片大小,可設為公共變數來修改 //下面兩句將生成圖片的錨點設為了父物體左下角(原點) rectTransform.anchorMin = new Vector2(0, 0); rectTransform.anchorMax = new Vector2(0, 0); } }
執行後便會出現一個點
繼續修改MyGraph
public class MyGraph : MonoBehaviour { //[SerializeField] //private Sprite circleSprite; //private RectTransform graphContainer; private void Awake() { //graphContainer = transform.Find("GraphContainer").GetComponent<RectTransform>(); //宣告一個列表用於測試 List<int> valueList = new List<int>() { 1, 2, 4, 9, 16, 25, 36, 49, 64, 81, 100, 80, 50, 20, 10 }; ShowGraph(valueList); } private void CreateCircle(Vector2 anchoredPosition) { ...... } private void ShowGraph(List<int> valueList) { int maxValue = 0; foreach (int value in valueList) //找出列表中的最大值 { if (maxValue <= value) { maxValue = value; } } float graphWidth = graphContainer.sizeDelta.x; //獲取畫布graphContainer的寬度 float graphHeight = graphContainer.sizeDelta.y; //獲取畫布graphContainer的高度 float xSpace = graphWidth / (valueList.Count - 1); //資料點x座標的間距 float ySpace = graphHeight / maxValue; //資料的y座標的比例 for (int i = 0; i < valueList.Count; i++) { float xPos = i * xSpace; //x座標為線性固定增長 float yPos = ySpace * valueList[i]; //y座標是以列表中最大值為畫布高度,按值的大小與最大值的比例取高度 CreateCircle(new Vector2(xPos, yPos)); //畫出點 } } }
執行顯示結果
為了好看點,可以將內側灰色的背景放大點
所有點都在 GraphContainer 之內,點在x座標平均分佈,最高點為列表中的最大值
這裡點之間的連線我仍然使用Image,只要Image足夠細就能夠看作線條
之後我會嘗試能否使用LineRenderer
這裡畫線的想法是在兩點中點建立一個線條狀的Image,然後旋轉一定角度
繼續修改MyGraph
public class MyGraph : MonoBehaviour { ...... private void ShowGraph(List<int> valueList) { ...... float xSpace = graphWidth / (valueList.Count - 1); float ySpace = graphHeight / maxValue; GameObject lastPoint = null; //用於儲存上一個點,畫出上一個點到現在點的連線,這樣就不用管最後一個點 for (int i = 0; i < valueList.Count; i++) { //float xPos = i * xSpace; //float yPos = ySpace * valueList[i]; GameObject circleGameobject = CreateCircle(new Vector2(xPos, yPos));//獲取建立的點 if (lastPoint != null) { //畫線,引數為上一個點的位置,和當前點的位置 DrawLine(lastPoint.GetComponent<RectTransform>().anchoredPosition, circleGameobject.GetComponent<RectTransform>().anchoredPosition); } lastPoint = circleGameobject; //畫完連線之後,變為上一個點 } } private void DrawLine(Vector2 pointA, Vector2 pointB) //畫線方法 { GameObject gameObject = new GameObject("line", typeof(Image));//新建一個物體包含一個Image元件 gameObject.transform.SetParent(graphContainer, false); //將該圖片設為graphContainer的子物體 //就是在畫板內畫線 RectTransform rectTransform = gameObject.GetComponent<RectTransform>(); //獲取 RectTransform 元件 Vector2 dir = pointB - pointA; //兩點間的向量 //同樣將線段錨點設為畫板左下角(原點) rectTransform.anchorMin = new Vector2(0, 0); rectTransform.anchorMax = new Vector2(0, 0); rectTransform.sizeDelta = new Vector2(dir.magnitude, 3f); //線段的長寬,長為兩點間向量的長度,就是兩點間距離 rectTransform.anchoredPosition = pointA + dir / 2; //線段的中心點,為兩點間的中心點 float angle = RotateAngle(dir.x, dir.y); //線段的旋轉角度 rectTransform.localEulerAngles = new Vector3(0, 0, angle); //旋轉線段 } private float RotateAngle(float x, float y) //旋轉方法 { float angle = Mathf.Atan2(y, x) * 180 / 3.14f;//Atan2返回的是弧度,需要乘以180/PI得到角度,這裡PI直接用了3.14 return angle; } }
在RotateAngle()
方法中Mathf.Atan2會返回角θ的弧度
圖片所示情況會返回正數,如果右邊的點更矮則是負數,可以直接用於旋轉
執行後顯示效果:
實際自己需要輸入的資料列表建議自己進行修改
線狀圖2.0會加上座標軸
到此這篇關於UnityUI中繪製線狀統計圖的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45