using Code.Base; using Code.Lab2; using TMPro; using UnityEngine; using UnityEngine.SceneManagement; using UnityEngine.UI; namespace Code.UI { public class Lab2Controller : MonoBehaviour { [SerializeField] private Agent arriveAgent; [SerializeField] private Agent leaveAgent; [SerializeField] private Transform arriveWrapper; [SerializeField] private Transform leaveWrapper; [SerializeField] private Transform arriveTarget; [SerializeField] private Transform leaveTarget; [SerializeField] private Button toMenuButton; [SerializeField] private Button resetButton; [SerializeField] private Button dopButton; private Slider _arriveTargetRadiusSlider; private Slider _arriveSlowRadiusSlider; private Slider _arriveTimeToTargetSlider; private Slider _arriveMaxSpeedSlider; private Slider _arriveMaxAccelerationSlider; private Slider _arriveOrientationSlider; private Slider _leaveEscapeRadiusSlider; private Slider _leaveDangerRadiusSlider; private Slider _leaveTimeToTargetSlider; private Slider _leaveMaxSpeedSlider; private Slider _leaveMaxAccelerationSlider; private Slider _leaveOrientationSlider; private TMP_Text _arriveRotationVelocityText; private TMP_Text _leaveRotationVelocityText; private Transform _targetCircle; private Transform _slowCircle; private Transform _dangerRadius; private Transform _escapeRadius; private Arrive _arriveBehaviour; private Leave _leaveBehaviour; private void Awake() { _arriveTargetRadiusSlider = GetSlider(arriveWrapper, "TargetRadiusSlider"); _arriveSlowRadiusSlider = GetSlider(arriveWrapper, "SlowRadiusSlider"); _arriveTimeToTargetSlider = GetSlider(arriveWrapper, "TimeToTargetSlider"); _arriveMaxSpeedSlider = GetSlider(arriveWrapper, "MaxSpeedSlider"); _arriveMaxAccelerationSlider = GetSlider(arriveWrapper, "MaxAccelerationSlider"); _arriveOrientationSlider = GetSlider(arriveWrapper, "OrientationSlider"); _leaveEscapeRadiusSlider = GetSlider(leaveWrapper, "EscapeRadiusSlider"); _leaveDangerRadiusSlider = GetSlider(leaveWrapper, "DangerRadiusSlider"); _leaveTimeToTargetSlider = GetSlider(leaveWrapper, "TimeToTargetSlider"); _leaveMaxSpeedSlider = GetSlider(leaveWrapper, "MaxSpeedSlider"); _leaveMaxAccelerationSlider = GetSlider(leaveWrapper, "MaxAccelerationSlider"); _leaveOrientationSlider = GetSlider(leaveWrapper, "OrientationSlider"); _arriveRotationVelocityText = GetText(arriveWrapper, "RotationVelocityText"); _leaveRotationVelocityText = GetText(leaveWrapper, "RotationVelocityText"); _targetCircle = arriveTarget?.Find("TargetCircle"); _slowCircle = arriveTarget?.Find("SlowCircle"); _dangerRadius = leaveTarget?.Find("DangerRadius"); _escapeRadius = leaveTarget?.Find("EscapeRadius"); _arriveBehaviour = arriveAgent.GetComponent(); _leaveBehaviour = leaveAgent.GetComponent(); if (_arriveBehaviour == null) Debug.LogWarning("ArriveBehaviour not found on ArriveAgent!"); if (_leaveBehaviour == null) Debug.LogWarning("LeaveBehaviour not found on LeaveAgent!"); if (toMenuButton != null) toMenuButton.onClick.AddListener(LoadMainMenu); if (resetButton != null) resetButton.onClick.AddListener(ResetAgents); if (dopButton != null) dopButton.onClick.AddListener(LoadDop); } private void Start() { UpdateArriveSliders(); UpdateLeaveSliders(); if (_arriveTargetRadiusSlider != null) _arriveTargetRadiusSlider.onValueChanged.AddListener(OnArriveTargetRadiusChanged); if (_arriveSlowRadiusSlider != null) _arriveSlowRadiusSlider.onValueChanged.AddListener(OnArriveSlowRadiusChanged); if (_arriveTimeToTargetSlider != null) _arriveTimeToTargetSlider.onValueChanged.AddListener(OnArriveTimeToTargetChanged); if (_arriveMaxSpeedSlider != null) _arriveMaxSpeedSlider.onValueChanged.AddListener(OnArriveMaxSpeedChanged); if (_arriveMaxAccelerationSlider != null) _arriveMaxAccelerationSlider.onValueChanged.AddListener(OnArriveMaxAccelerationChanged); if (_arriveOrientationSlider != null) _arriveOrientationSlider.onValueChanged.AddListener(OnArriveOrientationChanged); if (_leaveEscapeRadiusSlider != null) _leaveEscapeRadiusSlider.onValueChanged.AddListener(OnLeaveEscapeRadiusChanged); if (_leaveDangerRadiusSlider != null) _leaveDangerRadiusSlider.onValueChanged.AddListener(OnLeaveDangerRadiusChanged); if (_leaveTimeToTargetSlider != null) _leaveTimeToTargetSlider.onValueChanged.AddListener(OnLeaveTimeToTargetChanged); if (_leaveMaxSpeedSlider != null) _leaveMaxSpeedSlider.onValueChanged.AddListener(OnLeaveMaxSpeedChanged); if (_leaveMaxAccelerationSlider != null) _leaveMaxAccelerationSlider.onValueChanged.AddListener(OnLeaveMaxAccelerationChanged); if (_leaveOrientationSlider != null) _leaveOrientationSlider.onValueChanged.AddListener(OnLeaveOrientationChanged); } private void Update() { UpdateArriveSliders(); UpdateLeaveSliders(); } private static Slider GetSlider(Transform parent, string name) => parent?.Find(name)?.GetComponent(); private static TMP_Text GetText(Transform parent, string name) => parent?.Find(name)?.GetComponent(); private void UpdateArriveSliders() { if (_arriveBehaviour == null) return; if (_arriveTargetRadiusSlider != null) _arriveTargetRadiusSlider.value = _arriveBehaviour.targetRadius; if (_arriveSlowRadiusSlider != null) _arriveSlowRadiusSlider.value = _arriveBehaviour.slowRadius; if (_arriveTimeToTargetSlider != null) _arriveTimeToTargetSlider.value = _arriveBehaviour.timeToTarget; if (_arriveMaxSpeedSlider != null) _arriveMaxSpeedSlider.value = arriveAgent.maxSpeed; if (_arriveMaxAccelerationSlider != null) _arriveMaxAccelerationSlider.value = arriveAgent.maxAcceleration; if (_arriveOrientationSlider != null) _arriveOrientationSlider.value = arriveAgent.orientation; if (_targetCircle != null) _targetCircle.localScale = new Vector3(_arriveBehaviour.targetRadius * 2, _arriveBehaviour.targetRadius * 2, 1f); if (_slowCircle != null) _slowCircle.localScale = new Vector3(_arriveBehaviour.slowRadius * 2, _arriveBehaviour.slowRadius * 2, 1f); if (_arriveRotationVelocityText == null) return; var rot = arriveAgent.rotation; var vel = arriveAgent.velocity; _arriveRotationVelocityText.text = $"Rotation: {rot:F2}\nVelocity: X {vel.x:F2} Y {vel.y:F2} Z {vel.z:F2}"; } private void OnArriveTargetRadiusChanged(float value) { if (_arriveBehaviour == null) return; _arriveBehaviour.targetRadius = value; if (_targetCircle != null) _targetCircle.localScale = new Vector3(value, value, value); } private void OnArriveSlowRadiusChanged(float value) { if (_arriveBehaviour == null) return; _arriveBehaviour.slowRadius = value; if (_slowCircle != null) _slowCircle.localScale = new Vector3(value, value, value); } private void OnArriveTimeToTargetChanged(float value) { if (_arriveBehaviour != null) _arriveBehaviour.timeToTarget = value; } private void OnArriveMaxSpeedChanged(float value) { if (arriveAgent != null) arriveAgent.maxSpeed = value; } private void OnArriveMaxAccelerationChanged(float value) { if (arriveAgent != null) arriveAgent.maxAcceleration = value; } private void OnArriveOrientationChanged(float value) { if (arriveAgent != null) arriveAgent.orientation = value % 360f; } private void UpdateLeaveSliders() { if (_leaveBehaviour == null) return; if (_leaveEscapeRadiusSlider != null) _leaveEscapeRadiusSlider.value = _leaveBehaviour.escapeRadius; if (_leaveDangerRadiusSlider != null) _leaveDangerRadiusSlider.value = _leaveBehaviour.dangerRadius; if (_leaveTimeToTargetSlider != null) _leaveTimeToTargetSlider.value = _leaveBehaviour.timeToTarget; if (_leaveMaxSpeedSlider != null) _leaveMaxSpeedSlider.value = leaveAgent.maxSpeed; if (_leaveMaxAccelerationSlider != null) _leaveMaxAccelerationSlider.value = leaveAgent.maxAcceleration; if (_leaveOrientationSlider != null) _leaveOrientationSlider.value = leaveAgent.orientation; if (_dangerRadius != null) _dangerRadius.localScale = new Vector3(_leaveBehaviour.dangerRadius * 2, _leaveBehaviour.dangerRadius * 2, 1f); if (_escapeRadius != null) _escapeRadius.localScale = new Vector3(_leaveBehaviour.escapeRadius * 2, _leaveBehaviour.escapeRadius * 2, 1f); if (_leaveRotationVelocityText == null) return; var rot = leaveAgent.rotation; var vel = leaveAgent.velocity; _leaveRotationVelocityText.text = $"Rotation: {rot:F2}\nVelocity: X {vel.x:F2} Y {vel.y:F2} Z {vel.z:F2}"; } private void OnLeaveEscapeRadiusChanged(float value) { if (_leaveBehaviour == null) return; _leaveBehaviour.escapeRadius = value; if (_escapeRadius != null) _escapeRadius.localScale = new Vector3(value, value, 1f); } private void OnLeaveDangerRadiusChanged(float value) { if (_leaveBehaviour == null) return; _leaveBehaviour.dangerRadius = value; if (_dangerRadius != null) _dangerRadius.localScale = new Vector3(value, value, 1f); } private void OnLeaveTimeToTargetChanged(float value) { if (_leaveBehaviour != null) _leaveBehaviour.timeToTarget = value; } private void OnLeaveMaxSpeedChanged(float value) { if (leaveAgent != null) leaveAgent.maxSpeed = value; } private void OnLeaveMaxAccelerationChanged(float value) { if (leaveAgent != null) leaveAgent.maxAcceleration = value; } private void OnLeaveOrientationChanged(float value) { if (leaveAgent != null) leaveAgent.orientation = value % 360f; } private void ResetAgents() { if (leaveAgent != null && leaveTarget != null) { var pos = leaveAgent.transform.position; pos.x = leaveTarget.position.x; pos.z = leaveTarget.position.z; leaveAgent.transform.position = pos; } if (arriveAgent == null || _arriveBehaviour == null) return; var slowRadius = _arriveBehaviour.slowRadius; arriveAgent.transform.position = new Vector3(-slowRadius, 1f, 0f); } private static void LoadMainMenu() => SceneManager.LoadScene("MainMenu"); private static void LoadDop() => SceneManager.LoadScene("Lab2Dop"); private void OnDestroy() { if (_arriveTargetRadiusSlider != null) _arriveTargetRadiusSlider.onValueChanged.RemoveListener(OnArriveTargetRadiusChanged); if (_arriveSlowRadiusSlider != null) _arriveSlowRadiusSlider.onValueChanged.RemoveListener(OnArriveSlowRadiusChanged); if (_arriveTimeToTargetSlider != null) _arriveTimeToTargetSlider.onValueChanged.RemoveListener(OnArriveTimeToTargetChanged); if (_arriveMaxSpeedSlider != null) _arriveMaxSpeedSlider.onValueChanged.RemoveListener(OnArriveMaxSpeedChanged); if (_arriveMaxAccelerationSlider != null) _arriveMaxAccelerationSlider.onValueChanged.RemoveListener(OnArriveMaxAccelerationChanged); if (_arriveOrientationSlider != null) _arriveOrientationSlider.onValueChanged.RemoveListener(OnArriveOrientationChanged); if (_leaveEscapeRadiusSlider != null) _leaveEscapeRadiusSlider.onValueChanged.RemoveListener(OnLeaveEscapeRadiusChanged); if (_leaveDangerRadiusSlider != null) _leaveDangerRadiusSlider.onValueChanged.RemoveListener(OnLeaveDangerRadiusChanged); if (_leaveTimeToTargetSlider != null) _leaveTimeToTargetSlider.onValueChanged.RemoveListener(OnLeaveTimeToTargetChanged); if (_leaveMaxSpeedSlider != null) _leaveMaxSpeedSlider.onValueChanged.RemoveListener(OnLeaveMaxSpeedChanged); if (_leaveMaxAccelerationSlider != null) _leaveMaxAccelerationSlider.onValueChanged.RemoveListener(OnLeaveMaxAccelerationChanged); if (_leaveOrientationSlider != null) _leaveOrientationSlider.onValueChanged.RemoveListener(OnLeaveOrientationChanged); if (toMenuButton != null) toMenuButton.onClick.RemoveListener(LoadMainMenu); if (resetButton != null) resetButton.onClick.RemoveListener(ResetAgents); if (dopButton != null) resetButton.onClick.RemoveListener(LoadDop); } } }