Files
ScienceLab.WeightAndMass/Assets/Scripts/ScaleTest/MainScaleZone.cs
2026-04-07 03:14:32 +03:00

113 lines
3.5 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class MainScaleZone : MonoBehaviour
{
[SerializeField] private GameObject _mainScaleObject;
[SerializeField] private Collider _mainScaleTrigger;
[SerializeField] private TextMeshProUGUI _resultText;
[SerializeField] private float _showResultTime = 2f;
private bool _isChecking = false;
private bool _canCheck = false;
private void Start()
{
_mainScaleObject.SetActive(false);
_resultText.gameObject.SetActive(false);
SetTag(false);
}
private void Update()
{
if (Input.GetMouseButtonDown(1))
{
if (_mainScaleObject.activeSelf)
{
_mainScaleObject.SetActive(false);
SetTag(false);
SetPriorityForAllBalls(null);
_canCheck = false;
}
else
{
_mainScaleObject.SetActive(true);
SetTag(true);
SetPriorityForAllBalls(_mainScaleTrigger.transform);
_canCheck = false;
StartCoroutine(EnableCheckDelay());
}
}
if (!_mainScaleObject.activeSelf || _isChecking || !_canCheck) return;
Collider[] cols = Physics.OverlapSphere(
_mainScaleTrigger.bounds.center,
_mainScaleTrigger.bounds.extents.magnitude
);
foreach (var col in cols)
{
DraggableObject ball = col.GetComponent<DraggableObject>();
if (ball == null) continue;
if (ball.isDragging) continue;
Rigidbody rb = col.GetComponent<Rigidbody>();
if (rb != null && rb.velocity.magnitude > 0.1f) continue;
_isChecking = true;
SetTag(false);
if (ball.isHeavy)
StartCoroutine(ShowResultAndRestart("³ðíî!"));
else
StartCoroutine(ShowResultAndContinue("Ñïðîáóé ùå"));
break;
}
}
private void SetPriorityForAllBalls(Transform target)
{
DraggableObject[] balls = FindObjectsOfType<DraggableObject>();
foreach (var ball in balls)
ball.priorityTarget = target;
}
private IEnumerator EnableCheckDelay()
{
yield return new WaitForSeconds(2f);
_canCheck = true;
}
private IEnumerator ShowResultAndRestart(string text)
{
NewScaleZone scaleZone = FindObjectOfType<NewScaleZone>();
scaleZone?.ShowSuccess();
_resultText.text = text;
_resultText.gameObject.SetActive(true);
yield return new WaitForSeconds(_showResultTime);
_mainScaleObject.SetActive(false);
_resultText.gameObject.SetActive(false);
SetPriorityForAllBalls(null);
FindObjectOfType<WeighingManager>()?.FullRestart();
scaleZone?.RestartAttempts();
_isChecking = false;
}
private IEnumerator ShowResultAndContinue(string text)
{
_resultText.text = text;
_resultText.gameObject.SetActive(true);
yield return new WaitForSeconds(_showResultTime);
_mainScaleObject.SetActive(false);
_resultText.gameObject.SetActive(false);
SetPriorityForAllBalls(null);
FindObjectOfType<WeighingManager>()?.ResetAllBalls();
FindObjectOfType<NewScaleZone>()?.RegisterAttempt();
_isChecking = false;
}
private void SetTag(bool active)
{
if (_mainScaleTrigger != null)
_mainScaleTrigger.gameObject.tag = active ? "MainScale" : "Untagged";
}
}