using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; //Define the system managing the clients. (Singleton) //TODO: Switch to a registering approach for clients public sealed class ClientManager : MonoBehaviour { public static string ClientManager_path="/GameSystem/ClientManager"; //Singleton private static ClientManager _instance=null; public static ClientManager Instance { get { if(_instance is null) //Force Awakening if needed GameObject.Find(ClientManager_path).GetComponent().Awake(); return _instance; } } [HideInInspector] public bool ready = false; //Wether the ClientManager is initialized [SerializeField] int nbMaxClients = 1; //Maximum active clients [SerializeField] float clientSpawnChance = 100.0f; //Chance of new client every request [SerializeField] float clientFrequency = 1.0f; //Time (s) between clientRequest // [SerializeField] // float clientSpawnTimer = 0.5f; //Intial time before first spawn (pseudo-random after that) // [SerializeField] // float maxTimeNewClients = 2.0f; //Longest waiting time for new clients // bool clientSpawnReady = false; [SerializeField] string ClientRessourceFolder = "Clients"; private Object[] clientsPrefab; GameObject ClientContainer = null; private List _clientList = new List(); public List clientList { get{return _clientList;} private set{_clientList=value;} } Vector2 spawnPoint; Dictionary targets_dict; //Dict with target and wether they're taken by a client private List coroutines= new List(); //List of ClientManager coroutines //Request new client //Return wether a new client was created public bool clientRequest(float SpawnChance=100.0f) { if(Random.Range(0.0f, 99.9f) avail_tgt = new List(); foreach(KeyValuePair tgt in targets_dict) if(tgt.Value is false) avail_tgt.Add(tgt.Key); Vector2 target = avail_tgt[Random.Range(0, avail_tgt.Count)]; targets_dict[target]=true; return target; } } //Return a random order from available consummable //TODO : Check stock before assignement ? public string assignOrder() { List available_types = new List(Consumable.allowed_types); string order_type = available_types[Random.Range(0, available_types.Count)]; return order_type; } //InvokeRepeating() is another option //Coroutine to be started in a parallel process. It'll repeatidly request new client. private IEnumerator requestCoroutine() { while(ClientManager.Instance!=null){ if(GameSystem.Instance.serviceOpen) ClientManager.Instance.clientRequest(clientSpawnChance); yield return new WaitForSeconds(clientFrequency); } } //Awake is called when the script instance is being loaded. void Awake() { //Singleton if (_instance != null && _instance != this) Destroy(this.gameObject); else _instance = this; if(!ready) { ClientContainer = GameObject.Find(ClientManager_path); if (ClientContainer is null) throw new System.Exception("No ClientManager found under GameSystem"); // Load clients prefabs // // Find all assets labelled with 'usable' : // string[] guids = AssetDatabase.FindAssets("", new string[] {"Assets/Prefabs/Characters/Clients"}); // foreach (string guid in guids) // { // Debug.Log(AssetDatabase.GUIDToAssetPath(guid)); // Instantiate(guid, spawnPosition, Quaternion.identity); // } clientsPrefab = Resources.LoadAll(ClientRessourceFolder); // foreach (var c in clients) // { // Debug.Log(gameObject.name+" : "+c.name + " loaded"); // } if (clientsPrefab.Length(); GameObject targetsObj = GameObject.Find("/GameSystem/Targets"); if (targetsObj is null) throw new System.Exception("No Targets GameObject found under GameSystem"); Component[] targets = targetsObj.GetComponentsInChildren(); if(targets != null) { foreach(Transform target in targets) { if(target.gameObject.name != "Targets") { targets_dict.Add(target.position, false); // Debug.Log("Client target : "+ target.gameObject.name + target.position); } } } if (targets_dict.Count(); // } //// }