using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; [RequireComponent(typeof(FactWrapper))] public class FactFavorisation : MonoBehaviour, IPointerClickHandler { #region InspectorVariables [Header("Prefabs")] [SerializeField] private GameObject favoriteDisplayPrefab; #endregion InspectorVariables #region Static Variables private static readonly UnityEvent<Fact, bool> ChangeFavoriteEvent = new(); private static readonly List<Fact> favorites = new(); #endregion Static Variables #region Variables private GameObject favoriteDisplay; private Fact fact; #endregion Variables #region Properties private bool isFavorite = false; public bool IsFavorite { get { return isFavorite; } set { ChangeFavoriteEvent.Invoke(fact, value); } } #endregion Properties #region UnityMethods public void OnPointerClick(PointerEventData eventData) { // TODO: add support for other input systems if (eventData.button == PointerEventData.InputButton.Middle) { // write to property to invoke event IsFavorite = !IsFavorite; // update favorites list if (isFavorite) favorites.Add(fact); else favorites.Remove(fact); } } private void Start() { fact = transform.GetComponent<FactWrapper>().fact; ChangeFavoriteEvent.AddListener(OnFavoriteChange); // check if fact is currenty a favorite if (favorites.Contains(fact)) { isFavorite = true; UpdateDisplay(); } } #endregion UnityMethods #region Implementation private void OnFavoriteChange(Fact changedFact, bool isFavourite) { if (fact == changedFact) { this.isFavorite = isFavourite; UpdateDisplay(); } } private void UpdateDisplay() { if (!isFavorite) Destroy(favoriteDisplay); else if (!favoriteDisplay) favoriteDisplay = Instantiate(favoriteDisplayPrefab, transform); } #endregion Implementation }