拖尾的簡單實現

今天看到一個題目發現沒做過拖尾,簡單寫一下。

思路:

1.使用兩個子物體的Transform指示拖尾軌跡的兩端

2.每秒採樣當前的偏移,然後將頂點依次順延並添加該偏移值

3.重建Mesh

代碼如下:

void Start()n{n mesh = new Mesh();n mf = GetComponent<MeshFilter>();n mr = GetComponent<MeshRenderer>();n meshVertices = new List<Vector3>();n meshUvs = new List<Vector2>();n triangles = new List<int>();n meshColors = new List<Color>();n //把點分配好n // 0 2 4 8 10 .. (sampleCount-1)*2 ..sampleCount* 2n //n // 1 3 5 7 9 .. (sampleCount-1)*2+1 ..sampleCount*2+1n for (int i = 0; i < SampleCount; i++)n {n //需要雙面n triangles.Add(i * 2);n triangles.Add(i * 2 + 1);n triangles.Add(i * 2 + 3);n triangles.Add(i * 2);n triangles.Add(i * 2 + 3);n triangles.Add(i * 2 + 1);n triangles.Add(i * 2);n triangles.Add(i * 2 + 3);n triangles.Add(i * 2 + 2);n triangles.Add(i * 2);n triangles.Add(i * 2 + 2);n triangles.Add(i * 2 + 3);n }n //塞好頂點n for (int i = 0; i <= SampleCount; i++)n {n meshVertices.Add(Top.localPosition);n meshVertices.Add(Bottom.localPosition);n meshUvs.Add(new Vector2((float)i / SampleCount, 1));n meshUvs.Add(new Vector2((float)i / SampleCount, 0));n meshColors.Add(new Color((float)i / SampleCount, 1, 1));n meshColors.Add(new Color(1, 1, (float)i / SampleCount));n }n BuildNewMesh();n}nnvoid Update()n {n Vector3 move = lastPoint - transform.position;n for (int i = SampleCount - 1; i >= 0; i--)n {n meshVertices[i * 2 + 2] = meshVertices[i * 2] + move;n meshVertices[i * 2 + 3] = meshVertices[i * 2 + 1] + move;n }n meshVertices[0] = Top.localPosition;n meshVertices[1] = Bottom.localPosition;n lastPoint = transform.position;n BuildNewMesh();n mr.enabled = IsShow;n }n

至於BuildNewMesh,是一個很簡單的構造Mesh的過程,不再贅述。

推薦閱讀:

Python爬蟲實戰入門二:從一個簡單的HTTP請求開始
Fab Academy 第十六周:界面和應用編程
Haskell 這段代碼該如何理解?
設計師學編程?從五個思維訓練開始
getter 和 setter 方法有什麼意義?

TAG:Unity游戏引擎 | 编程 | 游戏开发 |