using Components; using Core; using DG.Tweening; using Sirenix.OdinInspector; using UnityEngine; namespace Systems { public class CannonController : SystemBase, ITick { [SerializeField] private float blastForce = 5; [SerializeField] private float rotationDegree = 35; [SerializeField] private float rotationSpeed = 1; [SerializeField] private Ease rotationEase; [SerializeField] private Transform cannon; [SerializeField] private Transform releasePoint; [SerializeField] private PlayerHolder player; private bool _isLaunched; private Tween _rotTween; protected override void ReleaseReferences() { releasePoint = null; player = null; } public override void StartSystem() { player.BindSettings(); RotateCannon(1); base.StartSystem(); } public void LaunchCannon() { if (_isLaunched) return; _rotTween?.Kill(); player.AddForce(releasePoint.up * blastForce); // player.AddForce((releasePoint.up + Vector3.forward) * blastForce); _isLaunched = true; } private void RotateCannon(int direction) { var rotation = Quaternion.Euler(Vector3.up * (rotationDegree * direction)); _rotTween = cannon.DOLocalRotateQuaternion(rotation, rotationSpeed) .SetEase(rotationEase) .OnComplete(() => RotateCannon(-direction)); } [Button(ButtonSizes.Large)] private void ResetElements() { cannon.localRotation = Quaternion.identity; player.ResetPlayer(); RotateCannon(1); _isLaunched = false; } public void Tick() { if (!IsRun) return; player.PlayerTick(); } } }