using System; using System.Collections.Generic; using UnityEngine; using Random = UnityEngine.Random; namespace InterfaceOff { public class WindowSpawner : MonoBehaviour { private List WindowTypes { get; } = new(); [field: SerializeField] private GameObject SampleChild { get; set; } [field: SerializeField] private Canvas GameCanvas { get; set; } [field: SerializeField] public bool AutoSpawn { get; private set; } = true; private void Awake() { /* Fetches all window types created */ Type[] types = typeof(WindowBase).Assembly.GetTypes(); foreach (Type t in types) { if (t.IsSubclassOf(typeof(WindowBase))) { WindowTypes.Add(t); } } /* Logs the amount of types found and errors if there is none */ Debug.Log($"Found [{WindowTypes.Count}] different window types "); if (WindowTypes.Count == 0) { Debug.LogError("Could not find any window types"); } } private void SpawnNewRandomWindow() { /* Creates the gameobject with a random class */ GameObject go = Instantiate(SampleChild, GameCanvas.transform); go.SetActive(true); Type type = WindowTypes.GetRandom(); go.name = type.Name; WindowBase windowBase = go.AddComponent(type) as WindowBase; /* Checks it created correctly before instantiating further */ if (DebugUtils.IsNull(windowBase)) { Debug.LogError("How did this happen"); return; } /* Makes sure the WindowInteractions and WindowComponents are setup before passing to user code */ windowBase.Interactions = go.GetComponent(); windowBase.Interactions.SetAttachedTo(windowBase); windowBase.Components = go.GetComponent(); windowBase.InstantiateWindowBase(); } private void FixedUpdate() { if (AutoSpawn) { /* Checks if it should spawn a window */ bool shouldSpawn = Random.Range(0, 60) == 0; if (shouldSpawn) { SpawnNewRandomWindow(); } } } private void Update() { if (!AutoSpawn) { if (Input.GetKeyDown(KeyCode.Space)) { SpawnNewRandomWindow(); } } } } }