Skip to content
Snippets Groups Projects
FactObject.cs 2.61 KiB
Newer Older
  • Learn to ignore specific revisions
  • using System;
    using System.Linq;
    using System.Collections.Generic;
    using UnityEngine;
    using System.Collections;
    
    Richard Marcus's avatar
    Richard Marcus committed
    
    
    /// <summary>
    /// <see cref="Fact.Id"/>/ <c>MonoBehaviour</c> wrapper to be attached to <see cref="Fact.Representation"/>
    /// </summary>
    
    public class FactObject : MonoBehaviour, ISerializationCallbackReceiver
    
    Richard Marcus's avatar
    Richard Marcus committed
    {
    
        /// <summary>
        /// <see cref="Fact.Id"/> to identify arbitrary <see cref="Fact"/> by its <see cref="Fact.Representation"/>
        /// </summary>
    
        public string URI;
    
    MaZiFAU's avatar
    MaZiFAU committed
        /// Shorthand and Cache for <see cref="FactOrganizer.AllFacts.TryGetValue(string, out Fact)"/>.
    
    MaZiFAU's avatar
    MaZiFAU committed
                if (_Fact == null) FactOrganizer.AllFacts.TryGetValue(URI, out _Fact);
    
                return _Fact;
            } 
            set { _Fact = value; URI = value.Id; }
        }
        private Fact _Fact;
    
    
        public enum FactMaterials
        {
            Default = 0,
            Selected = 1,
            Hint = 2,
            Solution = 3,
        }
    
        public Material[] materials;
        public new Renderer[] renderer;
        public List<FactObject> cascade;
    
        #region Unity Serialization
        public Material Default;
        public Material Selected;
        public Material Hint;
        public Material Solution;
        void ISerializationCallbackReceiver.OnBeforeSerialize()
        {
    
            Default = materials[(int)FactMaterials.Default];
            Selected = materials[(int)FactMaterials.Selected];
            Hint = materials[(int)FactMaterials.Hint];
            Solution = materials[(int)FactMaterials.Solution];
        }
    
        void ISerializationCallbackReceiver.OnAfterDeserialize()
        {
            materials = new Material[4];
            materials[(int)FactMaterials.Default] = Default;
            materials[(int)FactMaterials.Selected] = Selected;
            materials[(int)FactMaterials.Hint] = Hint;
            materials[(int)FactMaterials.Solution] = Solution;
        }
        #endregion
    
        private void Awake()
        {
            cascade = new() { this, };
            cascade.AddRange(transform.GetComponentsInChildren<FactObject>(includeInactive: true));
        }
    
        public void CascadeForChildren(Action<FactObject> func)
        {
            foreach (FactObject fo in cascade)
                func(fo);
        }
    
        public void ForAllRenderer(Action<Renderer> func)
        {
            foreach (Renderer ren in renderer)
                func(ren);
        }
    
        public void CoroutineCascadeForChildrenAllRenderer(Func<FactObject, Renderer, IEnumerator> func)
        {
            this.StopAllCoroutines();
    
            foreach (FactObject fo in cascade)
                foreach (Renderer ren in fo.renderer)
                    StartCoroutine(func(fo, ren));
        }
    
    Richard Marcus's avatar
    Richard Marcus committed
    }