using System; using UnityEngine; namespace AibisDream.FixSystem { [RequireComponent(typeof(Collider2D))] public class BottleSlot : MonoBehaviour { public event Action InsertSlotEvent; public event Action RemoveSlotEvent; public CoolingBottleData initBottleData; private CoolingBottle _curBottle; private GameObject _bottlePrefab; private bool _inShelf; private void Start() { InitRefs(); InitBottle(); } private void InitRefs() { var shelf = GetComponentInParent(); // 根据在瓶架上还是机器中确定操作 _inShelf = shelf != null; _bottlePrefab = Resources.Load("Prefabs/Fix/Bottle"); } private void InitBottle() { if (string.IsNullOrEmpty(initBottleData.name)) return; var newBottle = Instantiate(_bottlePrefab, transform).GetComponent(); _curBottle = newBottle; // 加载瓶子数据 newBottle.Load(initBottleData); newBottle.curSnapSlot = this; } /// /// 与瓶子发生碰撞时 /// /// private void OnTriggerEnter2D(Collider2D other) { // 如果当前Slot里已经有瓶子了,就返回 if (_curBottle != null) return; // 尝试获取瓶子 if (other.gameObject.TryGetComponent(out var bottle)) { bottle.targetSnapSlotSet.Add(this); } } /// /// 瓶子离开时 /// /// private void OnTriggerExit2D(Collider2D other) { // 尝试获取瓶子 if (other.gameObject.TryGetComponent(out var bottle)) { bottle.targetSnapSlotSet.Remove(this); } } /// /// 移除当前瓶子 /// public void RemoveBottle() { _curBottle = null; RemoveSlotEvent?.Invoke(); } /// /// 插入时触发 /// /// public void InsertSlot(CoolingBottle coolingBottle) { _curBottle = coolingBottle; _curBottle.transform.parent = transform; // 在架子上才正过来 if (_inShelf) { coolingBottle.Rotate(true); } } public void ChangeSlot(CoolingBottle coolingBottle) { InsertSlotEvent?.Invoke(coolingBottle); } /// /// 是否有冷却液 /// /// 瓶子 public CoolingBottle GetCurBottle() { return _curBottle; } public void DestroyBottle() { if (_curBottle) { _curBottle.transform.parent = null; Destroy(_curBottle.gameObject); _curBottle = null; } } } }