// Copyright (c) 2015 - 2023 Doozy Entertainment. All Rights Reserved. // This code can only be used under the standard Unity Asset Store End User License Agreement // A Copy of the EULA APPENDIX 1 is available at http://unity3d.com/company/legal/as_terms using System; using System.Collections.Generic; using Doozy.Runtime.Common.Utils; using Doozy.Runtime.Reactor.Targets; using Doozy.Runtime.Reactor.Ticker; using Doozy.Runtime.UIManager.Animators; using UnityEngine; // ReSharper disable MemberCanBePrivate.Global namespace Doozy.Runtime.UIManager.Visual { /// /// Specialized visual component used to swap a Sprites for a Reactor Sprite Target by listening to a UISelectable (controller) selection state changes. /// [AddComponentMenu("Doozy/UI/Components/Addons/UISelectable SpriteSwapper")] public class UISelectableSpriteSwapper : BaseUISelectableAnimator { #if UNITY_EDITOR [UnityEditor.MenuItem("GameObject/Doozy/UI/Components/Addons/UISelectable SpriteSwapper", false, 8)] private static void CreateComponent(UnityEditor.MenuCommand menuCommand) { GameObjectUtils.AddToScene("UISelectable SpriteSwapper", false, true); } #endif [SerializeField] private ReactorSpriteTarget SpriteTarget; /// Reference to a sprite target component public ReactorSpriteTarget spriteTarget => SpriteTarget; /// Check if a sprite target is referenced or not public bool hasSpriteTarget => SpriteTarget != null; [SerializeField] private Sprite NormalSprite; /// Container Normal Sprite public Sprite normalSprite => NormalSprite; [SerializeField] private Sprite HighlightedSprite; /// Container Highlighted Sprite public Sprite highlightedSprite => HighlightedSprite; [SerializeField] private Sprite PressedSprite; /// Container Pressed Sprite public Sprite pressedSprite => PressedSprite; [SerializeField] private Sprite SelectedSprite; /// Container Selected Sprite public Sprite selectedSprite => SelectedSprite; [SerializeField] private Sprite DisabledSprite; /// Container Disabled Sprite public Sprite disabledSprite => DisabledSprite; #if UNITY_EDITOR protected override void Reset() { FindTarget(); base.Reset(); } #endif public void FindTarget() { if (SpriteTarget != null) return; SpriteTarget = ReactorSpriteTarget.FindTarget(gameObject); UpdateSettings(); } protected override void Awake() { FindTarget(); UpdateSettings(); base.Awake(); } public override void UpdateSettings() {} //ignored public override void StopAllReactions() {} //ignored public override bool IsStateEnabled(UISelectionState state) => true; public override void Play(UISelectionState state) { if (!hasSpriteTarget) return; switch (state) { case UISelectionState.Normal: if (normalSprite != null) SpriteTarget.SetSprite(normalSprite); break; case UISelectionState.Highlighted: if (highlightedSprite != null) SpriteTarget.SetSprite(highlightedSprite); break; case UISelectionState.Pressed: if (pressedSprite != null) SpriteTarget.SetSprite(pressedSprite); break; case UISelectionState.Selected: if (selectedSprite != null) SpriteTarget.SetSprite(selectedSprite); break; case UISelectionState.Disabled: if (disabledSprite != null) SpriteTarget.SetSprite(disabledSprite); break; default: throw new ArgumentOutOfRangeException(nameof(state), state, null); } } public override void ResetToStartValues(bool forced = false) {} //ignored public override List SetHeartbeat() { return null; } //ignored } }