using DG.Tweening; using UnityEngine; public class Chip : MonoBehaviour { public Team team; [SerializeField] float acceleration = 200f; [SerializeField] float maxFallingRotationSpeed = 500; [SerializeField] private SpriteRenderer spriteRenderer; [SerializeField] private SpriteMask mask; [Header("Победная анимация")] [SerializeField] private Transform winDots; [SerializeField] private float winAnimationDuration = 1; private float chipVelocity = 0; private float rotationSpeed = 0; private Tween winTween; private WinDotsSpriteAnimation _winDotsAnimation; public int WinAnimationFrameCount => _winDotsAnimation.FrameCount; private void Awake() { _winDotsAnimation = winDots.GetComponent(); } public void Configure(Sprite sprite, Team team) { spriteRenderer.sprite = sprite; mask.sprite = sprite; this.team = team; mask.enabled = false; winDots.gameObject.SetActive(false); } public virtual void RemoveFromField() { Destroy(gameObject); } public bool MoveToLinear(Vector2 target, float speed) { transform.position = Vector2.MoveTowards(transform.position, target, speed * Time.deltaTime); if ((Vector2)transform.position == target) return true; return false; } public bool MoveToAccelerated(Vector2 target) { transform.position = Vector2.MoveTowards(transform.position, target, chipVelocity * Time.deltaTime); chipVelocity += acceleration * Time.deltaTime; if ((Vector2)transform.position == target) { acceleration = 0; return true; } return false; } public void SetRandomRotationSpeed() => rotationSpeed = Random.Range(-maxFallingRotationSpeed, maxFallingRotationSpeed); public void Rotate() => transform.Rotate(Vector3.forward * rotationSpeed * Time.deltaTime); public void WinAnimation() { if(winTween != null) { winTween.Kill(); winTween = null; } mask.enabled = true; winDots.localPosition = Vector3.zero; winDots.localScale = Vector3.one; winDots.gameObject.SetActive(true); winTween = DOVirtual.DelayedCall(winAnimationDuration, () => { mask.enabled = false; winDots.gameObject.SetActive(false); }, false); winTween.PlayForward(); } public void SetWinAnimationFrame(int frameIndex) { _winDotsAnimation.SetFrame(frameIndex); } }