using System.Collections; using System.Collections.Generic; using UnityEngine; public class ScaleController : MonoBehaviour { [SerializeField] private Transform _pointer; [SerializeField] private float _maxAngle = 1920f; [SerializeField] private float _maxWeight = 15f; [SerializeField] private float _rotationSpeed = 2f; [SerializeField] private ObjectInfoDisplay _display; private float _currentWeight = 0f; private float _targetAngle = 0f; private float _initialLocalZ; private void Start() { if (_pointer != null) _initialLocalZ = _pointer.localEulerAngles.z; } private void OnTriggerEnter(Collider other) { if (other.CompareTag("Target")) { Rigidbody rb = other.GetComponent(); if (rb != null) { _currentWeight += rb.mass; _targetAngle = (_currentWeight / _maxWeight) * _maxAngle; ObjectName objName = other.GetComponent(); string displayName = objName != null ? objName.ukrainianName : other.gameObject.name; if (_display != null) _display.ShowInfo(displayName, rb.mass); GameData.AddWeighed(displayName, rb.mass); } } } private void OnTriggerExit(Collider other) { if (other.CompareTag("Target")) { Rigidbody rb = other.GetComponent(); if (rb != null) { _currentWeight -= rb.mass; _currentWeight = Mathf.Max(0f, _currentWeight); _targetAngle = (_currentWeight / _maxWeight) * _maxAngle; } } } private void Update() { if (_currentWeight > 0 && !IsAnythingInTrigger()) { _currentWeight = 0f; _targetAngle = 0f; } if (_pointer != null) { float targetZ = _initialLocalZ + _targetAngle; float currentZ = _pointer.localEulerAngles.z; float diff = targetZ - currentZ; if (Mathf.Abs(diff) <= 180f) diff = Mathf.DeltaAngle(currentZ, targetZ); float step = diff * Time.deltaTime * _rotationSpeed; _pointer.RotateAround(GetPointerCenter(), _pointer.forward, step); } } private bool IsAnythingInTrigger() { Collider triggerCollider = GetComponent(); if (triggerCollider == null) return false; Collider[] hits = Physics.OverlapBox( triggerCollider.bounds.center, triggerCollider.bounds.extents ); foreach (Collider hit in hits) { if (hit.CompareTag("Target")) return true; } return false; } private Vector3 GetPointerCenter() { MeshFilter mf = _pointer.GetComponent(); if (mf != null) return _pointer.TransformPoint(mf.mesh.bounds.center); return _pointer.position; } }