using Code.Base; using Code.Lab1; using TMPro; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; namespace Code.UI { public class Lab1Controller : MonoBehaviour { [SerializeField] private Agent pursueAgent; [SerializeField] private Agent evadeAgent; [SerializeField] private Transform pursueWrapper; [SerializeField] private Transform evadeWrapper; [SerializeField] private Button exitButton; private Slider _pursueMaxPredictionSlider; private Slider _pursueMaxSpeedSlider; private Slider _pursueMaxAccelerationSlider; private Slider _pursueOrientationSlider; private Slider _evadeMaxPredictionSlider; private Slider _evadeMaxSpeedSlider; private Slider _evadeMaxAccelerationSlider; private Slider _evadeOrientationSlider; private TMP_Text _pursueRotationVelocityText; private TMP_Text _evadeRotationVelocityText; private Pursue _pursueBehaviour; private Evade _evadeBehaviour; private void Awake() { _pursueMaxPredictionSlider = GetSlider(pursueWrapper, "MaxPredictionSlider"); _pursueMaxSpeedSlider = GetSlider(pursueWrapper, "MaxSpeedSlider"); _pursueMaxAccelerationSlider = GetSlider(pursueWrapper, "MaxAccelerationSlider"); _pursueOrientationSlider = GetSlider(pursueWrapper, "OrientationSlider"); _evadeMaxPredictionSlider = GetSlider(evadeWrapper, "MaxPredictionSlider"); _evadeMaxSpeedSlider = GetSlider(evadeWrapper, "MaxSpeedSlider"); _evadeMaxAccelerationSlider = GetSlider(evadeWrapper, "MaxAccelerationSlider"); _evadeOrientationSlider = GetSlider(evadeWrapper, "OrientationSlider"); _pursueRotationVelocityText = GetText(pursueWrapper, "RotationVelocityText"); _evadeRotationVelocityText = GetText(evadeWrapper, "RotationVelocityText"); _pursueBehaviour = pursueAgent.GetComponent(); _evadeBehaviour = evadeAgent.GetComponent(); if (_pursueBehaviour == null) Debug.LogWarning("PursueBehaviour not found on PursueAgent!"); if (_evadeBehaviour == null) Debug.LogWarning("EvadeBehaviour not found on EvadeAgent!"); if (exitButton != null) exitButton.onClick.AddListener(LoadMainMenu); } private void Start() { UpdatePursueSliders(); UpdateEvadeSliders(); if (_pursueMaxPredictionSlider != null) _pursueMaxPredictionSlider.onValueChanged.AddListener(OnPursueMaxPredictionChanged); if (_pursueMaxSpeedSlider != null) _pursueMaxSpeedSlider.onValueChanged.AddListener(OnPursueMaxSpeedChanged); if (_pursueMaxAccelerationSlider != null) _pursueMaxAccelerationSlider.onValueChanged.AddListener(OnPursueMaxAccelerationChanged); if (_pursueOrientationSlider != null) _pursueOrientationSlider.onValueChanged.AddListener(OnPursueOrientationChanged); if (_evadeMaxPredictionSlider != null) _evadeMaxPredictionSlider.onValueChanged.AddListener(OnEvadeMaxPredictionChanged); if (_evadeMaxSpeedSlider != null) _evadeMaxSpeedSlider.onValueChanged.AddListener(OnEvadeMaxSpeedChanged); if (_evadeMaxAccelerationSlider != null) _evadeMaxAccelerationSlider.onValueChanged.AddListener(OnEvadeMaxAccelerationChanged); if (_evadeOrientationSlider != null) _evadeOrientationSlider.onValueChanged.AddListener(OnEvadeOrientationChanged); } private void Update() { UpdatePursueSliders(); UpdateEvadeSliders(); } private static Slider GetSlider(Transform parent, string sliderName) { var sliderObj = parent.Find(sliderName); return sliderObj != null ? sliderObj.GetComponent() : null; } private static TMP_Text GetText(Transform parent, string textName) { var textObj = parent.Find(textName); return textObj != null ? textObj.GetComponent() : null; } private void UpdatePursueSliders() { if (_pursueBehaviour == null) return; if (_pursueMaxPredictionSlider != null) _pursueMaxPredictionSlider.value = _pursueBehaviour.maxPrediction; if (_pursueMaxSpeedSlider != null) _pursueMaxSpeedSlider.value = pursueAgent.maxSpeed; if (_pursueMaxAccelerationSlider != null) _pursueMaxAccelerationSlider.value = pursueAgent.maxAcceleration; if (_pursueOrientationSlider != null) _pursueOrientationSlider.value = pursueAgent.orientation; if (_pursueRotationVelocityText == null) return; var rotation = pursueAgent.rotation; var velocity = pursueAgent.velocity; _pursueRotationVelocityText.text = $"Rotation: {rotation:F2}\nVelocity: X {velocity.x:F2} Y {velocity.y:F2} Z {velocity.z:F2}"; } private void OnPursueMaxPredictionChanged(float value) { if (_pursueBehaviour != null) _pursueBehaviour.maxPrediction = value; } private void OnPursueMaxSpeedChanged(float value) { if (pursueAgent != null) pursueAgent.maxSpeed = value; } private void OnPursueMaxAccelerationChanged(float value) { if (pursueAgent != null) pursueAgent.maxAcceleration = value; } private void OnPursueOrientationChanged(float value) { if (pursueAgent != null) pursueAgent.orientation = value % 360f; } private void UpdateEvadeSliders() { if (_evadeBehaviour == null) return; if (_evadeMaxPredictionSlider != null) _evadeMaxPredictionSlider.value = _evadeBehaviour.maxPrediction; if (_evadeMaxSpeedSlider != null) _evadeMaxSpeedSlider.value = evadeAgent.maxSpeed; if (_evadeMaxAccelerationSlider != null) _evadeMaxAccelerationSlider.value = evadeAgent.maxAcceleration; if (_evadeOrientationSlider != null) _evadeOrientationSlider.value = evadeAgent.orientation; if (_evadeRotationVelocityText == null) return; var rotation = evadeAgent.rotation; var velocity = evadeAgent.velocity; _evadeRotationVelocityText.text = $"Rotation: {rotation:F2}\nVelocity: X {velocity.x:F2} Y {velocity.y:F2} Z {velocity.z:F2}"; } private void OnEvadeMaxPredictionChanged(float value) { if (_evadeBehaviour != null) _evadeBehaviour.maxPrediction = value; } private void OnEvadeMaxSpeedChanged(float value) { if (evadeAgent != null) evadeAgent.maxSpeed = value; } private void OnEvadeMaxAccelerationChanged(float value) { if (evadeAgent != null) evadeAgent.maxAcceleration = value; } private void OnEvadeOrientationChanged(float value) { if (evadeAgent != null) evadeAgent.orientation = value % 360f; } private static void LoadMainMenu() { SceneManager.LoadScene("MainMenu"); } private void OnDestroy() { if (_pursueMaxPredictionSlider != null) _pursueMaxPredictionSlider.onValueChanged.RemoveListener(OnPursueMaxPredictionChanged); if (_pursueMaxSpeedSlider != null) _pursueMaxSpeedSlider.onValueChanged.RemoveListener(OnPursueMaxSpeedChanged); if (_pursueMaxAccelerationSlider != null) _pursueMaxAccelerationSlider.onValueChanged.RemoveListener(OnPursueMaxAccelerationChanged); if (_pursueOrientationSlider != null) _pursueOrientationSlider.onValueChanged.RemoveListener(OnPursueOrientationChanged); if (_evadeMaxPredictionSlider != null) _evadeMaxPredictionSlider.onValueChanged.RemoveListener(OnEvadeMaxPredictionChanged); if (_evadeMaxSpeedSlider != null) _evadeMaxSpeedSlider.onValueChanged.RemoveListener(OnEvadeMaxSpeedChanged); if (_evadeMaxAccelerationSlider != null) _evadeMaxAccelerationSlider.onValueChanged.RemoveListener(OnEvadeMaxAccelerationChanged); if (_evadeOrientationSlider != null) _evadeOrientationSlider.onValueChanged.RemoveListener(OnEvadeOrientationChanged); if (exitButton != null) exitButton.onClick.RemoveListener(LoadMainMenu); } } }