using System.Collections.Generic; using UnityEngine; using Vanguard.Battle; namespace Vanguard.Board3D { /// /// Единое управление красной attack-стрелкой и синими boost-стрелками. /// Геометрия/анимация общая, различие — цвет и толщина. /// public sealed class ArrowDirector { private readonly Transform _parent; private AnimationConfig _animation; private ArrowConfig _config; private AttackArrowView _attack; private readonly List _boosts = new List(); public ArrowDirector( Transform parent, AnimationConfig animation, ArrowConfig config) { _parent = parent; _animation = animation; _config = config != null ? config : ArrowConfig.Default; } public bool AttackVisible => _attack != null && _attack.IsVisible; public void SetConfig(AnimationConfig animation, ArrowConfig config) { _animation = animation; _config = config != null ? config : ArrowConfig.Default; if (_attack != null) { _attack.SetConfig(_animation); _attack.SetStyle( _config.attackColor, _config.thickness, _animation != null ? _animation.growDuration : _config.growDuration, _config.fadeDuration, _config.arcHeight); } } public void SetAttack(Vector3 from, Vector3 to) { EnsureAttack(); _attack.Show(from, to); _attack.SetPoints(from, to); } public void HideAttack() { _attack?.Hide(); } public void SetBoosts(IReadOnlyList<(Vector3 From, Vector3 To)> boosts) { for (var i = 0; i < boosts.Count; i++) { var arrow = i < _boosts.Count ? _boosts[i] : null; if (arrow == null) { arrow = new AttackArrowView(); arrow.Build(_parent, _animation); _boosts.Add(arrow); } arrow.SetStyle( _config.boostColor, _config.boostThickness, _animation != null ? _animation.boostGrowDuration : _config.growDuration, _config.fadeDuration, _config.arcHeight); arrow.Show(boosts[i].From, boosts[i].To); } for (var i = boosts.Count; i < _boosts.Count; i++) _boosts[i].Hide(); } public void HideAll() { _attack?.Hide(); foreach (var arrow in _boosts) arrow.Hide(); } public void HideImmediate() { _attack?.HideImmediate(); foreach (var arrow in _boosts) arrow.HideImmediate(); } public void Tick(float deltaTime) { _attack?.Tick(deltaTime); foreach (var arrow in _boosts) arrow?.Tick(deltaTime); } public void Dispose() { _attack?.Dispose(); _attack = null; foreach (var arrow in _boosts) arrow?.Dispose(); _boosts.Clear(); } private void EnsureAttack() { if (_attack != null) return; _attack = new AttackArrowView(); _attack.Build(_parent, _animation); _attack.SetStyle( _config.attackColor, _config.thickness, _animation != null ? _animation.growDuration : _config.growDuration, _config.fadeDuration, _config.arcHeight); } } }