Unity製作簡單3D圖表,unity3d圖表
轉載請註明本文出自大苞米的部落格(http://blog.csdn.net/a396901990),謝謝支援!
開篇廢話:
在大學時稍微自學過一段時間Unity3D,雖然現在在做安卓,但一直對遊戲開發高度興趣,所以平時偶爾有空也會稍微看看,不過水平還是未入門菜鳥級的。
下面這個demo是看了雨松MOMO大神所寫的幾篇基礎文章後,寫的一個練習demo,用來展示簡易的3D圖表。
這個Demo非常初級,純粹是為了練習知識點,但是所應用到的知識點非常基礎,非常重要,適合初學者學習。如下:
簡介:
這個Demo可以分為4個部分
第一部分——建立3D座標系:
外框首先由四個平面所圍成的一個“3D座標系”,和X、Y、Z三個“座標”組成。
1.四個平面
這四個平面所用的就是系統內建的cube,建立並調整cube的大小和方向組成上面的形狀。
2.建立座標系prefab
建立一個預設,並將左平面,右平面和後平面添加到下平面中最後添加到預設裡,這樣他們就變成了一個整體。如所示:
3.調整prefab在世界中的位置和他的scale
由於要設立座標點,所以需要使剛才建立的座標系的零點對應全局座標的零點。
在本例中:假設每個單位長度為1,X座標需要分成12份(12個月)座標系scale的x值為24(每兩份代表一個刻度)。Y軸代表百分比,分為5份(每份一個刻度)。Z軸同理。
通過上面的3個步驟,3D座標系的樣子已經出來了,下面開始為這個座標系添加“刻度名稱”。
第二部分——為座標添加刻度名稱:
刻度名稱使用兩個知識點:
1.全局座標轉換為螢幕座標:
添加刻度名稱其實就是將全局座標的座標值(因為我們已經在上一步中將座標系和全局座標同步了)轉換為螢幕座標值。
2.使用GUI.Label寫出座標名稱:
通過剛才算出的螢幕座標處使用GUI.Label函數寫出當前座標點的名稱。
下面是本例中這個方法的代碼:
[csharp] view plaincopyprint?
- // isY代表是不是Y軸
- void drawCoordinate (Vector3 point, string name, bool isY) {
- // 將全局座標轉換為螢幕座標
- Vector2 position = camera.WorldToScreenPoint (point);
- position = new Vector2 (position.x, position.y);
-
- // 設定刻度的大小和顏色
- Vector2 nameSize = GUI.skin.label.CalcSize (new GUIContent(name));
- GUI.color = Color.yellow;
- // 根據X,Y軸的不同加上適當位移量畫出刻度
- if (isY) {
- GUI.Label(new Rect(position.x-nameSize.x-coordOffset ,Screen.height-position.y,nameSize.x,nameSize.y), name);
- }
- else {
- GUI.Label(new Rect(position.x-nameSize.x ,Screen.height-position.y,nameSize.x,nameSize.y), name);
- }
- }
調用方法如下:
[csharp] view plaincopyprint?
- void OnGUI()
- {
- drawCoordinate (new Vector3 (0 , 0, 0), "0.00%", true);
- drawCoordinate (new Vector3 (2 , 0, 0), "Jan", false);
- }
最後我貼上從網上找的關於Unity中座標系的知識點(原文實在找不到了我就不貼串連了):
【Unity中四種座標系】
1、World Space(全局座標):
我們在情境中添加物體(如:Cube),他們都是以全局座標顯示在情境中的。
transform.position可以獲得該位置座標。
2、Screen Space(螢幕座標):
以像素來定義的,以螢幕的左下角為(0,0)點,右上方為(Screen.width,Screen.height),Z的位置是以相機的世界單位來衡量的。
Screen.width = Camera.pixelWidth
Screen.height = Camera.pixelHeigth
滑鼠位置座標屬於螢幕座標,Input.mousePosition可以獲得該位置座標,
手指觸控螢幕幕也為螢幕座標,Input.GetTouch(0).position可以獲得單個手指觸控螢幕幕座標。
3、ViewPort Space(視口座標):
視口座標是標準的和相對於相機的。相機的左下角為(0,0)點,右上方為(1,1)點,Z的位置是以相機的世界單位來衡量的。
4、繪製GUI介面的座標系:
這個座標系與螢幕座標系相似,不同的是該座標系以螢幕的左上方為(0,0)點,右下角為(Screen.width,Screen.height)。
【四種座標系的轉換】
1、全局座標→螢幕座標:
camera.WorldToScreenPoint(transform.position);
這樣可以將全局座標轉換為螢幕座標。其中camera為情境中的camera對象。
2、螢幕座標→視口座標:
camera.ScreenToViewportPoint(Input.GetTouch(0).position);
這樣可以將螢幕座標轉換為視口座標。其中camera為情境中的camera對象。
3、視口座標→螢幕座標:
camera.ViewportToScreenPoint();
4、視口座標→全局座標:
camera.ViewportToWorldPoint();
第三部分——在3D座標系中畫折線
座標系建立好以後我們就可以在這個座標系中畫折線來啦。
座標系已經和全局座標系同步,所以每個座標的座標點我們已經知道,下面的問題就是如何將點連成線。
Unity提供了LineRenderer來畫線,可以通過如下兩種方法建立它:
一.Unity編輯器的方式:
1.Unity -> GameObject -> Create Empty 建立一個空的對象,我命名為line。
2.然後點擊 Component -> Effects-> Line Renderer 給line添加一個線渲染器的屬性
二.指令碼的方式:
下面是本例的使用代碼:
[csharp] view plaincopyprint?
- public class lineScript1 : MonoBehaviour {
-
- private Color c1 = Color.red;
- private Color c2 = Color.red;
- private LineRenderer lineRenderer;
-
- private Vector3 v0 = new Vector3(0.0f,0.0f,3.0f);
- private Vector3 v1 = new Vector3(2.0f,2.0f,0.0f);
- private Vector3 v2 = new Vector3(4.0f,3.0f,1.0f);
- private Vector3 v3 = new Vector3(10.0f,4.0f,0.0f);
- private Vector3 v4 = new Vector3(15.0f,6.0f,2.0f);
- private Vector3 v5 = new Vector3(20.0f,8.6f,0.0f);
-
- void Start () {
- lineRenderer = lineRenderer = gameObject.AddComponent<LineRenderer>();
- lineRenderer.SetColors(c1, c2);
- lineRenderer.SetWidth(0.2f,0.2f);
- lineRenderer.SetVertexCount(6);
- }
-
- void Update () {
- lineRenderer.SetPosition (0, v0);
- lineRenderer.SetPosition (1, v1);
- lineRenderer.SetPosition (2, v2);
- lineRenderer.SetPosition (3, v3);
- lineRenderer.SetPosition (4, v4);
- lineRenderer.SetPosition (5, v5);
- }
- }
LineRenderer的詳細使用請參考雨松momo的文章:Unity3D研究院之遊戲對象的訪問繪製線與繪製面詳解(十七)
第四部分——通過手勢/滑鼠來放大、縮小、旋轉座標系
簡單概括為兩個要點:
1.手勢和滑鼠的識別
在Unity中手勢識別有一個外掛程式:FingerGestures
在本例中當然不需要做的這麼複雜,只需要判斷觸摸點來進行一些簡單計算就可以。
無論是Android應用還是Unity手勢判斷最常用的就是簡單的通過記錄之前的觸摸點位置和之後的觸摸點位置然後再進行計算。
計算觸摸點Unity提供如下幾個方法:
Input.touchCount可以判斷當前觸摸點的數量,所以可以通過這個方法來判斷是單點觸摸還是多點觸摸
Input.GetTouch(0).phase方法會返回一個表示當前觸摸類型的枚舉(TouchPhase)。
TouchPhase有如下幾種類型:
- Began手指已觸控螢幕幕。
- Moved手指在螢幕上移動。
- Stationary手指觸控螢幕幕,但並沒有移動。
- Ended手指從螢幕上移開。這是一個觸摸的最後狀態。
- Canceled系統取消跟蹤觸摸,如使用者把螢幕放到他臉上或超過五個接觸同時發生。這是一個觸摸的最後狀態。