using Fruitomation.Global; using UnityEngine; namespace Fruitomation.Game.Items { public class ItemBehaviour : MonoBehaviour { protected RectTransform RectTransform { get; private set; } protected Rigidbody2D Body2D { get; private set; } protected Canvas AttachedCanvas { get; private set; } protected bool EnteredCanvas { get; private set; } private GameObject CurrentChild; private ItemType InternalItemType; public ItemType CurrentType { get => InternalItemType; set { InternalItemType = value; OnUpdateItemType(); } } protected virtual void OnInitialized() { } public void InitBehaviour(Canvas canvas, ItemType startType) { RectTransform = transform.GetComponent(); Body2D = transform.GetComponent(); AttachedCanvas = canvas; CurrentType = startType; EnteredCanvas = false; OnInitialized(); } private void OnUpdateItemType() { if (CurrentChild is not null) { Destroy(CurrentChild); } ItemInfo info = ItemInfoRegistry.Get(CurrentType); CurrentChild = Instantiate(info.Prefab, transform); } protected void Update() { if (!GameStateController.Is(GameState.Simulation)) { TriggerDestruction(false); } } private void FixedUpdate() { bool contained = IsWithinCanvas(RectTransform, AttachedCanvas.GetComponent()); EnteredCanvas = EnteredCanvas || contained; if (!contained && EnteredCanvas) { TriggerDestruction(); } } private static bool IsWithinCanvas(RectTransform element, RectTransform canvas) { Vector3[] elementCorners = new Vector3[4]; Vector3[] canvasCorners = new Vector3[4]; element.GetWorldCorners(elementCorners); canvas.GetWorldCorners(canvasCorners); Rect bounds = new ( canvasCorners[0].x, canvasCorners[0].y, canvasCorners[2].x - canvasCorners[0].x, canvasCorners[2].y - canvasCorners[0].y ); foreach (Vector3 corner in elementCorners) { if (bounds.Contains(corner)) { return true; } } return false; } public void TriggerDestruction(bool harvest = true) { if (harvest) { ItemInfo info = ItemInfoRegistry.Get(CurrentType); float money = Random.Range(info.MinMoney, info.MaxMoney); MoneyController.Add(money); } Destroy(gameObject); } } }