diff --git a/Boids/Assets/Scripts/AdjustmentsHandler.cs b/Boids/Assets/Scripts/AdjustmentsHandler.cs new file mode 100644 index 0000000..956eb7d --- /dev/null +++ b/Boids/Assets/Scripts/AdjustmentsHandler.cs @@ -0,0 +1,81 @@ +using System; +using UnityEngine; +using UnityEngine.UI; + +/// +/// A MonoBehaviour script dedicated to handling changes upon the Adjustments Panel. +/// This MonoBehaviour communicates with a BoidController in order add or remove boids, +/// control biases, enable or disable rules, and interact with many small GUI elements to allow complex User control. +/// +public class AdjustmentsHandler : MonoBehaviour { + public BoidController controller; + + // Bias Sliders + public Slider separationSlider; + public Slider alignmentSlider; + public Slider cohesionSlider; + public Slider boundarySlider; + public Slider boidCountSlider; + + // Rule Toggles + private Toggle _separationToggle; + private Toggle _alignmentToggle; + private Toggle _cohesionToggle; + private Toggle _boundaryToggle; + + /// + /// Used to specify which elements within the UI should be updated + /// + private enum SliderType { + Separation, + Alignment, + Cohesion, + Boundary, + BoidCount + } + + private void Start() { + // Setup Sliders to Boid Controller's defaults + separationSlider.value = controller.separationBias; + alignmentSlider.value = controller.alignmentBias; + cohesionSlider.value = controller.cohesionBias; + boundarySlider.value = controller.boundaryBias; + boidCountSlider.value = controller.boidCount; + + // Register Slider Callbacks + separationSlider.onValueChanged.AddListener(_ => UpdateUI(SliderType.Separation)); + alignmentSlider.onValueChanged.AddListener(_ => UpdateUI(SliderType.Alignment)); + cohesionSlider.onValueChanged.AddListener(_ => UpdateUI(SliderType.Cohesion)); + boundarySlider.onValueChanged.AddListener(_ => UpdateUI(SliderType.Boundary)); + boidCountSlider.onValueChanged.AddListener(_ => UpdateUI(SliderType.BoidCount)); + } + + private void UpdateUI(SliderType update) { + switch (update) { + case SliderType.Separation: + controller.separationBias = separationSlider.value; + break; + case SliderType.Alignment: + controller.alignmentBias = alignmentSlider.value; + break; + case SliderType.Cohesion: + controller.cohesionBias = cohesionSlider.value; + break; + case SliderType.Boundary: + controller.boundaryBias = boundarySlider.value; + break; + case SliderType.BoidCount: + controller.boidCount = (int) boidCountSlider.value; + // Calculate diff, formally add/remove boids + int diff = controller.boidCount - controller.boids.Count; + if(diff > 0) + controller.AddBoids(diff); + else if(diff < 0) + controller.RemoveBoids(diff * -1); + + break; + default: + throw new ArgumentOutOfRangeException(nameof(update), update, null); + } + } +} \ No newline at end of file diff --git a/Boids/Assets/Scripts/AdjustmentsHandler.cs.meta b/Boids/Assets/Scripts/AdjustmentsHandler.cs.meta new file mode 100644 index 0000000..c8e2449 --- /dev/null +++ b/Boids/Assets/Scripts/AdjustmentsHandler.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1ae1d63935ed0dc46a7e2bef02c6810d +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: