using FlappyBird.Pipes; using UnityEngine; using Zenject; using FlappyBird.Ground; namespace FlappyBird.Bird { /// /// MonoBehaviour facade for the Bird prefab. /// Responsibilities (AI_RULES.md rule #1): /// - Holds component references /// - Forwards Unity lifecycle events to BirdController /// - Detects input in Update only ? all logic lives in BirdController /// [RequireComponent(typeof(Rigidbody2D))] public class BirdView : MonoBehaviour { public Rigidbody2D Rigidbody { get; private set; } private IBirdController _controller; [Inject] public void Construct(IBirdController controller) { _controller = controller; } private void Awake() { Rigidbody = GetComponent(); } private void Start() { _controller.Bind(this); } /// /// Input detection only ? no logic. /// Delegates to IBirdController on tap/click/space. /// private void Update() { if (_controller == null) { return; } if (Input.GetMouseButtonDown(0) || Input.GetKeyDown(KeyCode.Space)) { _controller.Jump(); } } /// /// Physics-tick delegation ? no input here. /// private void FixedUpdate() { if (_controller == null) { return; } _controller.FixedTick(); } private void OnCollisionEnter2D(Collision2D collision) { if (_controller == null || collision == null) { return; } if (!IsPipeCollision(collision.collider) && !IsGroundCollision(collision.collider)) { return; } _controller.HandleCollision(); } private void OnTriggerEnter2D(Collider2D other) { if (_controller == null || other == null || !IsGroundCollision(other)) { return; } _controller.HandleCollision(); } private static bool IsPipeCollision(Collider2D collider) { return collider.GetComponentInParent() != null; } private static bool IsGroundCollision(Collider2D collider) { return collider.GetComponentInParent() != null; } } }