一眨眼學習Unity3D 也有一段時間了,基本已經拿下了這套游戲引擎,回過頭來想想以前寫的RPG 游戲引擎,越來越發現以前寫的就是垃圾。人果然是要不斷學習與不斷進步
最近做一個項目須要去繪制線與繪制面,那么把這兩天的學習筆記整理一下,一是給自己留作備忘,二是方便初學者學習。
任何一個無規則曲線它都是有若干個線段組成,及時是圓形它也是又若干個線段組成的,也就是說將若干個線段拼接起來就是我們須要的無規則曲線~那么在3D 的世界中我們須要知道 X Y Z 三個點來確定一條3D線段。
首先先使用Unity編輯器的方式來添加一條線~
Unity -> GameObject -> Create Empty 創建一個空的對象,我命名為line。然后點擊 Component -> Miscellaneous -> Line Renderer 給line添加一個線渲染器的屬性,Line Renderer是非常中的屬性,下面我會詳細的說明。
Create -> Material 創建一個材質,做來這個線段的貼圖,下面我們看看Line Renderer的一些重要參數。
Cast Shadows: 是否投射陰影。
Receive Shadows: 是否接收陰影。
Materials :設置材質,這里可以設置多個材質, line就是上面我們創建的材質,這里我給line這個材質涂上了紅顏色。
Positions: 這個屬性就比較重要了,它是專門設置線段在3D 世界中的點的坐標,size 設置點的數量 為3 那么將會有3個點,Element 0 Element 1 Element 2 這三個點將確定這條曲線分為兩段,***段是(0,0,1) 到 (0,0,2) ,第二段是 (0,0,2) 到(0,0,4)。
Paramerters
StartWidth :設置起點的寬度
EndWidth: 設置終點的寬度 ,這兩項數值默認為1,但是現實起來很寬,所以一般都設置為0.幾~
Start Color: 設置起點顏色
Start Color: 設置終點顏色
Use World Space 使用世界坐標系
大家看看效果,清楚的可以看到曲線分為兩部分,***部分較短 第二部分較長。
怎么樣? 繪制線的方法不難學吧?在已知線段位置的情況下我們可以使用上面的方法去設置這條線,但是如果線段的位置是在游戲過程中動態的產生就得在代碼中去動態的去設置。
創建腳本Main.cs 綁定到攝像頭上,運行游戲繪制線的話須要在Main中去拿到line這個對象的實例。這就是一個比較重要的知識點了。
一些重要的方法,在編輯器中編輯的一些東西,在代碼中也可以做到。
LineRenderer.SetWidth(0.1,0.1) ; 設置線段起始點與結束點的寬度 (參數1 為起始點 參數2為結束點)
LineRenderer.SetColor(Color.black,Color.white); 設置線段起始點與結束點的顏色 (參數1 為起始點顏色 參數2為結束點顏色)
LineRenderer.SetVertexCount(5); 設置線段數量。
LineRenderer.useWorldSpace = true; 是否使用世界坐標系,和上面編輯器對應。
[代碼]c#/cpp/oc代碼:
02 |
using System.Collections; |
03 |
using System.Threading; |
05 |
public class Main : MonoBehaviour { |
08 |
private GameObject LineRenderGameObject; |
11 |
private LineRenderer lineRenderer; |
13 |
//設置線段的個數,標示一個曲線由幾條線段組成 |
14 |
private int lineLength = 4; |
16 |
//分別記錄4個點,通過這4個三維世界中的點去連接一條線段 |
17 |
private Vector3 v0 = new Vector3(1.0f,0.0f,0.0f); |
18 |
private Vector3 v1 = new Vector3(0.0f,1.0f,0.0f); |
19 |
private Vector3 v2 = new Vector3(0.0f,0.0f,1.0f); |
20 |
private Vector3 v3 = new Vector3(1.0f,0.0f,0.0f); |
24 |
//通過之前創建的對象的名稱,就可以在其它類中得到這個對象, |
25 |
//這里在main.cs中拿到line的對象 |
26 |
LineRenderGameObject = GameObject.Find ("line"); |
28 |
//通過游戲對象,GetComponent方法 傳入LineRenderer |
29 |
//就是之前給line游戲對象添加的渲染器屬性 |
31 |
lineRenderer = (LineRenderer)LineRenderGameObject.GetComponent ("LineRenderer"); |
33 |
//設置線段長度,這個數值須要和繪制線3D點的數量想等 |
35 |
lineRenderer.SetVertexCount(lineLength); |
50 |
lineRenderer.SetPosition (0, v0); |
51 |
lineRenderer.SetPosition (1, v1); |
52 |
lineRenderer.SetPosition (2, v2); |
53 |
lineRenderer.SetPosition (3, v3); |
通過上面代碼的設置,運行游戲,發現全新的一個三角形曲線赫然的映入我們的眼簾,有了上面的方法我們就可以組合的繪制出各種各樣的3D 游戲曲線了,這里MOMO使用的是顏色,大家也可以添加一個貼圖~
繪制面的話~,因為3D世界中游戲面全都是用三角形來拼起來的(出于效率的考慮),所以大家所看到的面其實都是用三角面拼接起來的。那么下面我們看看在 Unity3D 中如何繪制三角形平面。先創建一個GameObject對象,我命名為face,然后給這個對象添加兩個Mesh屬性, 添加MeshFilter(網格過濾器)與mesh Renderer(網格渲染器)屬性,這樣子就可以繪制網格面了。
為了給網格面貼圖,我給mesh Renderer 渲染器添加一個材質,貼上一張圖片~ 在3D 的世界中兩點可以確定一條線,那么三點就肯定能確定一個面,3D世界中的面一定是三角形拼湊組成,任何3D的面的所需要的坐標點的數量 一定是3的倍數。和繪制線一樣,MOMO還是創建一個腳本綁定在攝像頭中,然后去訪問上面創建的face游戲對象 去渲染三角面~
[代碼]c#/cpp/oc代碼:
02 |
using System.Collections; |
04 |
public class Main : MonoBehaviour { |
07 |
// Update is called once per frame |
10 |
//通過object對象名 face 得到網格渲染器對象 |
11 |
MeshFilter meshFilter = (MeshFilter)GameObject.Find("face").GetComponent(typeof(MeshFilter)); |
14 |
Mesh mesh = meshFilter.mesh; |
16 |
//API中寫的不是提清楚,我詳細的在說一遍 |
19 |
//三個點確定一個面,所以Vector3數組的數量一定是3個倍數 |
21 |
//這里的數量為6 也就是我創建了2個三角面 |
23 |
mesh.vertices = new Vector3[] {new Vector3(5, 0, 0), new Vector3(0, 5, 0), new Vector3(0, 0, 5),new Vector3(-5, 0, 0), new Vector3(0, -5, 0), new Vector3(0, 0, -5)}; |
25 |
//設置貼圖點,因為面確定出來以后就是就是2D |
30 |
mesh.uv = new Vector2[] {new Vector2(0, 0), new Vector2(0, 5), new Vector2(5, 5),new Vector2(0, 0), new Vector2(0, 1), new Vector2(1, 1)}; |
33 |
//設置三角形索引,這個索引是根據上面頂點坐標數組的索引 |
37 |
mesh.triangles= new int []{0,1,2,3,4,5}; |
Build and Run 運行效果后清楚的可以看到兩個三角形。MOMO提醒大家 善用三角平面可以繪制出各種各樣的游戲面出來噢~哇咔咔~