私はしばらく更新されていない古いチュートリアルを見つけ、1D平面の地形を作成するためにそれに従っていました。ベジェ曲線を使用してサーフェスを生成し、サーフェスはランドとして機能します。プロシージャによって生成された平面に余分な頂点を追加するにはどうすればよいですか?
しかし、これは頂点の2つのセット(底部に1つ、上部に1つ)を作成するだけです。私はそれがより多くのキューブの形を生成するようにそれを埋めたいですが、私は追加の頂点を追加する場所がわかりません。もう一つの目標は、頂点と底面の間に頂点を追加して、より強固な図形を作成することです。キューブのような形を作成するために追加の頂点ループを追加する必要があります。メッシュの解像度と深度を高めます。
using UnityEngine;
using System.Collections.Generic;
public class TerrainGenerator : MonoBehaviour
{
public Vector3[] meshPoints = null;
private Mesh _mesh = null;
public List<Vector3> vertices = new List<Vector3>();
private List<int> triangles = new List<int>();
private MeshCollider _collider;
private MeshFilter _filter;
private float terrainSize = 0.4f;
public LandTypes type;
public float lastHeight = 3;
void Awake()
{
_collider = GetComponent<MeshCollider>();
_filter = GetComponent<MeshFilter>();
}
public void GenerateMesh(float lh, LandTypes Type)
{
type = Type;
_mesh = _filter.mesh;
_mesh.Clear();
meshPoints = new Vector3[4];
switch(Type)
{
case LandTypes.Flat:
meshPoints[0] = new Vector3(terrainSize * (float)0, lh, 0f);
meshPoints[1] = new Vector3(terrainSize * (float)1, lh, 0f);
meshPoints[2] = new Vector3(terrainSize * (float)2, lh, 0f);
meshPoints[3] = new Vector3(terrainSize * (float)3, lh, 0f);
break;
case LandTypes.Up:
int typeOfUpChance = Random.Range(1, 20);
if (typeOfUpChance > 10)
{
meshPoints[0] = new Vector3(terrainSize * (float)0, lh, 0f);
meshPoints[1] = new Vector3(terrainSize * (float)1, lh + 1, 0f);
meshPoints[2] = new Vector3(terrainSize * (float)2, lh + 2, 0f);
meshPoints[3] = new Vector3(terrainSize * (float)3, lh + 3, 0f);
} else
{
meshPoints[0] = new Vector3(terrainSize * (float)0, lh, 0f);
meshPoints[1] = new Vector3(terrainSize * (float)1, lh + Random.Range(2, 3), 0f);
meshPoints[2] = new Vector3(terrainSize * (float)2, lh + Random.Range(2, 4), 0f);
meshPoints[3] = new Vector3(terrainSize * (float)3, lh + 5, 0f);
}
break;
case LandTypes.Down:
if (lh > 6f)
{
meshPoints[0] = new Vector3(terrainSize * (float)0, lh, 0f);
meshPoints[1] = new Vector3(terrainSize * (float)1, lh - 2, 0f);
meshPoints[2] = new Vector3(terrainSize * (float)2, lh - 3, 0f);
meshPoints[3] = new Vector3(terrainSize * (float)3, lh - 4, 0f);
}
else
{
meshPoints[0] = new Vector3(terrainSize * (float)0, lh, 0f);
meshPoints[1] = new Vector3(terrainSize * (float)1, lh, 0f);
meshPoints[2] = new Vector3(terrainSize * (float)2, lh, 0f);
meshPoints[3] = new Vector3(terrainSize * (float)3, lh, 0f);
}
break;
case LandTypes.Hill:
meshPoints[0] = new Vector3(terrainSize * (float)0, lh, 0f);
meshPoints[1] = new Vector3(terrainSize * (float)1, lh + 1.5f, 0f);
meshPoints[2] = new Vector3(terrainSize * (float)2, lh + 1.5f, 0f);
meshPoints[3] = new Vector3(terrainSize * (float)3, lh, 0f);
break;
}
LandController.Instance.HeightCounts.Add(meshPoints[3].y);
LandController.Instance.lastHeight = meshPoints[3].y;
int resolution = 8;
for (int i = 0; i < resolution; i++)
{
float t = (float)i/(float)(resolution - 1);
Vector3 p = CalculateBezierPoint(t, meshPoints[0], meshPoints[1], meshPoints[2], meshPoints[3]);
AddTerrainPoint(p);
}
_mesh.vertices = vertices.ToArray();
_mesh.triangles = triangles.ToArray();
_mesh.RecalculateBounds();
_mesh.RecalculateNormals();
_collider.sharedMesh = _mesh;
}
void AddTerrainPoint(Vector3 point)
{
vertices.Add(new Vector3(point.x, 0f, 0f));
vertices.Add(point);
if (vertices.Count >= 4)
{
int start = vertices.Count - 4;
triangles.Add(start + 0);
triangles.Add(start + 1);
triangles.Add(start + 2);
triangles.Add(start + 1);
triangles.Add(start + 3);
triangles.Add(start + 2);
}
}
private Vector3 CalculateBezierPoint(float t, Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3)
{
float u = 1 - t;
float tt = t * t;
float uu = u * u;
float uuu = uu * u;
float ttt = tt * t;
Vector3 p = uuu * p0;
p += 3 * uu * t * p1;
p += 3 * u * tt * p2;
p += ttt * p3;
return p;
}
}