Files
ID/Assets/Code/UI/Lab2Controller.cs
T
2026-02-07 10:54:20 +03:00

276 lines
13 KiB
C#

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<Arrive>();
_leaveBehaviour = leaveAgent.GetComponent<Leave>();
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<Slider>();
private static TMP_Text GetText(Transform parent, string name) =>
parent?.Find(name)?.GetComponent<TMP_Text>();
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);
}
}
}