// 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 Doozy.Runtime.Common.Utils; using Doozy.Runtime.Reactor.Targets; using Doozy.Runtime.Signals; using UnityEngine; // ReSharper disable MemberCanBePrivate.Global namespace Doozy.Runtime.UIManager.Visual { /// /// Connects to a specific stream and reacts to signals, sent through said stream, that have a Sprite value payload. /// The signal's Sprite value will be assigned to the target SpriteTarget. /// [AddComponentMenu("Doozy/Signals/Signal To SpriteTarget")] public class SignalToSpriteTarget : BaseStreamListener { #if UNITY_EDITOR [UnityEditor.MenuItem("GameObject/Doozy/Signals/Signal To SpriteTarget", false, 8)] private static void CreateComponent(UnityEditor.MenuCommand menuCommand) { GameObjectUtils.AddToScene("Signal To SpriteTarget", false, true); } #endif [SerializeField] private StreamId StreamId; /// Stream Id public StreamId streamId => StreamId; [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; public SignalStream stream { get; private set; } #if UNITY_EDITOR private void Reset() { FindTarget(); } #endif public void FindTarget() { if (SpriteTarget != null) return; SpriteTarget = ReactorSpriteTarget.FindTarget(gameObject); } private void Awake() { FindTarget(); } private void OnEnable() => ConnectReceiver(); private void OnDisable() => DisconnectReceiver(); protected override void ConnectReceiver() => stream = SignalStream.Get(streamId.Category, streamId.Name).ConnectReceiver(receiver); protected override void DisconnectReceiver() => stream.DisconnectReceiver(receiver); protected override void ProcessSignal(Signal signal) { if (!hasSpriteTarget) return; if (signal == null) return; if (!signal.hasValue) return; if (signal.valueType != typeof(Sprite)) return; SetSprite(signal.GetValueUnsafe()); } public void SetSprite(Sprite sprite) { if (SpriteTarget != null) SpriteTarget.SetSprite(sprite); } } }