lab2
This commit is contained in:
1 parent
e2c87a9ec8
commit
8151450cdc
12 files changed
+9769
No files matched your search
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 030a0473af3b411db8cf3a5eecfa4f00
|
||||
timeCreated: 1770375687
|
||||
@@ -0,0 +1,39 @@
|
||||
using Code.Base;
|
||||
|
||||
namespace Code.Lab2
|
||||
{
|
||||
public class Arrive : AgentBehaviour
|
||||
{
|
||||
public float targetRadius;
|
||||
public float slowRadius;
|
||||
public float timeToTarget = 0.1f;
|
||||
|
||||
public override Steering GetSteering()
|
||||
{
|
||||
var steering = new Steering();
|
||||
var direction = target.transform.position - transform.position;
|
||||
var distance = direction.magnitude;
|
||||
float targetSpeed;
|
||||
|
||||
if (distance < targetRadius)
|
||||
return steering;
|
||||
if (distance > slowRadius)
|
||||
targetSpeed = Agent.maxSpeed;
|
||||
else
|
||||
targetSpeed = Agent.maxSpeed * distance / slowRadius;
|
||||
|
||||
var desiredVelocity = direction;
|
||||
desiredVelocity.Normalize();
|
||||
desiredVelocity *= targetSpeed;
|
||||
steering.Linear = desiredVelocity - Agent.velocity;
|
||||
steering.Linear /= timeToTarget;
|
||||
|
||||
if (!(steering.Linear.magnitude > Agent.maxAcceleration)) return steering;
|
||||
|
||||
steering.Linear.Normalize();
|
||||
steering.Linear *= Agent.maxAcceleration;
|
||||
|
||||
return steering;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a971b0661663493c886aaf7cb1b7c1a1
|
||||
timeCreated: 1770375702
|
||||
@@ -0,0 +1,42 @@
|
||||
using Code.Base;
|
||||
|
||||
namespace Code.Lab2
|
||||
{
|
||||
public class Leave : AgentBehaviour
|
||||
{
|
||||
public float escapeRadius;
|
||||
public float dangerRadius;
|
||||
public float timeToTarget = 0.1f;
|
||||
|
||||
public override Steering GetSteering()
|
||||
{
|
||||
var steering = new Steering();
|
||||
var direction = transform.position - target.transform.position;
|
||||
var distance = direction.magnitude;
|
||||
|
||||
if (distance > dangerRadius) return steering;
|
||||
|
||||
float reduce;
|
||||
|
||||
if (distance < escapeRadius)
|
||||
reduce = 0f;
|
||||
else
|
||||
reduce = distance / dangerRadius * Agent.maxSpeed;
|
||||
|
||||
var targetSpeed = Agent.maxSpeed - reduce;
|
||||
|
||||
var desiredVelocity = direction;
|
||||
desiredVelocity.Normalize();
|
||||
desiredVelocity *= targetSpeed;
|
||||
steering.Linear = desiredVelocity - Agent.velocity;
|
||||
steering.Linear /= timeToTarget;
|
||||
|
||||
if (!(steering.Linear.magnitude > Agent.maxAcceleration)) return steering;
|
||||
|
||||
steering.Linear.Normalize();
|
||||
steering.Linear *= Agent.maxAcceleration;
|
||||
|
||||
return steering;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 99c7dd3de75b4888b84e02afda7dcb8d
|
||||
timeCreated: 1770375985
|
||||
@@ -0,0 +1,271 @@
|
||||
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;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 341aa60b8bff45888899f4cbc8cd60bd
|
||||
timeCreated: 1770379327
|
||||
Reference in new issue
Block a user