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(); if (mf == null) { mf = gameObject.AddComponent(); } var mesh = mf.sharedMesh; if (mesh == null) { mesh = new Mesh(); mf.sharedMesh = mesh; } branchStep = TrunkSize.z/(RootBranches + 1); var mTrunk = GenerateTrunk(TrunkSize); List branches = new List(); 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); } }