Files

90 lines
2.5 KiB
C#
Raw Permalink Normal View History

2025-05-13 05:25:23 +03:00
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);
}
}