using System; using System.Collections; using System.Collections.Generic; using MoreMountains.Feedbacks; using MoreMountains.Tools; using UnityEngine; namespace MoreMountains.Feel { /// /// A class used to handle Feel's Snake demo's snake bodyparts /// [AddComponentMenu("")] public class SnakeBodyPart : MonoBehaviour { /// a position recorder this body part will look at to know where to go to public MMPositionRecorder TargetRecorder; /// a feedback to play when food gets eaten public MMFeedbacks EatFeedback; /// a feedback to play when this part appears public MMFeedbacks NewFeedback; public int Offset = 20; public int Index = 0; protected Snake _snake; protected BoxCollider2D _collider2D; /// /// On awake we store our collider and enable it after a delay /// protected virtual void Awake() { _collider2D = this.gameObject.MMGetComponentNoAlloc(); StartCoroutine(ActivateCollider()); } /// /// Activates this part's collider /// /// protected virtual IEnumerator ActivateCollider() { yield return MMCoroutine.WaitFor(1f); _collider2D.enabled = true; } /// /// On update, we move to the recorded position of our predecessor /// protected void Update() { this.transform.position = TargetRecorder.Positions[Offset]; } /// /// Called when the snake eats a new food /// /// public virtual void Eat(float intensity) { EatFeedback?.PlayFeedbacks(this.transform.position, intensity); } /// /// Called when instantiating a new body part /// public virtual void New() { NewFeedback?.Initialization(); NewFeedback?.PlayFeedbacks(); } /// /// If we connect with the snake's head, we lose a part /// /// protected void OnTriggerEnter2D(Collider2D other) { if (Index == 0) { return; } _snake = other.GetComponent(); if (_snake != null) { _snake.Lose(this); } } } }