276 lines
13 KiB
C#
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);
|
|
}
|
|
}
|
|
} |