*
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
using UnityEngine;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
public class TreeGenerator : MonoBehaviour
|
||||
{
|
||||
public int SliceX;
|
||||
public int SliceY;
|
||||
public int SliceZ;
|
||||
|
||||
public int RootBranches = 3;
|
||||
|
||||
public Vector3 TrunkSize = Vector3.one;
|
||||
private float branchStep;
|
||||
public float BranchAngle = 60;
|
||||
|
||||
public ProceduralMeshData GenerateTrunk(Vector3 size){
|
||||
ProceduralMeshData m = new ProceduralMeshData();
|
||||
BoxGenerator box = new BoxGenerator();
|
||||
box.SliceX = SliceX;
|
||||
box.SliceY = SliceY;
|
||||
box.SliceZ = SliceZ;
|
||||
box.Size = size;
|
||||
box.Execute(m);
|
||||
|
||||
TransformVertexNode offsetPivot = new TransformVertexNode();
|
||||
offsetPivot.Offset = Vector3.forward * size.z * 0.5f;
|
||||
offsetPivot.Execute(m);
|
||||
return m;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void Generate() {
|
||||
var mf = GetComponent<MeshFilter>();
|
||||
if (mf == null) {
|
||||
mf = gameObject.AddComponent<MeshFilter>();
|
||||
}
|
||||
|
||||
var mesh = mf.sharedMesh;
|
||||
if (mesh == null)
|
||||
{
|
||||
mesh = new Mesh();
|
||||
mf.sharedMesh = mesh;
|
||||
}
|
||||
branchStep = TrunkSize.z/(RootBranches + 1);
|
||||
|
||||
var mTrunk = GenerateTrunk(TrunkSize);
|
||||
|
||||
List<ProceduralMeshData> branches = new List<ProceduralMeshData>();
|
||||
for (int i = 0; i < RootBranches; ++i)
|
||||
{
|
||||
float zOffset = branchStep*(i + 1);
|
||||
|
||||
|
||||
var branchSize = TrunkSize;
|
||||
branchSize.x *= 0.7f;
|
||||
branchSize.y *= 0.7f;
|
||||
branchSize.z *= Mathf.Pow(0.65f, i + 1) * 0.5f;
|
||||
|
||||
var l = GenerateTrunk(branchSize);
|
||||
var r = GenerateTrunk(branchSize);
|
||||
|
||||
TransformVertexNode branchTransform = new TransformVertexNode();
|
||||
branchTransform.Rotation = Quaternion.AngleAxis(BranchAngle, Vector3.up);
|
||||
branchTransform.Offset = new Vector3(0,0, zOffset);
|
||||
branchTransform.Execute(r);
|
||||
|
||||
branchTransform.Rotation = Quaternion.AngleAxis(-BranchAngle, Vector3.up);
|
||||
branchTransform.Execute(l);
|
||||
|
||||
branches.Add(l);
|
||||
branches.Add(r);
|
||||
}
|
||||
|
||||
|
||||
CombineMeshNode combiner = new CombineMeshNode();
|
||||
combiner.Source.Add(mTrunk);
|
||||
combiner.Source.AddRange(branches);
|
||||
|
||||
ProceduralMeshData result = new ProceduralMeshData();
|
||||
combiner.Execute(result);
|
||||
|
||||
|
||||
CombineSubmeshesNode submeshCombiner = new CombineSubmeshesNode();
|
||||
submeshCombiner.Execute(result);
|
||||
|
||||
result.ApplyToMesh(mesh);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user