diff --git a/Assets/Prefabs/TmpFruit.prefab b/Assets/Prefabs/Fruit.prefab similarity index 82% rename from Assets/Prefabs/TmpFruit.prefab rename to Assets/Prefabs/Fruit.prefab index e96ce6f..9958396 100644 --- a/Assets/Prefabs/TmpFruit.prefab +++ b/Assets/Prefabs/Fruit.prefab @@ -84,22 +84,22 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 3605213539719865219} + - component: {fileID: 1754222534141843334} - component: {fileID: 5645363082347469150} m_Layer: 0 - m_Name: TmpFruit + m_Name: Fruit m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &3605213539719865219 -Transform: +--- !u!224 &3605213539719865219 +RectTransform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8732739964968511634} - serializedVersion: 2 m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} m_LocalPosition: {x: 0, y: 0, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} @@ -108,6 +108,26 @@ Transform: - {fileID: 5459288295520796107} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &1754222534141843334 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8732739964968511634} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ed414fdac7005b54db4dc1ec26e16bd6, type: 3} + m_Name: + m_EditorClassIdentifier: + RectTransform: {fileID: 3605213539719865219} + Body2D: {fileID: 5645363082347469150} + AttachedCanvas: {fileID: 0} --- !u!50 &5645363082347469150 Rigidbody2D: serializedVersion: 4 diff --git a/Assets/Prefabs/TmpFruit.prefab.meta b/Assets/Prefabs/Fruit.prefab.meta similarity index 100% rename from Assets/Prefabs/TmpFruit.prefab.meta rename to Assets/Prefabs/Fruit.prefab.meta diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 59a8627..13914c4 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -643,6 +643,7 @@ MonoBehaviour: FruitSpawnParent: {fileID: 1944344878} FruitPrefab: {fileID: 8732739964968511634, guid: 958453a8750b46642babdd2f3a92952e, type: 3} + GameCanvas: {fileID: 1165634413} --- !u!1 &1944344877 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/FruitBehaviour.cs b/Assets/Scripts/FruitBehaviour.cs new file mode 100644 index 0000000..a981dcb --- /dev/null +++ b/Assets/Scripts/FruitBehaviour.cs @@ -0,0 +1,59 @@ +using PashaBibko.Pacore.Attributes; +using UnityEngine; + +public class FruitBehaviour : MonoBehaviour +{ + [Header("References")] + [SerializeField] private RectTransform RectTransform; + [SerializeField] private Rigidbody2D Body2D; + + [Header("Read only")] + [InspectorReadOnly, SerializeField] private Canvas AttachedCanvas; + [InspectorReadOnly, SerializeField] private bool EnteredCanvas; + + public void InitFruitBehaviour(Canvas canvas) + { + AttachedCanvas = canvas; + EnteredCanvas = false; + + Body2D.velocity = Random.insideUnitCircle * 2.5f; + } + + 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; + } + + private void FixedUpdate() + { + bool contained = IsWithinCanvas(RectTransform, AttachedCanvas.GetComponent()); + EnteredCanvas = EnteredCanvas || contained; + + if (!contained && EnteredCanvas) + { + Destroy(gameObject); + } + } +} diff --git a/Assets/Scripts/FruitBehaviour.cs.meta b/Assets/Scripts/FruitBehaviour.cs.meta new file mode 100644 index 0000000..eb57636 --- /dev/null +++ b/Assets/Scripts/FruitBehaviour.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ed414fdac7005b54db4dc1ec26e16bd6 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/FruitSpawner.cs b/Assets/Scripts/FruitSpawner.cs index 045854d..1cab86b 100644 --- a/Assets/Scripts/FruitSpawner.cs +++ b/Assets/Scripts/FruitSpawner.cs @@ -9,16 +9,19 @@ namespace Fruitomation [Header("References")] [SerializeField] private Transform FruitSpawnParent; [SerializeField] private GameObject FruitPrefab; + [SerializeField] private Canvas GameCanvas; [UsedImplicitly, InspectorCallable("Spawn Fruit")] private void SpawnFruit() { GameObject go = Instantiate(FruitPrefab, FruitSpawnParent); - - Rigidbody2D rb = go.GetComponent(); - Debug.Assert(rb != null, "Could not find Rigidbody2D component on FruitSpawner."); + FruitBehaviour behaviour = go.GetComponent(); + Debug.Assert(behaviour != null, "Could not find FruitBehaviour"); - rb.velocity = Random.insideUnitCircle * 2.5f; + behaviour.InitFruitBehaviour + ( + GameCanvas + ); } } }