iso2/env/SpikeField.cs
public class SpikeField : Component {
[Property] public Vector2 Bounds {get; set;}
[Property] public int Density {get; set;} = 15;
public List<Model> Models {get; set;} = new() {
Model.Load("models/props/wasteland/spike_01.vmdl"),
Model.Load("models/props/wasteland/spike_02.vmdl"),
Model.Load("models/props/wasteland/spike_03.vmdl"),
Model.Load("models/props/wasteland/spike_04.vmdl"),
Model.Load("models/props/wasteland/spike_05.vmdl"),
};
[Property, RequireComponent, ReadOnly] public BoxCollider Collider {get; set;}
[Button] public void Generate() {
foreach (var child in GameObject.Children)
child.Destroy();
var bounds = new Rect(-Bounds * 0.5f, Bounds);
for (var x = bounds.Left.FloorToInt(); x < bounds.Right.FloorToInt() + 1; x += Density) {
for (var y = bounds.Top.FloorToInt(); y < bounds.Bottom.FloorToInt() + 1; y += Density) {
var ob = Scene.CreateObject();
ob.Name = "generated_spike";
ob.SetParent(GameObject, false);
ob.LocalPosition = new Vector3(x, y, WorldPosition.z) + Vector3.Random.WithZ(0f) * Density * 0.5f;
ob.LocalRotation = Rotation.Random * 0.2f;
ob.LocalScale = Random.Shared.Float(0.5f, 1.1f);
ob.Components.Create<ModelRenderer>().Model = Random.Shared.FromList(Models);
}
}
}
protected override void DrawGizmos() {
Collider.Static = true;
Collider.Scale = new Vector3(Bounds.x + Density * 0.5f, Bounds.y + Density * 0.5f, 32);
Collider.Center = new Vector3(-Density).WithZ(0f) * 0.5f;
base.DrawGizmos();
}
}