90 lines
2.5 KiB
C#
90 lines
2.5 KiB
C#
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);
|
||
|
|
}
|
||
|
|
}
|