using System.Collections; using System.Collections.Generic; using UnityEngine; public class BalanceScale : MonoBehaviour { [SerializeField] private Transform[] _leftSlots; [SerializeField] private Transform[] _rightSlots; [SerializeField] private Transform[] _scaleMarks; [SerializeField] private Transform _slider; [SerializeField] private float _animationSpeed = 2f; private Transform[] _leftOccupied; private Transform[] _rightOccupied; private Vector3 _targetSliderPos; private void Awake() { _leftOccupied = new Transform[_leftSlots.Length]; _rightOccupied = new Transform[_rightSlots.Length]; if (_slider != null) _targetSliderPos = _slider.localPosition; } private void Update() { if (_slider == null) return; _slider.localPosition = Vector3.Lerp( _slider.localPosition, _targetSliderPos, Time.deltaTime * _animationSpeed ); } public void PlaceLeft(Transform obj) { Place(obj, _leftSlots, _leftOccupied); } public void PlaceRight(Transform obj) { Place(obj, _rightSlots, _rightOccupied); } private void Place(Transform obj, Transform[] slots, Transform[] occupied) { for (int i = 0; i < occupied.Length; i++) if (occupied[i] == obj) occupied[i] = null; for (int i = 0; i < slots.Length; i++) { if (occupied[i] == null) { occupied[i] = obj; obj.SetParent(null); Collider col = slots[i].GetComponent(); Vector3 targetPos = col != null ? col.bounds.center : slots[i].position; obj.position = targetPos; obj.rotation = slots[i].rotation; UpdateSlider(); return; } } obj.SetParent(null, true); } public void RemoveObject(Transform obj) { for (int i = 0; i < _leftOccupied.Length; i++) if (_leftOccupied[i] == obj) _leftOccupied[i] = null; for (int i = 0; i < _rightOccupied.Length; i++) if (_rightOccupied[i] == obj) _rightOccupied[i] = null; UpdateSlider(); } private float GetMass(Transform[] occupied) { float total = 0f; foreach (var obj in occupied) { if (obj == null) continue; LiquidContainer lc = obj.GetComponent() ?? obj.GetComponentInChildren(); Rigidbody rb = obj.GetComponent(); if (lc != null) total += lc.GetTotalMassKg(); else if (rb != null) total += rb.mass; } return total; } private void UpdateSlider() { if (_scaleMarks == null || _scaleMarks.Length == 0) return; float leftMass = GetMass(_leftOccupied); float rightMass = GetMass(_rightOccupied); float displayMass = Mathf.Max(leftMass, rightMass); int targetIndex = Mathf.Clamp(Mathf.RoundToInt(displayMass), 0, _scaleMarks.Length - 1); _targetSliderPos = _slider.parent != null ? _slider.parent.InverseTransformPoint(_scaleMarks[targetIndex].position) : _scaleMarks[targetIndex].position; } }