Files
ScienceLab.UniformLinearMotion/Assets/Scripts/Lesson_1/AmyRunScript.cs
2026-04-30 12:04:09 +03:00

108 lines
2.5 KiB
C#

using TMPro;
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class AmyRunScript : MonoBehaviour
{
[Header("Amy Properties")]
public float runSpeed = 10f;
public float runSpeedOnRadiusOffset = 100f;
public float angle = 0f;
public float startAngle = 0f;
public TMP_Text speedText;
private CharacterController characterController;
private Animator animator;
private bool isRunning = false;
[Header("Runline")]
public RunlinePlacer runline;
private void Awake()
{
characterController = GetComponent<CharacterController>();
animator = GetComponent<Animator>();
}
void Start()
{
SetAmyRandomSpeed();
}
void Update()
{
if (!gameObject.activeSelf) return;
if(isRunning) MoveAmyOnTrack();
animator.SetBool("isRunning", isRunning);
}
private void MoveAmyOnTrack()
{
angle += (runSpeed / runSpeedOnRadiusOffset) * Time.deltaTime;
float x = Mathf.Cos(angle) * runline.radiusX;
float z = Mathf.Sin(angle) * runline.radiusZ;
Vector3 targetPos = new Vector3(x, runline.center.y, z);
Vector3 direction = targetPos - transform.position;
characterController.Move(direction);
if (direction != Vector3.zero)
{
transform.rotation = Quaternion.LookRotation(direction);
}
}
public void StartRun()
{
isRunning = true;
}
public void StopRun()
{
isRunning = false;
}
public void SetAngle(float newAngle)
{
angle = newAngle;
MoveAmyOnTrack();
StopRun();
}
public void PlaceOnStartAngle()
{
angle = startAngle;
transform.rotation = new Quaternion(0f, transform.rotation.y, transform.rotation.z, 0f);
SetSpeedText();
MoveAmyOnTrack();
StopRun();
}
[ContextMenu("Set Amy random speed")]
public void SetAmyRandomSpeed()
{
runSpeed = Random.Range(8, 15);
}
private void OnTriggerEnter(Collider collider)
{
if (collider.gameObject.tag == "Endline" && Lesson1Controller.Instance.activeExperiment == 2) ExperimentChooser.Instance.experiment3Button.interactable = true;
}
private void SetSpeedText()
{
if (Lesson1Controller.Instance.activeExperiment != 2)
{
speedText.text = "SPEED: " + runSpeed.ToString();
}
else
{
speedText.text = "";
}
}
}