private void SpawnAtVertex(Vector3 position, Vector2 uv, Vector3 localNormal) { Vector3 worldPosition = MeshFilterComponent.transform.TransformPoint(position); Vector3 offset = Random.insideUnitSphere * PositionOffset; offset.y = 0; float distributionMultiplier = 1; if (DistributionMap != null) { distributionMultiplier = DistributionMap.GetPixelBilinear(uv.x, uv.y).a; } Vector3 scale = Vector3.one * Size * distributionMultiplier; GameObject g = Instantiate(Prefab); g.transform.parent = this.transform; g.transform.position = worldPosition + offset; g.transform.localScale = scale; g.name = Prefab.name; if (FollowVertexNormal) { g.transform.up = MeshFilterComponent.transform.TransformPoint(localNormal); } float rotationDegreeY = MaxRotation * Random.value; g.transform.Rotate(0, rotationDegreeY, 0, Space.Self); }
public void Populate() { if (MeshFilterComponent == null || MeshFilterComponent.sharedMesh == null) { return; } Utilities.ClearChildren(this.transform); Vector3[] vertices = MeshFilterComponent.sharedMesh.vertices; Vector2[] uvCoords = MeshFilterComponent.sharedMesh.uv; Vector3[] normals = MeshFilterComponent.sharedMesh.normals; for (int i = 0; i < vertices.Length; ++i) { float distributionMultiplier = 1; if (DistributionMap != null) { distributionMultiplier = DistributionMap.GetPixelBilinear(uvCoords[i].x, uvCoords[i].y).a; } float probability = Density * distributionMultiplier; if (Random.value < probability) { SpawnAtVertex(vertices[i], uvCoords[i], normals[i]); } } }